]> git.meshlink.io Git - meshlink/commitdiff
Only reset UDP SPTPS sessions if the session ID changed.
authorGuus Sliepen <guus@meshlink.io>
Tue, 10 Nov 2020 20:10:00 +0000 (21:10 +0100)
committerGuus Sliepen <guus@meshlink.io>
Tue, 10 Nov 2020 20:10:00 +0000 (21:10 +0100)
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

index 56ef11db382deb39f5268cb0e8a34fcfc198f4a1..b73a35e69f749c98bc839c5f2ed9b3a414bdbe21 100644 (file)
@@ -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;