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 70992f6b6a600fe289240623e6166cf49021a92d..256fdf7892958a9b837cb272826dd53914eaa4de 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 8a7a617c784280e8d3ab6ab48a402ca045a222d1..82213e91b1ac50852e5fc7cbf8d386bf1f7694d7 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 af8efd148ab0823a78870a7cec28d8ef20d18e79..5e45360084d1ea9d59cdd511124cf016fb9f05fb 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)