]> git.meshlink.io Git - meshlink/commitdiff
Fast retries and timeout of UDP probes.
authorGuus Sliepen <guus@meshlink.io>
Thu, 27 Aug 2020 20:32:07 +0000 (22:32 +0200)
committerGuus Sliepen <guus@meshlink.io>
Fri, 8 Oct 2021 18:57:24 +0000 (20:57 +0200)
When the previous probe hasn't been replied to, try the next UDP probe
faster. After three probes without a reply, consider the UDP connection
timed out.

src/node.h
src/pmtu.c

index 24f78dcfc4efb91e7a4ad70d85389cf0d1a5deb0..0131e35972c93086bbf8a6c02b6d21b2ef8aab1c 100644 (file)
@@ -73,7 +73,8 @@ typedef struct node_t {
        timeout_t udp_ping_timeout;             /* UDP probe event */
        struct timespec last_mtu_probe_sent;    /* Time that the last MTU probe was sent */
        struct timespec last_udp_probe_sent;    /* Time that the last UDP probe was sent */
-       int mtuprobes;                          /* Number of probes */
+       int8_t mtuprobes;                       /* MTU probes counter */
+       int8_t udpprobes;                       /* UDP probes counter */
        uint16_t last_mtu_len;                  /* Size of the last sent probe */
        uint16_t mtu;                           /* Maximum size of packets to send to this node */
        uint16_t maxmtu;                        /* Probed maximum MTU */
index d91919eed40f9e95a653f00d7cad55389cd293a7..5220a737459f0cd061e844be7fd99b442ee5686f 100644 (file)
@@ -91,6 +91,7 @@ static void udp_probe_timeout_handler(event_loop_t *loop, void *data) {
        logger(mesh, MESHLINK_INFO, "Too much time has elapsed since last UDP ping response from %s, stopping UDP communication", n->name);
        n->status.udp_confirmed = false;
        n->mtuprobes = 0;
+       n->udpprobes = 0;
        n->minmtu = 0;
        n->maxmtu = MTU;
 
@@ -161,6 +162,8 @@ void udp_probe_h(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet, uint1
                n->status.udp_confirmed = true;
        }
 
+       n->udpprobes = 0;
+
        // Reset the UDP ping timer.
 
        timeout_del(&mesh->loop, &n->udp_ping_timeout);
@@ -219,14 +222,21 @@ static void send_udp_probe_packet(meshlink_handle_t *mesh, node_t *n, int len) {
 static void try_udp(meshlink_handle_t *mesh, node_t *n) {
        /* Probe request */
 
+       if(n->udpprobes < -3) {
+               /* We lost three UDP probes, UDP status is no longer unconfirmed */
+               udp_probe_timeout_handler(&mesh->loop, n);
+       }
+
        struct timespec elapsed;
+
        timespec_sub(&mesh->loop.now, &n->last_udp_probe_sent, &elapsed);
 
-       int interval = n->status.udp_confirmed ? 10 : 2;
+       int interval = (n->status.udp_confirmed && n->udpprobes >= 0) ? 10 : 2;
 
        if(elapsed.tv_sec >= interval) {
                n->last_udp_probe_sent = mesh->loop.now;
                send_udp_probe_packet(mesh, n, MIN_PROBE_SIZE);
+               n->udpprobes--;
 
                if(!n->status.udp_confirmed && n->prevedge) {
                        n->status.broadcast = true;