ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.C
Revision: 1.100
Committed: Wed Jul 17 05:34:17 2013 UTC (10 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.99: +3 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     connection.C -- manage a single connection
3 root 1.98 Copyright (C) 2003-2008,2010,2011,2013 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.42 This file is part of GVPE.
6    
7 pcg 1.69 GVPE is free software; you can redistribute it and/or modify it
8     under the terms of the GNU General Public License as published by the
9     Free Software Foundation; either version 3 of the License, or (at your
10     option) any later version.
11    
12     This program is distributed in the hope that it will be useful, but
13     WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15     Public License for more details.
16    
17     You should have received a copy of the GNU General Public License along
18     with this program; if not, see <http://www.gnu.org/licenses/>.
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.
30 pcg 1.1 */
31    
32     #include "config.h"
33    
34     #include <list>
35 pcg 1.70 #include <queue>
36     #include <utility>
37 pcg 1.1
38 pcg 1.2 #include <openssl/rand.h>
39     #include <openssl/evp.h>
40     #include <openssl/rsa.h>
41     #include <openssl/err.h>
42    
43 pcg 1.1 #include "conf.h"
44     #include "slog.h"
45     #include "device.h"
46 pcg 1.2 #include "vpn.h"
47 pcg 1.1 #include "connection.h"
48 root 1.98 #include "hkdf.h"
49 pcg 1.1
50 pcg 1.20 #include "netcompat.h"
51 pcg 1.19
52 root 1.98 #define MAGIC "gvpe\xbd\xc6\xdb\x82" // 8 bytes of magic
53 pcg 1.30
54     #define ULTRA_FAST 1
55     #define HLOG 15
56     #include "lzf/lzf.h"
57     #include "lzf/lzf_c.c"
58     #include "lzf/lzf_d.c"
59 pcg 1.1
60 pcg 1.70 //////////////////////////////////////////////////////////////////////////////
61    
62     static std::queue< std::pair<run_script_cb *, const char *> > rs_queue;
63     static ev::child rs_child_ev;
64    
65 root 1.90 namespace
66 pcg 1.70 {
67 root 1.90 void // c++ requires external linkage here, apparently :(
68     rs_child_cb (ev::child &w, int revents)
69     {
70     w.stop ();
71 pcg 1.70
72 root 1.90 if (rs_queue.empty ())
73     return;
74 pcg 1.70
75 root 1.90 pid_t pid = run_script (*rs_queue.front ().first, false);
76     if (pid)
77     {
78     w.set (pid);
79     w.start ();
80     }
81     else
82     slog (L_WARN, rs_queue.front ().second);
83 pcg 1.70
84 root 1.90 delete rs_queue.front ().first;
85     rs_queue.pop ();
86     }
87     };
88 pcg 1.70
89     // despite the fancy name, this is quite a hack
90     static void
91     run_script_queued (run_script_cb *cb, const char *warnmsg)
92     {
93     rs_queue.push (std::make_pair (cb, warnmsg));
94    
95     if (!rs_child_ev.is_active ())
96     {
97     rs_child_ev.set<rs_child_cb> ();
98     rs_child_ev ();
99     }
100     }
101    
102     //////////////////////////////////////////////////////////////////////////////
103    
104 pcg 1.1 struct crypto_ctx
105     {
106     EVP_CIPHER_CTX cctx;
107     HMAC_CTX hctx;
108    
109 root 1.98 crypto_ctx (const auth_data &auth1, const auth_data &auth2, const ecdh_key &a, const ecdh_key &b, int enc);
110 pcg 1.1 ~crypto_ctx ();
111     };
112    
113 root 1.98 crypto_ctx::crypto_ctx (const auth_data &auth1, const auth_data &auth2, const ecdh_key &a, const ecdh_key &b, int enc)
114 pcg 1.1 {
115 root 1.98 ecdh_key s;
116    
117     curve25519_combine (a, b, s);
118    
119     {
120     u8 mac_key[MAC_KEYSIZE];
121     static const unsigned char mac_info[] = "gvpe mac key";
122    
123 root 1.99 hkdf kdf (auth2.rsa.hkdf_salt, sizeof (auth2.rsa.hkdf_salt), HKDF_XTR_HASH ());
124 root 1.98 kdf.extract (auth2.rsa.ikm, sizeof (auth2.rsa.ikm));
125     kdf.extract (auth1.rsa.mac_key, sizeof (auth1.rsa.mac_key));
126     kdf.extract (s, sizeof (s));
127 root 1.99 kdf.extract_done (HKDF_PRF_HASH ());
128 root 1.98 kdf.expand (mac_key, sizeof (mac_key), mac_info, sizeof (mac_info));
129    
130     HMAC_CTX_init (&hctx);
131     require (HMAC_Init_ex (&hctx, mac_key, MAC_KEYSIZE, MAC_DIGEST (), 0));
132     }
133    
134     {
135     u8 cipher_key[CIPHER_KEYSIZE];
136     static const unsigned char cipher_info[] = "gvpe cipher key";
137    
138 root 1.99 hkdf kdf (auth2.rsa.hkdf_salt, sizeof (auth2.rsa.hkdf_salt), HKDF_XTR_HASH ());
139 root 1.98 kdf.extract (auth2.rsa.ikm, sizeof (auth2.rsa.ikm));
140     kdf.extract (auth1.rsa.cipher_key, sizeof (auth1.rsa.cipher_key));
141     kdf.extract (s, sizeof (s));
142 root 1.99 kdf.extract_done (HKDF_PRF_HASH ());
143 root 1.98 kdf.expand (cipher_key, sizeof (cipher_key), cipher_info, sizeof (cipher_info));
144    
145     EVP_CIPHER_CTX_init (&cctx);
146     require (EVP_CipherInit_ex (&cctx, CIPHER (), 0, cipher_key, 0, enc));
147     }
148 pcg 1.1 }
149    
150     crypto_ctx::~crypto_ctx ()
151     {
152 pcg 1.29 require (EVP_CIPHER_CTX_cleanup (&cctx));
153 pcg 1.1 HMAC_CTX_cleanup (&hctx);
154     }
155    
156 root 1.98 static inline void
157     auth_encrypt (RSA *key, const auth_data &auth, auth_encr &encr)
158 pcg 1.1 {
159 root 1.98 if (RSA_public_encrypt (sizeof (auth.rsa),
160     (unsigned char *)&auth.rsa, (unsigned char *)&encr.rsa,
161     key, RSA_PKCS1_OAEP_PADDING) < 0)
162     fatal ("RSA_public_encrypt error");
163 root 1.100
164     memcpy (&encr.ecdh, &auth.ecdh, sizeof (encr.ecdh));
165 pcg 1.1 }
166    
167 root 1.98 static inline bool
168     auth_decrypt (RSA *key, const auth_encr &encr, auth_data &auth)
169 pcg 1.63 {
170 root 1.98 u8 rsa_decrypt[RSA_KEYLEN];
171 pcg 1.1
172 root 1.98 if (RSA_private_decrypt (sizeof (encr.rsa),
173     (const unsigned char *)&encr.rsa, (unsigned char *)rsa_decrypt,
174     key, RSA_PKCS1_OAEP_PADDING) != sizeof (auth.rsa))
175     return 0;
176 pcg 1.1
177 root 1.98 memcpy (&auth.rsa, rsa_decrypt, sizeof (auth.rsa));
178 root 1.100 memcpy (&auth.ecdh, &encr.ecdh, sizeof (auth.ecdh));
179 pcg 1.1
180 root 1.98 return 1;
181     }
182 pcg 1.1
183 root 1.98 static void
184     auth_hash (const auth_data &auth, auth_mac &mac)
185     {
186     HMAC_CTX ctx;
187 pcg 1.1
188 root 1.98 HMAC_CTX_init (&ctx);
189     require (HMAC_Init_ex (&ctx, auth.rsa.auth_key, sizeof (auth.rsa.auth_key), AUTH_DIGEST (), 0));
190     require (HMAC_Update (&ctx, (const unsigned char *)&auth, sizeof auth));
191     require (HMAC_Final (&ctx, (unsigned char *)&mac, 0));
192     HMAC_CTX_cleanup (&ctx);
193     }
194 pcg 1.1
195 root 1.90 void
196 root 1.98 connection::generate_auth_data ()
197 pcg 1.1 {
198 root 1.98 if (auth_expire < ev_now ())
199 pcg 1.1 {
200 root 1.98 // request data
201 root 1.99 RAND_bytes ((unsigned char *)&snd_auth.rsa, sizeof snd_auth.rsa);
202 root 1.98 curve25519_generate (snd_ecdh_a, snd_auth.ecdh);
203     auth_hash (snd_auth, snd_auth_mac);
204    
205     // eventual response data
206     curve25519_generate (rcv_ecdh_a, rcv_ecdh_b);
207 pcg 1.1 }
208 root 1.98
209     // every use prolongs the expiry
210     auth_expire = ev_now () + AUTH_TTL;
211 pcg 1.1 }
212    
213     //////////////////////////////////////////////////////////////////////////////
214    
215 pcg 1.67 pkt_queue::pkt_queue (double max_ttl, int max_queue)
216     : max_ttl (max_ttl), max_queue (max_queue)
217 pcg 1.1 {
218 pcg 1.67 queue = new pkt [max_queue];
219    
220     i = 0;
221     j = 0;
222    
223     expire.set<pkt_queue, &pkt_queue::expire_cb> (this);
224     }
225 pcg 1.1
226 pcg 1.67 pkt_queue::~pkt_queue ()
227     {
228     while (net_packet *p = get ())
229     delete p;
230 pcg 1.1
231 pcg 1.67 delete [] queue;
232 pcg 1.1 }
233    
234 root 1.90 void
235     pkt_queue::expire_cb (ev::timer &w, int revents)
236 pcg 1.1 {
237 pcg 1.67 ev_tstamp expire = ev_now () - max_ttl;
238 pcg 1.1
239 pcg 1.67 for (;;)
240 pcg 1.1 {
241 pcg 1.67 if (empty ())
242     break;
243    
244     double diff = queue[j].tstamp - expire;
245    
246     if (diff >= 0.)
247     {
248     w.start (diff > 0.5 ? diff : 0.5);
249     break;
250     }
251    
252     delete get ();
253 pcg 1.1 }
254     }
255    
256 root 1.90 void
257     pkt_queue::put (net_packet *p)
258 pcg 1.1 {
259 pcg 1.67 ev_tstamp now = ev_now ();
260    
261     // start expiry timer
262     if (empty ())
263     expire.start (max_ttl);
264    
265     int ni = i + 1 == max_queue ? 0 : i + 1;
266    
267     if (ni == j)
268     delete get ();
269    
270     queue[i].pkt = p;
271     queue[i].tstamp = now;
272    
273     i = ni;
274 pcg 1.1 }
275    
276 root 1.90 net_packet *
277     pkt_queue::get ()
278 pcg 1.1 {
279 pcg 1.67 if (empty ())
280     return 0;
281    
282     net_packet *p = queue[j].pkt;
283     queue[j].pkt = 0;
284    
285     j = j + 1 == max_queue ? 0 : j + 1;
286    
287     return p;
288 pcg 1.1 }
289    
290 pcg 1.63 struct net_rateinfo
291     {
292 pcg 1.1 u32 host;
293     double pcnt, diff;
294     tstamp last;
295     };
296    
297     // only do action once every x seconds per host whole allowing bursts.
298     // this implementation ("splay list" ;) is inefficient,
299     // but low on resources.
300     struct net_rate_limiter : list<net_rateinfo>
301     {
302 pcg 1.35 # define NRL_ALPHA (1. - 1. / 600.) // allow bursts
303     # define NRL_CUTOFF 10. // one event every CUTOFF seconds
304     # define NRL_EXPIRE (NRL_CUTOFF * 30.) // expire entries after this time
305     # define NRL_MAXDIF (NRL_CUTOFF * (1. / (1. - NRL_ALPHA))) // maximum diff /count value
306 pcg 1.1
307 pcg 1.16 bool can (const sockinfo &si) { return can((u32)si.host); }
308 pcg 1.1 bool can (u32 host);
309     };
310    
311 root 1.90 static net_rate_limiter auth_rate_limiter, reset_rate_limiter;
312 pcg 1.1
313 root 1.90 bool
314     net_rate_limiter::can (u32 host)
315 pcg 1.1 {
316     iterator i;
317    
318     for (i = begin (); i != end (); )
319     if (i->host == host)
320     break;
321 pcg 1.62 else if (i->last < ev_now () - NRL_EXPIRE)
322 pcg 1.1 i = erase (i);
323     else
324     i++;
325    
326     if (i == end ())
327     {
328     net_rateinfo ri;
329    
330     ri.host = host;
331     ri.pcnt = 1.;
332 pcg 1.34 ri.diff = NRL_MAXDIF;
333 pcg 1.62 ri.last = ev_now ();
334 pcg 1.1
335     push_front (ri);
336    
337     return true;
338     }
339     else
340     {
341     net_rateinfo ri (*i);
342     erase (i);
343    
344 pcg 1.34 ri.pcnt = ri.pcnt * NRL_ALPHA;
345 pcg 1.62 ri.diff = ri.diff * NRL_ALPHA + (ev_now () - ri.last);
346 pcg 1.1
347 pcg 1.62 ri.last = ev_now ();
348 pcg 1.1
349 pcg 1.10 double dif = ri.diff / ri.pcnt;
350 pcg 1.1
351 pcg 1.34 bool send = dif > NRL_CUTOFF;
352 pcg 1.10
353 pcg 1.34 if (dif > NRL_MAXDIF)
354 pcg 1.10 {
355     ri.pcnt = 1.;
356 pcg 1.34 ri.diff = NRL_MAXDIF;
357 pcg 1.10 }
358     else if (send)
359 pcg 1.1 ri.pcnt++;
360    
361     push_front (ri);
362    
363     return send;
364     }
365     }
366    
367     /////////////////////////////////////////////////////////////////////////////
368    
369     unsigned char hmac_packet::hmac_digest[EVP_MAX_MD_SIZE];
370    
371 root 1.90 void
372     hmac_packet::hmac_gen (crypto_ctx *ctx)
373 pcg 1.1 {
374     unsigned int xlen;
375    
376     HMAC_CTX *hctx = &ctx->hctx;
377    
378 root 1.98 require (HMAC_Init_ex (hctx, 0, 0, 0, 0));
379     require (HMAC_Update (hctx, ((unsigned char *) this) + sizeof (hmac_packet),
380     len - sizeof (hmac_packet)));
381     require (HMAC_Final (hctx, (unsigned char *) &hmac_digest, &xlen));
382 pcg 1.1 }
383    
384     void
385     hmac_packet::hmac_set (crypto_ctx *ctx)
386     {
387     hmac_gen (ctx);
388    
389     memcpy (hmac, hmac_digest, HMACLENGTH);
390     }
391    
392     bool
393     hmac_packet::hmac_chk (crypto_ctx *ctx)
394     {
395     hmac_gen (ctx);
396    
397     return !memcmp (hmac, hmac_digest, HMACLENGTH);
398     }
399    
400 root 1.90 void
401     vpn_packet::set_hdr (ptype type_, unsigned int dst)
402 pcg 1.1 {
403 pcg 1.6 type = type_;
404 pcg 1.1
405     int src = THISNODE->id;
406    
407     src1 = src;
408     srcdst = ((src >> 8) << 4) | (dst >> 8);
409     dst1 = dst;
410     }
411    
412     #define MAXVPNDATA (MAX_MTU - 6 - 6)
413     #define DATAHDR (sizeof (u32) + RAND_SIZE)
414    
415 pcg 1.28 struct vpndata_packet : vpn_packet
416 root 1.90 {
417     u8 data[MAXVPNDATA + DATAHDR]; // seqno
418    
419     void setup (connection *conn, int dst, u8 *d, u32 len, u32 seqno);
420     tap_packet *unpack (connection *conn, u32 &seqno);
421 pcg 1.1
422     private:
423 root 1.90 const u32 data_hdr_size () const
424     {
425     return sizeof (vpndata_packet) - sizeof (net_packet) - MAXVPNDATA - DATAHDR;
426     }
427     };
428 pcg 1.1
429     void
430     vpndata_packet::setup (connection *conn, int dst, u8 *d, u32 l, u32 seqno)
431     {
432     EVP_CIPHER_CTX *cctx = &conn->octx->cctx;
433     int outl = 0, outl2;
434     ptype type = PT_DATA_UNCOMPRESSED;
435    
436     #if ENABLE_COMPRESSION
437     u8 cdata[MAX_MTU];
438    
439 pcg 1.86 if (conn->features & FEATURE_COMPRESSION)
440 pcg 1.1 {
441 pcg 1.31 u32 cl = lzf_compress (d, l, cdata + 2, (l - 2) & ~7);
442 pcg 1.1
443 pcg 1.31 if (cl)
444     {
445     type = PT_DATA_COMPRESSED;
446     d = cdata;
447     l = cl + 2;
448    
449     d[0] = cl >> 8;
450     d[1] = cl;
451     }
452 pcg 1.1 }
453     #endif
454    
455 root 1.98 require (EVP_CipherInit_ex (cctx, 0, 0, 0, 0, 1));
456 pcg 1.1
457     struct {
458     #if RAND_SIZE
459     u8 rnd[RAND_SIZE];
460     #endif
461     u32 seqno;
462     } datahdr;
463    
464     datahdr.seqno = ntohl (seqno);
465     #if RAND_SIZE
466 root 1.99 RAND_bytes ((unsigned char *) datahdr.rnd, RAND_SIZE);
467 pcg 1.1 #endif
468    
469 pcg 1.29 require (EVP_EncryptUpdate (cctx,
470 pcg 1.1 (unsigned char *) data + outl, &outl2,
471 pcg 1.29 (unsigned char *) &datahdr, DATAHDR));
472 pcg 1.1 outl += outl2;
473    
474 pcg 1.29 require (EVP_EncryptUpdate (cctx,
475 pcg 1.1 (unsigned char *) data + outl, &outl2,
476 pcg 1.29 (unsigned char *) d, l));
477 pcg 1.1 outl += outl2;
478    
479 pcg 1.29 require (EVP_EncryptFinal_ex (cctx, (unsigned char *) data + outl, &outl2));
480 pcg 1.1 outl += outl2;
481    
482     len = outl + data_hdr_size ();
483    
484     set_hdr (type, dst);
485    
486     hmac_set (conn->octx);
487     }
488    
489     tap_packet *
490     vpndata_packet::unpack (connection *conn, u32 &seqno)
491     {
492     EVP_CIPHER_CTX *cctx = &conn->ictx->cctx;
493     int outl = 0, outl2;
494     tap_packet *p = new tap_packet;
495     u8 *d;
496     u32 l = len - data_hdr_size ();
497    
498 root 1.98 require (EVP_CipherInit_ex (cctx, 0, 0, 0, 0, 0));
499 pcg 1.1
500     #if ENABLE_COMPRESSION
501     u8 cdata[MAX_MTU];
502    
503     if (type == PT_DATA_COMPRESSED)
504     d = cdata;
505     else
506     #endif
507     d = &(*p)[6 + 6 - DATAHDR];
508    
509     /* this overwrites part of the src mac, but we fix that later */
510 pcg 1.29 require (EVP_DecryptUpdate (cctx,
511 pcg 1.1 d, &outl2,
512 pcg 1.29 (unsigned char *)&data, len - data_hdr_size ()));
513 pcg 1.1 outl += outl2;
514    
515 pcg 1.29 require (EVP_DecryptFinal_ex (cctx, (unsigned char *)d + outl, &outl2));
516 pcg 1.1 outl += outl2;
517    
518     seqno = ntohl (*(u32 *)(d + RAND_SIZE));
519    
520     id2mac (dst () ? dst() : THISNODE->id, p->dst);
521     id2mac (src (), p->src);
522    
523     #if ENABLE_COMPRESSION
524     if (type == PT_DATA_COMPRESSED)
525     {
526     u32 cl = (d[DATAHDR] << 8) | d[DATAHDR + 1];
527    
528     p->len = lzf_decompress (d + DATAHDR + 2, cl < MAX_MTU ? cl : 0,
529     &(*p)[6 + 6], MAX_MTU)
530     + 6 + 6;
531     }
532     else
533     p->len = outl + (6 + 6 - DATAHDR);
534     #endif
535    
536     return p;
537     }
538    
539     struct ping_packet : vpn_packet
540     {
541     void setup (int dst, ptype type)
542     {
543     set_hdr (type, dst);
544     len = sizeof (*this) - sizeof (net_packet);
545     }
546     };
547    
548     struct config_packet : vpn_packet
549     {
550 root 1.98 u8 prot_major, prot_minor, randsize;
551     u8 flags, features, pad6, pad7, pad8;
552     u32 cipher_nid, mac_nid, auth_nid;
553 pcg 1.1
554     void setup (ptype type, int dst);
555     bool chk_config () const;
556 pcg 1.32
557     static u8 get_features ()
558     {
559     u8 f = 0;
560     #if ENABLE_COMPRESSION
561     f |= FEATURE_COMPRESSION;
562     #endif
563     #if ENABLE_ROHC
564     f |= FEATURE_ROHC;
565     #endif
566 pcg 1.59 #if ENABLE_BRIDGING
567     f |= FEATURE_BRIDGING;
568     #endif
569 pcg 1.32 return f;
570     }
571 pcg 1.1 };
572    
573 root 1.90 void
574     config_packet::setup (ptype type, int dst)
575 pcg 1.1 {
576     prot_major = PROTOCOL_MAJOR;
577     prot_minor = PROTOCOL_MINOR;
578     randsize = RAND_SIZE;
579 pcg 1.48 flags = 0;
580 pcg 1.32 features = get_features ();
581 pcg 1.1
582 root 1.98 cipher_nid = htonl (EVP_CIPHER_nid (CIPHER ()));
583     mac_nid = htonl (EVP_MD_type (MAC_DIGEST ()));
584     auth_nid = htonl (EVP_MD_type (AUTH_DIGEST ()));
585 pcg 1.1
586     len = sizeof (*this) - sizeof (net_packet);
587     set_hdr (type, dst);
588     }
589    
590 root 1.90 bool
591     config_packet::chk_config () const
592 pcg 1.1 {
593 pcg 1.15 if (prot_major != PROTOCOL_MAJOR)
594 pcg 1.23 slog (L_WARN, _("major version mismatch (remote %d <=> local %d)"), prot_major, PROTOCOL_MAJOR);
595 pcg 1.15 else if (randsize != RAND_SIZE)
596 pcg 1.23 slog (L_WARN, _("rand size mismatch (remote %d <=> local %d)"), randsize, RAND_SIZE);
597 root 1.98 else if (cipher_nid != htonl (EVP_CIPHER_nid (CIPHER ())))
598     slog (L_WARN, _("cipher algo mismatch (remote %x <=> local %x)"), ntohl (cipher_nid), EVP_CIPHER_nid (CIPHER ()));
599     else if (mac_nid != htonl (EVP_MD_type (MAC_DIGEST ())))
600     slog (L_WARN, _("mac algo mismatch (remote %x <=> local %x)"), ntohl (mac_nid), EVP_MD_type (MAC_DIGEST ()));
601     else if (auth_nid != htonl (EVP_MD_type (AUTH_DIGEST ())))
602     slog (L_WARN, _("auth algo mismatch (remote %x <=> local %x)"), ntohl (auth_nid), EVP_MD_type (AUTH_DIGEST ()));
603 pcg 1.15 else
604     return true;
605    
606     return false;
607 pcg 1.1 }
608    
609 root 1.98 struct auth_req_packet : config_packet // UNPROTECTED
610 pcg 1.1 {
611     char magic[8];
612     u8 initiate; // false if this is just an automatic reply
613 pcg 1.28 u8 protocols; // supported protocols (will be patched on forward)
614 pcg 1.1 u8 pad2, pad3;
615 root 1.98 auth_encr encr;
616 pcg 1.1
617     auth_req_packet (int dst, bool initiate_, u8 protocols_)
618     {
619     config_packet::setup (PT_AUTH_REQ, dst);
620 root 1.98 memcpy (magic, MAGIC, 8);
621 pcg 1.1 initiate = !!initiate_;
622     protocols = protocols_;
623    
624     len = sizeof (*this) - sizeof (net_packet);
625     }
626     };
627    
628 root 1.98 struct auth_res_packet : config_packet // UNPROTECTED
629 pcg 1.1 {
630 root 1.98 auth_response response;
631 pcg 1.1
632     auth_res_packet (int dst)
633     {
634     config_packet::setup (PT_AUTH_RES, dst);
635    
636     len = sizeof (*this) - sizeof (net_packet);
637     }
638     };
639    
640     struct connect_req_packet : vpn_packet
641     {
642     u8 id, protocols;
643     u8 pad1, pad2;
644    
645     connect_req_packet (int dst, int id_, u8 protocols_)
646     : id(id_)
647     , protocols(protocols_)
648     {
649     set_hdr (PT_CONNECT_REQ, dst);
650     len = sizeof (*this) - sizeof (net_packet);
651     }
652     };
653    
654     struct connect_info_packet : vpn_packet
655     {
656     u8 id, protocols;
657     u8 pad1, pad2;
658     sockinfo si;
659    
660     connect_info_packet (int dst, int id_, const sockinfo &si_, u8 protocols_)
661     : id(id_)
662     , protocols(protocols_)
663     , si(si_)
664     {
665     set_hdr (PT_CONNECT_INFO, dst);
666    
667     len = sizeof (*this) - sizeof (net_packet);
668     }
669     };
670    
671     /////////////////////////////////////////////////////////////////////////////
672    
673     void
674 root 1.98 connection::connection_established (const sockinfo &rsi)
675 pcg 1.10 {
676 root 1.98 if (!have_snd_auth || !have_rcv_auth)
677     return;
678    
679     si = rsi;
680     protocol = rsi.prot;
681    
682     slog (L_INFO, _("%s(%s): connection established (%s), protocol version %d.%d."),
683     conf->nodename, (const char *)rsi,
684     is_direct ? "direct" : "forwarded",
685     PROTOCOL_MAJOR, prot_minor);
686    
687     if (::conf.script_node_up)
688     {
689     run_script_cb *cb = new run_script_cb;
690     cb->set<connection, &connection::script_node_up> (this);
691     run_script_queued (cb, _("node-up command execution failed, continuing."));
692     }
693    
694     delete ictx; ictx = new crypto_ctx (rcv_auth, snd_auth, rcv_ecdh_a, rcv_auth.ecdh, 0);
695     iseqno.reset (ntohl (rcv_auth.rsa.seqno) & 0x7fffffff);
696    
697     delete octx; octx = new crypto_ctx (snd_auth, rcv_auth, snd_ecdh_a, snd_ecdh_b , 1);
698     oseqno = ntohl (snd_auth.rsa.seqno) & 0x7fffffff;
699 pcg 1.61
700 pcg 1.10 if (ictx && octx)
701     {
702 pcg 1.36 // make sure rekeying timeouts are slightly asymmetric
703 pcg 1.60 ev::tstamp rekey_interval = ::conf.rekey + (conf->id > THISNODE->id ? 10 : 0);
704     rekey.start (rekey_interval, rekey_interval);
705 root 1.97
706 pcg 1.60 keepalive.start (::conf.keepalive);
707 pcg 1.10
708     // send queued packets
709     if (ictx && octx)
710 pcg 1.12 {
711     while (tap_packet *p = (tap_packet *)data_queue.get ())
712     {
713 pcg 1.67 if (p->len) send_data_packet (p);
714 pcg 1.12 delete p;
715     }
716    
717     while (vpn_packet *p = (vpn_packet *)vpn_queue.get ())
718     {
719 pcg 1.67 if (p->len) send_vpn_packet (p, si, IPTOS_RELIABILITY);
720 pcg 1.12 delete p;
721     }
722     }
723 pcg 1.73
724     vpn->connection_established (this);
725 pcg 1.10 }
726 root 1.98 #if 0
727 pcg 1.10 else
728     {
729     retry_cnt = 0;
730 pcg 1.60 establish_connection.start (5);
731 pcg 1.25 keepalive.stop ();
732     rekey.stop ();
733 pcg 1.10 }
734 root 1.98 #endif
735 pcg 1.10 }
736    
737     void
738 pcg 1.8 connection::reset_si ()
739 pcg 1.1 {
740 pcg 1.73 if (vpn->can_direct (THISNODE, conf))
741     protocol = best_protocol (THISNODE->protocols & conf->connectable_protocols ());
742     else
743 pcg 1.59 {
744 pcg 1.73 slog (L_TRACE, _("%s: direct connection denied by config."), conf->nodename);
745 pcg 1.59 protocol = 0;
746     }
747 pcg 1.6
748     si.set (conf, protocol);
749 pcg 1.73
750     is_direct = si.valid ();
751 pcg 1.1 }
752    
753 pcg 1.8 // ensure sockinfo is valid, forward if necessary
754     const sockinfo &
755     connection::forward_si (const sockinfo &si) const
756     {
757     if (!si.valid ())
758     {
759 pcg 1.73 connection *r = vpn->find_router_for (this);
760 pcg 1.8
761     if (r)
762     {
763 pcg 1.73 slog (L_DEBUG, _("%s: no common protocol, trying to route through %s."),
764     conf->nodename, r->conf->nodename);
765 pcg 1.8 return r->si;
766     }
767     else
768 pcg 1.73 slog (L_DEBUG, _("%s: node unreachable, no common protocol or no router available."),
769 pcg 1.8 conf->nodename);
770     }
771    
772     return si;
773     }
774    
775 pcg 1.1 void
776 pcg 1.10 connection::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
777     {
778 pcg 1.46 if (!vpn->send_vpn_packet (pkt, si, tos))
779 pcg 1.10 reset_connection ();
780     }
781    
782     void
783 pcg 1.1 connection::send_ping (const sockinfo &si, u8 pong)
784     {
785     ping_packet *pkt = new ping_packet;
786    
787     pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING);
788 pcg 1.73
789 pcg 1.79 slog (L_TRACE, "%s << %s [%s]", conf->nodename, pong ? "PT_PONG" : "PT_PING", (const char *)si);
790 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_LOWDELAY);
791 pcg 1.1
792     delete pkt;
793     }
794    
795     void
796     connection::send_reset (const sockinfo &si)
797     {
798     if (reset_rate_limiter.can (si) && connectmode != conf_node::C_DISABLED)
799     {
800     config_packet *pkt = new config_packet;
801    
802     pkt->setup (vpn_packet::PT_RESET, conf->id);
803 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_MINCOST);
804 pcg 1.1
805     delete pkt;
806     }
807     }
808    
809     void
810     connection::send_auth_request (const sockinfo &si, bool initiate)
811     {
812     auth_req_packet *pkt = new auth_req_packet (conf->id, initiate, THISNODE->protocols);
813    
814 root 1.98 generate_auth_data ();
815     auth_encrypt (conf->rsa_key, snd_auth, pkt->encr);
816 pcg 1.1
817 pcg 1.81 slog (L_TRACE, "%s << PT_AUTH_REQ [%s]", conf->nodename, (const char *)si);
818 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_RELIABILITY | IPTOS_LOWDELAY); // rsa is very very costly
819 pcg 1.1
820 pcg 1.6 delete pkt;
821 pcg 1.1 }
822    
823     void
824 root 1.98 connection::send_auth_response (const sockinfo &si)
825 pcg 1.1 {
826     auth_res_packet *pkt = new auth_res_packet (conf->id);
827    
828 root 1.98 auth_hash (rcv_auth, pkt->response.mac);
829     memcpy (pkt->response.ecdh, rcv_ecdh_b, sizeof (rcv_ecdh_b));
830 pcg 1.1
831 pcg 1.80 slog (L_TRACE, "%s << PT_AUTH_RES [%s]", conf->nodename, (const char *)si);
832 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_RELIABILITY); // rsa is very very costly
833 pcg 1.1
834     delete pkt;
835     }
836    
837     void
838     connection::send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols)
839     {
840 root 1.93 slog (L_TRACE, "%s << PT_CONNECT_INFO(%s,%s,p%02x)", conf->nodename,
841     vpn->conns[rid - 1]->conf->nodename, (const char *)rsi,
842     conf->protocols);
843 pcg 1.1
844     connect_info_packet *r = new connect_info_packet (conf->id, rid, rsi, rprotocols);
845    
846     r->hmac_set (octx);
847 pcg 1.10 send_vpn_packet (r, si);
848 pcg 1.1
849     delete r;
850     }
851    
852 pcg 1.66 inline void
853 pcg 1.60 connection::establish_connection_cb (ev::timer &w, int revents)
854 pcg 1.1 {
855 root 1.92 if (!(ictx && octx)
856 pcg 1.25 && conf != THISNODE
857     && connectmode != conf_node::C_NEVER
858     && connectmode != conf_node::C_DISABLED
859 pcg 1.60 && !w.is_active ())
860 pcg 1.1 {
861 pcg 1.67 // a bit hacky, if ondemand, and packets are no longer queued, then reset the connection
862     // and stop trying. should probably be handled by a per-connection expire handler.
863     if (connectmode == conf_node::C_ONDEMAND && vpn_queue.empty () && data_queue.empty ())
864     {
865     reset_connection ();
866     return;
867     }
868    
869 pcg 1.68 last_establish_attempt = ev_now ();
870    
871 pcg 1.60 ev::tstamp retry_int = ev::tstamp (retry_cnt & 3
872     ? (retry_cnt & 3) + 1
873     : 1 << (retry_cnt >> 2));
874 pcg 1.1
875 pcg 1.47 reset_si ();
876 pcg 1.1
877 pcg 1.47 bool slow = si.prot & PROT_SLOW;
878 pcg 1.8
879 pcg 1.73 if (si.prot && !si.host && vpn->can_direct (THISNODE, conf))
880 pcg 1.60 {
881     /*TODO*/ /* start the timer so we don't recurse endlessly */
882     w.start (1);
883 pcg 1.74 vpn->send_connect_request (this);
884 pcg 1.60 }
885 pcg 1.8 else
886 pcg 1.1 {
887 pcg 1.73 if (si.valid ())
888     slog (L_DEBUG, _("%s: sending direct connection request to %s."),
889     conf->nodename, (const char *)si);
890 pcg 1.61
891 pcg 1.8 const sockinfo &dsi = forward_si (si);
892 pcg 1.6
893 pcg 1.47 slow = slow || (dsi.prot & PROT_SLOW);
894    
895 pcg 1.8 if (dsi.valid () && auth_rate_limiter.can (dsi))
896     {
897     if (retry_cnt < 4)
898     send_auth_request (dsi, true);
899     else
900     send_ping (dsi, 0);
901     }
902 pcg 1.1 }
903 pcg 1.47
904 pcg 1.68 retry_int *= slow ? 8. : 0.9;
905 pcg 1.47
906     if (retry_int < conf->max_retry)
907     retry_cnt++;
908     else
909     retry_int = conf->max_retry;
910    
911 pcg 1.60 w.start (retry_int);
912 pcg 1.1 }
913     }
914    
915     void
916     connection::reset_connection ()
917     {
918     if (ictx && octx)
919     {
920     slog (L_INFO, _("%s(%s): connection lost"),
921     conf->nodename, (const char *)si);
922    
923     if (::conf.script_node_down)
924 pcg 1.64 {
925 pcg 1.70 run_script_cb *cb = new run_script_cb;
926     cb->set<connection, &connection::script_node_down> (this);
927     run_script_queued (cb, _("node-down command execution failed, continuing."));
928 pcg 1.64 }
929 pcg 1.1 }
930    
931     delete ictx; ictx = 0;
932     delete octx; octx = 0;
933    
934 pcg 1.38 si.host = 0;
935 pcg 1.1
936 root 1.98 have_snd_auth = false;
937     have_rcv_auth = false;
938     auth_expire = 0.;
939    
940 pcg 1.73 last_activity = 0.;
941     //last_si_change = 0.;
942 pcg 1.1 retry_cnt = 0;
943    
944 pcg 1.25 rekey.stop ();
945     keepalive.stop ();
946     establish_connection.stop ();
947 pcg 1.1 }
948    
949     void
950     connection::shutdown ()
951     {
952     if (ictx && octx)
953     send_reset (si);
954    
955     reset_connection ();
956     }
957    
958 pcg 1.73 // poor-man's rekeying
959 pcg 1.66 inline void
960 pcg 1.60 connection::rekey_cb (ev::timer &w, int revents)
961 pcg 1.1 {
962     reset_connection ();
963     establish_connection ();
964     }
965    
966     void
967 pcg 1.21 connection::send_data_packet (tap_packet *pkt)
968 pcg 1.1 {
969     vpndata_packet *p = new vpndata_packet;
970     int tos = 0;
971    
972 pcg 1.12 // I am not hilarious about peeking into packets, but so be it.
973 pcg 1.21 if (conf->inherit_tos && pkt->is_ipv4 ())
974 pcg 1.1 tos = (*pkt)[15] & IPTOS_TOS_MASK;
975    
976 pcg 1.21 p->setup (this, conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs
977 pcg 1.10 send_vpn_packet (p, si, tos);
978 pcg 1.1
979     delete p;
980    
981     if (oseqno > MAX_SEQNO)
982     rekey ();
983     }
984    
985     void
986 pcg 1.68 connection::post_inject_queue ()
987     {
988     // force a connection every now and when when packets are sent (max 1/s)
989     if (ev_now () - last_establish_attempt >= 0.95) // arbitrary
990     establish_connection.stop ();
991    
992     establish_connection ();
993     }
994    
995     void
996     connection::inject_data_packet (tap_packet *pkt)
997 pcg 1.1 {
998     if (ictx && octx)
999 pcg 1.21 send_data_packet (pkt);
1000 pcg 1.1 else
1001     {
1002 pcg 1.68 data_queue.put (new tap_packet (*pkt));
1003     post_inject_queue ();
1004 pcg 1.1 }
1005     }
1006    
1007 root 1.90 void
1008     connection::inject_vpn_packet (vpn_packet *pkt, int tos)
1009 pcg 1.8 {
1010     if (ictx && octx)
1011 pcg 1.10 send_vpn_packet (pkt, si, tos);
1012 pcg 1.8 else
1013 pcg 1.12 {
1014 pcg 1.28 vpn_queue.put ((vpn_packet *)new data_packet (*(data_packet *)pkt));
1015 pcg 1.68 post_inject_queue ();
1016 pcg 1.12 }
1017 pcg 1.8 }
1018    
1019 pcg 1.1 void
1020     connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
1021     {
1022 pcg 1.62 last_activity = ev_now ();
1023 pcg 1.1
1024 root 1.91 slog (L_NOISE, "%s >> received packet type %d from %d to %d.",
1025 pcg 1.79 conf->nodename, pkt->typ (), pkt->src (), pkt->dst ());
1026 pcg 1.1
1027 pcg 1.61 if (connectmode == conf_node::C_DISABLED)
1028     return;
1029    
1030 pcg 1.1 switch (pkt->typ ())
1031     {
1032 pcg 1.3 case vpn_packet::PT_PING:
1033 pcg 1.79 slog (L_TRACE, "%s >> PT_PING", conf->nodename);
1034    
1035 pcg 1.3 // we send pings instead of auth packets after some retries,
1036     // so reset the retry counter and establish a connection
1037     // when we receive a ping.
1038 root 1.89 if (!ictx)
1039 pcg 1.3 {
1040     if (auth_rate_limiter.can (rsi))
1041     send_auth_request (rsi, true);
1042     }
1043     else
1044 root 1.89 // we would love to change the socket address here, but ping's aren't
1045 pcg 1.73 // authenticated, so we best ignore it.
1046 pcg 1.3 send_ping (rsi, 1); // pong
1047    
1048     break;
1049    
1050     case vpn_packet::PT_PONG:
1051 pcg 1.79 slog (L_TRACE, "%s >> PT_PONG", conf->nodename);
1052 root 1.89
1053     // a PONG might mean that the other side doesn't really know
1054     // about our desire for communication.
1055     establish_connection ();
1056 pcg 1.3 break;
1057    
1058     case vpn_packet::PT_RESET:
1059 pcg 1.1 {
1060 pcg 1.3 reset_connection ();
1061    
1062     config_packet *p = (config_packet *) pkt;
1063    
1064     if (!p->chk_config ())
1065     {
1066 pcg 1.73 slog (L_WARN, _("%s(%s): protocol mismatch, disabling node."),
1067 pcg 1.3 conf->nodename, (const char *)rsi);
1068     connectmode = conf_node::C_DISABLED;
1069     }
1070     else if (connectmode == conf_node::C_ALWAYS)
1071     establish_connection ();
1072 pcg 1.1 }
1073 pcg 1.3 break;
1074    
1075     case vpn_packet::PT_AUTH_REQ:
1076     if (auth_rate_limiter.can (rsi))
1077     {
1078 root 1.93 auth_req_packet *p = (auth_req_packet *)pkt;
1079 pcg 1.3
1080 root 1.93 slog (L_TRACE, "%s >> PT_AUTH_REQ(%s,p%02x,f%02x)",
1081     conf->nodename, p->initiate ? "initiate" : "reply",
1082     p->protocols, p->features);
1083 pcg 1.1
1084 root 1.98 if (p->chk_config () && !memcmp (p->magic, MAGIC, 8))
1085 pcg 1.3 {
1086     if (p->prot_minor != PROTOCOL_MINOR)
1087     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
1088     conf->nodename, (const char *)rsi,
1089     PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1090    
1091     if (p->initiate)
1092     send_auth_request (rsi, false);
1093    
1094 root 1.98 auth_data auth;
1095 pcg 1.3
1096 root 1.98 if (!auth_decrypt (::conf.rsa_key, p->encr, auth))
1097 pcg 1.23 {
1098     slog (L_ERR, _("%s(%s): challenge illegal or corrupted (%s). mismatched key or config file?"),
1099     conf->nodename, (const char *)rsi, ERR_error_string (ERR_get_error (), 0));
1100     }
1101 pcg 1.3 else
1102     {
1103 root 1.98 bool chg = !have_rcv_auth || memcmp (&rcv_auth, &auth, sizeof auth);
1104 pcg 1.1
1105 root 1.98 rcv_auth = auth;
1106     have_rcv_auth = true;
1107 pcg 1.1
1108 root 1.98 send_auth_response (rsi);
1109 pcg 1.10
1110 root 1.98 if (chg)
1111     {
1112     conf->protocols = p->protocols;
1113     features = p->features & config_packet::get_features ();
1114 pcg 1.3
1115 root 1.98 connection_established (rsi);
1116     }
1117     }
1118 pcg 1.10
1119 root 1.98 break;
1120 pcg 1.3 }
1121 pcg 1.15 else
1122 pcg 1.73 slog (L_WARN, _("%s(%s): protocol mismatch."),
1123 pcg 1.15 conf->nodename, (const char *)rsi);
1124 pcg 1.3
1125     send_reset (rsi);
1126 pcg 1.1 }
1127    
1128 pcg 1.3 break;
1129    
1130     case vpn_packet::PT_AUTH_RES:
1131 pcg 1.1 {
1132 pcg 1.79 auth_res_packet *p = (auth_res_packet *)pkt;
1133 pcg 1.1
1134 pcg 1.81 slog (L_TRACE, "%s >> PT_AUTH_RES", conf->nodename);
1135 pcg 1.1
1136 pcg 1.3 if (p->chk_config ())
1137 pcg 1.1 {
1138 root 1.98 if (memcmp (&p->response.mac, snd_auth_mac, sizeof (snd_auth_mac)))
1139 pcg 1.13 {
1140 root 1.98 slog (L_ERR, _("%s(%s): unrequested or outdated auth response, ignoring."),
1141 pcg 1.13 conf->nodename, (const char *)rsi);
1142     }
1143 root 1.98 else if (!have_snd_auth)
1144 pcg 1.1 {
1145 root 1.98 if (p->prot_minor != PROTOCOL_MINOR)
1146     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
1147     conf->nodename, (const char *)rsi,
1148     PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1149 pcg 1.3
1150 root 1.98 prot_minor = p->prot_minor;
1151     memcpy (snd_ecdh_b, p->response.ecdh, sizeof (snd_ecdh_b));
1152 pcg 1.1
1153 root 1.98 have_snd_auth = true;
1154     connection_established (rsi);
1155 pcg 1.1 }
1156 root 1.98
1157     break;
1158 pcg 1.1 }
1159     }
1160    
1161 pcg 1.3 send_reset (rsi);
1162     break;
1163 pcg 1.1
1164 pcg 1.3 case vpn_packet::PT_DATA_COMPRESSED:
1165     #if !ENABLE_COMPRESSION
1166     send_reset (rsi);
1167     break;
1168     #endif
1169 pcg 1.1
1170 pcg 1.3 case vpn_packet::PT_DATA_UNCOMPRESSED:
1171 pcg 1.1
1172 pcg 1.3 if (ictx && octx)
1173 pcg 1.1 {
1174 pcg 1.3 vpndata_packet *p = (vpndata_packet *)pkt;
1175 pcg 1.1
1176 pcg 1.10 if (!p->hmac_chk (ictx))
1177     slog (L_ERR, _("%s(%s): hmac authentication error, received invalid packet\n"
1178 pcg 1.73 "could be an attack, or just corruption or a synchronization error."),
1179 pcg 1.10 conf->nodename, (const char *)rsi);
1180     else
1181 pcg 1.1 {
1182 pcg 1.10 u32 seqno;
1183     tap_packet *d = p->unpack (this, seqno);
1184 pcg 1.73 int seqclass = iseqno.seqno_classify (seqno);
1185 pcg 1.10
1186 pcg 1.73 if (seqclass == 0) // ok
1187 pcg 1.1 {
1188 pcg 1.10 vpn->tap->send (d);
1189 pcg 1.1
1190 pcg 1.10 if (si != rsi)
1191 pcg 1.1 {
1192 pcg 1.56 // fast re-sync on source address changes, useful especially for tcp/ip
1193 pcg 1.73 //if (last_si_change < ev_now () + 5.)
1194     // {
1195 pcg 1.78 slog (L_INFO, _("%s(%s): changing socket address to %s."),
1196     conf->nodename, (const char *)si, (const char *)rsi);
1197    
1198 pcg 1.73 si = rsi;
1199 pcg 1.84
1200     if (::conf.script_node_change)
1201     {
1202     run_script_cb *cb = new run_script_cb;
1203     cb->set<connection, &connection::script_node_change> (this);
1204     run_script_queued (cb, _("node-change command execution failed, continuing."));
1205     }
1206    
1207 pcg 1.73 // }
1208     //else
1209     // slog (L_INFO, _("%s(%s): accepted packet from %s, not (yet) redirecting traffic."),
1210     // conf->nodename, (const char *)si, (const char *)rsi);
1211 pcg 1.10 }
1212 pcg 1.32 }
1213 pcg 1.75 else if (seqclass == 1) // far history
1214     slog (L_ERR, _("received very old packet (received %08lx, expected %08lx). "
1215     "possible replay attack, or just packet duplication/delay, ignoring."), seqno, iseqno.seq + 1);
1216     else if (seqclass == 2) // in-window duplicate, happens often on wireless
1217     slog (L_DEBUG, _("received recent duplicated packet (received %08lx, expected %08lx). "
1218     "possible replay attack, or just packet duplication, ignoring."), seqno, iseqno.seq + 1);
1219     else if (seqclass == 3) // reset
1220 pcg 1.73 {
1221 pcg 1.75 slog (L_ERR, _("received out-of-sync (far future) packet (received %08lx, expected %08lx). "
1222     "probably just massive packet loss, sending reset."), seqno, iseqno.seq + 1);
1223 pcg 1.73 send_reset (rsi);
1224     }
1225 pcg 1.3
1226 pcg 1.32 delete d;
1227     break;
1228 pcg 1.1 }
1229     }
1230    
1231 pcg 1.3 send_reset (rsi);
1232     break;
1233 pcg 1.1
1234 pcg 1.3 case vpn_packet::PT_CONNECT_REQ:
1235     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1236     {
1237 pcg 1.84 connect_req_packet *p = (connect_req_packet *)pkt;
1238 pcg 1.1
1239 pcg 1.57 if (p->id > 0 && p->id <= vpn->conns.size ())
1240     {
1241     connection *c = vpn->conns[p->id - 1];
1242     conf->protocols = p->protocols;
1243 pcg 1.1
1244 root 1.93 slog (L_TRACE, "%s >> PT_CONNECT_REQ(%s,p%02x) [%d]",
1245     conf->nodename, vpn->conns[p->id - 1]->conf->nodename,
1246     p->protocols,
1247     c->ictx && c->octx);
1248 pcg 1.1
1249 pcg 1.57 if (c->ictx && c->octx)
1250     {
1251     // send connect_info packets to both sides, in case one is
1252     // behind a nat firewall (or both ;)
1253     c->send_connect_info (conf->id, si, conf->protocols);
1254     send_connect_info (c->conf->id, c->si, c->conf->protocols);
1255     }
1256     else
1257     c->establish_connection ();
1258 pcg 1.3 }
1259 pcg 1.11 else
1260 pcg 1.57 slog (L_WARN,
1261     _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1262     p->id);
1263 pcg 1.3 }
1264 pcg 1.1
1265 pcg 1.3 break;
1266 pcg 1.1
1267 pcg 1.3 case vpn_packet::PT_CONNECT_INFO:
1268     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1269     {
1270 pcg 1.39 connect_info_packet *p = (connect_info_packet *)pkt;
1271 pcg 1.1
1272 pcg 1.57 if (p->id > 0 && p->id <= vpn->conns.size ())
1273 pcg 1.39 {
1274     connection *c = vpn->conns[p->id - 1];
1275 pcg 1.7
1276 pcg 1.39 c->conf->protocols = p->protocols;
1277     protocol = best_protocol (c->conf->protocols & THISNODE->protocols & p->si.supported_protocols (c->conf));
1278     p->si.upgrade_protocol (protocol, c->conf);
1279 pcg 1.1
1280 root 1.96 slog (L_TRACE, "%s >> PT_CONNECT_INFO(%s,%s,protocols=%02x,protocol=%02x,upgradable=%02x) [%d]",
1281 root 1.93 conf->nodename,
1282     vpn->conns[p->id - 1]->conf->nodename,
1283     (const char *)p->si,
1284     p->protocols,
1285 root 1.96 protocol,
1286     p->si.supported_protocols (c->conf),
1287 root 1.93 !c->ictx && !c->octx);
1288 pcg 1.7
1289 pcg 1.39 const sockinfo &dsi = forward_si (p->si);
1290 pcg 1.1
1291 pcg 1.39 if (dsi.valid ())
1292     c->send_auth_request (dsi, true);
1293 root 1.96 else
1294     slog (L_INFO, "connect info for %s received (%s), but still unable to contact.",
1295     vpn->conns[p->id - 1]->conf->nodename,
1296     (const char *)p->si);
1297 pcg 1.39 }
1298 pcg 1.57 else
1299     slog (L_WARN,
1300     _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1301     p->id);
1302 pcg 1.3 }
1303 pcg 1.1
1304 pcg 1.3 break;
1305 pcg 1.1
1306 pcg 1.3 default:
1307     send_reset (rsi);
1308     break;
1309 pcg 1.1 }
1310     }
1311    
1312 pcg 1.66 inline void
1313     connection::keepalive_cb (ev::timer &w, int revents)
1314 pcg 1.1 {
1315 root 1.97 ev_tstamp when = last_activity + ::conf.keepalive - ev::now ();
1316    
1317     if (when >= 0)
1318     w.start (when);
1319     else if (when < -15)
1320 pcg 1.1 {
1321     reset_connection ();
1322     establish_connection ();
1323     }
1324     else if (conf->connectmode != conf_node::C_ONDEMAND
1325     || THISNODE->connectmode != conf_node::C_ONDEMAND)
1326     {
1327 root 1.97 w.start (3);
1328 pcg 1.1 send_ping (si);
1329     }
1330 root 1.97 else if (when >= -10)
1331 pcg 1.12 // hold ondemand connections implicitly a few seconds longer
1332     // should delete octx, though, or something like that ;)
1333 root 1.97 w.start (when + 10);
1334 pcg 1.1 else
1335     reset_connection ();
1336     }
1337    
1338 root 1.90 void
1339     connection::send_connect_request (int id)
1340 pcg 1.1 {
1341 root 1.93 connect_req_packet *p = new connect_req_packet (conf->id, id, THISNODE->protocols);
1342 pcg 1.1
1343 root 1.93 slog (L_TRACE, "%s << PT_CONNECT_REQ(%s,p%02x)",
1344     conf->nodename, vpn->conns[id - 1]->conf->nodename,
1345     THISNODE->protocols);
1346 pcg 1.1 p->hmac_set (octx);
1347 pcg 1.10 send_vpn_packet (p, si);
1348 pcg 1.1
1349     delete p;
1350     }
1351    
1352 root 1.90 void
1353     connection::script_init_env (const char *ext)
1354 pcg 1.53 {
1355     char *env;
1356     asprintf (&env, "IFUPDATA%s=%s", ext, conf->if_up_data); putenv (env);
1357 pcg 1.84 asprintf (&env, "NODENAME%s=%s", ext, conf->nodename); putenv (env);
1358 pcg 1.53 asprintf (&env, "MAC%s=%02x:%02x:%02x:%02x:%02x:%02x", ext,
1359     0xfe, 0xfd, 0x80, 0x00, conf->id >> 8,
1360 pcg 1.84 conf->id & 0xff); putenv (env);
1361 pcg 1.53 }
1362    
1363 root 1.90 void
1364     connection::script_init_connect_env ()
1365 pcg 1.1 {
1366 pcg 1.52 vpn->script_init_env ();
1367 pcg 1.1
1368     char *env;
1369 pcg 1.84 asprintf (&env, "DESTID=%d", conf->id); putenv (env);
1370     asprintf (&env, "DESTSI=%s", (const char *)si); putenv (env);
1371     asprintf (&env, "DESTNODE=%s", conf->nodename); putenv (env);
1372     asprintf (&env, "DESTIP=%s", si.ntoa ()); putenv (env);
1373     asprintf (&env, "DESTPORT=%d", ntohs (si.port)); putenv (env);
1374 pcg 1.1 }
1375    
1376 pcg 1.66 inline const char *
1377     connection::script_node_up ()
1378 pcg 1.1 {
1379 pcg 1.53 script_init_connect_env ();
1380 pcg 1.1
1381 pcg 1.60 putenv ((char *)"STATE=up");
1382 pcg 1.1
1383 pcg 1.52 char *filename;
1384     asprintf (&filename,
1385     "%s/%s",
1386     confbase,
1387     ::conf.script_node_up ? ::conf.script_node_up : "node-up");
1388 pcg 1.54
1389     return filename;
1390 pcg 1.1 }
1391    
1392 pcg 1.66 inline const char *
1393 pcg 1.84 connection::script_node_change ()
1394     {
1395     script_init_connect_env ();
1396    
1397     putenv ((char *)"STATE=change");
1398    
1399     char *filename;
1400     asprintf (&filename,
1401     "%s/%s",
1402     confbase,
1403     ::conf.script_node_change ? ::conf.script_node_change : "node-change");
1404    
1405     return filename;
1406     }
1407    
1408     inline const char *
1409 pcg 1.66 connection::script_node_down ()
1410 pcg 1.1 {
1411 pcg 1.53 script_init_connect_env ();
1412 pcg 1.1
1413 pcg 1.60 putenv ((char *)"STATE=down");
1414 pcg 1.1
1415 pcg 1.52 char *filename;
1416     asprintf (&filename,
1417     "%s/%s",
1418     confbase,
1419     ::conf.script_node_down ? ::conf.script_node_down : "node-down");
1420 pcg 1.54
1421     return filename;
1422 pcg 1.1 }
1423    
1424 pcg 1.40 connection::connection (struct vpn *vpn, conf_node *conf)
1425 pcg 1.67 : vpn(vpn), conf(conf),
1426 pcg 1.40 #if ENABLE_DNS
1427 pcg 1.67 dns (0),
1428 pcg 1.40 #endif
1429 pcg 1.72 data_queue(conf->max_ttl, conf->max_queue + 1),
1430     vpn_queue(conf->max_ttl, conf->max_queue + 1)
1431 pcg 1.1 {
1432 pcg 1.65 rekey .set<connection, &connection::rekey_cb > (this);
1433     keepalive .set<connection, &connection::keepalive_cb > (this);
1434     establish_connection.set<connection, &connection::establish_connection_cb> (this);
1435    
1436 pcg 1.68 last_establish_attempt = 0.;
1437 pcg 1.1 octx = ictx = 0;
1438    
1439 pcg 1.67 connectmode = conf->connectmode;
1440    
1441     // queue a dummy packet to force an initial connection attempt
1442     if (connectmode != conf_node::C_ALWAYS && connectmode != conf_node::C_DISABLED)
1443 pcg 1.68 vpn_queue.put (new net_packet);
1444 pcg 1.67
1445 pcg 1.1 reset_connection ();
1446     }
1447    
1448     connection::~connection ()
1449     {
1450     shutdown ();
1451     }
1452    
1453 root 1.90 void
1454     connection_init ()
1455 pcg 1.1 {
1456     auth_rate_limiter.clear ();
1457     reset_rate_limiter.clear ();
1458     }
1459