]> git.meshlink.io Git - meshlink/blobdiff - src/net_packet.c
Try to get a new reflexive UDP address if UDP probes failed.
[meshlink] / src / net_packet.c
index e4f3295af941bdd92335298c30b9c776e9b9c8dd..0510b54be8def584f8b9f33d78329b4d852baaa7 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) {
@@ -472,27 +478,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;