X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet.c;h=8400b936bd4f08d18ed8c5fe44a31e053098ed1c;hb=a569797b9cbd3db571ea9216fd103347acd6ccff;hp=80e866a0ad461fc49bce1794379044ca97e2e33c;hpb=e4e5a81447142da0fb1291b2d2119ed6981b89e5;p=meshlink diff --git a/src/net.c b/src/net.c index 80e866a0..8400b936 100644 --- a/src/net.c +++ b/src/net.c @@ -131,8 +131,8 @@ static void timeout_handler(event_loop_t *loop, void *data) { timeout_set(&mesh->loop, data, &(struct timeval){mesh->pingtimeout, rand() % 100000}); } -// devclass asc, last_connect_try desc -static int node_compare_devclass_asc_last_connect_try_desc(const void *a, const void *b) +// devclass asc, last_successfull_connection desc +static int node_compare_devclass_asc_lsc_desc(const void *a, const void *b) { const node_t *na = a, *nb = b; @@ -142,30 +142,42 @@ static int node_compare_devclass_asc_last_connect_try_desc(const void *a, const if(na->devclass > nb->devclass) { return 1; } - if(na->last_connect_try == nb->last_connect_try) + if(na->last_successfull_connection == nb->last_successfull_connection) return 0; - if(nb->last_connect_try == 0 || na->last_connect_try < nb->last_connect_try) + if(na->last_successfull_connection == 0 || na->last_successfull_connection > nb->last_successfull_connection) return -1; - if(na->last_connect_try == 0 || na->last_connect_try > nb->last_connect_try) + if(nb->last_successfull_connection == 0 || na->last_successfull_connection < nb->last_successfull_connection) + return 1; + + if(na < nb) + return -1; + + if(na > nb) return 1; return 0; } -// last_connect_try desc -static int node_compare_last_connect_try_desc(const void *a, const void *b) +// last_successfull_connection desc +static int node_compare_lsc_desc(const void *a, const void *b) { const node_t *na = a, *nb = b; - if(na->last_connect_try == nb->last_connect_try) + if(na->last_successfull_connection == nb->last_successfull_connection) return 0; - if(nb->last_connect_try == 0 || na->last_connect_try < nb->last_connect_try) + if(na->last_successfull_connection == 0 || na->last_successfull_connection > nb->last_successfull_connection) + return -1; + + if(nb->last_successfull_connection == 0 || na->last_successfull_connection < nb->last_successfull_connection) + return 1; + + if(na < nb) return -1; - if(na->last_connect_try == 0 || na->last_connect_try > nb->last_connect_try) + if(na > nb) return 1; return 0; @@ -182,13 +194,18 @@ static int node_compare_devclass_desc(const void *a, const void *b) if(na->devclass > nb->devclass) { return 1; } + if(na < nb) + return -1; + + if(na > nb) + return 1; + return 0; } /* - autoconnect() { timeout = 5 @@ -278,8 +295,7 @@ disconnect } - - */ +*/ static void periodic_handler(event_loop_t *loop, void *data) { @@ -313,9 +329,13 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_INFO, "--- autoconnect begin ---"); - int retry_timeout = min(mesh->nodes->count * 5, 60); + logger(mesh, MESHLINK_INFO, "* devclass = %d", mesh->devclass); + logger(mesh, MESHLINK_INFO, "* nodes = %d", mesh->nodes->count); + logger(mesh, MESHLINK_INFO, "* retry_timeout = %d", retry_timeout); + + // connect disconnect nodes node_t* connect_to = NULL; @@ -335,7 +355,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { } logger(mesh, MESHLINK_INFO, "* cur_connects = %d", cur_connects); - + logger(mesh, MESHLINK_INFO, "* outgoings = %d", mesh->outgoings->count); // get min_connects and max_connects @@ -352,11 +372,12 @@ static void periodic_handler(event_loop_t *loop, void *data) { if(cur_connects < min_connects) { - splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_asc_last_connect_try_desc, NULL); + splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_asc_lsc_desc, NULL); for splay_each(node_t, n, mesh->nodes) { - if(n->devclass <= mesh->devclass && !n->connection && (n->last_connect_try == 0 || (time(NULL) - n->last_connect_try) > retry_timeout)) + logger(mesh, MESHLINK_INFO, "* n->devclass = %d", n->devclass); + if(n != mesh->self && n->devclass <= mesh->devclass && !n->connection && (n->last_connect_try == 0 || (time(NULL) - n->last_connect_try) > retry_timeout)) { splay_insert(nodes, n); } } @@ -367,6 +388,8 @@ static void periodic_handler(event_loop_t *loop, void *data) { //timeout = 0; connect_to = (node_t*)nodes->head->data; } + else + { logger(mesh, MESHLINK_INFO, "* could not find node for initial connect"); } splay_free_tree(nodes); } @@ -388,11 +411,11 @@ static void periodic_handler(event_loop_t *loop, void *data) { if( connects < min_connects ) { - splay_tree_t *nodes = splay_alloc_tree(node_compare_last_connect_try_desc, NULL); + splay_tree_t *nodes = splay_alloc_tree(node_compare_lsc_desc, NULL); for splay_each(node_t, n, mesh->nodes) { - if(n->devclass == devclass && !n->connection && (n->last_connect_try == 0 || (time(NULL) - n->last_connect_try) > retry_timeout)) + if(n != mesh->self && n->devclass == devclass && !n->connection && (n->last_connect_try == 0 || (time(NULL) - n->last_connect_try) > retry_timeout)) { splay_insert(nodes, n); } } @@ -410,6 +433,9 @@ static void periodic_handler(event_loop_t *loop, void *data) { else { break; } } + + if(!connect_to) + { logger(mesh, MESHLINK_INFO, "* could not find better nodes"); } } @@ -417,11 +443,11 @@ static void periodic_handler(event_loop_t *loop, void *data) { 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); + splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_asc_lsc_desc, NULL); for splay_each(node_t, n, mesh->nodes) { - if(n->devclass <= mesh->devclass && !n->status.reachable && (n->last_connect_try == 0 || (time(NULL) - n->last_connect_try) > retry_timeout)) + if(n != mesh->self && n->devclass <= mesh->devclass && !n->status.reachable && (n->last_connect_try == 0 || (time(NULL) - n->last_connect_try) > retry_timeout)) { splay_insert(nodes, n); } } @@ -430,6 +456,8 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_INFO, "* try to heal partition"); connect_to = (node_t*)nodes->head->data; } + else + { logger(mesh, MESHLINK_INFO, "* could not find nodes for partition healing"); } splay_free_tree(nodes); } @@ -439,10 +467,14 @@ static void periodic_handler(event_loop_t *loop, void *data) { if(connect_to && !connect_to->connection) { + connect_to->last_connect_try = time(NULL); + /* 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)) { + for list_each(outgoing_t, outgoing, mesh->outgoings) + { + if(!strcmp(outgoing->name, connect_to->name)) + { found = true; break; } @@ -455,8 +487,10 @@ static void periodic_handler(event_loop_t *loop, void *data) { outgoing->mesh = mesh; outgoing->name = xstrdup(connect_to->name); list_insert_tail(mesh->outgoings, outgoing); - setup_outgoing_connection(mesh, outgoing); + setup_outgoing_connection(mesh, outgoing); } + else + { logger(mesh, MESHLINK_INFO, "* skip autoconnect since it is an outgoing connection already"); } } @@ -494,6 +528,9 @@ static void periodic_handler(event_loop_t *loop, void *data) { break; } } + + if(!disconnect_from) + { logger(mesh, MESHLINK_INFO, "* no suboptimal outgoing connections"); } } @@ -511,11 +548,13 @@ static void periodic_handler(event_loop_t *loop, void *data) { if(nodes->head) { - logger(mesh, MESHLINK_INFO, "* disconnect connection (too many connections"); + logger(mesh, MESHLINK_INFO, "* disconnect connection (too many connections)"); //timeout = 0; disconnect_from = (node_t*)nodes->head->data; } + else + { logger(mesh, MESHLINK_INFO, "* no node we want to disconnect, even though we have too many connections"); } splay_free_tree(nodes); }