X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fautoconnect.c;h=8adb74f3a1156efe395c48c218df7c5958ca524a;hp=e97a33ceeb1a812c0188bcf260c95a5a0aa84138;hb=f6e87ab476a0faf8b124ecaaa27f967d825e6457;hpb=3a316823b971396a428f020f401b9fe41252d98d diff --git a/src/autoconnect.c b/src/autoconnect.c index e97a33ce..8adb74f3 100644 --- a/src/autoconnect.c +++ b/src/autoconnect.c @@ -27,23 +27,29 @@ static void make_new_connection() { /* Select a random node we haven't connected to yet. */ int count = 0; + for splay_each(node_t, n, node_tree) { - if(n == myself || n->connection || !(n->status.has_address || n->status.reachable)) + if(n == myself || n->connection || !(n->status.has_address || n->status.reachable)) { continue; + } + count++; } - if(!count) + if(!count) { return; + } int r = rand() % count; for splay_each(node_t, n, node_tree) { - if(n == myself || n->connection || !(n->status.has_address || n->status.reachable)) + if(n == myself || n->connection || !(n->status.has_address || n->status.reachable)) { continue; + } - if(r--) + if(r--) { continue; + } bool found = false; @@ -77,17 +83,20 @@ static void connect_to_unreachable() { int r = rand() % node_tree->count; for splay_each(node_t, n, node_tree) { - if(r--) + if(r--) { continue; + } /* Is it unreachable and do we know an address for it? If not, return. */ - if(n == myself || n->connection || n->status.reachable || !n->status.has_address) + if(n == myself || n->connection || n->status.reachable || !n->status.has_address) { return; + } /* Are we already trying to make an outgoing connection to it? If not, return. */ for list_each(outgoing_t, outgoing, outgoing_list) - if(!strcmp(outgoing->name, n->name)) + if(!strcmp(outgoing->name, n->name)) { return; + } logger(DEBUG_CONNECTIONS, LOG_INFO, "Autoconnecting to %s", n->name); outgoing_t *outgoing = xzalloc(sizeof(*outgoing)); @@ -102,23 +111,29 @@ static void connect_to_unreachable() { static void drop_superfluous_outgoing_connection() { /* Choose a random outgoing connection to a node that has at least one other connection. */ int count = 0; + for list_each(connection_t, c, connection_list) { - if(!c->edge || !c->outgoing || !c->node || c->node->edge_tree->count < 2) + if(!c->edge || !c->outgoing || !c->node || c->node->edge_tree->count < 2) { continue; + } + count++; } - if(!count) + if(!count) { return; + } int r = rand() % count; for list_each(connection_t, c, connection_list) { - if(!c->edge || !c->outgoing || !c->node || c->node->edge_tree->count < 2) + if(!c->edge || !c->outgoing || !c->node || c->node->edge_tree->count < 2) { continue; - - if(r--) + } + + if(r--) { continue; + } logger(DEBUG_CONNECTIONS, LOG_INFO, "Autodisconnecting from %s", c->name); list_delete(outgoing_list, c->outgoing); @@ -132,6 +147,7 @@ static void drop_superfluous_pending_connections() { for list_each(outgoing_t, o, outgoing_list) { /* Only look for connections that are waiting to be retried later. */ bool found = false; + for list_each(connection_t, c, connection_list) { if(c->outgoing == o) { found = true; @@ -139,8 +155,9 @@ static void drop_superfluous_pending_connections() { } } - if(found) + if(found) { continue; + } logger(DEBUG_CONNECTIONS, LOG_INFO, "Cancelled outgoing connection to %s", o->name); list_delete_node(outgoing_list, node); @@ -150,9 +167,11 @@ static void drop_superfluous_pending_connections() { void do_autoconnect() { /* Count number of active connections. */ int nc = 0; + for list_each(connection_t, c, connection_list) { - if(c->edge) + if(c->edge) { nc++; + } } /* Less than 3 connections? Eagerly try to make a new one. */ @@ -160,10 +179,11 @@ void do_autoconnect() { make_new_connection(); return; } - + /* More than 3 connections? See if we can get rid of a superfluous one. */ - if(nc > 3) + if(nc > 3) { drop_superfluous_outgoing_connection(); + } /* Check if there are unreachable nodes that we should try to connect to. */