From 5d5563821bd159ecdc4c1249664219536e2dceb3 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Tue, 10 Nov 2020 21:10:00 +0100 Subject: [PATCH] Only reset UDP SPTPS sessions if the session ID changed. Previously we reset the SPTPS session if we detected if a node was unreachable. However, that node might not think it was unreachable, leading to only one side to reset the SPTPS connection. This would then take some time to resolve itself. We already had code to detect whether a node was restarted, so we use that to detect if, once a node becomes reachable again, it remembers the old SPTPS session or whether we have to start a new one. This should be deterministic and not depend on the exact timing of events. --- src/graph.c | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/src/graph.c b/src/graph.c index 56ef11db..b73a35e6 100644 --- a/src/graph.c +++ b/src/graph.c @@ -145,28 +145,25 @@ static void check_reachability(meshlink_handle_t *mesh) { /* Check for nodes that have changed session_id */ if(n->status.visited && n->prevedge && n->prevedge->reverse->session_id != n->session_id) { + logger(mesh, MESHLINK_DEBUG, "Node %s has a new session ID", n->name); + n->session_id = n->prevedge->reverse->session_id; if(n->utcp) { utcp_abort_all_connections(n->utcp); } - if(n->status.visited == n->status.reachable) { - /* This session replaces the previous one without changing reachability status. - * We still need to reset the UDP SPTPS state. - */ - n->status.validkey = false; - sptps_stop(&n->sptps); - n->status.waitingforkey = false; - n->last_req_key = -3600; - - n->status.udp_confirmed = false; - n->maxmtu = MTU; - n->minmtu = 0; - n->mtuprobes = 0; - - timeout_del(&mesh->loop, &n->mtutimeout); - } + n->status.validkey = false; + sptps_stop(&n->sptps); + n->status.waitingforkey = false; + n->last_req_key = -3600; + + n->status.udp_confirmed = false; + n->maxmtu = MTU; + n->minmtu = 0; + n->mtuprobes = 0; + + timeout_del(&mesh->loop, &n->mtutimeout); } if(n->status.visited != n->status.reachable) { @@ -191,16 +188,6 @@ static void check_reachability(meshlink_handle_t *mesh) { } } - /* TODO: only clear status.validkey if node is unreachable? */ - - if(!n->status.reachable) { - logger(mesh, MESHLINK_DEBUG, "Resetting validkey/waitingforkey for %s, reachable %d", n->name, n->status.reachable); - n->status.validkey = false; - sptps_stop(&n->sptps); - n->status.waitingforkey = false; - n->last_req_key = -3600; - } - n->status.udp_confirmed = false; n->maxmtu = MTU; n->minmtu = 0; -- 2.39.2