Clamp MSS to miminum MTU in both directions.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 28 Feb 2010 17:20:13 +0000 (18:20 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 28 Feb 2010 17:20:13 +0000 (18:20 +0100)
Clamp MSS of both incoming and outgoing packets, and use the minimum of the
PMTU of both directions when clamping.

src/route.c

index 664fed8..6c381cc 100644 (file)
@@ -94,9 +94,13 @@ static bool checklength(node_t *source, vpn_packet_t *packet, length_t length) {
 }
 
 static void clamp_mss(const node_t *source, const node_t *via, vpn_packet_t *packet) {
-       if(!via || via == myself || !(via->options & OPTION_CLAMP_MSS))
+       if(!source || !via || !(via->options & OPTION_CLAMP_MSS))
                return;
 
+       uint16_t mtu = source->mtu;
+       if(via != myself && via->mtu < mtu)
+               mtu = via->mtu;
+
        /* Find TCP header */
        int start = 0;
        uint16_t type = packet->data[12] << 8 | packet->data[13];
@@ -140,7 +144,7 @@ static void clamp_mss(const node_t *source, const node_t *via, vpn_packet_t *pac
 
                /* Found it */
                uint16_t oldmss = packet->data[start + 22 + i] << 8 | packet->data[start + 23 + i];
-               uint16_t newmss = via->mtu - start - 20;
+               uint16_t newmss = mtu - start - 20;
                uint16_t csum = packet->data[start + 16] << 8 | packet->data[start + 17];
 
                if(oldmss <= newmss)