]> git.meshlink.io Git - meshlink/blobdiff - src/net.c
Merge branch 'mesh_topology_output' into roles
[meshlink] / src / net.c
index 6528fab9833fd82c364b752bf9308bae4c5c7424..80e866a0ad461fc49bce1794379044ca97e2e33c 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -364,7 +364,7 @@ static void periodic_handler(event_loop_t *loop, void *data) {
                        {
                                logger(mesh, MESHLINK_INFO, "* found best one for initial connect");
 
-                               timeout = 0;
+                               //timeout = 0;
                                connect_to = (node_t*)nodes->head->data;
                        }
 
@@ -374,7 +374,7 @@ static void periodic_handler(event_loop_t *loop, void *data) {
 
                // find better nodes to connect to
 
-               if(!connect_to && min_connects <= cur_connects < max_connects)
+               if(!connect_to && min_connects <= cur_connects && cur_connects < max_connects)
                {
                        unsigned int connects = 0;
 
@@ -415,7 +415,7 @@ static void periodic_handler(event_loop_t *loop, void *data) {
 
                // heal partitions
 
-               if(!connect_to && min_connects <= cur_connects < max_connects)
+               if(!connect_to && min_connects <= cur_connects && cur_connects < max_connects)
                {
                        splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_asc_last_connect_try_desc, NULL);
 
@@ -439,18 +439,30 @@ static void periodic_handler(event_loop_t *loop, void *data) {
 
                if(connect_to && !connect_to->connection)
                {
-                       logger(mesh, MESHLINK_INFO, "Autoconnecting to %s", connect_to->name);
-                       outgoing_t *outgoing = xzalloc(sizeof(outgoing_t));
-                       outgoing->mesh = mesh;
-                       outgoing->name = xstrdup(connect_to->name);
-                       list_insert_tail(mesh->outgoings, outgoing);
-                       setup_outgoing_connection(mesh, outgoing);
+                       /* check if there is already a connection attempt to this node */
+                       bool found = false;
+                       for list_each(outgoing_t, outgoing, mesh->outgoings) {
+                               if(!strcmp(outgoing->name, connect_to->name)) {
+                                       found = true;
+                                       break;
+                               }
+                       }
+
+                       if(!found)
+                       {
+                               logger(mesh, MESHLINK_INFO, "Autoconnecting to %s", connect_to->name);
+                               outgoing_t *outgoing = xzalloc(sizeof(outgoing_t));
+                               outgoing->mesh = mesh;
+                               outgoing->name = xstrdup(connect_to->name);
+                               list_insert_tail(mesh->outgoings, outgoing);
+                               setup_outgoing_connection(mesh, outgoing);      
+                       }
                }
 
 
                // disconnect suboptimal outgoing connections
 
-               if(min_connects < cur_connects <= max_connects)
+               if(min_connects < cur_connects && cur_connects <= max_connects)
                {
                        unsigned int connects = 0;
 
@@ -501,7 +513,7 @@ static void periodic_handler(event_loop_t *loop, void *data) {
                        {
                                logger(mesh, MESHLINK_INFO, "* disconnect connection (too many connections");
 
-                               timeout = 0;
+                               //timeout = 0;
                                disconnect_from = (node_t*)nodes->head->data;
                        }
 
@@ -564,7 +576,7 @@ int main_loop(meshlink_handle_t *mesh) {
        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)) {
+       if(!event_loop_run(&(mesh->loop), &(mesh->mesh_mutex))) {
                logger(mesh, MESHLINK_ERROR, "Error while waiting for input: %s", strerror(errno));
                return 1;
        }