X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet.c;h=80e866a0ad461fc49bce1794379044ca97e2e33c;hb=e4e5a81447142da0fb1291b2d2119ed6981b89e5;hp=9659a8f26236f19b8e0e7d8859744d5a7dd38673;hpb=1bcadbde8302683f9803129f847ded42a4f66d27;p=meshlink diff --git a/src/net.c b/src/net.c index 9659a8f2..80e866a0 100644 --- a/src/net.c +++ b/src/net.c @@ -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; @@ -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; }