Remove "release-" from displayed git version.
[tinc] / src / net.c
index 286f157..1ce8071 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -93,8 +93,6 @@ void purge(void) {
 void terminate_connection(connection_t *c, bool report) {
        logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Closing connection with %s (%s)", c->name, c->hostname);
 
-       c->status.active = false;
-
        if(c->node && c->node->connection == c)
                c->node->connection = NULL;
 
@@ -129,6 +127,12 @@ void terminate_connection(connection_t *c, bool report) {
 
        if(outgoing)
                do_outgoing_connection(outgoing);
+
+#ifndef HAVE_MINGW
+       /* Clean up dead proxy processes */
+
+       while(waitpid(-1, NULL, WNOHANG) > 0);
+#endif
 }
 
 /*
@@ -145,7 +149,8 @@ static void timeout_handler(void *data) {
                        continue;
 
                if(c->last_ping_time + pingtimeout <= now.tv_sec) {
-                       if(c->status.active) {
+                       if(c->edge) {
+                               try_tx(c->node, false);
                                if(c->status.pinged) {
                                        logger(DEBUG_CONNECTIONS, LOG_INFO, "%s (%s) didn't respond to PING in %ld seconds", c->name, c->hostname, (long)now.tv_sec - c->last_ping_time);
                                } else if(c->last_ping_time + pinginterval <= now.tv_sec) {
@@ -160,11 +165,12 @@ static void timeout_handler(void *data) {
                                else
                                        logger(DEBUG_CONNECTIONS, LOG_WARNING, "Timeout from %s (%s) during authentication", c->name, c->hostname);
                        }
-                       terminate_connection(c, c->status.active);
+                       terminate_connection(c, c->edge);
                }
+
        }
 
-       timeout_set(data, &(struct timeval){pingtimeout, rand() % 100000});
+       timeout_set(data, &(struct timeval){1, rand() % 100000});
 }
 
 static void periodic_handler(void *data) {
@@ -194,11 +200,11 @@ static void periodic_handler(void *data) {
                /* Count number of active connections */
                int nc = 0;
                for list_each(connection_t, c, connection_list) {
-                       if(c->status.active && !c->status.control)
+                       if(c->edge)
                                nc++;
                }
 
-               if(nc < autoconnect) {
+               if(nc < 3) {
                        /* Not enough active connections, try to add one.
                           Choose a random node, if we don't have a connection to it,
                           and we are not already trying to make one, create an
@@ -232,7 +238,7 @@ static void periodic_handler(void *data) {
                                }
                                break;
                        }
-               } else if(nc > autoconnect) {
+               } else if(nc > 3) {
                        /* Too many active connections, try to remove one.
                           Choose a random outgoing connection to a node
                           that has at least one other connection.
@@ -241,7 +247,7 @@ static void periodic_handler(void *data) {
                        int i = 0;
 
                        for list_each(connection_t, c, connection_list) {
-                               if(!c->status.active || c->status.control)
+                               if(!c->edge)
                                        continue;
 
                                if(i++ != r)
@@ -253,12 +259,12 @@ static void periodic_handler(void *data) {
                                logger(DEBUG_CONNECTIONS, LOG_INFO, "Autodisconnecting from %s", c->name);
                                list_delete(outgoing_list, c->outgoing);
                                c->outgoing = NULL;
-                               terminate_connection(c, c->status.active);
+                               terminate_connection(c, c->edge);
                                break;
                        }
                }
 
-               if(nc >= autoconnect) {
+               if(nc >= 3) {
                        /* If we have enough active connections,
                           remove any pending outgoing connections.
                        */
@@ -283,7 +289,7 @@ static void periodic_handler(void *data) {
 
 void handle_meta_connection_data(connection_t *c) {
        if (!receive_meta(c)) {
-               terminate_connection(c, c->status.active);
+               terminate_connection(c, c->edge);
                return;
        }
 }
@@ -334,11 +340,14 @@ int reload_configuration(void) {
 
        if(strictsubnets) {
                for splay_each(subnet_t, subnet, subnet_tree)
-                       subnet->expires = 1;
+                       if (subnet->owner)
+                               subnet->expires = 1;
 
                load_all_subnets();
 
                for splay_each(subnet_t, subnet, subnet_tree) {
+                       if (!subnet->owner)
+                               continue;
                        if(subnet->expires == 1) {
                                send_del_subnet(everyone, subnet);
                                if(subnet->owner->status.reachable)
@@ -402,7 +411,7 @@ int reload_configuration(void) {
                struct stat s;
                if(stat(fname, &s) || s.st_mtime > last_config_check) {
                        logger(DEBUG_CONNECTIONS, LOG_INFO, "Host config file of %s has been changed", c->name);
-                       terminate_connection(c, c->status.active);
+                       terminate_connection(c, c->edge);
                }
                free(fname);
        }
@@ -452,7 +461,7 @@ int main_loop(void) {
 #endif
 
        if(!event_loop()) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", strerror(errno));
+               logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", sockstrerror(sockerrno));
                return 1;
        }