]> git.meshlink.io Git - meshlink/blobdiff - src/net_packet.c
Allow nodes to learn their own reflexive UDP address.
[meshlink] / src / net_packet.c
index e4f3295af941bdd92335298c30b9c776e9b9c8dd..a2709553fb9893f555d548cc57a8c62372730289 100644 (file)
@@ -102,6 +102,12 @@ static void send_mtu_probe_handler(event_loop_t *loop, void *data) {
        }
 
        if(n->mtuprobes == 31) {
+               if(!n->minmtu && n->status.want_udp) {
+                       /* Send a dummy ANS_KEY to try to update the reflexive UDP address */
+                       send_request(mesh, n->nexthop->connection, NULL, "%d %s %s . -1 -1 -1 0", ANS_KEY, mesh->self->name, n->name);
+                       n->status.want_udp = false;
+               }
+
                timeout = mesh->dev_class_traits[n->devclass].pinginterval;
                goto end;
        } else if(n->mtuprobes == 32) {
@@ -179,7 +185,14 @@ static void mtu_probe_h(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet
                   is possible using the address and socket that the reply
                   packet used. */
 
-               n->status.udp_confirmed = true;
+               if(!n->status.udp_confirmed) {
+                       char *address, *port;
+                       sockaddr2str(&n->address, &address, &port);
+                       send_request(mesh, n->nexthop->connection, NULL, "%d %s %s . -1 -1 -1 0 %s %s", ANS_KEY, n->name, n->name, address, port);
+                       free(address);
+                       free(port);
+                       n->status.udp_confirmed = true;
+               }
 
                /* If we haven't established the PMTU yet, restart the discovery process. */
 
@@ -472,27 +485,12 @@ void send_packet(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet) {
 
        n->out_packets++;
        n->out_bytes += packet->len;
+       n->status.want_udp = true;
 
        send_sptps_packet(mesh, n, packet);
        return;
 }
 
-/* Broadcast a packet using the minimum spanning tree */
-
-void broadcast_packet(meshlink_handle_t *mesh, const node_t *from, vpn_packet_t *packet) {
-       // Always give ourself a copy of the packet.
-       if(from != mesh->self) {
-               send_packet(mesh, mesh->self, packet);
-       }
-
-       logger(mesh, MESHLINK_INFO, "Broadcasting packet of %d bytes from %s", packet->len, from->name);
-
-       for list_each(connection_t, c, mesh->connections)
-               if(c->status.active && c->status.mst && c != from->nexthop->connection) {
-                       send_packet(mesh, c->node, packet);
-               }
-}
-
 static node_t *try_harder(meshlink_handle_t *mesh, const sockaddr_t *from, const vpn_packet_t *pkt) {
        node_t *n = NULL;
        bool hard = false;