Fix retrying outgoing connections.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 19 May 2007 13:34:32 +0000 (13:34 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 19 May 2007 13:34:32 +0000 (13:34 +0000)
src/connection.h
src/net.c
src/net_socket.c

index 6537e51..ec6c063 100644 (file)
@@ -41,7 +41,7 @@ typedef union connection_status_t {
                int connecting:1;                       /* 1 if we are waiting for a non-blocking connect() to finish */
                int termreq:1;                          /* the termination of this connection was requested */
                int remove_unused:1;                            /* Set to 1 if you want this connection removed */
-               int timeout:1;                          /* 1 if gotten timeout */
+               int timeout_unused:1;                           /* 1 if gotten timeout */
                int encryptout:1;                       /* 1 if we can encrypt outgoing traffic */
                int decryptin:1;                        /* 1 if we have to decrypt incoming traffic */
                int mst:1;                              /* 1 if this connection is part of a minimum spanning tree */
index d78770e..2c7cc55 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -154,12 +154,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;
-       } else {
-               connection_del(c);
-       }
+
+       connection_del(c);
 }
 
 /*
@@ -186,20 +184,20 @@ 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 {
-                               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;
                                }
@@ -216,6 +214,8 @@ void handle_meta_connection_data(int fd, short events, void *data) {
        socklen_t len = sizeof(result);
 
        if(c->status.connecting) {
+               c->status.connecting = false;
+
                getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len);
 
                if(!result)
@@ -224,7 +224,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;
index 3fea33e..7ef8193 100644 (file)
@@ -231,7 +231,7 @@ int setup_vpn_in_socket(const sockaddr_t *sa) {
 }
 
 static void retry_outgoing_handler(int fd, short events, void *data) {
-       do_outgoing_connection(data);
+       setup_outgoing_connection(data);
 }
 
 void retry_outgoing(outgoing_t *outgoing) {
@@ -275,6 +275,8 @@ begin:
                        ifdebug(CONNECTIONS) logger(LOG_ERR, _("Could not set up a meta connection to %s"),
                                           c->name);
                        retry_outgoing(c->outgoing);
+                       c->outgoing = NULL;
+                       connection_del(c);
                        return;
                }