]> git.meshlink.io Git - meshlink/blobdiff - src/net.c
Fix compile error.
[meshlink] / src / net.c
index deac6eee42a612a57ef3e621a0eb657f0b924913..25cc15042f0b2a74d030acc78d625531e757fee8 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -162,8 +162,18 @@ static void periodic_handler(event_loop_t *loop, void *data) {
                        int i = 0;
 
                        for splay_each(node_t, n, mesh->nodes) {
-                               if(i++ != r)
-                                       continue;
+                               bool trying_unreachable = false;
+
+                               if(i++ != r) {
+                                       if(n->status.reachable) {
+                                               continue;
+                                       } else {
+                                               /* If we see an unreachable node
+                                                  before node i, try it anyway.
+                                               */
+                                               trying_unreachable = true;
+                                       }
+                               }
 
                                if(n->connection)
                                        break;
@@ -185,6 +195,15 @@ static void periodic_handler(event_loop_t *loop, void *data) {
                                        outgoing->name = xstrdup(n->name);
                                        list_insert_tail(mesh->outgoings, outgoing);
                                        setup_outgoing_connection(mesh, outgoing);
+                               } else if(trying_unreachable) {
+                                       /* We're trying an unreachable node instead
+                                          of node i. We already have an outgoing
+                                          to it. Try the next node rather than
+                                          breaking here, to avoid churning on a
+                                          connection attempt to the first
+                                          unreachable node.
+                                       */
+                                       continue;
                                }
                                break;
                        }
@@ -269,6 +288,10 @@ int main_loop(meshlink_handle_t *mesh) {
        timeout_add(&mesh->loop, &mesh->pingtimer, timeout_handler, &mesh->pingtimer, &(struct timeval){mesh->pingtimeout, rand() % 100000});
        timeout_add(&mesh->loop, &mesh->periodictimer, periodic_handler, &mesh->periodictimer, &(struct timeval){mesh->pingtimeout, rand() % 100000});
 
+       //Add signal handler
+       mesh->datafromapp.signum = 0;
+       signal_add(&(mesh->loop),&(mesh->datafromapp), (signal_cb_t)meshlink_send_from_queue,mesh, mesh->datafromapp.signum);
+
        if(!event_loop_run(&mesh->loop)) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", strerror(errno));
                return 1;