]> git.meshlink.io Git - meshlink/commitdiff
Try connections to unreachable nodes more often.
authorAaron Krebs <aaron.krebs@everbase.net>
Tue, 29 Jul 2014 08:27:24 +0000 (10:27 +0200)
committerAaron Krebs <aaron.krebs@everbase.net>
Tue, 29 Jul 2014 08:27:24 +0000 (10:27 +0200)
src/net.c

index 5f50531b9ff4fada055e90b255ecf9b9f03ea351..0475335592fd5c2b8445cf25f3ffd622dfd7c894 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;
                        }