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.28 by pcg, Sat Nov 10 05:14:22 2007 UTC vs.
Revision 1.32 by pcg, Thu Aug 7 17:54:26 2008 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines