X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fgraph.c;h=5afa7c32526509a31b610e8153d26c4c41a87829;hb=2bf1a40fa455564a4aac52349d70e9fedb163721;hp=9955ea41644721a208041de60860329158998e04;hpb=8d4ac42ceb67a93fc1e5c0d045819597c5da47d0;p=meshlink diff --git a/src/graph.c b/src/graph.c index 9955ea41..5afa7c32 100644 --- a/src/graph.c +++ b/src/graph.c @@ -144,16 +144,35 @@ static void check_reachability(meshlink_handle_t *mesh) { 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 = 0; + + 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) { n->status.reachable = !n->status.reachable; - n->last_state_change = mesh->loop.now.tv_sec; + n->status.dirty = true; if(n->status.reachable) { logger(mesh, MESHLINK_DEBUG, "Node %s became reachable", n->name); + n->last_reachable = mesh->loop.now.tv_sec; } else { logger(mesh, MESHLINK_DEBUG, "Node %s became unreachable", n->name); + n->last_unreachable = mesh->loop.now.tv_sec; } /* TODO: only clear status.validkey if node is unreachable? */