// 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;
// 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);
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;
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;
}