X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fgraph.c;h=18376c14956a619a9e99441365fd44c42a7cfa18;hp=5afa7c32526509a31b610e8153d26c4c41a87829;hb=529b8fab8c21e7ae5af91d742ff202eab38e51f3;hpb=5f79c2c0882e03648acb9c4a2f6780a7513c61aa diff --git a/src/graph.c b/src/graph.c index 5afa7c32..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; @@ -207,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) {