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.
/* Check for nodes that have changed session_id */
if(n->status.visited && n->prevedge && n->prevedge->reverse->session_id != n->session_id) {
/* 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);
}
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) {
}
if(n->status.visited != n->status.reachable) {
- /* 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;
n->status.udp_confirmed = false;
n->maxmtu = MTU;
n->minmtu = 0;