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