X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fpmtu.c;h=36152cffec2af6d8d23a61f32d5a8fa7ffa202c9;hb=689fd74cf976264f54d9c61f09ef5338fa5c5f23;hp=84fd23af8c4290b0a20f9c094852b766e359c62d;hpb=bfbbc484bef5a4c76656fdfbb2336f1d10510988;p=meshlink diff --git a/src/pmtu.c b/src/pmtu.c index 84fd23af..36152cff 100644 --- a/src/pmtu.c +++ b/src/pmtu.c @@ -91,8 +91,16 @@ 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; + + // If we also have a meta-connection to this node, send a PING on it as well + connection_t *c = n->connection; + + if(c && !c->status.pinged) { + send_ping(mesh, c); + } } static void send_udp_probe_reply(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet, uint16_t len) { @@ -154,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); @@ -212,17 +222,25 @@ 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; + timespec_sub(&mesh->loop.now, &n->last_udp_probe_sent, &elapsed); - logger(mesh, MESHLINK_DEBUG, "try_udp(%s) %d %d\n", n->name, (int)elapsed.tv_sec, interval); + 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); + if(n->status.udp_confirmed) { + n->udpprobes--; + } + if(!n->status.udp_confirmed && n->prevedge) { n->status.broadcast = true; send_udp_probe_packet(mesh, n, MIN_PROBE_SIZE); @@ -300,8 +318,6 @@ static uint16_t choose_initial_maxmtu(meshlink_handle_t *mesh, node_t *n) { */ static void try_pmtu(meshlink_handle_t *mesh, node_t *n) { - logger(mesh, MESHLINK_DEBUG, "try_pmtu(%s) %d %d\n", n->name, n->mtuprobes, n->status.udp_confirmed); - if(!n->status.udp_confirmed) { n->mtuprobes = 0; n->minmtu = 0; @@ -384,8 +400,6 @@ static void try_pmtu(meshlink_handle_t *mesh, node_t *n) { */ void keepalive(meshlink_handle_t *mesh, node_t *n, bool traffic) { - logger(mesh, MESHLINK_DEBUG, "keepalive(%s) %d %d\n", n->name, n->status.reachable, n->status.validkey); - if(!n->status.reachable || !n->status.validkey) { return; }