]> git.meshlink.io Git - meshlink/blob - src/net_packet.c
Rename mesh_mutex to mutex.
[meshlink] / src / net_packet.c
1 /*
2     net_packet.c -- Handles in- and outgoing VPN packets
3     Copyright (C) 2014-2017 Guus Sliepen <guus@meshlink.io>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License along
16     with this program; if not, write to the Free Software Foundation, Inc.,
17     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "system.h"
21
22 #include "conf.h"
23 #include "connection.h"
24 #include "crypto.h"
25 #include "graph.h"
26 #include "logger.h"
27 #include "meshlink_internal.h"
28 #include "net.h"
29 #include "netutl.h"
30 #include "protocol.h"
31 #include "route.h"
32 #include "utils.h"
33 #include "xalloc.h"
34
35 int keylifetime = 0;
36
37 static void send_udppacket(meshlink_handle_t *mesh, node_t *, vpn_packet_t *);
38
39 #define MAX_SEQNO 1073741824
40
41 /* mtuprobes == 1..30: initial discovery, send bursts with 1 second interval
42    mtuprobes ==    31: sleep pinginterval seconds
43    mtuprobes ==    32: send 1 burst, sleep pingtimeout second
44    mtuprobes ==    33: no response from other side, restart PMTU discovery process
45
46    Probes are sent in batches of at least three, with random sizes between the
47    lower and upper boundaries for the MTU thus far discovered.
48
49    After the initial discovery, a fourth packet is added to each batch with a
50    size larger than the currently known PMTU, to test if the PMTU has increased.
51
52    In case local discovery is enabled, another packet is added to each batch,
53    which will be broadcast to the local network.
54
55 */
56
57 static void send_mtu_probe_handler(event_loop_t *loop, void *data) {
58         meshlink_handle_t *mesh = loop->data;
59         node_t *n = data;
60         int timeout = 1;
61
62         n->mtuprobes++;
63
64         if(!n->status.reachable || !n->status.validkey) {
65                 logger(mesh, MESHLINK_INFO, "Trying to send MTU probe to unreachable or rekeying node %s", n->name);
66                 n->mtuprobes = 0;
67                 return;
68         }
69
70         if(n->mtuprobes > 32) {
71                 if(!n->minmtu) {
72                         n->mtuprobes = 31;
73                         timeout = mesh->dev_class_traits[n->devclass].pinginterval;
74                         goto end;
75                 }
76
77                 logger(mesh, MESHLINK_INFO, "%s did not respond to UDP ping, restarting PMTU discovery", n->name);
78                 n->status.udp_confirmed = false;
79                 n->mtuprobes = 1;
80                 n->minmtu = 0;
81                 n->maxmtu = MTU;
82
83                 update_node_pmtu(mesh, n);
84         }
85
86         if(n->mtuprobes >= 10 && n->mtuprobes < 32 && !n->minmtu) {
87                 logger(mesh, MESHLINK_INFO, "No response to MTU probes from %s", n->name);
88                 n->mtuprobes = 31;
89         }
90
91         if(n->mtuprobes == 30 || (n->mtuprobes < 30 && n->minmtu >= n->maxmtu)) {
92                 if(n->minmtu > n->maxmtu) {
93                         n->minmtu = n->maxmtu;
94                         update_node_pmtu(mesh, n);
95                 } else {
96                         n->maxmtu = n->minmtu;
97                 }
98
99                 n->mtu = n->minmtu;
100                 logger(mesh, MESHLINK_INFO, "Fixing MTU of %s to %d after %d probes", n->name, n->mtu, n->mtuprobes);
101                 n->mtuprobes = 31;
102         }
103
104         if(n->mtuprobes == 31) {
105                 timeout = mesh->dev_class_traits[n->devclass].pinginterval;
106                 goto end;
107         } else if(n->mtuprobes == 32) {
108                 timeout = mesh->dev_class_traits[n->devclass].pingtimeout;
109         }
110
111         for(int i = 0; i < 5; i++) {
112                 int len;
113
114                 if(i == 0) {
115                         if(n->mtuprobes < 30 || n->maxmtu + 8 >= MTU) {
116                                 continue;
117                         }
118
119                         len = n->maxmtu + 8;
120                 } else if(n->maxmtu <= n->minmtu) {
121                         len = n->maxmtu;
122                 } else {
123                         len = n->minmtu + 1 + prng(mesh, n->maxmtu - n->minmtu);
124                 }
125
126                 if(len < 64) {
127                         len = 64;
128                 }
129
130                 vpn_packet_t packet;
131                 packet.probe = true;
132                 memset(packet.data, 0, 14);
133                 randomize(packet.data + 14, len - 14);
134                 packet.len = len;
135                 n->status.broadcast = i >= 4 && n->mtuprobes <= 10 && n->prevedge;
136
137                 logger(mesh, MESHLINK_DEBUG, "Sending MTU probe length %d to %s", len, n->name);
138
139                 send_udppacket(mesh, n, &packet);
140         }
141
142         n->status.broadcast = false;
143
144 end:
145         timeout_set(&mesh->loop, &n->mtutimeout, &(struct timeval) {
146                 timeout, prng(mesh, TIMER_FUDGE)
147         });
148 }
149
150 void send_mtu_probe(meshlink_handle_t *mesh, node_t *n) {
151         timeout_add(&mesh->loop, &n->mtutimeout, send_mtu_probe_handler, n, &(struct timeval) {
152                 1, 0
153         });
154         send_mtu_probe_handler(&mesh->loop, n);
155 }
156
157 static void mtu_probe_h(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet, uint16_t len) {
158         if(len < 64) {
159                 logger(mesh, MESHLINK_WARNING, "Got too short MTU probe length %d from %s", packet->len, n->name);
160                 return;
161         }
162
163         logger(mesh, MESHLINK_DEBUG, "Got MTU probe length %d from %s", packet->len, n->name);
164
165         if(!packet->data[0]) {
166                 /* It's a probe request, send back a reply */
167
168                 packet->data[0] = 1;
169
170                 /* Temporarily set udp_confirmed, so that the reply is sent
171                    back exactly the way it came in. */
172
173                 bool udp_confirmed = n->status.udp_confirmed;
174                 n->status.udp_confirmed = true;
175                 send_udppacket(mesh, n, packet);
176                 n->status.udp_confirmed = udp_confirmed;
177         } else {
178                 /* It's a valid reply: now we know bidirectional communication
179                    is possible using the address and socket that the reply
180                    packet used. */
181
182                 n->status.udp_confirmed = true;
183
184                 /* If we haven't established the PMTU yet, restart the discovery process. */
185
186                 if(n->mtuprobes > 30) {
187                         if(len == n->maxmtu + 8) {
188                                 logger(mesh, MESHLINK_INFO, "Increase in PMTU to %s detected, restarting PMTU discovery", n->name);
189                                 n->maxmtu = MTU;
190                                 n->mtuprobes = 10;
191                                 return;
192                         }
193
194                         if(n->minmtu) {
195                                 n->mtuprobes = 30;
196                         } else {
197                                 n->mtuprobes = 1;
198                         }
199                 }
200
201                 /* If applicable, raise the minimum supported MTU */
202
203                 if(len > n->maxmtu) {
204                         len = n->maxmtu;
205                 }
206
207                 if(n->minmtu < len) {
208                         n->minmtu = len;
209                         update_node_pmtu(mesh, n);
210                 }
211         }
212 }
213
214 /* VPN packet I/O */
215
216 static void receive_packet(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet) {
217         logger(mesh, MESHLINK_DEBUG, "Received packet of %d bytes from %s", packet->len, n->name);
218
219         if(n->status.blacklisted) {
220                 logger(mesh, MESHLINK_WARNING, "Dropping packet from blacklisted node %s", n->name);
221         } else {
222                 n->in_packets++;
223                 n->in_bytes += packet->len;
224
225                 route(mesh, n, packet);
226         }
227 }
228
229 static bool try_mac(meshlink_handle_t *mesh, node_t *n, const vpn_packet_t *inpkt) {
230         (void)mesh;
231         return sptps_verify_datagram(&n->sptps, inpkt->data, inpkt->len);
232 }
233
234 static void receive_udppacket(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *inpkt) {
235         if(!n->sptps.state) {
236                 if(!n->status.waitingforkey) {
237                         logger(mesh, MESHLINK_DEBUG, "Got packet from %s but we haven't exchanged keys yet", n->name);
238                         send_req_key(mesh, n);
239                 } else {
240                         logger(mesh, MESHLINK_DEBUG, "Got packet from %s but he hasn't got our key yet", n->name);
241                 }
242
243                 return;
244         }
245
246         sptps_receive_data(&n->sptps, inpkt->data, inpkt->len);
247 }
248
249 static void send_sptps_packet(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *origpkt) {
250         if(!n->status.validkey) {
251                 logger(mesh, MESHLINK_INFO, "No valid key known yet for %s", n->name);
252
253                 if(!n->status.waitingforkey) {
254                         send_req_key(mesh, n);
255                 } else if(n->last_req_key + 10 < mesh->loop.now.tv_sec) {
256                         logger(mesh, MESHLINK_DEBUG, "No key from %s after 10 seconds, restarting SPTPS", n->name);
257                         sptps_stop(&n->sptps);
258                         n->status.waitingforkey = false;
259                         send_req_key(mesh, n);
260                 }
261
262                 return;
263         }
264
265         uint8_t type = 0;
266
267         // If it's a probe, send it immediately without trying to compress it.
268         if(origpkt->probe) {
269                 sptps_send_record(&n->sptps, PKT_PROBE, origpkt->data, origpkt->len);
270                 return;
271         }
272
273         sptps_send_record(&n->sptps, type, origpkt->data, origpkt->len);
274         return;
275 }
276
277 static void choose_udp_address(meshlink_handle_t *mesh, const node_t *n, const sockaddr_t **sa, int *sock) {
278         /* Latest guess */
279         *sa = &n->address;
280         *sock = n->sock;
281
282         /* If the UDP address is confirmed, use it. */
283         if(n->status.udp_confirmed) {
284                 return;
285         }
286
287         /* Send every third packet to n->address; that could be set
288            to the node's reflexive UDP address discovered during key
289            exchange. */
290
291         if(++mesh->udp_choice >= 3) {
292                 mesh->udp_choice = 0;
293                 return;
294         }
295
296         /* Otherwise, address are found in edges to this node.
297            So we pick a random edge and a random socket. */
298
299         int i = 0;
300         int j = prng(mesh, n->edge_tree->count);
301         edge_t *candidate = NULL;
302
303         for splay_each(edge_t, e, n->edge_tree) {
304                 if(i++ == j) {
305                         candidate = e->reverse;
306                         break;
307                 }
308         }
309
310         if(candidate) {
311                 *sa = &candidate->address;
312                 *sock = prng(mesh, mesh->listen_sockets);
313         }
314
315         /* Make sure we have a suitable socket for the chosen address */
316         if(mesh->listen_socket[*sock].sa.sa.sa_family != (*sa)->sa.sa_family) {
317                 for(int i = 0; i < mesh->listen_sockets; i++) {
318                         if(mesh->listen_socket[i].sa.sa.sa_family == (*sa)->sa.sa_family) {
319                                 *sock = i;
320                                 break;
321                         }
322                 }
323         }
324 }
325
326 static void choose_broadcast_address(meshlink_handle_t *mesh, const node_t *n, const sockaddr_t **sa, int *sock) {
327         *sock = prng(mesh, mesh->listen_sockets);
328         sockaddr_t *broadcast_sa = &mesh->listen_socket[*sock].broadcast_sa;
329
330         if(broadcast_sa->sa.sa_family == AF_INET6) {
331                 broadcast_sa->in6.sin6_port = n->prevedge->address.in.sin_port;
332         } else {
333                 broadcast_sa->in.sin_port = n->prevedge->address.in.sin_port;
334         }
335
336         *sa = broadcast_sa;
337 }
338
339 static void send_udppacket(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *origpkt) {
340         if(!n->status.reachable) {
341                 logger(mesh, MESHLINK_INFO, "Trying to send UDP packet to unreachable node %s", n->name);
342                 return;
343         }
344
345         send_sptps_packet(mesh, n, origpkt);
346 }
347
348 bool send_sptps_data(void *handle, uint8_t type, const void *data, size_t len) {
349         assert(handle);
350         assert(data);
351         assert(len);
352
353         node_t *to = handle;
354         meshlink_handle_t *mesh = to->mesh;
355
356         /* Send it via TCP if it is a handshake packet, TCPOnly is in use, or this packet is larger than the MTU. */
357
358         if(type >= SPTPS_HANDSHAKE || (type != PKT_PROBE && len > to->minmtu)) {
359                 char buf[len * 4 / 3 + 5];
360                 b64encode(data, buf, len);
361
362                 /* If no valid key is known yet, send the packets using ANS_KEY requests,
363                    to ensure we get to learn the reflexive UDP address. */
364                 if(!to->status.validkey) {
365                         return send_request(mesh, to->nexthop->connection, NULL, "%d %s %s %s -1 -1 -1 %d", ANS_KEY, mesh->self->name, to->name, buf, 0);
366                 } else {
367                         return send_request(mesh, to->nexthop->connection, NULL, "%d %s %s %d %s", REQ_KEY, mesh->self->name, to->name, REQ_SPTPS, buf);
368                 }
369         }
370
371         /* Otherwise, send the packet via UDP */
372
373         const sockaddr_t *sa;
374         int sock;
375
376         if(to->status.broadcast) {
377                 choose_broadcast_address(mesh, to, &sa, &sock);
378         } else {
379                 choose_udp_address(mesh, to, &sa, &sock);
380         }
381
382         if(sendto(mesh->listen_socket[sock].udp.fd, data, len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) {
383                 if(sockmsgsize(sockerrno)) {
384                         if(to->maxmtu >= len) {
385                                 to->maxmtu = len - 1;
386                         }
387
388                         if(to->mtu >= len) {
389                                 to->mtu = len - 1;
390                         }
391                 } else {
392                         logger(mesh, MESHLINK_WARNING, "Error sending UDP SPTPS packet to %s: %s", to->name, sockstrerror(sockerrno));
393                         return false;
394                 }
395         }
396
397         return true;
398 }
399
400 bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len) {
401         assert(handle);
402         assert(!data || len);
403
404         node_t *from = handle;
405         meshlink_handle_t *mesh = from->mesh;
406
407         if(type == SPTPS_HANDSHAKE) {
408                 if(!from->status.validkey) {
409                         logger(mesh, MESHLINK_INFO, "SPTPS key exchange with %s successful", from->name);
410                         from->status.validkey = true;
411                         from->status.waitingforkey = false;
412
413                         if(from->utcp) {
414                                 utcp_reset_timers(from->utcp);
415                         }
416                 }
417
418                 return true;
419         }
420
421         if(len > MTU) {
422                 logger(mesh, MESHLINK_ERROR, "Packet from %s larger than maximum supported size (%d > %d)", from->name, len, MTU);
423                 return false;
424         }
425
426         vpn_packet_t inpkt;
427
428         if(type == PKT_PROBE) {
429                 inpkt.len = len;
430                 inpkt.probe = true;
431                 memcpy(inpkt.data, data, len);
432                 mtu_probe_h(mesh, from, &inpkt, len);
433                 return true;
434         } else {
435                 inpkt.probe = false;
436         }
437
438         if(type & ~(PKT_COMPRESSED)) {
439                 logger(mesh, MESHLINK_ERROR, "Unexpected SPTPS record type %d len %d from %s", type, len, from->name);
440                 return false;
441         }
442
443         if(type & PKT_COMPRESSED) {
444                 logger(mesh, MESHLINK_ERROR, "Error while decompressing packet from %s", from->name);
445                 return false;
446         }
447
448         memcpy(inpkt.data, data, len); // TODO: get rid of memcpy
449         inpkt.len = len;
450
451         receive_packet(mesh, from, &inpkt);
452         return true;
453 }
454
455 /*
456   send a packet to the given vpn ip.
457 */
458 void send_packet(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet) {
459         if(n == mesh->self) {
460                 n->out_packets++;
461                 n->out_bytes += packet->len;
462                 // TODO: send to application
463                 return;
464         }
465
466         logger(mesh, MESHLINK_DEBUG, "Sending packet of %d bytes to %s", packet->len, n->name);
467
468         if(!n->status.reachable) {
469                 logger(mesh, MESHLINK_WARNING, "Node %s is not reachable", n->name);
470                 return;
471         }
472
473         n->out_packets++;
474         n->out_bytes += packet->len;
475
476         send_sptps_packet(mesh, n, packet);
477         return;
478 }
479
480 /* Broadcast a packet using the minimum spanning tree */
481
482 void broadcast_packet(meshlink_handle_t *mesh, const node_t *from, vpn_packet_t *packet) {
483         // Always give ourself a copy of the packet.
484         if(from != mesh->self) {
485                 send_packet(mesh, mesh->self, packet);
486         }
487
488         logger(mesh, MESHLINK_INFO, "Broadcasting packet of %d bytes from %s", packet->len, from->name);
489
490         for list_each(connection_t, c, mesh->connections)
491                 if(c->status.active && c->status.mst && c != from->nexthop->connection) {
492                         send_packet(mesh, c->node, packet);
493                 }
494 }
495
496 static node_t *try_harder(meshlink_handle_t *mesh, const sockaddr_t *from, const vpn_packet_t *pkt) {
497         node_t *n = NULL;
498         bool hard = false;
499
500         for splay_each(edge_t, e, mesh->edges) {
501                 if(!e->to->status.reachable || e->to == mesh->self) {
502                         continue;
503                 }
504
505                 if(sockaddrcmp_noport(from, &e->address)) {
506                         if(mesh->last_hard_try == mesh->loop.now.tv_sec) {
507                                 continue;
508                         }
509
510                         hard = true;
511                 }
512
513                 if(!try_mac(mesh, e->to, pkt)) {
514                         continue;
515                 }
516
517                 n = e->to;
518                 break;
519         }
520
521         if(hard) {
522                 mesh->last_hard_try = mesh->loop.now.tv_sec;
523         }
524
525         return n;
526 }
527
528 void handle_incoming_vpn_data(event_loop_t *loop, void *data, int flags) {
529         (void)flags;
530         meshlink_handle_t *mesh = loop->data;
531         listen_socket_t *ls = data;
532         vpn_packet_t pkt;
533         char *hostname;
534         sockaddr_t from;
535         socklen_t fromlen = sizeof(from);
536         node_t *n;
537         int len;
538
539         memset(&from, 0, sizeof(from));
540
541         len = recvfrom(ls->udp.fd, pkt.data, MAXSIZE, 0, &from.sa, &fromlen);
542
543         if(len <= 0 || len > MAXSIZE) {
544                 if(!sockwouldblock(sockerrno)) {
545                         logger(mesh, MESHLINK_ERROR, "Receiving packet failed: %s", sockstrerror(sockerrno));
546                 }
547
548                 return;
549         }
550
551         pkt.len = len;
552
553         sockaddrunmap(&from); /* Some braindead IPv6 implementations do stupid things. */
554
555         n = lookup_node_udp(mesh, &from);
556
557         if(!n) {
558                 n = try_harder(mesh, &from, &pkt);
559
560                 if(n) {
561                         update_node_udp(mesh, n, &from);
562                 } else if(mesh->log_level >= MESHLINK_WARNING) {
563                         hostname = sockaddr2hostname(&from);
564                         logger(mesh, MESHLINK_WARNING, "Received UDP packet from unknown source %s", hostname);
565                         free(hostname);
566                         return;
567                 } else {
568                         return;
569                 }
570         }
571
572         if(n->status.blacklisted) {
573                 logger(mesh, MESHLINK_WARNING, "Dropping packet from blacklisted node %s", n->name);
574                 return;
575         }
576
577         n->sock = ls - mesh->listen_socket;
578
579         receive_udppacket(mesh, n, &pkt);
580 }