X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_socket.c;h=a8e197b4c430f37dbb1833e31cfacc8b3dfd6ec2;hb=6debc6c79ba385d35f646e0958f84ace5b8f4b4d;hp=24a9804ed239be9800801d4afd53afe0f5d22b5b;hpb=1545909dcb3ac618754486f4ccd4d8f237d64bb7;p=tinc diff --git a/src/net_socket.c b/src/net_socket.c index 24a9804e..a8e197b4 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -25,6 +25,7 @@ #include "address_cache.h" #include "conf.h" #include "connection.h" +#include "crypto.h" #include "list.h" #include "logger.h" #include "names.h" @@ -49,7 +50,18 @@ int listen_sockets; #ifndef HAVE_MINGW io_t unix_socket; #endif -list_t *outgoing_list = NULL; + +static void free_outgoing(outgoing_t *outgoing) { + timeout_del(&outgoing->ev); + free(outgoing); +} + +list_t outgoing_list = { + .head = NULL, + .tail = NULL, + .count = 0, + .delete = (list_action_t)free_outgoing, +}; /* Setup sockets */ @@ -104,7 +116,7 @@ static bool bind_to_interface(int sd) { int status; #endif /* defined(SOL_SOCKET) && defined(SO_BINDTODEVICE) */ - if(!get_config_string(lookup_config(config_tree, "BindToInterface"), &iface)) { + if(!get_config_string(lookup_config(&config_tree, "BindToInterface"), &iface)) { return true; } @@ -205,7 +217,7 @@ int setup_listen_socket(const sockaddr_t *sa) { #endif if(get_config_string - (lookup_config(config_tree, "BindToInterface"), &iface)) { + (lookup_config(&config_tree, "BindToInterface"), &iface)) { #if defined(SOL_SOCKET) && defined(SO_BINDTODEVICE) struct ifreq ifr; @@ -397,7 +409,7 @@ void retry_outgoing(outgoing_t *outgoing) { } timeout_add(&outgoing->ev, retry_outgoing_handler, outgoing, &(struct timeval) { - outgoing->timeout, rand() % 100000 + outgoing->timeout, jitter() }); logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Trying to re-establish outgoing connection in %d seconds", outgoing->timeout); @@ -675,7 +687,7 @@ void setup_outgoing_connection(outgoing_t *outgoing, bool verbose) { return; remove: - list_delete(outgoing_list, outgoing); + list_delete(&outgoing_list, outgoing); } /* @@ -704,8 +716,8 @@ void handle_new_meta_connection(void *data, int flags) { static sockaddr_t prev_sa; if(!sockaddrcmp_noport(&sa, &prev_sa)) { - static int samehost_burst; - static int samehost_burst_time; + static time_t samehost_burst; + static time_t samehost_burst_time; if(now.tv_sec - samehost_burst_time > samehost_burst) { samehost_burst = 0; @@ -726,8 +738,8 @@ void handle_new_meta_connection(void *data, int flags) { // Check if we get many connections from different hosts - static int connection_burst; - static int connection_burst_time; + static time_t connection_burst; + static time_t connection_burst_time; if(now.tv_sec - connection_burst_time > connection_burst) { connection_burst = 0; @@ -809,25 +821,16 @@ void handle_new_unix_connection(void *data, int flags) { } #endif -static void free_outgoing(outgoing_t *outgoing) { - timeout_del(&outgoing->ev); - free(outgoing); -} - void try_outgoing_connections(void) { /* If there is no outgoing list yet, create one. Otherwise, mark all outgoings as deleted. */ - if(!outgoing_list) { - outgoing_list = list_alloc((list_action_t)free_outgoing); - } else { - for list_each(outgoing_t, outgoing, outgoing_list) { - outgoing->timeout = -1; - } + for list_each(outgoing_t, outgoing, &outgoing_list) { + outgoing->timeout = -1; } /* Make sure there is one outgoing_t in the list for each ConnectTo. */ - for(config_t *cfg = lookup_config(config_tree, "ConnectTo"); cfg; cfg = lookup_config_next(config_tree, cfg)) { + for(config_t *cfg = lookup_config(&config_tree, "ConnectTo"); cfg; cfg = lookup_config_next(&config_tree, cfg)) { char *name; get_config_string(cfg, &name); @@ -846,7 +849,7 @@ void try_outgoing_connections(void) { bool found = false; - for list_each(outgoing_t, outgoing, outgoing_list) { + for list_each(outgoing_t, outgoing, &outgoing_list) { if(!strcmp(outgoing->node->name, name)) { found = true; outgoing->timeout = 0; @@ -867,14 +870,14 @@ void try_outgoing_connections(void) { free(name); outgoing->node = n; - list_insert_tail(outgoing_list, outgoing); + list_insert_tail(&outgoing_list, outgoing); setup_outgoing_connection(outgoing, true); } } /* Terminate any connections whose outgoing_t is to be deleted. */ - for list_each(connection_t, c, connection_list) { + for list_each(connection_t, c, &connection_list) { if(c->outgoing && c->outgoing->timeout == -1) { c->outgoing = NULL; logger(DEBUG_CONNECTIONS, LOG_INFO, "No more outgoing connection to %s", c->name); @@ -884,8 +887,8 @@ void try_outgoing_connections(void) { /* Delete outgoing_ts for which there is no ConnectTo. */ - for list_each(outgoing_t, outgoing, outgoing_list) + for list_each(outgoing_t, outgoing, &outgoing_list) if(outgoing->timeout == -1) { - list_delete_node(outgoing_list, node); + list_delete_node(&outgoing_list, node); } }