ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/protocol.C
Revision: 1.23
Committed: Fri Mar 28 05:40:54 2003 UTC (21 years, 2 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.22: +1 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     protocol.C -- handle the protocol, encryption, handshaking etc.
3    
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8    
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12     GNU General Public License for more details.
13    
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17     */
18    
19     #include "config.h"
20    
21 pcg 1.10 #include <list>
22    
23 pcg 1.1 #include <cstdlib>
24     #include <cstring>
25     #include <cstdio>
26    
27     #include <sys/types.h>
28     #include <sys/socket.h>
29     #include <sys/poll.h>
30     #include <sys/wait.h>
31     #include <netinet/in.h>
32     #include <arpa/inet.h>
33     #include <errno.h>
34     #include <time.h>
35     #include <unistd.h>
36    
37     #include <openssl/rand.h>
38     #include <openssl/hmac.h>
39     #include <openssl/evp.h>
40     #include <openssl/rsa.h>
41     #include <openssl/err.h>
42    
43     extern "C" {
44     # include "lzf/lzf.h"
45     }
46    
47     #include "gettext.h"
48     #include "pidfile.h"
49    
50     #include "conf.h"
51     #include "slog.h"
52     #include "device.h"
53     #include "protocol.h"
54    
55     #if !HAVE_RAND_PSEUDO_BYTES
56     # define RAND_pseudo_bytes RAND_bytes
57     #endif
58    
59     static time_t next_timecheck;
60    
61     #define MAGIC "vped\xbd\xc6\xdb\x82" // 8 bytes of magic
62    
63 pcg 1.21 static u8
64     best_protocol (u8 protset)
65     {
66     if (protset & PROT_IPv4)
67     return PROT_IPv4;
68    
69     return PROT_UDPv4;
70     }
71    
72 pcg 1.17 struct crypto_ctx
73     {
74     EVP_CIPHER_CTX cctx;
75     HMAC_CTX hctx;
76    
77     crypto_ctx (const rsachallenge &challenge, int enc);
78     ~crypto_ctx ();
79     };
80    
81     crypto_ctx::crypto_ctx (const rsachallenge &challenge, int enc)
82     {
83     EVP_CIPHER_CTX_init (&cctx);
84     EVP_CipherInit_ex (&cctx, CIPHER, 0, &challenge[CHG_CIPHER_KEY], 0, enc);
85     HMAC_CTX_init (&hctx);
86     HMAC_Init_ex (&hctx, &challenge[CHG_HMAC_KEY], HMAC_KEYLEN, DIGEST, 0);
87     }
88    
89     crypto_ctx::~crypto_ctx ()
90 pcg 1.1 {
91 pcg 1.17 EVP_CIPHER_CTX_cleanup (&cctx);
92     HMAC_CTX_cleanup (&hctx);
93     }
94 pcg 1.1
95 pcg 1.17 static void
96 pcg 1.19 rsa_hash (const rsaid &id, const rsachallenge &chg, rsaresponse &h)
97 pcg 1.17 {
98     EVP_MD_CTX ctx;
99 pcg 1.1
100 pcg 1.17 EVP_MD_CTX_init (&ctx);
101     EVP_DigestInit (&ctx, RSA_HASH);
102     EVP_DigestUpdate(&ctx, &chg, sizeof chg);
103 pcg 1.19 EVP_DigestUpdate(&ctx, &id, sizeof id);
104 pcg 1.17 EVP_DigestFinal (&ctx, (unsigned char *)&h, 0);
105     EVP_MD_CTX_cleanup (&ctx);
106 pcg 1.1 }
107    
108 pcg 1.10 struct rsa_entry {
109     tstamp expire;
110 pcg 1.17 rsaid id;
111 pcg 1.10 rsachallenge chg;
112     };
113    
114     struct rsa_cache : list<rsa_entry>
115     {
116     void cleaner_cb (tstamp &ts); time_watcher cleaner;
117    
118 pcg 1.17 bool find (const rsaid &id, rsachallenge &chg)
119 pcg 1.10 {
120     for (iterator i = begin (); i != end (); ++i)
121 pcg 1.17 {
122     if (!memcmp (&id, &i->id, sizeof id) && i->expire > NOW)
123     {
124     memcpy (&chg, &i->chg, sizeof chg);
125    
126     erase (i);
127     return true;
128     }
129     }
130 pcg 1.10
131     if (cleaner.at < NOW)
132 pcg 1.17 cleaner.start (NOW + RSA_TTL);
133 pcg 1.10
134 pcg 1.17 return false;
135 pcg 1.10 }
136    
137 pcg 1.17 void gen (rsaid &id, rsachallenge &chg)
138 pcg 1.10 {
139 pcg 1.17 rsa_entry e;
140 pcg 1.10
141 pcg 1.17 RAND_bytes ((unsigned char *)&id, sizeof id);
142     RAND_bytes ((unsigned char *)&chg, sizeof chg);
143 pcg 1.10
144 pcg 1.17 e.expire = NOW + RSA_TTL;
145     e.id = id;
146     memcpy (&e.chg, &chg, sizeof chg);
147 pcg 1.10
148 pcg 1.17 push_back (e);
149 pcg 1.10
150 pcg 1.17 if (cleaner.at < NOW)
151     cleaner.start (NOW + RSA_TTL);
152 pcg 1.10 }
153    
154     rsa_cache ()
155     : cleaner (this, &rsa_cache::cleaner_cb)
156     { }
157    
158     } rsa_cache;
159    
160     void rsa_cache::cleaner_cb (tstamp &ts)
161     {
162     if (empty ())
163     ts = TSTAMP_CANCEL;
164     else
165     {
166 pcg 1.17 ts = NOW + RSA_TTL;
167    
168 pcg 1.10 for (iterator i = begin (); i != end (); )
169 pcg 1.17 if (i->expire <= NOW)
170     i = erase (i);
171     else
172     ++i;
173 pcg 1.10 }
174     }
175    
176 pcg 1.17 typedef callback<const char *, int> run_script_cb;
177    
178     // run a shell script (or actually an external program).
179 pcg 1.1 static void
180 pcg 1.17 run_script (const run_script_cb &cb, bool wait)
181 pcg 1.1 {
182     int pid;
183    
184     if ((pid = fork ()) == 0)
185     {
186     char *filename;
187 pcg 1.17 asprintf (&filename, "%s/%s", confbase, cb(0));
188 pcg 1.1 execl (filename, filename, (char *) 0);
189     exit (255);
190     }
191     else if (pid > 0)
192     {
193     if (wait)
194     {
195     waitpid (pid, 0, 0);
196     /* TODO: check status */
197     }
198     }
199     }
200    
201 pcg 1.9 //////////////////////////////////////////////////////////////////////////////
202    
203     void pkt_queue::put (tap_packet *p)
204     {
205     if (queue[i])
206     {
207     delete queue[i];
208     j = (j + 1) % QUEUEDEPTH;
209     }
210    
211     queue[i] = p;
212    
213     i = (i + 1) % QUEUEDEPTH;
214     }
215    
216     tap_packet *pkt_queue::get ()
217     {
218     tap_packet *p = queue[j];
219    
220     if (p)
221     {
222     queue[j] = 0;
223     j = (j + 1) % QUEUEDEPTH;
224     }
225    
226     return p;
227     }
228    
229     pkt_queue::pkt_queue ()
230     {
231     memset (queue, 0, sizeof (queue));
232     i = 0;
233     j = 0;
234     }
235    
236     pkt_queue::~pkt_queue ()
237     {
238     for (i = QUEUEDEPTH; --i > 0; )
239     delete queue[i];
240     }
241    
242 pcg 1.16 struct net_rateinfo {
243     u32 host;
244     double pcnt, diff;
245     tstamp last;
246     };
247 pcg 1.9
248 pcg 1.16 // only do action once every x seconds per host whole allowing bursts.
249     // this implementation ("splay list" ;) is inefficient,
250     // but low on resources.
251 pcg 1.21 struct net_rate_limiter : list<net_rateinfo>
252 pcg 1.16 {
253     static const double ALPHA = 1. - 1. / 90.; // allow bursts
254     static const double CUTOFF = 20.; // one event every CUTOFF seconds
255     static const double EXPIRE = CUTOFF * 30.; // expire entries after this time
256    
257 pcg 1.21 bool can (const sockinfo &si) { return can((u32)si.host); }
258 pcg 1.16 bool can (u32 host);
259     };
260 pcg 1.9
261 pcg 1.16 net_rate_limiter auth_rate_limiter, reset_rate_limiter;
262 pcg 1.9
263 pcg 1.16 bool net_rate_limiter::can (u32 host)
264 pcg 1.9 {
265     iterator i;
266    
267     for (i = begin (); i != end (); )
268 pcg 1.16 if (i->host == host)
269     break;
270     else if (i->last < NOW - EXPIRE)
271     i = erase (i);
272 pcg 1.9 else
273 pcg 1.16 i++;
274    
275     if (i == end ())
276     {
277     net_rateinfo ri;
278    
279     ri.host = host;
280     ri.pcnt = 1.;
281     ri.diff = CUTOFF * (1. / (1. - ALPHA));
282     ri.last = NOW;
283    
284     push_front (ri);
285    
286     return true;
287     }
288     else
289     {
290     net_rateinfo ri (*i);
291     erase (i);
292    
293     ri.pcnt = ri.pcnt * ALPHA;
294     ri.diff = ri.diff * ALPHA + (NOW - ri.last);
295    
296     ri.last = NOW;
297    
298     bool send = ri.diff / ri.pcnt > CUTOFF;
299 pcg 1.9
300 pcg 1.16 if (send)
301     ri.pcnt++;
302 pcg 1.9
303 pcg 1.16 push_front (ri);
304 pcg 1.9
305 pcg 1.16 return send;
306     }
307 pcg 1.9 }
308    
309 pcg 1.1 /////////////////////////////////////////////////////////////////////////////
310    
311     static void next_wakeup (time_t next)
312     {
313     if (next_timecheck > next)
314     next_timecheck = next;
315     }
316    
317     static unsigned char hmac_digest[EVP_MAX_MD_SIZE];
318    
319     struct hmac_packet:net_packet
320 pcg 1.18 {
321     u8 hmac[HMACLENGTH]; // each and every packet has a hmac field, but that is not (yet) checked everywhere
322 pcg 1.1
323 pcg 1.18 void hmac_set (crypto_ctx * ctx);
324     bool hmac_chk (crypto_ctx * ctx);
325 pcg 1.1
326     private:
327 pcg 1.18 void hmac_gen (crypto_ctx * ctx)
328     {
329     unsigned int xlen;
330     HMAC_CTX *hctx = &ctx->hctx;
331 pcg 1.1
332 pcg 1.18 HMAC_Init_ex (hctx, 0, 0, 0, 0);
333     HMAC_Update (hctx, ((unsigned char *) this) + sizeof (hmac_packet),
334     len - sizeof (hmac_packet));
335     HMAC_Final (hctx, (unsigned char *) &hmac_digest, &xlen);
336     }
337     };
338 pcg 1.1
339     void
340     hmac_packet::hmac_set (crypto_ctx * ctx)
341     {
342     hmac_gen (ctx);
343    
344     memcpy (hmac, hmac_digest, HMACLENGTH);
345     }
346    
347     bool
348     hmac_packet::hmac_chk (crypto_ctx * ctx)
349     {
350     hmac_gen (ctx);
351    
352     return !memcmp (hmac, hmac_digest, HMACLENGTH);
353     }
354    
355     struct vpn_packet : hmac_packet
356     {
357     enum ptype
358     {
359     PT_RESET = 0,
360     PT_DATA_UNCOMPRESSED,
361     PT_DATA_COMPRESSED,
362     PT_PING, PT_PONG, // wasting namespace space? ;)
363 pcg 1.17 PT_AUTH_REQ, // authentification request
364     PT_AUTH_RES, // authentification response
365 pcg 1.1 PT_CONNECT_REQ, // want other host to contact me
366     PT_CONNECT_INFO, // request connection to some node
367     PT_MAX
368     };
369    
370     u8 type;
371     u8 srcdst, src1, dst1;
372    
373     void set_hdr (ptype type, unsigned int dst);
374    
375 pcg 1.21 unsigned int src () const
376 pcg 1.1 {
377     return src1 | ((srcdst >> 4) << 8);
378     }
379 pcg 1.9
380 pcg 1.21 unsigned int dst () const
381 pcg 1.1 {
382     return dst1 | ((srcdst & 0xf) << 8);
383     }
384 pcg 1.9
385 pcg 1.21 ptype typ () const
386 pcg 1.1 {
387     return (ptype) type;
388     }
389     };
390    
391     void vpn_packet::set_hdr (ptype type, unsigned int dst)
392     {
393     this->type = type;
394    
395     int src = THISNODE->id;
396    
397     src1 = src;
398     srcdst = ((src >> 8) << 4) | (dst >> 8);
399     dst1 = dst;
400     }
401    
402     #define MAXVPNDATA (MAX_MTU - 6 - 6)
403     #define DATAHDR (sizeof (u32) + RAND_SIZE)
404    
405     struct vpndata_packet:vpn_packet
406     {
407     u8 data[MAXVPNDATA + DATAHDR]; // seqno
408    
409     void setup (connection *conn, int dst, u8 *d, u32 len, u32 seqno);
410     tap_packet *unpack (connection *conn, u32 &seqno);
411     private:
412    
413     const u32 data_hdr_size () const
414     {
415     return sizeof (vpndata_packet) - sizeof (net_packet) - MAXVPNDATA - DATAHDR;
416     }
417     };
418    
419     void
420     vpndata_packet::setup (connection *conn, int dst, u8 *d, u32 l, u32 seqno)
421     {
422     EVP_CIPHER_CTX *cctx = &conn->octx->cctx;
423     int outl = 0, outl2;
424     ptype type = PT_DATA_UNCOMPRESSED;
425    
426     #if ENABLE_COMPRESSION
427     u8 cdata[MAX_MTU];
428     u32 cl;
429    
430     cl = lzf_compress (d, l, cdata + 2, (l - 2) & ~7);
431     if (cl)
432     {
433     type = PT_DATA_COMPRESSED;
434     d = cdata;
435     l = cl + 2;
436    
437     d[0] = cl >> 8;
438     d[1] = cl;
439     }
440     #endif
441    
442     EVP_EncryptInit_ex (cctx, 0, 0, 0, 0);
443    
444 pcg 1.13 struct {
445 pcg 1.1 #if RAND_SIZE
446     u8 rnd[RAND_SIZE];
447 pcg 1.13 #endif
448 pcg 1.1 u32 seqno;
449     } datahdr;
450    
451 pcg 1.12 datahdr.seqno = ntohl (seqno);
452 pcg 1.13 #if RAND_SIZE
453 pcg 1.1 RAND_pseudo_bytes ((unsigned char *) datahdr.rnd, RAND_SIZE);
454 pcg 1.13 #endif
455 pcg 1.1
456     EVP_EncryptUpdate (cctx,
457     (unsigned char *) data + outl, &outl2,
458     (unsigned char *) &datahdr, DATAHDR);
459     outl += outl2;
460    
461     EVP_EncryptUpdate (cctx,
462     (unsigned char *) data + outl, &outl2,
463     (unsigned char *) d, l);
464     outl += outl2;
465    
466     EVP_EncryptFinal_ex (cctx, (unsigned char *) data + outl, &outl2);
467     outl += outl2;
468    
469     len = outl + data_hdr_size ();
470    
471     set_hdr (type, dst);
472    
473     hmac_set (conn->octx);
474     }
475    
476     tap_packet *
477     vpndata_packet::unpack (connection *conn, u32 &seqno)
478     {
479     EVP_CIPHER_CTX *cctx = &conn->ictx->cctx;
480     int outl = 0, outl2;
481     tap_packet *p = new tap_packet;
482     u8 *d;
483     u32 l = len - data_hdr_size ();
484    
485     EVP_DecryptInit_ex (cctx, 0, 0, 0, 0);
486    
487     #if ENABLE_COMPRESSION
488     u8 cdata[MAX_MTU];
489    
490     if (type == PT_DATA_COMPRESSED)
491     d = cdata;
492     else
493     #endif
494     d = &(*p)[6 + 6 - DATAHDR];
495    
496     /* this overwrites part of the src mac, but we fix that later */
497     EVP_DecryptUpdate (cctx,
498     d, &outl2,
499     (unsigned char *)&data, len - data_hdr_size ());
500     outl += outl2;
501    
502     EVP_DecryptFinal_ex (cctx, (unsigned char *)d + outl, &outl2);
503     outl += outl2;
504    
505 pcg 1.12 seqno = ntohl (*(u32 *)(d + RAND_SIZE));
506 pcg 1.1
507 pcg 1.2 id2mac (dst () ? dst() : THISNODE->id, p->dst);
508     id2mac (src (), p->src);
509 pcg 1.1
510     #if ENABLE_COMPRESSION
511     if (type == PT_DATA_COMPRESSED)
512     {
513     u32 cl = (d[DATAHDR] << 8) | d[DATAHDR + 1];
514 pcg 1.19
515     p->len = lzf_decompress (d + DATAHDR + 2, cl < MAX_MTU ? cl : 0,
516     &(*p)[6 + 6], MAX_MTU)
517     + 6 + 6;
518 pcg 1.1 }
519     else
520     p->len = outl + (6 + 6 - DATAHDR);
521     #endif
522    
523     return p;
524     }
525    
526     struct ping_packet : vpn_packet
527 pcg 1.17 {
528     void setup (int dst, ptype type)
529 pcg 1.1 {
530 pcg 1.17 set_hdr (type, dst);
531     len = sizeof (*this) - sizeof (net_packet);
532     }
533     };
534 pcg 1.1
535     struct config_packet : vpn_packet
536 pcg 1.17 {
537     // actually, hmaclen cannot be checked because the hmac
538     // field comes before this data, so peers with other
539     // hmacs simply will not work.
540     u8 prot_major, prot_minor, randsize, hmaclen;
541     u8 flags, challengelen, pad2, pad3;
542     u32 cipher_nid, digest_nid, hmac_nid;
543    
544     const u8 curflags () const
545 pcg 1.1 {
546 pcg 1.17 return 0x80
547     | (ENABLE_COMPRESSION ? 0x01 : 0x00);
548     }
549    
550 pcg 1.21 void setup (ptype type, int dst);
551     bool chk_config () const;
552     };
553    
554     void config_packet::setup (ptype type, int dst)
555     {
556     prot_major = PROTOCOL_MAJOR;
557     prot_minor = PROTOCOL_MINOR;
558     randsize = RAND_SIZE;
559     hmaclen = HMACLENGTH;
560     flags = curflags ();
561     challengelen = sizeof (rsachallenge);
562    
563     cipher_nid = htonl (EVP_CIPHER_nid (CIPHER));
564     digest_nid = htonl (EVP_MD_type (RSA_HASH));
565     hmac_nid = htonl (EVP_MD_type (DIGEST));
566 pcg 1.1
567 pcg 1.21 len = sizeof (*this) - sizeof (net_packet);
568     set_hdr (type, dst);
569     }
570 pcg 1.17
571 pcg 1.21 bool config_packet::chk_config () const
572     {
573     return prot_major == PROTOCOL_MAJOR
574     && randsize == RAND_SIZE
575     && hmaclen == HMACLENGTH
576     && flags == curflags ()
577     && challengelen == sizeof (rsachallenge)
578     && cipher_nid == htonl (EVP_CIPHER_nid (CIPHER))
579     && digest_nid == htonl (EVP_MD_type (RSA_HASH))
580     && hmac_nid == htonl (EVP_MD_type (DIGEST));
581     }
582 pcg 1.1
583 pcg 1.17 struct auth_req_packet : config_packet
584     {
585     char magic[8];
586 pcg 1.21 u8 initiate, can_recv; // false if this is just an automatic reply
587     u8 pad2, pad3;
588 pcg 1.17 rsaid id;
589     rsaencrdata encr;
590 pcg 1.1
591 pcg 1.21 auth_req_packet (int dst, bool initiate_, u8 can_recv_)
592 pcg 1.17 {
593     config_packet::setup (PT_AUTH_REQ, dst);
594 pcg 1.21 strncpy (magic, MAGIC, 8);
595 pcg 1.17 initiate = !!initiate_;
596 pcg 1.21 can_recv = can_recv_;
597    
598 pcg 1.17 len = sizeof (*this) - sizeof (net_packet);
599     }
600     };
601 pcg 1.1
602 pcg 1.17 struct auth_res_packet : config_packet
603     {
604     rsaid id;
605 pcg 1.19 u8 pad1, pad2, pad3;
606     u8 response_len; // encrypted length
607 pcg 1.17 rsaresponse response;
608 pcg 1.1
609 pcg 1.17 auth_res_packet (int dst)
610 pcg 1.1 {
611 pcg 1.17 config_packet::setup (PT_AUTH_RES, dst);
612 pcg 1.21
613 pcg 1.17 len = sizeof (*this) - sizeof (net_packet);
614     }
615     };
616 pcg 1.1
617     struct connect_req_packet : vpn_packet
618 pcg 1.17 {
619     u8 id;
620     u8 pad1, pad2, pad3;
621    
622     connect_req_packet (int dst, int id_)
623 pcg 1.1 {
624 pcg 1.17 id = id_;
625     set_hdr (PT_CONNECT_REQ, dst);
626     len = sizeof (*this) - sizeof (net_packet);
627     }
628     };
629 pcg 1.1
630 pcg 1.17 struct connect_info_packet : vpn_packet
631     {
632 pcg 1.21 u8 id, can_recv;
633     u8 pad1, pad2;
634 pcg 1.17 sockinfo si;
635 pcg 1.1
636 pcg 1.21 connect_info_packet (int dst, int id_, sockinfo &si_, u8 can_recv_)
637 pcg 1.1 {
638 pcg 1.17 id = id_;
639 pcg 1.21 can_recv = can_recv_;
640 pcg 1.17 si = si_;
641     set_hdr (PT_CONNECT_INFO, dst);
642 pcg 1.21
643 pcg 1.17 len = sizeof (*this) - sizeof (net_packet);
644     }
645     };
646 pcg 1.1
647     /////////////////////////////////////////////////////////////////////////////
648    
649     void
650     connection::reset_dstaddr ()
651     {
652 pcg 1.21 si.set (conf);
653 pcg 1.1 }
654    
655     void
656 pcg 1.21 connection::send_ping (const sockinfo &si, u8 pong)
657 pcg 1.1 {
658     ping_packet *pkt = new ping_packet;
659    
660     pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING);
661 pcg 1.21 send_vpn_packet (pkt, si, IPTOS_LOWDELAY);
662 pcg 1.1
663     delete pkt;
664     }
665    
666     void
667 pcg 1.21 connection::send_reset (const sockinfo &si)
668 pcg 1.1 {
669 pcg 1.21 if (reset_rate_limiter.can (si) && connectmode != conf_node::C_DISABLED)
670 pcg 1.1 {
671     config_packet *pkt = new config_packet;
672    
673     pkt->setup (vpn_packet::PT_RESET, conf->id);
674 pcg 1.21 send_vpn_packet (pkt, si, IPTOS_MINCOST);
675 pcg 1.1
676     delete pkt;
677     }
678     }
679    
680 pcg 1.17 void
681 pcg 1.21 connection::send_auth_request (const sockinfo &si, bool initiate)
682 pcg 1.1 {
683 pcg 1.21 auth_req_packet *pkt = new auth_req_packet (conf->id, initiate, THISNODE->can_recv);
684 pcg 1.17
685 pcg 1.21 // the next line is very conservative
686     prot_send = best_protocol (THISNODE->can_send & THISNODE->can_recv & conf->can_recv);
687 pcg 1.17
688 pcg 1.21 rsachallenge chg;
689 pcg 1.17
690 pcg 1.21 rsa_cache.gen (pkt->id, chg);
691 pcg 1.1
692 pcg 1.21 if (0 > RSA_public_encrypt (sizeof chg,
693     (unsigned char *)&chg, (unsigned char *)&pkt->encr,
694     conf->rsa_key, RSA_PKCS1_OAEP_PADDING))
695     fatal ("RSA_public_encrypt error");
696 pcg 1.1
697 pcg 1.21 slog (L_TRACE, ">>%d PT_AUTH_REQ [%s]", conf->id, (const char *)si);
698 pcg 1.17
699 pcg 1.21 send_vpn_packet (pkt, si, IPTOS_RELIABILITY); // rsa is very very costly
700    
701     delete pkt;
702 pcg 1.1 }
703    
704     void
705 pcg 1.21 connection::send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg)
706 pcg 1.1 {
707 pcg 1.19 auth_res_packet *pkt = new auth_res_packet (conf->id);
708    
709     pkt->id = id;
710    
711     rsa_hash (id, chg, pkt->response);
712 pcg 1.10
713 pcg 1.19 pkt->hmac_set (octx);
714 pcg 1.1
715 pcg 1.21 slog (L_TRACE, ">>%d PT_AUTH_RES [%s]", conf->id, (const char *)si);
716 pcg 1.1
717 pcg 1.21 send_vpn_packet (pkt, si, IPTOS_RELIABILITY); // rsa is very very costly
718 pcg 1.1
719 pcg 1.19 delete pkt;
720 pcg 1.1 }
721    
722     void
723 pcg 1.9 connection::establish_connection_cb (tstamp &ts)
724 pcg 1.1 {
725 pcg 1.18 if (ictx || conf == THISNODE
726     || connectmode == conf_node::C_NEVER
727     || connectmode == conf_node::C_DISABLED)
728 pcg 1.9 ts = TSTAMP_CANCEL;
729     else if (ts <= NOW)
730 pcg 1.1 {
731 pcg 1.17 double retry_int = double (retry_cnt & 3 ? (retry_cnt & 3) : 1 << (retry_cnt >> 2)) * 0.6;
732 pcg 1.1
733 pcg 1.9 if (retry_int < 3600 * 8)
734     retry_cnt++;
735 pcg 1.1
736 pcg 1.9 ts = NOW + retry_int;
737 pcg 1.1
738 pcg 1.9 if (conf->hostname)
739     {
740     reset_dstaddr ();
741 pcg 1.21 if (si.host && auth_rate_limiter.can (si))
742     {
743 pcg 1.9 if (retry_cnt < 4)
744 pcg 1.21 send_auth_request (si, true);
745     else
746     send_ping (si, 0);
747     }
748 pcg 1.1 }
749 pcg 1.9 else
750     vpn->connect_request (conf->id);
751 pcg 1.1 }
752     }
753    
754     void
755     connection::reset_connection ()
756     {
757     if (ictx && octx)
758     {
759 pcg 1.19 slog (L_INFO, _("%s(%s): connection lost"),
760 pcg 1.21 conf->nodename, (const char *)si);
761 pcg 1.1
762     if (::conf.script_node_down)
763 pcg 1.17 run_script (run_script_cb (this, &connection::script_node_down), false);
764 pcg 1.1 }
765    
766 pcg 1.10 delete ictx; ictx = 0;
767     delete octx; octx = 0;
768 pcg 1.1
769 pcg 1.21 si.host= 0;
770 pcg 1.1
771     last_activity = 0;
772 pcg 1.21 retry_cnt = 0;
773 pcg 1.9
774     rekey.reset ();
775     keepalive.reset ();
776     establish_connection.reset ();
777 pcg 1.1 }
778    
779     void
780     connection::shutdown ()
781     {
782     if (ictx && octx)
783 pcg 1.21 send_reset (si);
784 pcg 1.1
785     reset_connection ();
786     }
787    
788     void
789 pcg 1.9 connection::rekey_cb (tstamp &ts)
790 pcg 1.1 {
791 pcg 1.9 ts = TSTAMP_CANCEL;
792    
793 pcg 1.1 reset_connection ();
794     establish_connection ();
795     }
796    
797     void
798 pcg 1.21 connection::send_data_packet (tap_packet *pkt, bool broadcast)
799 pcg 1.1 {
800     vpndata_packet *p = new vpndata_packet;
801 pcg 1.6 int tos = 0;
802    
803     if (conf->inherit_tos
804     && (*pkt)[12] == 0x08 && (*pkt)[13] == 0x00 // IP
805     && ((*pkt)[14] & 0xf0) == 0x40) // IPv4
806     tos = (*pkt)[15] & IPTOS_TOS_MASK;
807 pcg 1.1
808     p->setup (this, broadcast ? 0 : conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs
809 pcg 1.21 send_vpn_packet (p, si, tos);
810 pcg 1.1
811     delete p;
812    
813     if (oseqno > MAX_SEQNO)
814     rekey ();
815     }
816    
817     void
818     connection::inject_data_packet (tap_packet *pkt, bool broadcast)
819     {
820     if (ictx && octx)
821     send_data_packet (pkt, broadcast);
822     else
823     {
824     if (!broadcast)//DDDD
825     queue.put (new tap_packet (*pkt));
826    
827     establish_connection ();
828     }
829     }
830    
831     void
832 pcg 1.21 connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
833 pcg 1.1 {
834 pcg 1.9 last_activity = NOW;
835 pcg 1.1
836     slog (L_NOISE, "<<%d received packet type %d from %d to %d",
837     conf->id, pkt->typ (), pkt->src (), pkt->dst ());
838    
839     switch (pkt->typ ())
840     {
841     case vpn_packet::PT_PING:
842     // we send pings instead of auth packets after some retries,
843 pcg 1.21 // so reset the retry counter and establish a connection
844     // when we receive a ping.
845 pcg 1.22 if (!ictx)
846 pcg 1.1 {
847 pcg 1.21 if (auth_rate_limiter.can (rsi))
848     send_auth_request (rsi, true);
849 pcg 1.1 }
850 pcg 1.16 else
851 pcg 1.21 send_ping (rsi, 1); // pong
852 pcg 1.1
853     break;
854    
855 pcg 1.16 case vpn_packet::PT_PONG:
856     break;
857    
858 pcg 1.1 case vpn_packet::PT_RESET:
859     {
860     reset_connection ();
861    
862     config_packet *p = (config_packet *) pkt;
863 pcg 1.17
864 pcg 1.9 if (!p->chk_config ())
865     {
866 pcg 1.19 slog (L_WARN, _("%s(%s): protocol mismatch, disabling node"),
867 pcg 1.21 conf->nodename, (const char *)rsi);
868 pcg 1.10 connectmode = conf_node::C_DISABLED;
869 pcg 1.9 }
870     else if (connectmode == conf_node::C_ALWAYS)
871     establish_connection ();
872 pcg 1.1 }
873     break;
874    
875 pcg 1.17 case vpn_packet::PT_AUTH_REQ:
876 pcg 1.21 if (auth_rate_limiter.can (rsi))
877 pcg 1.19 {
878     auth_req_packet *p = (auth_req_packet *) pkt;
879 pcg 1.1
880 pcg 1.19 slog (L_TRACE, "<<%d PT_AUTH_REQ(%d)", conf->id, p->initiate);
881 pcg 1.1
882 pcg 1.19 if (p->chk_config () && !strncmp (p->magic, MAGIC, 8))
883     {
884     if (p->prot_minor != PROTOCOL_MINOR)
885     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
886 pcg 1.21 conf->nodename, (const char *)rsi,
887 pcg 1.19 PROTOCOL_MINOR, conf->nodename, p->prot_minor);
888    
889     if (p->initiate)
890 pcg 1.21 send_auth_request (rsi, false);
891 pcg 1.19
892     rsachallenge k;
893    
894     if (0 > RSA_private_decrypt (sizeof (p->encr),
895     (unsigned char *)&p->encr, (unsigned char *)&k,
896     ::conf.rsa_key, RSA_PKCS1_OAEP_PADDING))
897     slog (L_ERR, _("%s(%s): challenge illegal or corrupted"),
898 pcg 1.21 conf->nodename, (const char *)rsi);
899 pcg 1.19 else
900     {
901     retry_cnt = 0;
902     establish_connection.set (NOW + 8); //? ;)
903     keepalive.reset ();
904     rekey.reset ();
905    
906     delete ictx;
907     ictx = 0;
908    
909     delete octx;
910 pcg 1.1
911 pcg 1.19 octx = new crypto_ctx (k, 1);
912     oseqno = ntohl (*(u32 *)&k[CHG_SEQNO]) & 0x7fffffff;
913 pcg 1.1
914 pcg 1.21 conf->can_recv = p->can_recv;
915     send_auth_response (rsi, p->id, k);
916 pcg 1.1
917 pcg 1.19 break;
918     }
919     }
920 pcg 1.1
921 pcg 1.21 send_reset (rsi);
922 pcg 1.19 }
923 pcg 1.1
924 pcg 1.17 break;
925    
926     case vpn_packet::PT_AUTH_RES:
927     {
928     auth_res_packet *p = (auth_res_packet *) pkt;
929 pcg 1.1
930 pcg 1.17 slog (L_TRACE, "<<%d PT_AUTH_RES", conf->id);
931 pcg 1.1
932 pcg 1.17 if (p->chk_config ())
933     {
934     if (p->prot_minor != PROTOCOL_MINOR)
935 pcg 1.19 slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
936 pcg 1.21 conf->nodename, (const char *)rsi,
937 pcg 1.17 PROTOCOL_MINOR, conf->nodename, p->prot_minor);
938    
939     rsachallenge chg;
940    
941     if (!rsa_cache.find (p->id, chg))
942 pcg 1.19 slog (L_ERR, _("%s(%s): unrequested auth response"),
943 pcg 1.21 conf->nodename, (const char *)rsi);
944 pcg 1.17 else
945     {
946 pcg 1.19 crypto_ctx *cctx = new crypto_ctx (chg, 0);
947    
948     if (!p->hmac_chk (cctx))
949     slog (L_ERR, _("%s(%s): hmac authentication error on auth response, received invalid packet\n"
950     "could be an attack, or just corruption or an synchronization error"),
951 pcg 1.21 conf->nodename, (const char *)rsi);
952 pcg 1.19 else
953     {
954     rsaresponse h;
955    
956     rsa_hash (p->id, chg, h);
957 pcg 1.17
958 pcg 1.19 if (!memcmp ((u8 *)&h, (u8 *)p->response, sizeof h))
959     {
960     prot_minor = p->prot_minor;
961 pcg 1.17
962 pcg 1.19 delete ictx; ictx = cctx;
963 pcg 1.1
964 pcg 1.19 iseqno.reset (ntohl (*(u32 *)&chg[CHG_SEQNO]) & 0x7fffffff); // at least 2**31 sequence numbers are valid
965 pcg 1.1
966 pcg 1.21 si = rsi;
967 pcg 1.1
968 pcg 1.19 rekey.set (NOW + ::conf.rekey);
969     keepalive.set (NOW + ::conf.keepalive);
970 pcg 1.1
971 pcg 1.19 // send queued packets
972     while (tap_packet *p = queue.get ())
973     {
974     send_data_packet (p);
975     delete p;
976     }
977 pcg 1.1
978 pcg 1.19 connectmode = conf->connectmode;
979 pcg 1.5
980 pcg 1.20 slog (L_INFO, _("%s(%s): connection established, protocol version %d.%d"),
981 pcg 1.21 conf->nodename, (const char *)rsi,
982 pcg 1.19 p->prot_major, p->prot_minor);
983 pcg 1.1
984 pcg 1.19 if (::conf.script_node_up)
985     run_script (run_script_cb (this, &connection::script_node_up), false);
986 pcg 1.17
987 pcg 1.19 break;
988     }
989     else
990     slog (L_ERR, _("%s(%s): sent and received challenge do not match"),
991 pcg 1.21 conf->nodename, (const char *)rsi);
992 pcg 1.1 }
993 pcg 1.19
994     delete cctx;
995 pcg 1.1 }
996     }
997 pcg 1.17 }
998 pcg 1.1
999 pcg 1.21 send_reset (rsi);
1000 pcg 1.17 break;
1001 pcg 1.1
1002     case vpn_packet::PT_DATA_COMPRESSED:
1003     #if !ENABLE_COMPRESSION
1004 pcg 1.21 send_reset (rsi);
1005 pcg 1.1 break;
1006     #endif
1007 pcg 1.17
1008 pcg 1.1 case vpn_packet::PT_DATA_UNCOMPRESSED:
1009    
1010     if (ictx && octx)
1011     {
1012     vpndata_packet *p = (vpndata_packet *)pkt;
1013    
1014 pcg 1.21 if (rsi == si)
1015 pcg 1.1 {
1016     if (!p->hmac_chk (ictx))
1017 pcg 1.19 slog (L_ERR, _("%s(%s): hmac authentication error, received invalid packet\n"
1018     "could be an attack, or just corruption or an synchronization error"),
1019 pcg 1.21 conf->nodename, (const char *)rsi);
1020 pcg 1.1 else
1021     {
1022     u32 seqno;
1023     tap_packet *d = p->unpack (this, seqno);
1024    
1025 pcg 1.8 if (iseqno.recv_ok (seqno))
1026 pcg 1.1 {
1027 pcg 1.8 vpn->tap->send (d);
1028 pcg 1.1
1029 pcg 1.8 if (p->dst () == 0) // re-broadcast
1030     for (vpn::conns_vector::iterator i = vpn->conns.begin (); i != vpn->conns.end (); ++i)
1031     {
1032     connection *c = *i;
1033 pcg 1.1
1034 pcg 1.8 if (c->conf != THISNODE && c->conf != conf)
1035     c->inject_data_packet (d);
1036     }
1037    
1038     delete d;
1039    
1040     break;
1041 pcg 1.1 }
1042     }
1043     }
1044     else
1045 pcg 1.21 slog (L_ERR, _("received data packet from unknown source %s"), (const char *)rsi);
1046 pcg 1.1 }
1047    
1048 pcg 1.21 send_reset (rsi);
1049 pcg 1.1 break;
1050    
1051     case vpn_packet::PT_CONNECT_REQ:
1052 pcg 1.21 if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1053 pcg 1.1 {
1054     connect_req_packet *p = (connect_req_packet *) pkt;
1055    
1056     assert (p->id > 0 && p->id <= vpn->conns.size ()); // hmac-auth does not mean we accept anything
1057    
1058     connection *c = vpn->conns[p->id - 1];
1059    
1060     slog (L_TRACE, "<<%d PT_CONNECT_REQ(%d) [%d]\n",
1061     conf->id, p->id, c->ictx && c->octx);
1062    
1063     if (c->ictx && c->octx)
1064     {
1065 pcg 1.4 // send connect_info packets to both sides, in case one is
1066     // behind a nat firewall (or both ;)
1067     {
1068     slog (L_TRACE, ">>%d PT_CONNECT_INFO(%d,%s)\n",
1069     c->conf->id, conf->id, (const char *)si);
1070 pcg 1.1
1071 pcg 1.21 connect_info_packet *r = new connect_info_packet (c->conf->id, conf->id, si, conf->can_recv);
1072 pcg 1.1
1073 pcg 1.4 r->hmac_set (c->octx);
1074 pcg 1.21 send_vpn_packet (r, c->si);
1075 pcg 1.1
1076 pcg 1.4 delete r;
1077     }
1078    
1079     {
1080     slog (L_TRACE, ">>%d PT_CONNECT_INFO(%d,%s)\n",
1081 pcg 1.21 conf->id, c->conf->id, (const char *)c->si);
1082 pcg 1.4
1083 pcg 1.21 connect_info_packet *r = new connect_info_packet (conf->id, c->conf->id, c->si, c->conf->can_recv);
1084 pcg 1.4
1085     r->hmac_set (octx);
1086 pcg 1.21 send_vpn_packet (r, si);
1087 pcg 1.4
1088     delete r;
1089     }
1090 pcg 1.1 }
1091     }
1092    
1093     break;
1094    
1095     case vpn_packet::PT_CONNECT_INFO:
1096 pcg 1.21 if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1097 pcg 1.1 {
1098     connect_info_packet *p = (connect_info_packet *) pkt;
1099    
1100     assert (p->id > 0 && p->id <= vpn->conns.size ()); // hmac-auth does not mean we accept anything
1101    
1102     connection *c = vpn->conns[p->id - 1];
1103    
1104     slog (L_TRACE, "<<%d PT_CONNECT_INFO(%d,%s) (%d)",
1105     conf->id, p->id, (const char *)p->si, !c->ictx && !c->octx);
1106    
1107 pcg 1.21 c->conf->can_recv = p->can_recv;
1108     c->send_auth_request (p->si, true);
1109 pcg 1.1 }
1110 pcg 1.17
1111 pcg 1.1 break;
1112    
1113     default:
1114 pcg 1.21 send_reset (rsi);
1115 pcg 1.1 break;
1116 pcg 1.17
1117 pcg 1.1 }
1118     }
1119    
1120 pcg 1.9 void connection::keepalive_cb (tstamp &ts)
1121 pcg 1.1 {
1122 pcg 1.9 if (NOW >= last_activity + ::conf.keepalive + 30)
1123     {
1124     reset_connection ();
1125     establish_connection ();
1126     }
1127     else if (NOW < last_activity + ::conf.keepalive)
1128     ts = last_activity + ::conf.keepalive;
1129     else if (conf->connectmode != conf_node::C_ONDEMAND
1130 pcg 1.23 || THISNODE->connectmode != conf_node::C_ONDEMAND)
1131 pcg 1.1 {
1132 pcg 1.21 send_ping (si);
1133 pcg 1.9 ts = NOW + 5;
1134     }
1135     else
1136     reset_connection ();
1137 pcg 1.1 }
1138    
1139     void connection::connect_request (int id)
1140     {
1141     connect_req_packet *p = new connect_req_packet (conf->id, id);
1142    
1143     slog (L_TRACE, ">>%d PT_CONNECT_REQ(%d)", id, conf->id);
1144     p->hmac_set (octx);
1145 pcg 1.21 send_vpn_packet (p, si);
1146 pcg 1.1
1147     delete p;
1148     }
1149    
1150     void connection::script_node ()
1151     {
1152 pcg 1.17 vpn->script_if_up (0);
1153 pcg 1.1
1154     char *env;
1155 pcg 1.21 asprintf (&env, "DESTID=%d", conf->id); putenv (env);
1156     asprintf (&env, "DESTNODE=%s", conf->nodename); putenv (env);
1157     asprintf (&env, "DESTIP=%s", si.ntoa ()); putenv (env);
1158     asprintf (&env, "DESTPORT=%d", ntohs (si.port)); putenv (env);
1159 pcg 1.1 }
1160    
1161 pcg 1.17 const char *connection::script_node_up (int)
1162 pcg 1.1 {
1163     script_node ();
1164    
1165     putenv ("STATE=up");
1166    
1167     return ::conf.script_node_up ? ::conf.script_node_up : "node-up";
1168     }
1169    
1170 pcg 1.17 const char *connection::script_node_down (int)
1171 pcg 1.1 {
1172     script_node ();
1173    
1174     putenv ("STATE=down");
1175    
1176     return ::conf.script_node_up ? ::conf.script_node_down : "node-down";
1177     }
1178    
1179 pcg 1.21 // send a vpn packet out to other hosts
1180     void
1181     connection::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
1182     {
1183     if (prot_send & PROT_IPv4)
1184     vpn->send_ipv4_packet (pkt, si, tos);
1185     else
1186     vpn->send_udpv4_packet (pkt, si, tos);
1187     }
1188    
1189 pcg 1.9 connection::connection(struct vpn *vpn_)
1190     : vpn(vpn_)
1191     , rekey (this, &connection::rekey_cb)
1192     , keepalive (this, &connection::keepalive_cb)
1193     , establish_connection (this, &connection::establish_connection_cb)
1194     {
1195     octx = ictx = 0;
1196     retry_cnt = 0;
1197    
1198     connectmode = conf_node::C_ALWAYS; // initial setting
1199     reset_connection ();
1200     }
1201    
1202     connection::~connection ()
1203     {
1204     shutdown ();
1205     }
1206    
1207 pcg 1.1 /////////////////////////////////////////////////////////////////////////////
1208    
1209 pcg 1.17 const char *vpn::script_if_up (int)
1210 pcg 1.1 {
1211     // the tunnel device mtu should be the physical mtu - overhead
1212     // the tricky part is rounding to the cipher key blocksize
1213 pcg 1.17 int mtu = conf.mtu - ETH_OVERHEAD - VPE_OVERHEAD - MAX_OVERHEAD;
1214 pcg 1.1 mtu += ETH_OVERHEAD - 6 - 6; // now we have the data portion
1215     mtu -= mtu % EVP_CIPHER_block_size (CIPHER); // round
1216     mtu -= ETH_OVERHEAD - 6 - 6; // and get interface mtu again
1217    
1218     char *env;
1219     asprintf (&env, "CONFBASE=%s", confbase);
1220     putenv (env);
1221     asprintf (&env, "NODENAME=%s", THISNODE->nodename);
1222     putenv (env);
1223     asprintf (&env, "NODEID=%d", THISNODE->id);
1224     putenv (env);
1225     asprintf (&env, "IFNAME=%s", tap->interface ());
1226     putenv (env);
1227     asprintf (&env, "MTU=%d", mtu);
1228     putenv (env);
1229     asprintf (&env, "MAC=%02x:%02x:%02x:%02x:%02x:%02x",
1230     0xfe, 0xfd, 0x80, 0x00, THISNODE->id >> 8,
1231     THISNODE->id & 0xff);
1232     putenv (env);
1233    
1234     return ::conf.script_if_up ? ::conf.script_if_up : "if-up";
1235     }
1236    
1237     int
1238 pcg 1.21 vpn::setup ()
1239 pcg 1.1 {
1240 pcg 1.21 u8 prots = 0;
1241 pcg 1.1
1242 pcg 1.21 for (configuration::node_vector::iterator i = conf.nodes.begin ();
1243     i != conf.nodes.end (); ++i)
1244     prots |= (*i)->can_send | (*i)->can_recv;
1245 pcg 1.1
1246 pcg 1.21 sockinfo si;
1247 pcg 1.1
1248 pcg 1.21 si.set (THISNODE);
1249    
1250     udpv4_fd = -1;
1251    
1252     if (prots & PROT_UDPv4)
1253 pcg 1.1 {
1254 pcg 1.21 udpv4_fd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP);
1255    
1256     if (udpv4_fd < 0)
1257     return -1;
1258    
1259     if (bind (udpv4_fd, si.sav4 (), si.salenv4 ()))
1260     {
1261     slog (L_ERR, _("can't bind udpv4 to %s: %s"), (const char *)si, strerror (errno));
1262     exit (1);
1263     }
1264    
1265     #ifdef IP_MTU_DISCOVER
1266     // this I really consider a linux bug. I am neither connected
1267     // nor do I fragment myself. Linux still sets DF and doesn't
1268     // fragment for me sometimes.
1269     {
1270     int oval = IP_PMTUDISC_DONT;
1271     setsockopt (udpv4_fd, SOL_IP, IP_MTU_DISCOVER, &oval, sizeof oval);
1272     }
1273     #endif
1274    
1275     // standard daemon practise...
1276     {
1277     int oval = 1;
1278     setsockopt (udpv4_fd, SOL_SOCKET, SO_REUSEADDR, &oval, sizeof oval);
1279     }
1280    
1281     udpv4_ev_watcher.start (udpv4_fd, POLLIN);
1282 pcg 1.1 }
1283    
1284 pcg 1.21 ipv4_fd = -1;
1285     if (prots & PROT_IPv4)
1286     {
1287     ipv4_fd = socket (PF_INET, SOCK_RAW, ::conf.ip_proto);
1288    
1289     if (ipv4_fd < 0)
1290     return -1;
1291    
1292     if (bind (ipv4_fd, si.sav4 (), si.salenv4 ()))
1293     {
1294     slog (L_ERR, _("can't bind ipv4 socket to %s: %s"), (const char *)si, strerror (errno));
1295     exit (1);
1296     }
1297    
1298 pcg 1.1 #ifdef IP_MTU_DISCOVER
1299 pcg 1.21 // this I really consider a linux bug. I am neither connected
1300     // nor do I fragment myself. Linux still sets DF and doesn't
1301     // fragment for me sometimes.
1302     {
1303     int oval = IP_PMTUDISC_DONT;
1304     setsockopt (ipv4_fd, SOL_IP, IP_MTU_DISCOVER, &oval, sizeof oval);
1305     }
1306 pcg 1.1 #endif
1307    
1308 pcg 1.21 ipv4_ev_watcher.start (ipv4_fd, POLLIN);
1309     }
1310 pcg 1.9
1311 pcg 1.1 tap = new tap_device ();
1312     if (!tap) //D this, of course, never catches
1313     {
1314     slog (L_ERR, _("cannot create network interface '%s'"), conf.ifname);
1315     exit (1);
1316     }
1317 pcg 1.9
1318 pcg 1.17 run_script (run_script_cb (this, &vpn::script_if_up), true);
1319 pcg 1.9
1320 pcg 1.21 tap_ev_watcher.start (tap->fd, POLLIN);
1321 pcg 1.1
1322 pcg 1.9 reconnect_all ();
1323 pcg 1.1
1324     return 0;
1325     }
1326    
1327     void
1328 pcg 1.21 vpn::send_ipv4_packet (vpn_packet *pkt, const sockinfo &si, int tos)
1329 pcg 1.1 {
1330 pcg 1.21 setsockopt (ipv4_fd, SOL_IP, IP_TOS, &tos, sizeof tos);
1331     sendto (ipv4_fd, &((*pkt)[0]), pkt->len, 0, si.sav4 (), si.salenv4 ());
1332 pcg 1.1 }
1333    
1334     void
1335 pcg 1.21 vpn::send_udpv4_packet (vpn_packet *pkt, const sockinfo &si, int tos)
1336 pcg 1.1 {
1337 pcg 1.21 setsockopt (udpv4_fd, SOL_IP, IP_TOS, &tos, sizeof tos);
1338     sendto (udpv4_fd, &((*pkt)[0]), pkt->len, 0, si.sav4 (), si.salenv4 ());
1339 pcg 1.1 }
1340    
1341     void
1342 pcg 1.21 vpn::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
1343 pcg 1.1 {
1344 pcg 1.21 unsigned int src = pkt->src ();
1345     unsigned int dst = pkt->dst ();
1346    
1347     slog (L_NOISE, _("<<?/%s received possible vpn packet type %d from %d to %d, length %d"),
1348     (const char *)rsi, pkt->typ (), pkt->src (), pkt->dst (), pkt->len);
1349 pcg 1.1
1350 pcg 1.21 if (dst > conns.size () || pkt->typ () >= vpn_packet::PT_MAX)
1351     slog (L_WARN, _("<<? received CORRUPTED packet type %d from %d to %d"),
1352     pkt->typ (), pkt->src (), pkt->dst ());
1353     else if (dst == 0 && !THISNODE->routerprio)
1354     slog (L_WARN, _("<<%d received broadcast, but we are no router"), dst);
1355     else if (dst != 0 && dst != THISNODE->id)
1356     slog (L_WARN,
1357     _("received frame for node %d ('%s') from %s, but this is node %d ('%s')"),
1358     dst, conns[dst - 1]->conf->nodename,
1359     (const char *)rsi,
1360     THISNODE->id, THISNODE->nodename);
1361     else if (src == 0 || src > conns.size ())
1362     slog (L_WARN, _("received frame from unknown node %d (%s)"),
1363     src, (const char *)rsi);
1364     else
1365     conns[src - 1]->recv_vpn_packet (pkt, rsi);
1366     }
1367 pcg 1.1
1368 pcg 1.21 void
1369     vpn::udpv4_ev (short revents)
1370     {
1371     if (revents & (POLLIN | POLLERR))
1372 pcg 1.1 {
1373 pcg 1.21 vpn_packet *pkt = new vpn_packet;
1374     struct sockaddr_in sa;
1375     socklen_t sa_len = sizeof (sa);
1376     int len;
1377 pcg 1.1
1378 pcg 1.21 len = recvfrom (udpv4_fd, &((*pkt)[0]), MAXSIZE, 0, (sockaddr *)&sa, &sa_len);
1379 pcg 1.1
1380 pcg 1.21 sockinfo si(sa);
1381 pcg 1.1
1382 pcg 1.21 if (len > 0)
1383     {
1384     pkt->len = len;
1385 pcg 1.1
1386 pcg 1.21 recv_vpn_packet (pkt, si);
1387     }
1388     else
1389 pcg 1.1 {
1390 pcg 1.21 // probably ECONNRESET or somesuch
1391     slog (L_DEBUG, _("%s: %s"), (const char *)si, strerror (errno));
1392 pcg 1.1 }
1393 pcg 1.21
1394     delete pkt;
1395     }
1396     else if (revents & POLLHUP)
1397     {
1398     // this cannot ;) happen on udp sockets
1399     slog (L_ERR, _("FATAL: POLLHUP on udp v4 fd, terminating."));
1400     exit (1);
1401     }
1402     else
1403     {
1404     slog (L_ERR,
1405     _("FATAL: unknown revents %08x in socket, terminating\n"),
1406     revents);
1407     exit (1);
1408 pcg 1.1 }
1409     }
1410    
1411     void
1412 pcg 1.21 vpn::ipv4_ev (short revents)
1413 pcg 1.1 {
1414 pcg 1.9 if (revents & (POLLIN | POLLERR))
1415     {
1416     vpn_packet *pkt = new vpn_packet;
1417     struct sockaddr_in sa;
1418     socklen_t sa_len = sizeof (sa);
1419     int len;
1420 pcg 1.1
1421 pcg 1.21 len = recvfrom (ipv4_fd, &((*pkt)[0]), MAXSIZE, 0, (sockaddr *)&sa, &sa_len);
1422    
1423     sockinfo si(sa, PROT_IPv4);
1424 pcg 1.1
1425 pcg 1.9 if (len > 0)
1426     {
1427     pkt->len = len;
1428    
1429 pcg 1.21 // raw sockets deliver the ipv4, but don't expect it on sends
1430     // this is slow, but...
1431     pkt->skip_hdr (IP_OVERHEAD);
1432 pcg 1.1
1433 pcg 1.21 recv_vpn_packet (pkt, si);
1434 pcg 1.9 }
1435     else
1436 pcg 1.1 {
1437 pcg 1.9 // probably ECONNRESET or somesuch
1438 pcg 1.21 slog (L_DEBUG, _("%s: %s"), (const char *)si, strerror (errno));
1439 pcg 1.9 }
1440    
1441     delete pkt;
1442     }
1443     else if (revents & POLLHUP)
1444     {
1445     // this cannot ;) happen on udp sockets
1446 pcg 1.21 slog (L_ERR, _("FATAL: POLLHUP on ipv4 fd, terminating."));
1447 pcg 1.9 exit (1);
1448     }
1449     else
1450     {
1451     slog (L_ERR,
1452     _("FATAL: unknown revents %08x in socket, terminating\n"),
1453     revents);
1454     exit (1);
1455     }
1456     }
1457 pcg 1.1
1458 pcg 1.9 void
1459 pcg 1.21 vpn::tap_ev (short revents)
1460 pcg 1.9 {
1461     if (revents & POLLIN)
1462     {
1463     /* process data */
1464     tap_packet *pkt;
1465 pcg 1.1
1466 pcg 1.9 pkt = tap->recv ();
1467 pcg 1.1
1468 pcg 1.9 int dst = mac2id (pkt->dst);
1469     int src = mac2id (pkt->src);
1470 pcg 1.1
1471 pcg 1.9 if (src != THISNODE->id)
1472     {
1473     slog (L_ERR, _("FATAL: tap packet not originating on current node received, terminating."));
1474     exit (1);
1475     }
1476 pcg 1.1
1477 pcg 1.9 if (dst == THISNODE->id)
1478     {
1479     slog (L_ERR, _("FATAL: tap packet destined for current node received, terminating."));
1480     exit (1);
1481     }
1482 pcg 1.1
1483 pcg 1.9 if (dst > conns.size ())
1484     slog (L_ERR, _("tap packet for unknown node %d received, ignoring."), dst);
1485     else
1486     {
1487     if (dst)
1488     {
1489     // unicast
1490     if (dst != THISNODE->id)
1491     conns[dst - 1]->inject_data_packet (pkt);
1492 pcg 1.1 }
1493 pcg 1.9 else
1494 pcg 1.1 {
1495 pcg 1.9 // broadcast, first check router, then self, then english
1496     connection *router = find_router ();
1497 pcg 1.1
1498 pcg 1.9 if (router)
1499     router->inject_data_packet (pkt, true);
1500 pcg 1.1 else
1501 pcg 1.9 for (conns_vector::iterator c = conns.begin (); c != conns.end (); ++c)
1502     if ((*c)->conf != THISNODE)
1503     (*c)->inject_data_packet (pkt);
1504 pcg 1.1 }
1505     }
1506    
1507 pcg 1.9 delete pkt;
1508     }
1509     else if (revents & (POLLHUP | POLLERR))
1510     {
1511     slog (L_ERR, _("FATAL: POLLHUP or POLLERR on network device fd, terminating."));
1512     exit (1);
1513     }
1514     else
1515     abort ();
1516     }
1517    
1518     void
1519     vpn::event_cb (tstamp &ts)
1520     {
1521     if (events)
1522     {
1523     if (events & EVENT_SHUTDOWN)
1524 pcg 1.1 {
1525 pcg 1.21 slog (L_INFO, _("preparing shutdown..."));
1526    
1527 pcg 1.9 shutdown_all ();
1528 pcg 1.1
1529 pcg 1.9 remove_pid (pidfilename);
1530 pcg 1.1
1531 pcg 1.21 slog (L_INFO, _("terminating"));
1532 pcg 1.1
1533 pcg 1.9 exit (0);
1534     }
1535 pcg 1.1
1536 pcg 1.9 if (events & EVENT_RECONNECT)
1537 pcg 1.21 {
1538     slog (L_INFO, _("forced reconnect"));
1539    
1540     reconnect_all ();
1541     }
1542 pcg 1.1
1543 pcg 1.9 events = 0;
1544     }
1545 pcg 1.1
1546 pcg 1.9 ts = TSTAMP_CANCEL;
1547     }
1548 pcg 1.1
1549 pcg 1.21 void
1550     vpn::shutdown_all ()
1551     {
1552     for (conns_vector::iterator c = conns.begin (); c != conns.end (); ++c)
1553     (*c)->shutdown ();
1554     }
1555    
1556     void
1557     vpn::reconnect_all ()
1558     {
1559     for (conns_vector::iterator c = conns.begin (); c != conns.end (); ++c)
1560     delete *c;
1561    
1562     conns.clear ();
1563    
1564     auth_rate_limiter.clear ();
1565     reset_rate_limiter.clear ();
1566    
1567     for (configuration::node_vector::iterator i = conf.nodes.begin ();
1568     i != conf.nodes.end (); ++i)
1569     {
1570     connection *conn = new connection (this);
1571    
1572     conn->conf = *i;
1573     conns.push_back (conn);
1574    
1575     conn->establish_connection ();
1576     }
1577     }
1578    
1579     connection *vpn::find_router ()
1580     {
1581     u32 prio = 0;
1582     connection *router = 0;
1583    
1584     for (conns_vector::iterator i = conns.begin (); i != conns.end (); ++i)
1585     {
1586     connection *c = *i;
1587    
1588     if (c->conf->routerprio > prio
1589     && c->connectmode == conf_node::C_ALWAYS
1590     && c->conf != THISNODE
1591     && c->ictx && c->octx)
1592     {
1593     prio = c->conf->routerprio;
1594     router = c;
1595     }
1596     }
1597    
1598     return router;
1599     }
1600    
1601     void vpn::connect_request (int id)
1602     {
1603     connection *c = find_router ();
1604    
1605     if (c)
1606     c->connect_request (id);
1607     //else // does not work, because all others must connect to the same router
1608     // // no router found, aggressively connect to all routers
1609     // for (conns_vector::iterator i = conns.begin (); i != conns.end (); ++i)
1610     // if ((*i)->conf->routerprio)
1611     // (*i)->establish_connection ();
1612     }
1613    
1614     void
1615     connection::dump_status ()
1616     {
1617     slog (L_NOTICE, _("node %s (id %d)"), conf->nodename, conf->id);
1618     slog (L_NOTICE, _(" connectmode %d (%d) / sockaddr %s / minor %d"),
1619     connectmode, conf->connectmode, (const char *)si, (int)prot_minor);
1620     slog (L_NOTICE, _(" ictx/octx %08lx/%08lx / oseqno %d / retry_cnt %d"),
1621     (long)ictx, (long)octx, (int)oseqno, (int)retry_cnt);
1622     slog (L_NOTICE, _(" establish_conn %ld / rekey %ld / keepalive %ld"),
1623     (long)(establish_connection.at), (long)(rekey.at), (long)(keepalive.at));
1624     }
1625    
1626     void
1627     vpn::dump_status ()
1628     {
1629     slog (L_NOTICE, _("BEGIN status dump (%ld)"), (long)NOW);
1630    
1631     for (conns_vector::iterator c = conns.begin (); c != conns.end (); ++c)
1632     (*c)->dump_status ();
1633    
1634     slog (L_NOTICE, _("END status dump"));
1635     }
1636    
1637 pcg 1.9 vpn::vpn (void)
1638 pcg 1.21 : udpv4_ev_watcher(this, &vpn::udpv4_ev)
1639     , ipv4_ev_watcher(this, &vpn::ipv4_ev)
1640     , tap_ev_watcher(this, &vpn::tap_ev)
1641     , event(this, &vpn::event_cb)
1642 pcg 1.9 {
1643 pcg 1.1 }
1644    
1645     vpn::~vpn ()
1646 pcg 1.9 {
1647     }
1648 pcg 1.1