X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet.c;h=1b5bb16693f1e700da422451b1f47017afe2ad5a;hb=fbf305c09d91bf34b1504b58d50392df2e6bcfba;hp=33d90da8137d861864f0e61a923562ce3acdfdbf;hpb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219;p=meshlink diff --git a/src/net.c b/src/net.c index 33d90da8..1b5bb166 100644 --- a/src/net.c +++ b/src/net.c @@ -25,7 +25,7 @@ #include #include "utils.h" -#include "avl_tree.h" +#include "splay_tree.h" #include "conf.h" #include "connection.h" #include "device.h" @@ -42,7 +42,7 @@ /* Purge edges and subnets of unreachable nodes. Use carefully. */ static void purge(void) { - avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext; + splay_node_t *nnode, *nnext, *enode, *enext, *snode, *snext; node_t *n; edge_t *e; subnet_t *s; @@ -100,31 +100,6 @@ static void purge(void) { } } -/* - put all file descriptors into events - While we're at it, purge stuf that needs to be removed. -*/ -static int build_fdset(void) { - avl_node_t *node, *next; - connection_t *c; - int i, max = 0; - - cp(); - - for(node = connection_tree->head; node; node = next) { - next = node->next; - c = node->data; - - if(c->status.remove) { - connection_del(c); - if(!connection_tree->head) - purge(); - } - } - - return 0; -} - /* Terminate a connection: - Close the socket @@ -135,13 +110,9 @@ static int build_fdset(void) { void terminate_connection(connection_t *c, bool report) { cp(); - if(c->status.remove) - return; - ifdebug(CONNECTIONS) logger(LOG_NOTICE, _("Closing connection with %s (%s)"), c->name, c->hostname); - c->status.remove = true; c->status.active = false; if(c->node) @@ -150,8 +121,6 @@ void terminate_connection(connection_t *c, bool report) { if(c->socket) closesocket(c->socket); - event_del(&c->ev); - if(c->edge) { if(report && !tunnelserver) send_del_edge(broadcast, c->edge); @@ -177,16 +146,10 @@ void terminate_connection(connection_t *c, bool report) { /* Check if this was our outgoing connection */ - if(c->outgoing) { + if(c->outgoing) retry_outgoing(c->outgoing); - c->outgoing = NULL; - } - free(c->outbuf); - c->outbuf = NULL; - c->outbuflen = 0; - c->outbufsize = 0; - c->outbufstart = 0; + connection_del(c); } /* @@ -198,7 +161,7 @@ void terminate_connection(connection_t *c, bool report) { and close the connection. */ static void timeout_handler(int fd, short events, void *event) { - avl_node_t *node, *next; + splay_node_t *node, *next; connection_t *c; time_t now = time(NULL); @@ -213,26 +176,22 @@ static void timeout_handler(int fd, short events, void *event) { if(c->status.pinged) { ifdebug(CONNECTIONS) logger(LOG_INFO, _("%s (%s) didn't respond to PING in %ld seconds"), c->name, c->hostname, now - c->last_ping_time); - c->status.timeout = true; terminate_connection(c, true); + continue; } else if(c->last_ping_time + pinginterval < now) { send_ping(c); } } else { - if(c->status.remove) { - logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."), - c->name, c->hostname, c->status.value); - connection_del(c); - continue; - } - ifdebug(CONNECTIONS) logger(LOG_WARNING, _("Timeout from %s (%s) during authentication"), - c->name, c->hostname); if(c->status.connecting) { + ifdebug(CONNECTIONS) + logger(LOG_WARNING, _("Timeout while connecting to %s (%s)"), c->name, c->hostname); c->status.connecting = false; closesocket(c->socket); do_outgoing_connection(c); } else { + ifdebug(CONNECTIONS) logger(LOG_WARNING, _("Timeout from %s (%s) during authentication"), c->name, c->hostname); terminate_connection(c, false); + continue; } } } @@ -246,10 +205,9 @@ void handle_meta_connection_data(int fd, short events, void *data) { int result; socklen_t len = sizeof(result); - if (c->status.remove) - return; - if(c->status.connecting) { + c->status.connecting = false; + getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len); if(!result) @@ -258,7 +216,6 @@ void handle_meta_connection_data(int fd, short events, void *data) { ifdebug(CONNECTIONS) logger(LOG_DEBUG, _("Error while connecting to %s (%s): %s"), c->name, c->hostname, strerror(result)); - c->status.connecting = false; closesocket(c->socket); do_outgoing_connection(c); return; @@ -315,7 +272,7 @@ static void sigwinch_handler(int signal, short events, void *data) { static void sighup_handler(int signal, short events, void *data) { connection_t *c; - avl_node_t *node; + splay_node_t *node; char *fname; struct stat s; static time_t last_config_check = 0; @@ -363,7 +320,7 @@ static void sigalrm_handler(int signal, short events, void *data) { logger(LOG_NOTICE, _("Got %s signal"), strsignal(signal)); connection_t *c; - avl_node_t *node; + splay_node_t *node; for(node = connection_tree->head; node; node = node->next) { c = node->data; @@ -383,8 +340,6 @@ static void sigalrm_handler(int signal, short events, void *data) { this is where it all happens... */ int main_loop(void) { - struct timeval tv; - int r; struct event timeout_event; struct event sighup_event; struct event sigint_event;