Avoid calling time(NULL).
[tinc] / src / net_packet.c
1 /*
2     net_packet.c -- Handles in- and outgoing VPN packets
3     Copyright (C) 1998-2005 Ivo Timmermans,
4                   2000-2013 Guus Sliepen <guus@tinc-vpn.org>
5                   2010      Timothy Redaelli <timothy@redaelli.eu>
6                   2010      Brandon Black <blblack@gmail.com>
7
8     This program is free software; you can redistribute it and/or modify
9     it under the terms of the GNU General Public License as published by
10     the Free Software Foundation; either version 2 of the License, or
11     (at your option) any later version.
12
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16     GNU General Public License for more details.
17
18     You should have received a copy of the GNU General Public License along
19     with this program; if not, write to the Free Software Foundation, Inc.,
20     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22
23 #include "system.h"
24
25 #ifdef HAVE_ZLIB
26 #include <zlib.h>
27 #endif
28
29 #ifdef HAVE_LZO
30 #include LZO1X_H
31 #endif
32
33 #include "cipher.h"
34 #include "conf.h"
35 #include "connection.h"
36 #include "crypto.h"
37 #include "digest.h"
38 #include "device.h"
39 #include "ethernet.h"
40 #include "graph.h"
41 #include "logger.h"
42 #include "net.h"
43 #include "netutl.h"
44 #include "protocol.h"
45 #include "process.h"
46 #include "route.h"
47 #include "utils.h"
48 #include "xalloc.h"
49
50 int keylifetime = 0;
51 #ifdef HAVE_LZO
52 static char lzo_wrkmem[LZO1X_999_MEM_COMPRESS > LZO1X_1_MEM_COMPRESS ? LZO1X_999_MEM_COMPRESS : LZO1X_1_MEM_COMPRESS];
53 #endif
54
55 static void send_udppacket(node_t *, vpn_packet_t *);
56
57 unsigned replaywin = 16;
58 bool localdiscovery = false;
59
60 #define MAX_SEQNO 1073741824
61
62 /* mtuprobes == 1..30: initial discovery, send bursts with 1 second interval
63    mtuprobes ==    31: sleep pinginterval seconds
64    mtuprobes ==    32: send 1 burst, sleep pingtimeout second
65    mtuprobes ==    33: no response from other side, restart PMTU discovery process
66
67    Probes are sent in batches of at least three, with random sizes between the
68    lower and upper boundaries for the MTU thus far discovered.
69
70    After the initial discovery, a fourth packet is added to each batch with a
71    size larger than the currently known PMTU, to test if the PMTU has increased.
72
73    In case local discovery is enabled, another packet is added to each batch,
74    which will be broadcast to the local network.
75
76 */
77
78 static void send_mtu_probe_handler(void *data) {
79         node_t *n = data;
80         int timeout = 1;
81
82         n->mtuprobes++;
83
84         if(!n->status.reachable || !n->status.validkey) {
85                 logger(DEBUG_TRAFFIC, LOG_INFO, "Trying to send MTU probe to unreachable or rekeying node %s (%s)", n->name, n->hostname);
86                 n->mtuprobes = 0;
87                 return;
88         }
89
90         if(n->mtuprobes > 32) {
91                 if(!n->minmtu) {
92                         n->mtuprobes = 31;
93                         timeout = pinginterval;
94                         goto end;
95                 }
96
97                 logger(DEBUG_TRAFFIC, LOG_INFO, "%s (%s) did not respond to UDP ping, restarting PMTU discovery", n->name, n->hostname);
98                 n->status.udp_confirmed = false;
99                 n->mtuprobes = 1;
100                 n->minmtu = 0;
101                 n->maxmtu = MTU;
102         }
103
104         if(n->mtuprobes >= 10 && n->mtuprobes < 32 && !n->minmtu) {
105                 logger(DEBUG_TRAFFIC, LOG_INFO, "No response to MTU probes from %s (%s)", n->name, n->hostname);
106                 n->mtuprobes = 31;
107         }
108
109         if(n->mtuprobes == 30 || (n->mtuprobes < 30 && n->minmtu >= n->maxmtu)) {
110                 if(n->minmtu > n->maxmtu)
111                         n->minmtu = n->maxmtu;
112                 else
113                         n->maxmtu = n->minmtu;
114                 n->mtu = n->minmtu;
115                 logger(DEBUG_TRAFFIC, LOG_INFO, "Fixing MTU of %s (%s) to %d after %d probes", n->name, n->hostname, n->mtu, n->mtuprobes);
116                 n->mtuprobes = 31;
117         }
118
119         if(n->mtuprobes == 31) {
120                 timeout = pinginterval;
121                 goto end;
122         } else if(n->mtuprobes == 32) {
123                 timeout = pingtimeout;
124         }
125
126         for(int i = 0; i < 4 + localdiscovery; i++) {
127                 int len;
128
129                 if(i == 0) {
130                         if(n->mtuprobes < 30 || n->maxmtu + 8 >= MTU)
131                                 continue;
132                         len = n->maxmtu + 8;
133                 } else if(n->maxmtu <= n->minmtu) {
134                         len = n->maxmtu;
135                 } else {
136                         len = n->minmtu + 1 + rand() % (n->maxmtu - n->minmtu);
137                 }
138
139                 if(len < 64)
140                         len = 64;
141
142                 vpn_packet_t packet;
143                 memset(packet.data, 0, 14);
144                 randomize(packet.data + 14, len - 14);
145                 packet.len = len;
146                 if(i >= 4 && n->mtuprobes <= 10)
147                         packet.priority = -1;
148                 else
149                         packet.priority = 0;
150
151                 logger(DEBUG_TRAFFIC, LOG_INFO, "Sending MTU probe length %d to %s (%s)", len, n->name, n->hostname);
152
153                 send_udppacket(n, &packet);
154         }
155
156         n->probe_counter = 0;
157         gettimeofday(&n->probe_time, NULL);
158
159         /* Calculate the packet loss of incoming traffic by comparing the rate of
160            packets received to the rate with which the sequence number has increased.
161          */
162
163         if(n->received > n->prev_received)
164                 n->packetloss = 1.0 - (n->received - n->prev_received) / (float)(n->received_seqno - n->prev_received_seqno);
165         else
166                 n->packetloss = n->received_seqno <= n->prev_received_seqno;
167
168         n->prev_received_seqno = n->received_seqno;
169         n->prev_received = n->received;
170
171 end:
172         timeout_set(&n->mtutimeout, &(struct timeval){timeout, rand() % 100000});
173 }
174
175 void send_mtu_probe(node_t *n) {
176         timeout_add(&n->mtutimeout, send_mtu_probe_handler, n, &(struct timeval){1, 0});
177         send_mtu_probe_handler(n);
178 }
179
180 static void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
181         logger(DEBUG_TRAFFIC, LOG_INFO, "Got MTU probe length %d from %s (%s)", packet->len, n->name, n->hostname);
182
183         if(!packet->data[0]) {
184                 /* It's a probe request, send back a reply */
185
186                 packet->data[0] = 1;
187
188                 /* Temporarily set udp_confirmed, so that the reply is sent
189                    back exactly the way it came in. */
190
191                 bool udp_confirmed = n->status.udp_confirmed;
192                 n->status.udp_confirmed = true;
193                 send_udppacket(n, packet);
194                 n->status.udp_confirmed = udp_confirmed;
195         } else {
196                 /* It's a valid reply: now we know bidirectional communication
197                    is possible using the address and socket that the reply
198                    packet used. */
199
200                 n->status.udp_confirmed = true;
201
202                 /* If we haven't established the PMTU yet, restart the discovery process. */
203
204                 if(n->mtuprobes > 30) {
205                         if (len == n->maxmtu + 8) {
206                                 logger(DEBUG_TRAFFIC, LOG_INFO, "Increase in PMTU to %s (%s) detected, restarting PMTU discovery", n->name, n->hostname);
207                                 n->maxmtu = MTU;
208                                 n->mtuprobes = 10;
209                                 return;
210                         }
211
212                         if(n->minmtu)
213                                 n->mtuprobes = 30;
214                         else
215                                 n->mtuprobes = 1;
216                 }
217
218                 /* If applicable, raise the minimum supported MTU */
219
220                 if(len > n->maxmtu)
221                         len = n->maxmtu;
222                 if(n->minmtu < len)
223                         n->minmtu = len;
224
225                 /* Calculate RTT and bandwidth.
226                    The RTT is the time between the MTU probe burst was sent and the first
227                    reply is received. The bandwidth is measured using the time between the
228                    arrival of the first and third probe reply.
229                  */
230
231                 struct timeval now, diff;
232                 gettimeofday(&now, NULL);
233                 timersub(&now, &n->probe_time, &diff);
234                 n->probe_counter++;
235
236                 if(n->probe_counter == 1) {
237                         n->rtt = diff.tv_sec + diff.tv_usec * 1e-6;
238                         n->probe_time = now;
239                 } else if(n->probe_counter == 3) {
240                         n->bandwidth = 2.0 * len / (diff.tv_sec + diff.tv_usec * 1e-6);
241                         logger(DEBUG_TRAFFIC, LOG_DEBUG, "%s (%s) RTT %.2f ms, burst bandwidth %.3f Mbit/s, rx packet loss %.2f %%", n->name, n->hostname, n->rtt * 1e3, n->bandwidth * 8e-6, n->packetloss * 1e2);
242                 }
243         }
244 }
245
246 static length_t compress_packet(uint8_t *dest, const uint8_t *source, length_t len, int level) {
247         if(level == 0) {
248                 memcpy(dest, source, len);
249                 return len;
250         } else if(level == 10) {
251 #ifdef HAVE_LZO
252                 lzo_uint lzolen = MAXSIZE;
253                 lzo1x_1_compress(source, len, dest, &lzolen, lzo_wrkmem);
254                 return lzolen;
255 #else
256                 return -1;
257 #endif
258         } else if(level < 10) {
259 #ifdef HAVE_ZLIB
260                 unsigned long destlen = MAXSIZE;
261                 if(compress2(dest, &destlen, source, len, level) == Z_OK)
262                         return destlen;
263                 else
264 #endif
265                         return -1;
266         } else {
267 #ifdef HAVE_LZO
268                 lzo_uint lzolen = MAXSIZE;
269                 lzo1x_999_compress(source, len, dest, &lzolen, lzo_wrkmem);
270                 return lzolen;
271 #else
272                 return -1;
273 #endif
274         }
275
276         return -1;
277 }
278
279 static length_t uncompress_packet(uint8_t *dest, const uint8_t *source, length_t len, int level) {
280         if(level == 0) {
281                 memcpy(dest, source, len);
282                 return len;
283         } else if(level > 9) {
284 #ifdef HAVE_LZO
285                 lzo_uint lzolen = MAXSIZE;
286                 if(lzo1x_decompress_safe(source, len, dest, &lzolen, NULL) == LZO_E_OK)
287                         return lzolen;
288                 else
289 #endif
290                         return -1;
291         }
292 #ifdef HAVE_ZLIB
293         else {
294                 unsigned long destlen = MAXSIZE;
295                 if(uncompress(dest, &destlen, source, len) == Z_OK)
296                         return destlen;
297                 else
298                         return -1;
299         }
300 #endif
301
302         return -1;
303 }
304
305 /* VPN packet I/O */
306
307 static void receive_packet(node_t *n, vpn_packet_t *packet) {
308         logger(DEBUG_TRAFFIC, LOG_DEBUG, "Received packet of %d bytes from %s (%s)",
309                            packet->len, n->name, n->hostname);
310
311         n->in_packets++;
312         n->in_bytes += packet->len;
313
314         route(n, packet);
315 }
316
317 static bool try_mac(node_t *n, const vpn_packet_t *inpkt) {
318         if(n->status.sptps)
319                 return sptps_verify_datagram(&n->sptps, (char *)&inpkt->seqno, inpkt->len);
320
321         if(!digest_active(&n->indigest) || inpkt->len < sizeof inpkt->seqno + digest_length(&n->indigest))
322                 return false;
323
324         return digest_verify(&n->indigest, &inpkt->seqno, inpkt->len - n->indigest.maclength, (const char *)&inpkt->seqno + inpkt->len - n->indigest.maclength);
325 }
326
327 static void receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
328         vpn_packet_t pkt1, pkt2;
329         vpn_packet_t *pkt[] = { &pkt1, &pkt2, &pkt1, &pkt2 };
330         int nextpkt = 0;
331         vpn_packet_t *outpkt = pkt[0];
332         size_t outlen;
333
334         if(n->status.sptps) {
335                 sptps_receive_data(&n->sptps, (char *)&inpkt->seqno, inpkt->len);
336                 return;
337         }
338
339         if(!cipher_active(&n->incipher)) {
340                 logger(DEBUG_TRAFFIC, LOG_DEBUG, "Got packet from %s (%s) but he hasn't got our key yet",
341                                         n->name, n->hostname);
342                 return;
343         }
344
345         /* Check packet length */
346
347         if(inpkt->len < sizeof inpkt->seqno + digest_length(&n->indigest)) {
348                 logger(DEBUG_TRAFFIC, LOG_DEBUG, "Got too short packet from %s (%s)",
349                                         n->name, n->hostname);
350                 return;
351         }
352
353         /* Check the message authentication code */
354
355         if(digest_active(&n->indigest)) {
356                 inpkt->len -= n->indigest.maclength;
357                 if(!digest_verify(&n->indigest, &inpkt->seqno, inpkt->len, (const char *)&inpkt->seqno + inpkt->len)) {
358                         logger(DEBUG_TRAFFIC, LOG_DEBUG, "Got unauthenticated packet from %s (%s)", n->name, n->hostname);
359                         return;
360                 }
361         }
362         /* Decrypt the packet */
363
364         if(cipher_active(&n->incipher)) {
365                 outpkt = pkt[nextpkt++];
366                 outlen = MAXSIZE;
367
368                 if(!cipher_decrypt(&n->incipher, &inpkt->seqno, inpkt->len, &outpkt->seqno, &outlen, true)) {
369                         logger(DEBUG_TRAFFIC, LOG_DEBUG, "Error decrypting packet from %s (%s)", n->name, n->hostname);
370                         return;
371                 }
372
373                 outpkt->len = outlen;
374                 inpkt = outpkt;
375         }
376
377         /* Check the sequence number */
378
379         inpkt->len -= sizeof inpkt->seqno;
380         inpkt->seqno = ntohl(inpkt->seqno);
381
382         if(replaywin) {
383                 if(inpkt->seqno != n->received_seqno + 1) {
384                         if(inpkt->seqno >= n->received_seqno + replaywin * 8) {
385                                 if(n->farfuture++ < replaywin >> 2) {
386                                         logger(DEBUG_ALWAYS, LOG_WARNING, "Packet from %s (%s) is %d seqs in the future, dropped (%u)",
387                                                 n->name, n->hostname, inpkt->seqno - n->received_seqno - 1, n->farfuture);
388                                         return;
389                                 }
390                                 logger(DEBUG_ALWAYS, LOG_WARNING, "Lost %d packets from %s (%s)",
391                                                 inpkt->seqno - n->received_seqno - 1, n->name, n->hostname);
392                                 memset(n->late, 0, replaywin);
393                         } else if (inpkt->seqno <= n->received_seqno) {
394                                 if((n->received_seqno >= replaywin * 8 && inpkt->seqno <= n->received_seqno - replaywin * 8) || !(n->late[(inpkt->seqno / 8) % replaywin] & (1 << inpkt->seqno % 8))) {
395                                         logger(DEBUG_ALWAYS, LOG_WARNING, "Got late or replayed packet from %s (%s), seqno %d, last received %d",
396                                                 n->name, n->hostname, inpkt->seqno, n->received_seqno);
397                                         return;
398                                 }
399                         } else {
400                                 for(int i = n->received_seqno + 1; i < inpkt->seqno; i++)
401                                         n->late[(i / 8) % replaywin] |= 1 << i % 8;
402                         }
403                 }
404
405                 n->farfuture = 0;
406                 n->late[(inpkt->seqno / 8) % replaywin] &= ~(1 << inpkt->seqno % 8);
407         }
408
409         if(inpkt->seqno > n->received_seqno)
410                 n->received_seqno = inpkt->seqno;
411
412         n->received++;
413
414         if(n->received_seqno > MAX_SEQNO)
415                 regenerate_key();
416
417         /* Decompress the packet */
418
419         length_t origlen = inpkt->len;
420
421         if(n->incompression) {
422                 outpkt = pkt[nextpkt++];
423
424                 if((outpkt->len = uncompress_packet(outpkt->data, inpkt->data, inpkt->len, n->incompression)) < 0) {
425                         logger(DEBUG_TRAFFIC, LOG_ERR, "Error while uncompressing packet from %s (%s)",
426                                                  n->name, n->hostname);
427                         return;
428                 }
429
430                 inpkt = outpkt;
431
432                 origlen -= MTU/64 + 20;
433         }
434
435         inpkt->priority = 0;
436
437         if(!inpkt->data[12] && !inpkt->data[13])
438                 mtu_probe_h(n, inpkt, origlen);
439         else
440                 receive_packet(n, inpkt);
441 }
442
443 void receive_tcppacket(connection_t *c, const char *buffer, int len) {
444         vpn_packet_t outpkt;
445
446         outpkt.len = len;
447         if(c->options & OPTION_TCPONLY)
448                 outpkt.priority = 0;
449         else
450                 outpkt.priority = -1;
451         memcpy(outpkt.data, buffer, len);
452
453         receive_packet(c->node, &outpkt);
454 }
455
456 static void send_sptps_packet(node_t *n, vpn_packet_t *origpkt) {
457         if(!n->status.validkey) {
458                 logger(DEBUG_TRAFFIC, LOG_INFO, "No valid key known yet for %s (%s)", n->name, n->hostname);
459                 if(!n->status.waitingforkey)
460                         send_req_key(n);
461                 else if(n->last_req_key + 10 < now.tv_sec) {
462                         logger(DEBUG_ALWAYS, LOG_DEBUG, "No key from %s after 10 seconds, restarting SPTPS", n->name);
463                         sptps_stop(&n->sptps);
464                         n->status.waitingforkey = false;
465                         send_req_key(n);
466                 }
467                 return;
468         }
469
470         uint8_t type = 0;
471         int offset = 0;
472
473         if(!(origpkt->data[12] | origpkt->data[13])) {
474                 sptps_send_record(&n->sptps, PKT_PROBE, (char *)origpkt->data, origpkt->len);
475                 return;
476         }
477
478         if(routing_mode == RMODE_ROUTER)
479                 offset = 14;
480         else
481                 type = PKT_MAC;
482
483         if(origpkt->len < offset)
484                 return;
485
486         vpn_packet_t outpkt;
487
488         if(n->outcompression) {
489                 int len = compress_packet(outpkt.data + offset, origpkt->data + offset, origpkt->len - offset, n->outcompression);
490                 if(len < 0) {
491                         logger(DEBUG_TRAFFIC, LOG_ERR, "Error while compressing packet to %s (%s)", n->name, n->hostname);
492                 } else if(len < origpkt->len - offset) {
493                         outpkt.len = len + offset;
494                         origpkt = &outpkt;
495                         type |= PKT_COMPRESSED;
496                 }
497         }
498
499         sptps_send_record(&n->sptps, type, (char *)origpkt->data + offset, origpkt->len - offset);
500         return;
501 }
502
503 static void choose_udp_address(const node_t *n, const sockaddr_t **sa, int *sock) {
504         /* Latest guess */
505         *sa = &n->address;
506         *sock = n->sock;
507
508         /* If the UDP address is confirmed, use it. */
509         if(n->status.udp_confirmed)
510                 return;
511
512         /* Send every third packet to n->address; that could be set
513            to the node's reflexive UDP address discovered during key
514            exchange. */
515
516         static int x = 0;
517         if(++x >= 3) {
518                 x = 0;
519                 return;
520         }
521
522         /* Otherwise, address are found in edges to this node.
523            So we pick a random edge and a random socket. */
524
525         int i = 0;
526         int j = rand() % n->edge_tree->count;
527         edge_t *candidate = NULL;
528
529         for splay_each(edge_t, e, n->edge_tree) {
530                 if(i++ == j) {
531                         candidate = e->reverse;
532                         break;
533                 }
534         }
535
536         if(candidate) {
537                 *sa = &candidate->address;
538                 *sock = rand() % listen_sockets;
539         }
540
541         /* Make sure we have a suitable socket for the chosen address */
542         if(listen_socket[*sock].sa.sa.sa_family != (*sa)->sa.sa_family) {
543                 for(int i = 0; i < listen_sockets; i++) {
544                         if(listen_socket[i].sa.sa.sa_family == (*sa)->sa.sa_family) {
545                                 *sock = i;
546                                 break;
547                         }
548                 }
549         }
550 }
551
552 static void choose_broadcast_address(const node_t *n, const sockaddr_t **sa, int *sock) {
553         static sockaddr_t broadcast_ipv4 = {
554                 .in = {
555                         .sin_family = AF_INET,
556                         .sin_addr.s_addr = -1,
557                 }
558         };
559
560         static sockaddr_t broadcast_ipv6 = {
561                 .in6 = {
562                         .sin6_family = AF_INET6,
563                         .sin6_addr.s6_addr[0x0] = 0xff,
564                         .sin6_addr.s6_addr[0x1] = 0x02,
565                         .sin6_addr.s6_addr[0xf] = 0x01,
566                 }
567         };
568
569         *sock = rand() % listen_sockets;
570
571         if(listen_socket[*sock].sa.sa.sa_family == AF_INET6) {
572                 broadcast_ipv6.in6.sin6_port = n->prevedge->address.in.sin_port;
573                 broadcast_ipv6.in6.sin6_scope_id = listen_socket[*sock].sa.in6.sin6_scope_id;
574                 *sa = &broadcast_ipv6;
575         } else {
576                 broadcast_ipv4.in.sin_port = n->prevedge->address.in.sin_port;
577                 *sa = &broadcast_ipv4;
578         }
579 }
580
581 static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
582         vpn_packet_t pkt1, pkt2;
583         vpn_packet_t *pkt[] = { &pkt1, &pkt2, &pkt1, &pkt2 };
584         vpn_packet_t *inpkt = origpkt;
585         int nextpkt = 0;
586         vpn_packet_t *outpkt;
587         int origlen = origpkt->len;
588         size_t outlen;
589 #if defined(SOL_IP) && defined(IP_TOS)
590         static int priority = 0;
591 #endif
592         int origpriority = origpkt->priority;
593
594         if(!n->status.reachable) {
595                 logger(DEBUG_TRAFFIC, LOG_INFO, "Trying to send UDP packet to unreachable node %s (%s)", n->name, n->hostname);
596                 return;
597         }
598
599         if(n->status.sptps)
600                 return send_sptps_packet(n, origpkt);
601
602         /* Make sure we have a valid key */
603
604         if(!n->status.validkey) {
605                 logger(DEBUG_TRAFFIC, LOG_INFO,
606                                    "No valid key known yet for %s (%s), forwarding via TCP",
607                                    n->name, n->hostname);
608
609                 if(n->last_req_key + 10 <= now.tv_sec) {
610                         send_req_key(n);
611                         n->last_req_key = now.tv_sec;
612                 }
613
614                 send_tcppacket(n->nexthop->connection, origpkt);
615
616                 return;
617         }
618
619         if(n->options & OPTION_PMTU_DISCOVERY && inpkt->len > n->minmtu && (inpkt->data[12] | inpkt->data[13])) {
620                 logger(DEBUG_TRAFFIC, LOG_INFO,
621                                 "Packet for %s (%s) larger than minimum MTU, forwarding via %s",
622                                 n->name, n->hostname, n != n->nexthop ? n->nexthop->name : "TCP");
623
624                 if(n != n->nexthop)
625                         send_packet(n->nexthop, origpkt);
626                 else
627                         send_tcppacket(n->nexthop->connection, origpkt);
628
629                 return;
630         }
631
632         /* Compress the packet */
633
634         if(n->outcompression) {
635                 outpkt = pkt[nextpkt++];
636
637                 if((outpkt->len = compress_packet(outpkt->data, inpkt->data, inpkt->len, n->outcompression)) < 0) {
638                         logger(DEBUG_TRAFFIC, LOG_ERR, "Error while compressing packet to %s (%s)",
639                                    n->name, n->hostname);
640                         return;
641                 }
642
643                 inpkt = outpkt;
644         }
645
646         /* Add sequence number */
647
648         inpkt->seqno = htonl(++(n->sent_seqno));
649         inpkt->len += sizeof inpkt->seqno;
650
651         /* Encrypt the packet */
652
653         if(cipher_active(&n->outcipher)) {
654                 outpkt = pkt[nextpkt++];
655                 outlen = MAXSIZE;
656
657                 if(!cipher_encrypt(&n->outcipher, &inpkt->seqno, inpkt->len, &outpkt->seqno, &outlen, true)) {
658                         logger(DEBUG_TRAFFIC, LOG_ERR, "Error while encrypting packet to %s (%s)", n->name, n->hostname);
659                         goto end;
660                 }
661
662                 outpkt->len = outlen;
663                 inpkt = outpkt;
664         }
665
666         /* Add the message authentication code */
667
668         if(digest_active(&n->outdigest)) {
669                 digest_create(&n->outdigest, &inpkt->seqno, inpkt->len, (char *)&inpkt->seqno + inpkt->len);
670                 inpkt->len += digest_length(&n->outdigest);
671         }
672
673         /* Send the packet */
674
675         const sockaddr_t *sa;
676         int sock;
677
678         /* Overloaded use of priority field: -1 means local broadcast */
679
680         if(origpriority == -1 && n->prevedge)
681                 choose_broadcast_address(n, &sa, &sock);
682         else
683                 choose_udp_address(n, &sa, &sock);
684
685 #if defined(SOL_IP) && defined(IP_TOS)
686         if(priorityinheritance && origpriority != priority
687            && listen_socket[n->sock].sa.sa.sa_family == AF_INET) {
688                 priority = origpriority;
689                 logger(DEBUG_TRAFFIC, LOG_DEBUG, "Setting outgoing packet priority to %d", priority);
690                 if(setsockopt(listen_socket[n->sock].udp.fd, SOL_IP, IP_TOS, &priority, sizeof(priority))) /* SO_PRIORITY doesn't seem to work */
691                         logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "setsockopt", strerror(errno));
692         }
693 #endif
694
695         if(sendto(listen_socket[sock].udp.fd, (char *) &inpkt->seqno, inpkt->len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) {
696                 if(sockmsgsize(sockerrno)) {
697                         if(n->maxmtu >= origlen)
698                                 n->maxmtu = origlen - 1;
699                         if(n->mtu >= origlen)
700                                 n->mtu = origlen - 1;
701                 } else
702                         logger(DEBUG_TRAFFIC, LOG_WARNING, "Error sending packet to %s (%s): %s", n->name, n->hostname, sockstrerror(sockerrno));
703         }
704
705 end:
706         origpkt->len = origlen;
707 }
708
709 bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len) {
710         node_t *to = handle;
711
712         /* Send it via TCP if it is a handshake packet, TCPOnly is in use, or this packet is larger than the MTU. */
713
714         if(type >= SPTPS_HANDSHAKE || ((myself->options | to->options) & OPTION_TCPONLY) || (type != PKT_PROBE && len > to->minmtu)) {
715                 char buf[len * 4 / 3 + 5];
716                 b64encode(data, buf, len);
717                 /* If no valid key is known yet, send the packets using ANS_KEY requests,
718                    to ensure we get to learn the reflexive UDP address. */
719                 if(!to->status.validkey)
720                         return send_request(to->nexthop->connection, "%d %s %s %s -1 -1 -1 %d", ANS_KEY, myself->name, to->name, buf, myself->incompression);
721                 else
722                         return send_request(to->nexthop->connection, "%d %s %s %d %s", REQ_KEY, myself->name, to->name, REQ_SPTPS, buf);
723         }
724
725         /* Otherwise, send the packet via UDP */
726
727         const sockaddr_t *sa;
728         int sock;
729
730         choose_udp_address(to, &sa, &sock);
731
732         if(sendto(listen_socket[sock].udp.fd, data, len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) {
733                 if(sockmsgsize(sockerrno)) {
734                         if(to->maxmtu >= len)
735                                 to->maxmtu = len - 1;
736                         if(to->mtu >= len)
737                                 to->mtu = len - 1;
738                 } else {
739                         logger(DEBUG_TRAFFIC, LOG_WARNING, "Error sending UDP SPTPS packet to %s (%s): %s", to->name, to->hostname, sockstrerror(sockerrno));
740                         return false;
741                 }
742         }
743
744         return true;
745 }
746
747 bool receive_sptps_record(void *handle, uint8_t type, const char *data, uint16_t len) {
748         node_t *from = handle;
749
750         if(type == SPTPS_HANDSHAKE) {
751                 if(!from->status.validkey) {
752                         from->status.validkey = true;
753                         from->status.waitingforkey = false;
754                         logger(DEBUG_META, LOG_INFO, "SPTPS key exchange with %s (%s) succesful", from->name, from->hostname);
755                 }
756                 return true;
757         }
758
759         if(len > MTU) {
760                 logger(DEBUG_ALWAYS, LOG_ERR, "Packet from %s (%s) larger than maximum supported size (%d > %d)", from->name, from->hostname, len, MTU);
761                 return false;
762         }
763
764         vpn_packet_t inpkt;
765
766         if(type == PKT_PROBE) {
767                 inpkt.len = len;
768                 memcpy(inpkt.data, data, len);
769                 mtu_probe_h(from, &inpkt, len);
770                 return true;
771         }
772
773         if(type & ~(PKT_COMPRESSED | PKT_MAC)) {
774                 logger(DEBUG_ALWAYS, LOG_ERR, "Unexpected SPTPS record type %d len %d from %s (%s)", type, len, from->name, from->hostname);
775                 return false;
776         }
777
778         /* Check if we have the headers we need */
779         if(routing_mode != RMODE_ROUTER && !(type & PKT_MAC)) {
780                 logger(DEBUG_TRAFFIC, LOG_ERR, "Received packet from %s (%s) without MAC header (maybe Mode is not set correctly)", from->name, from->hostname);
781                 return false;
782         } else if(routing_mode == RMODE_ROUTER && (type & PKT_MAC)) {
783                 logger(DEBUG_TRAFFIC, LOG_WARNING, "Received packet from %s (%s) with MAC header (maybe Mode is not set correctly)", from->name, from->hostname);
784         }
785
786         int offset = (type & PKT_MAC) ? 0 : 14;
787         if(type & PKT_COMPRESSED) {
788                 length_t ulen = uncompress_packet(inpkt.data + offset, (const uint8_t *)data, len, from->incompression);
789                 if(ulen < 0) {
790                         return false;
791                 } else {
792                         inpkt.len = ulen + offset;
793                 }
794                 if(inpkt.len > MAXSIZE)
795                         abort();
796         } else {
797                 memcpy(inpkt.data + offset, data, len);
798                 inpkt.len = len + offset;
799         }
800
801         /* Generate the Ethernet packet type if necessary */
802         if(offset) {
803                 switch(inpkt.data[14] >> 4) {
804                         case 4:
805                                 inpkt.data[12] = 0x08;
806                                 inpkt.data[13] = 0x00;
807                                 break;
808                         case 6:
809                                 inpkt.data[12] = 0x86;
810                                 inpkt.data[13] = 0xDD;
811                                 break;
812                         default:
813                                 logger(DEBUG_TRAFFIC, LOG_ERR,
814                                                    "Unknown IP version %d while reading packet from %s (%s)",
815                                                    inpkt.data[14] >> 4, from->name, from->hostname);
816                                 return false;
817                 }
818         }
819
820         receive_packet(from, &inpkt);
821         return true;
822 }
823
824 /*
825   send a packet to the given vpn ip.
826 */
827 void send_packet(node_t *n, vpn_packet_t *packet) {
828         node_t *via;
829
830         if(n == myself) {
831                 if(overwrite_mac)
832                          memcpy(packet->data, mymac.x, ETH_ALEN);
833                 n->out_packets++;
834                 n->out_bytes += packet->len;
835                 devops.write(packet);
836                 return;
837         }
838
839         logger(DEBUG_TRAFFIC, LOG_ERR, "Sending packet of %d bytes to %s (%s)",
840                            packet->len, n->name, n->hostname);
841
842         if(!n->status.reachable) {
843                 logger(DEBUG_TRAFFIC, LOG_INFO, "Node %s (%s) is not reachable",
844                                    n->name, n->hostname);
845                 return;
846         }
847
848         n->out_packets++;
849         n->out_bytes += packet->len;
850
851         if(n->status.sptps) {
852                 send_sptps_packet(n, packet);
853                 return;
854         }
855
856         via = (packet->priority == -1 || n->via == myself) ? n->nexthop : n->via;
857
858         if(via != n)
859                 logger(DEBUG_TRAFFIC, LOG_INFO, "Sending packet to %s via %s (%s)",
860                            n->name, via->name, n->via->hostname);
861
862         if(packet->priority == -1 || ((myself->options | via->options) & OPTION_TCPONLY)) {
863                 if(!send_tcppacket(via->connection, packet))
864                         terminate_connection(via->connection, true);
865         } else
866                 send_udppacket(via, packet);
867 }
868
869 /* Broadcast a packet using the minimum spanning tree */
870
871 void broadcast_packet(const node_t *from, vpn_packet_t *packet) {
872         // Always give ourself a copy of the packet.
873         if(from != myself)
874                 send_packet(myself, packet);
875
876         // In TunnelServer mode, do not forward broadcast packets.
877         // The MST might not be valid and create loops.
878         if(tunnelserver || broadcast_mode == BMODE_NONE)
879                 return;
880
881         logger(DEBUG_TRAFFIC, LOG_INFO, "Broadcasting packet of %d bytes from %s (%s)",
882                            packet->len, from->name, from->hostname);
883
884         switch(broadcast_mode) {
885                 // In MST mode, broadcast packets travel via the Minimum Spanning Tree.
886                 // This guarantees all nodes receive the broadcast packet, and
887                 // usually distributes the sending of broadcast packets over all nodes.
888                 case BMODE_MST:
889                         for list_each(connection_t, c, connection_list)
890                                 if(c->status.active && c->status.mst && c != from->nexthop->connection)
891                                         send_packet(c->node, packet);
892                         break;
893
894                 // In direct mode, we send copies to each node we know of.
895                 // However, this only reaches nodes that can be reached in a single hop.
896                 // We don't have enough information to forward broadcast packets in this case.
897                 case BMODE_DIRECT:
898                         if(from != myself)
899                                 break;
900
901                         for splay_each(node_t, n, node_tree)
902                                 if(n->status.reachable && ((n->via == myself && n->nexthop == n) || n->via == n))
903                                         send_packet(n, packet);
904                         break;
905
906                 default:
907                         break;
908         }
909 }
910
911 static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) {
912         node_t *n = NULL;
913         bool hard = false;
914         static time_t last_hard_try = 0;
915
916         for splay_each(edge_t, e, edge_weight_tree) {
917                 if(!e->to->status.reachable || e->to == myself)
918                         continue;
919
920                 if(sockaddrcmp_noport(from, &e->address)) {
921                         if(last_hard_try == now.tv_sec)
922                                 continue;
923                         hard = true;
924                 }
925
926                 if(!try_mac(e->to, pkt))
927                         continue;
928
929                 n = e->to;
930                 break;
931         }
932
933         if(hard)
934                 last_hard_try = now.tv_sec;
935
936         last_hard_try = now.tv_sec;
937         return n;
938 }
939
940 void handle_incoming_vpn_data(void *data, int flags) {
941         listen_socket_t *ls = data;
942         vpn_packet_t pkt;
943         char *hostname;
944         sockaddr_t from = {{0}};
945         socklen_t fromlen = sizeof from;
946         node_t *n;
947         int len;
948
949         len = recvfrom(ls->udp.fd, (char *) &pkt.seqno, MAXSIZE, 0, &from.sa, &fromlen);
950
951         if(len <= 0 || len > MAXSIZE) {
952                 if(!sockwouldblock(sockerrno))
953                         logger(DEBUG_ALWAYS, LOG_ERR, "Receiving packet failed: %s", sockstrerror(sockerrno));
954                 return;
955         }
956
957         pkt.len = len;
958
959         sockaddrunmap(&from); /* Some braindead IPv6 implementations do stupid things. */
960
961         n = lookup_node_udp(&from);
962
963         if(!n) {
964                 n = try_harder(&from, &pkt);
965                 if(n)
966                         update_node_udp(n, &from);
967                 else if(debug_level >= DEBUG_PROTOCOL) {
968                         hostname = sockaddr2hostname(&from);
969                         logger(DEBUG_PROTOCOL, LOG_WARNING, "Received UDP packet from unknown source %s", hostname);
970                         free(hostname);
971                         return;
972                 }
973                 else
974                         return;
975         }
976
977         n->sock = ls - listen_socket;
978
979         receive_udppacket(n, &pkt);
980 }
981
982 void handle_device_data(void *data, int flags) {
983         vpn_packet_t packet;
984
985         packet.priority = 0;
986
987         if(devops.read(&packet)) {
988                 myself->in_packets++;
989                 myself->in_bytes += packet.len;
990                 route(myself, &packet);
991         }
992 }