X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fnet.c;h=76f884758ceb7408ce82b566de6c11784b210810;hp=1df0be0030b257f800ed23e12d9c89e757e0a175;hb=f31267783fccb4e17d914c64243b0cba4e5632c4;hpb=f91651414adcac1c05e1b923bee4cb3caf559c3b diff --git a/src/net.c b/src/net.c index 1df0be00..76f88475 100644 --- a/src/net.c +++ b/src/net.c @@ -39,6 +39,9 @@ static inline int min(int a, int b) { } #endif +static const int default_timeout = 5; +static const int default_interval = 60; + /* Terminate a connection: - Mark it as inactive @@ -106,22 +109,27 @@ void terminate_connection(meshlink_handle_t *mesh, connection_t *c, bool report) and close the connection. */ static void timeout_handler(event_loop_t *loop, void *data) { + assert(data); + meshlink_handle_t *mesh = loop->data; logger(mesh, MESHLINK_DEBUG, "timeout_handler()"); for list_each(connection_t, c, mesh->connections) { + int pingtimeout = c->node ? mesh->dev_class_traits[c->node->devclass].pingtimeout : default_timeout; + int pinginterval = c->node ? mesh->dev_class_traits[c->node->devclass].pinginterval : default_interval; + // Also make sure that if outstanding key requests for the UDP counterpart of a connection has timed out, we restart it. if(c->node) { - if(c->node->status.waitingforkey && c->node->last_req_key + mesh->pingtimeout <= mesh->loop.now.tv_sec) { + if(c->node->status.waitingforkey && c->node->last_req_key + pingtimeout <= mesh->loop.now.tv_sec) { send_req_key(mesh, c->node); } } - if(c->last_ping_time + mesh->pingtimeout <= mesh->loop.now.tv_sec) { + if(c->last_ping_time + pingtimeout <= mesh->loop.now.tv_sec) { if(c->status.active) { if(c->status.pinged) { logger(mesh, MESHLINK_INFO, "%s didn't respond to PING in %ld seconds", c->name, (long)mesh->loop.now.tv_sec - c->last_ping_time); - } else if(c->last_ping_time + mesh->pinginterval <= mesh->loop.now.tv_sec) { + } else if(c->last_ping_time + pinginterval <= mesh->loop.now.tv_sec) { send_ping(mesh, c); continue; } else { @@ -140,7 +148,7 @@ static void timeout_handler(event_loop_t *loop, void *data) { } timeout_set(&mesh->loop, data, &(struct timeval) { - mesh->pingtimeout, rand() % 100000 + default_timeout, prng(mesh, TIMER_FUDGE) }); } @@ -351,7 +359,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { mesh->contradicting_add_edge = 0; mesh->contradicting_del_edge = 0; - int timeout = 5; + int timeout = default_timeout; /* Check if we need to make or break connections. */ @@ -359,7 +367,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_DEBUG, "--- autoconnect begin ---"); - int retry_timeout = min(mesh->nodes->count * 5, 60); + int retry_timeout = min(mesh->nodes->count * default_timeout, 60); logger(mesh, MESHLINK_DEBUG, "* devclass = %d", mesh->devclass); logger(mesh, MESHLINK_DEBUG, "* nodes = %d", mesh->nodes->count); @@ -387,8 +395,8 @@ static void periodic_handler(event_loop_t *loop, void *data) { // get min_connects and max_connects - unsigned int min_connects = dev_class_traits[mesh->devclass].min_connects; - unsigned int max_connects = dev_class_traits[mesh->devclass].max_connects; + unsigned int min_connects = mesh->dev_class_traits[mesh->devclass].min_connects; + unsigned int max_connects = mesh->dev_class_traits[mesh->devclass].max_connects; logger(mesh, MESHLINK_DEBUG, "* min_connects = %d", min_connects); logger(mesh, MESHLINK_DEBUG, "* max_connects = %d", max_connects); @@ -415,7 +423,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_DEBUG, "* could not find node for initial connect"); } - splay_free_tree(nodes); + splay_delete_tree(nodes); } @@ -424,7 +432,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { if(!connect_to && min_connects <= cur_connects && cur_connects < max_connects) { unsigned int connects = 0; - for(int32_t devclass = 0; devclass <= mesh->devclass; ++devclass) { + for(dev_class_t devclass = 0; devclass <= mesh->devclass; ++devclass) { for list_each(connection_t, c, mesh->connections) { if(c->status.active && c->node && c->node->devclass == devclass) { connects += 1; @@ -444,11 +452,11 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_DEBUG, "* found better node"); connect_to = (node_t *)nodes->head->data; - splay_free_tree(nodes); + splay_delete_tree(nodes); break; } - splay_free_tree(nodes); + splay_delete_tree(nodes); } else { break; } @@ -478,7 +486,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_DEBUG, "* could not find nodes for partition healing"); } - splay_free_tree(nodes); + splay_delete_tree(nodes); } @@ -519,7 +527,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { if(min_connects < cur_connects /*&& cur_connects <= max_connects*/) { unsigned int connects = 0; - for(int32_t devclass = 0; devclass <= mesh->devclass; ++devclass) { + for(dev_class_t devclass = 0; devclass <= mesh->devclass; ++devclass) { for list_each(connection_t, c, mesh->connections) { if(c->status.active && c->node && c->node->devclass == devclass) { connects += 1; @@ -540,7 +548,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { disconnect_from = (node_t *)nodes->head->data; } - splay_free_tree(nodes); + splay_delete_tree(nodes); break; } } @@ -571,7 +579,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { logger(mesh, MESHLINK_DEBUG, "* no node we want to disconnect, even though we have too many connections"); } - splay_free_tree(nodes); + splay_delete_tree(nodes); } @@ -602,7 +610,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { } timeout_set(&mesh->loop, data, &(struct timeval) { - timeout, rand() % 100000 + timeout, prng(mesh, TIMER_FUDGE) }); } @@ -690,7 +698,7 @@ void retry(meshlink_handle_t *mesh) { */ int main_loop(meshlink_handle_t *mesh) { timeout_add(&mesh->loop, &mesh->pingtimer, timeout_handler, &mesh->pingtimer, &(struct timeval) { - mesh->pingtimeout, rand() % 100000 + default_timeout, prng(mesh, TIMER_FUDGE) }); timeout_add(&mesh->loop, &mesh->periodictimer, periodic_handler, &mesh->periodictimer, &(struct timeval) { 0, 0 @@ -698,13 +706,19 @@ int main_loop(meshlink_handle_t *mesh) { //Add signal handler mesh->datafromapp.signum = 0; - signal_add(&(mesh->loop), &(mesh->datafromapp), (signal_cb_t)meshlink_send_from_queue, mesh, mesh->datafromapp.signum); + signal_add(&mesh->loop, &mesh->datafromapp, meshlink_send_from_queue, mesh, mesh->datafromapp.signum); - if(!event_loop_run(&(mesh->loop), &(mesh->mesh_mutex))) { + if(!event_loop_run(&mesh->loop, &mesh->mesh_mutex)) { logger(mesh, MESHLINK_ERROR, "Error while waiting for input: %s", strerror(errno)); + abort(); + signal_del(&mesh->loop, &mesh->datafromapp); + timeout_del(&mesh->loop, &mesh->periodictimer); + timeout_del(&mesh->loop, &mesh->pingtimer); + return 1; } + signal_del(&mesh->loop, &mesh->datafromapp); timeout_del(&mesh->loop, &mesh->periodictimer); timeout_del(&mesh->loop, &mesh->pingtimer);