ip6_tunnel: use the right value for ipv4 min mtu check in ip6_tnl_xmit
authorXin Long <[email protected]>
Sun, 5 Aug 2018 14:46:07 +0000 (22:46 +0800)
committerDavid S. Miller <[email protected]>
Mon, 6 Aug 2018 00:35:02 +0000 (17:35 -0700)
According to RFC791, 68 bytes is the minimum size of IPv4 datagram every
device must be able to forward without further fragmentation while 576
bytes is the minimum size of IPv4 datagram every device has to be able
to receive, so in ip6_tnl_xmit(), 68(IPV4_MIN_MTU) should be the right
value for the ipv4 min mtu check in ip6_tnl_xmit.

While at it, change to use max() instead of if statement.

Fixes: c9fefa08190f ("ip6_tunnel: get the min mtu properly in ip6_tnl_xmit")
Reported-by: Sabrina Dubroca <[email protected]>
Signed-off-by: Xin Long <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
net/ipv6/ip6_tunnel.c

index 00e138a44cbba2e7c03cb003f5823b42e18a923a..1cc9650af9fbc0bf3f49d2bd4258f9b3d1e5790c 100644 (file)
@@ -1133,12 +1133,8 @@ route_lookup:
                max_headroom += 8;
                mtu -= 8;
        }
-       if (skb->protocol == htons(ETH_P_IPV6)) {
-               if (mtu < IPV6_MIN_MTU)
-                       mtu = IPV6_MIN_MTU;
-       } else if (mtu < 576) {
-               mtu = 576;
-       }
+       mtu = max(mtu, skb->protocol == htons(ETH_P_IPV6) ?
+                      IPV6_MIN_MTU : IPV4_MIN_MTU);
 
        skb_dst_update_pmtu(skb, mtu);
        if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) {