ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.h
(Generate patch)

Comparing gvpe/src/connection.h (file contents):
Revision 1.6 by pcg, Sun Apr 6 04:17:36 2003 UTC vs.
Revision 1.36 by root, Sun Mar 6 19:40:28 2011 UTC

1/* 1/*
2 connection.h -- header for connection.C 2 connection.h -- header for connection.C
3 Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de>
3 4
5 This file is part of GVPE.
6
4 This program is free software; you can redistribute it and/or modify 7 GVPE is free software; you can redistribute it and/or modify it
5 it under the terms of the GNU General Public License as published by 8 under the terms of the GNU General Public License as published by the
6 the Free Software Foundation; either version 2 of the License, or 9 Free Software Foundation; either version 3 of the License, or (at your
7 (at your option) any later version. 10 option) any later version.
8 11
9 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful, but
10 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
12 GNU General Public License for more details. 15 Public License for more details.
13 16
14 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License along
15 along with this program; if not, write to the Free Software 18 with this program; if not, see <http://www.gnu.org/licenses/>.
16 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this Program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a modified
24 version of that library), containing parts covered by the terms of the
25 OpenSSL or SSLeay licenses, the licensors of this Program grant you
26 additional permission to convey the resulting work. Corresponding
27 Source for a non-source form of such a combination shall include the
28 source code for the parts of OpenSSL used as well as that of the
29 covered work.
17*/ 30*/
18 31
19#ifndef VPE_CONNECTION_H__ 32#ifndef GVPE_CONNECTION_H__
20#define VPE_CONNECTION_H__ 33#define GVPE_CONNECTION_H__
21 34
22#include <openssl/hmac.h> 35#include <openssl/hmac.h>
23 36
24#include "global.h" 37#include "global.h"
25#include "conf.h" 38#include "conf.h"
30struct vpn; 43struct vpn;
31 44
32// called after HUP etc. to (re-)initialize global data structures 45// called after HUP etc. to (re-)initialize global data structures
33void connection_init (); 46void connection_init ();
34 47
35struct rsaid { 48struct rsaid
49{
36 u8 id[RSA_IDLEN]; // the challenge id 50 u8 id[RSA_IDLEN]; // the challenge id
37}; 51};
38 52
39typedef u8 rsachallenge[RSA_KEYLEN - RSA_OVERHEAD]; // challenge data; 53typedef rsaclear rsachallenge; // challenge data;
40typedef u8 rsaencrdata[RSA_KEYLEN]; // encrypted challenge 54typedef rsacrypt rsaencrdata; // encrypted challenge
41typedef u8 rsaresponse[RSA_RESLEN]; // the encrypted ripemd160 hash 55typedef u8 rsaresponse[RSA_RESLEN]; // the encrypted ripemd160 hash
42 56
43//////////////////////////////////////////////////////////////////////////////////////// 57////////////////////////////////////////////////////////////////////////////////////////
44 58
45struct crypto_ctx; 59struct crypto_ctx;
46 60
47struct hmac_packet:net_packet 61struct hmac_packet : net_packet
48{ 62{
49 u8 hmac[HMACLENGTH]; // each and every packet has a hmac field, but that is not (yet) checked everywhere 63 u8 hmac[HMACLENGTH]; // each and every packet has a hmac field, but that is not (yet) checked everywhere
50 64
51 void hmac_set (crypto_ctx * ctx); 65 void hmac_set (crypto_ctx * ctx);
52 bool hmac_chk (crypto_ctx * ctx); 66 bool hmac_chk (crypto_ctx * ctx);
56 70
57 void hmac_gen (crypto_ctx * ctx); 71 void hmac_gen (crypto_ctx * ctx);
58}; 72};
59 73
60struct vpn_packet : hmac_packet 74struct vpn_packet : hmac_packet
61 { 75{
62 enum ptype 76 enum ptype
63 { 77 {
64 PT_RESET = 0, 78 PT_RESET = 0,
65 PT_DATA_UNCOMPRESSED, 79 PT_DATA_UNCOMPRESSED,
66 PT_DATA_COMPRESSED, 80 PT_DATA_COMPRESSED,
67 PT_PING, PT_PONG, // wasting namespace space? ;) 81 PT_PING, PT_PONG, // wasting namespace space? ;)
68 PT_AUTH_REQ, // authentification request 82 PT_AUTH_REQ, // authentification request
69 PT_AUTH_RES, // authentification response 83 PT_AUTH_RES, // authentification response
70 PT_CONNECT_REQ, // want other host to contact me 84 PT_CONNECT_REQ, // want other node to contact me
71 PT_CONNECT_INFO, // request connection to some node 85 PT_CONNECT_INFO, // request connection to some node
86 PT_DATA_BRIDGED, // uncompressed packet with foreign mac pot. larger than path mtu (NYI)
72 PT_MAX 87 PT_MAX
73 };
74
75 u8 type;
76 u8 srcdst, src1, dst1;
77
78 void set_hdr (ptype type_, unsigned int dst);
79
80 unsigned int src () const
81 {
82 return src1 | ((srcdst >> 4) << 8);
83 }
84
85 unsigned int dst () const
86 {
87 return dst1 | ((srcdst & 0xf) << 8);
88 }
89
90 ptype typ () const
91 {
92 return (ptype) type;
93 }
94 }; 88 };
89
90 u8 type;
91 u8 srcdst, src1, dst1;
92
93 void set_hdr (ptype type_, unsigned int dst);
94
95 unsigned int src () const
96 {
97 return src1 | ((srcdst >> 4) << 8);
98 }
99
100 unsigned int dst () const
101 {
102 return dst1 | ((srcdst & 0xf) << 8);
103 }
104
105 ptype typ () const
106 {
107 return (ptype) type;
108 }
109};
95 110
96//////////////////////////////////////////////////////////////////////////////////////// 111////////////////////////////////////////////////////////////////////////////////////////
97 112
98// a very simple fifo pkt-queue 113// a very simple fifo pkt-queue
99class pkt_queue 114class pkt_queue
100 { 115{
101 tap_packet *queue[QUEUEDEPTH];
102 int i, j; 116 int i, j;
117 int max_queue;
118 double max_ttl;
103 119
120 struct pkt {
121 ev_tstamp tstamp;
122 net_packet *pkt;
123 } *queue;
124
125 void expire_cb (ev::timer &w, int revents); ev::timer expire;
126
104 public: 127public:
105 128
106 void put (tap_packet *p); 129 void put (net_packet *p);
107 tap_packet *get (); 130 net_packet *get ();
108 131
109 pkt_queue (); 132 bool empty ()
133 {
134 return i == j;
135 }
136
137 pkt_queue (double max_ttl, int max_queue);
110 ~pkt_queue (); 138 ~pkt_queue ();
111 }; 139};
140
141enum
142{
143 FEATURE_COMPRESSION = 0x01,
144 FEATURE_ROHC = 0x02,
145 FEATURE_BRIDGING = 0x04,
146};
112 147
113struct connection 148struct connection
114 { 149{
115 conf_node *conf; 150 conf_node *conf;
116 struct vpn *vpn; 151 struct vpn *vpn;
117 152
118 sockinfo si; // the current(!) destination ip to send packets to 153 sockinfo si; // the current(!) destination ip to send packets to
119 int retry_cnt; 154 int retry_cnt;
120 155
121 tstamp last_activity; // time of last packet received 156 tstamp last_activity; // time of last packet received
157 tstamp last_establish_attempt;
158 //tstamp last_si_change; // time we last changed the socket address
122 159
123 u32 oseqno; 160 u32 oseqno;
124 sliding_window iseqno; 161 sliding_window iseqno;
125 162
126 u8 protocol; 163 u8 protocol;
164 u8 features;
165 bool is_direct; // current connection (si) is direct?
127 166
128 pkt_queue queue; 167 pkt_queue data_queue, vpn_queue;
129 168
130 crypto_ctx *octx, *ictx; 169 crypto_ctx *octx, *ictx;
131 170
132 enum conf_node::connectmode connectmode; 171#if ENABLE_DNS
133 u8 prot_minor; // minor number of other side 172 struct dns_connection *dns;
134
135 void reset_si ();
136 const sockinfo &forward_si (const sockinfo &si) const;
137
138 void shutdown ();
139 void reset_connection ();
140 void establish_connection_cb (time_watcher &w); time_watcher establish_connection;
141 void rekey_cb (time_watcher &w); time_watcher rekey; // next rekying (actually current reset + reestablishing)
142 void keepalive_cb (time_watcher &w); time_watcher keepalive; // next keepalive probe
143
144 void send_auth_request (const sockinfo &si, bool initiate);
145 void send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg);
146 void send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols);
147 void send_reset (const sockinfo &dsi);
148 void send_ping (const sockinfo &dsi, u8 pong = 0);
149 void send_data_packet (tap_packet *pkt, bool broadcast = false);
150 void inject_data_packet (tap_packet *pkt, bool broadcast = false);
151 void inject_vpn_packet (vpn_packet *pkt, int tos = 0); // for forwarding
152 void connect_request (int id);
153
154 void recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi);
155
156 void script_node ();
157 const char *script_node_up ();
158 const char *script_node_down ();
159
160 void dump_status ();
161
162 connection(struct vpn *vpn_);
163 ~connection ();
164 };
165
166#endif 173#endif
167 174
175 enum conf_node::connectmode connectmode;
176 u8 prot_minor; // minor number of other side
177
178 void reset_si ();
179 const sockinfo &forward_si (const sockinfo &si) const;
180
181 void shutdown ();
182 void connection_established ();
183 void reset_connection ();
184
185 void establish_connection_cb (ev::timer &w, int revents); ev::timer establish_connection;
186 void rekey_cb (ev::timer &w, int revents); ev::timer rekey; // next rekying (actually current reset + reestablishing)
187 void keepalive_cb (ev::timer &w, int revents); ev::timer keepalive; // next keepalive probe
188
189 void send_connect_request (int id);
190 void send_auth_request (const sockinfo &si, bool initiate);
191 void send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg);
192 void send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols);
193 void send_reset (const sockinfo &dsi);
194 void send_ping (const sockinfo &dsi, u8 pong = 0);
195 void send_data_packet (tap_packet *pkt);
196
197 void post_inject_queue ();
198 void inject_data_packet (tap_packet *pkt);
199 void inject_vpn_packet (vpn_packet *pkt, int tos = 0); // for forwarding
200
201 void recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi);
202 void send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos = 0);
203
204 void script_init_env (const char *ext);
205 void script_init_connect_env ();
206 const char *script_node_up ();
207 const char *script_node_change ();
208 const char *script_node_down ();
209
210 void dump_status ();
211
212 connection (struct vpn *vpn, conf_node *conf);
213 ~connection ();
214};
215
216#endif
217

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines