Always keep UDP mappings alive for nodes that also have a meta-connection.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 11 Jan 2015 12:31:01 +0000 (13:31 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 11 Jan 2015 12:31:01 +0000 (13:31 +0100)
This is necessary for assisting with UDP hole punching. But we don't
need to know the PMTU for this, so only send UDP probes.

src/net.c
src/net.h
src/net_packet.c

index 91b93056e44c1573a7f4eef6f71a01fb8687bfe7..5f3f6e7876eaaa4bda37efcbe84b6df9eddf9792 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -154,6 +154,7 @@ static void timeout_handler(void *data) {
 
                if(c->last_ping_time + pingtimeout <= now.tv_sec) {
                        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) {
@@ -170,6 +171,7 @@ static void timeout_handler(void *data) {
                        }
                        terminate_connection(c, c->edge);
                }
+
        }
 
        timeout_set(data, &(struct timeval){pingtimeout, rand() % 100000});
index 660ffc497071758385bb5040182f24e0b09d91b6..cfc44d23d5c77878f1478b46dfeecd106340c8b2 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -214,6 +214,7 @@ extern void retry(void);
 extern int reload_configuration(void);
 extern void load_all_subnets(void);
 extern void load_all_nodes(void);
+extern void try_tx(struct node_t *n, bool);
 
 #ifndef HAVE_MINGW
 #define closesocket(s) close(s)
index 0021aabb691bf26bed1d1a6e5ee1f2788c86057d..99063ac25a245ff922993b8ae28c0d0a29319255 100644 (file)
@@ -1087,7 +1087,7 @@ static void try_mtu(node_t *n) {
    idle.
 */
 
-static void try_tx_sptps(node_t *n) {
+static void try_tx_sptps(node_t *n, bool mtu) {
        /* If n is a TCP-only neighbor, we'll only use "cleartext" PACKET
           messages anyway, so there's no need for SPTPS at all. */
 
@@ -1110,13 +1110,14 @@ static void try_tx_sptps(node_t *n) {
        /* If we do have a relay, try everything with that one instead. */
 
        if(via != n)
-               return try_tx_sptps(via);
+               return try_tx_sptps(via, mtu);
 
        try_udp(n);
-       try_mtu(n);
+       if(mtu)
+               try_mtu(n);
 }
 
-static void try_tx_legacy(node_t *n) {
+static void try_tx_legacy(node_t *n, bool mtu) {
        /* Does he have our key? If not, send one. */
 
        if(!n->status.validkey_in)
@@ -1133,7 +1134,15 @@ static void try_tx_legacy(node_t *n) {
        }
 
        try_udp(n);
-       try_mtu(n);
+       if(mtu)
+               try_mtu(n);
+}
+
+void try_tx(node_t *n, bool mtu) {
+       if(n->status.sptps)
+               try_tx_sptps(n, mtu);
+       else
+               try_tx_legacy(n, mtu);
 }
 
 void send_packet(node_t *n, vpn_packet_t *packet) {
@@ -1166,7 +1175,7 @@ void send_packet(node_t *n, vpn_packet_t *packet) {
 
        if(n->status.sptps) {
                send_sptps_packet(n, packet);
-               try_tx_sptps(n);
+               try_tx_sptps(n, true);
                return;
        }
 
@@ -1186,7 +1195,7 @@ void send_packet(node_t *n, vpn_packet_t *packet) {
        }
 
        send_udppacket(via, packet);
-       try_tx_legacy(via);
+       try_tx_legacy(via, true);
 }
 
 void broadcast_packet(const node_t *from, vpn_packet_t *packet) {