]> git.meshlink.io Git - meshlink/blob - src/net_packet.c
Remove support for broadcast packets.
[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 static node_t *try_harder(meshlink_handle_t *mesh, const sockaddr_t *from, const vpn_packet_t *pkt) {
481         node_t *n = NULL;
482         bool hard = false;
483
484         for splay_each(edge_t, e, mesh->edges) {
485                 if(!e->to->status.reachable || e->to == mesh->self) {
486                         continue;
487                 }
488
489                 if(sockaddrcmp_noport(from, &e->address)) {
490                         if(mesh->last_hard_try == mesh->loop.now.tv_sec) {
491                                 continue;
492                         }
493
494                         hard = true;
495                 }
496
497                 if(!try_mac(mesh, e->to, pkt)) {
498                         continue;
499                 }
500
501                 n = e->to;
502                 break;
503         }
504
505         if(hard) {
506                 mesh->last_hard_try = mesh->loop.now.tv_sec;
507         }
508
509         return n;
510 }
511
512 void handle_incoming_vpn_data(event_loop_t *loop, void *data, int flags) {
513         (void)flags;
514         meshlink_handle_t *mesh = loop->data;
515         listen_socket_t *ls = data;
516         vpn_packet_t pkt;
517         char *hostname;
518         sockaddr_t from;
519         socklen_t fromlen = sizeof(from);
520         node_t *n;
521         int len;
522
523         memset(&from, 0, sizeof(from));
524
525         len = recvfrom(ls->udp.fd, pkt.data, MAXSIZE, 0, &from.sa, &fromlen);
526
527         if(len <= 0 || len > MAXSIZE) {
528                 if(!sockwouldblock(sockerrno)) {
529                         logger(mesh, MESHLINK_ERROR, "Receiving packet failed: %s", sockstrerror(sockerrno));
530                 }
531
532                 return;
533         }
534
535         pkt.len = len;
536
537         sockaddrunmap(&from); /* Some braindead IPv6 implementations do stupid things. */
538
539         n = lookup_node_udp(mesh, &from);
540
541         if(!n) {
542                 n = try_harder(mesh, &from, &pkt);
543
544                 if(n) {
545                         update_node_udp(mesh, n, &from);
546                 } else if(mesh->log_level >= MESHLINK_WARNING) {
547                         hostname = sockaddr2hostname(&from);
548                         logger(mesh, MESHLINK_WARNING, "Received UDP packet from unknown source %s", hostname);
549                         free(hostname);
550                         return;
551                 } else {
552                         return;
553                 }
554         }
555
556         if(n->status.blacklisted) {
557                 logger(mesh, MESHLINK_WARNING, "Dropping packet from blacklisted node %s", n->name);
558                 return;
559         }
560
561         n->sock = ls - mesh->listen_socket;
562
563         receive_udppacket(mesh, n, &pkt);
564 }