X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fgraph.c;h=18376c14956a619a9e99441365fd44c42a7cfa18;hb=be83b0af60449c7b35d17d97f2e6dc12f611e831;hp=d40087d8dc1c65f680c9f55b403f52c3acfc110f;hpb=79d712373a1beb6bca71af56b1540834d467dce1;p=meshlink diff --git a/src/graph.c b/src/graph.c index d40087d8..18376c14 100644 --- a/src/graph.c +++ b/src/graph.c @@ -136,7 +136,13 @@ static void sssp_bfs(meshlink_handle_t *mesh) { static void check_reachability(meshlink_handle_t *mesh) { /* Check reachability status. */ + int reachable = -1; /* Don't count ourself */ + for splay_each(node_t, n, mesh->nodes) { + if(n->status.visited) { + reachable++; + } + /* Check for nodes that have changed session_id */ if(n->status.visited && n->prevedge && n->prevedge->reverse->session_id != n->session_id) { n->session_id = n->prevedge->reverse->session_id; @@ -165,12 +171,14 @@ static void check_reachability(meshlink_handle_t *mesh) { 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? */ @@ -205,6 +213,20 @@ static void check_reachability(meshlink_handle_t *mesh) { } } } + + if(mesh->reachable != reachable) { + if(!reachable) { + mesh->last_unreachable = mesh->loop.now.tv_sec; + + if(mesh->threadstarted) { + timeout_set(&mesh->loop, &mesh->periodictimer, &(struct timeval) { + 0, prng(mesh, TIMER_FUDGE) + }); + } + } + + mesh->reachable = reachable; + } } void graph(meshlink_handle_t *mesh) {