Disable PMTUDiscovery in switch and hub modes.
authorGuus Sliepen <guus@tinc-vpn.org>
Mon, 9 Mar 2009 12:48:54 +0000 (13:48 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 9 Mar 2009 12:48:54 +0000 (13:48 +0100)
In switch and hub modes, tinc does not generate ICMP packets in response to
packets that are larger than the path MTU.  However, if PMTUDiscovery is
enabled, the IP_MTU_DISCOVER and IPV6_MTU_DISCOVER option is set on the UDP
sockets, which causes all UDP packets to be sent with the DF bit set, causing
large packets to be dropped, even if they would otherwise be routed fine.

src/net_setup.c
src/net_socket.c
src/protocol_auth.c

index 70992f6..256fdf7 100644 (file)
@@ -286,9 +286,6 @@ bool setup_myself(void)
        if(get_config_bool(lookup_config(myself->connection->config_tree, "TCPOnly"), &choice) && choice)
                myself->options |= OPTION_TCPONLY;
 
        if(get_config_bool(lookup_config(myself->connection->config_tree, "TCPOnly"), &choice) && choice)
                myself->options |= OPTION_TCPONLY;
 
-       if(!get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) || choice)
-               myself->options |= OPTION_PMTU_DISCOVERY;
-
        if(myself->options & OPTION_TCPONLY)
                myself->options |= OPTION_INDIRECT;
 
        if(myself->options & OPTION_TCPONLY)
                myself->options |= OPTION_INDIRECT;
 
@@ -309,6 +306,10 @@ bool setup_myself(void)
        } else
                routing_mode = RMODE_ROUTER;
 
        } else
                routing_mode = RMODE_ROUTER;
 
+       if(routing_mode == RMODE_ROUTER)
+               if(!get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) || choice)
+                       myself->options |= OPTION_PMTU_DISCOVERY;
+
        get_config_bool(lookup_config(config_tree, "PriorityInheritance"), &priorityinheritance);
 
 #if !defined(SOL_IP) || !defined(IP_TOS)
        get_config_bool(lookup_config(config_tree, "PriorityInheritance"), &priorityinheritance);
 
 #if !defined(SOL_IP) || !defined(IP_TOS)
index 8a7a617..82213e9 100644 (file)
@@ -193,24 +193,16 @@ int setup_vpn_in_socket(const sockaddr_t *sa)
 #endif
 
 #if defined(SOL_IP) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
 #endif
 
 #if defined(SOL_IP) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
-       {
-               bool choice;
-
-               if(!get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) || choice) {
-                       option = IP_PMTUDISC_DO;
-                       setsockopt(nfd, SOL_IP, IP_MTU_DISCOVER, &option, sizeof(option));
-               }
+       if(myself->options & OPTION_PMTU_DISCOVERY) {
+               option = IP_PMTUDISC_DO;
+               setsockopt(nfd, SOL_IP, IP_MTU_DISCOVER, &option, sizeof(option));
        }
 #endif
 
 #if defined(SOL_IPV6) && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
        }
 #endif
 
 #if defined(SOL_IPV6) && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
-       {
-               bool choice;
-
-               if(!get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) || choice) {
-                       option = IPV6_PMTUDISC_DO;
-                       setsockopt(nfd, SOL_IPV6, IPV6_MTU_DISCOVER, &option, sizeof(option));
-               }
+       if(myself->options & OPTION_PMTU_DISCOVERY) {
+               option = IPV6_PMTUDISC_DO;
+               setsockopt(nfd, SOL_IPV6, IPV6_MTU_DISCOVER, &option, sizeof(option));
        }
 #endif
 
        }
 #endif
 
index af8efd1..5e45360 100644 (file)
@@ -483,7 +483,7 @@ bool send_ack(connection_t *c)
        if((get_config_bool(lookup_config(c->config_tree, "TCPOnly"), &choice) && choice) || myself->options & OPTION_TCPONLY)
                c->options |= OPTION_TCPONLY | OPTION_INDIRECT;
 
        if((get_config_bool(lookup_config(c->config_tree, "TCPOnly"), &choice) && choice) || myself->options & OPTION_TCPONLY)
                c->options |= OPTION_TCPONLY | OPTION_INDIRECT;
 
-       if((!get_config_bool(lookup_config(c->config_tree, "PMTUDiscovery"), &choice) || choice) && (myself->options & OPTION_PMTU_DISCOVERY))
+       if(myself->options & OPTION_PMTU_DISCOVERY)
                c->options |= OPTION_PMTU_DISCOVERY;
 
        get_config_int(lookup_config(c->config_tree, "Weight"), &c->estimated_weight);
                c->options |= OPTION_PMTU_DISCOVERY;
 
        get_config_int(lookup_config(c->config_tree, "Weight"), &c->estimated_weight);
@@ -561,6 +561,10 @@ bool ack_h(connection_t *c)
 
        n->connection = c;
        c->node = n;
 
        n->connection = c;
        c->node = n;
+       if(!(c->options & options & OPTION_PMTU_DISCOVERY)) {
+               c->options &= ~OPTION_PMTU_DISCOVERY;
+               options &= ~OPTION_PMTU_DISCOVERY;
+       }
        c->options |= options;
 
        if(get_config_int(lookup_config(c->config_tree, "PMTU"), &mtu) && mtu < n->mtu)
        c->options |= options;
 
        if(get_config_int(lookup_config(c->config_tree, "PMTU"), &mtu) && mtu < n->mtu)