[net] ip6_tunnel: use the right value for ipv4 min mtu check in ip6_tnl_xmit

Message ID 2176423fed58d51f462505d67be9e5ff0e666922.1533480367.git.lucien.xin@gmail.com
State Accepted
Delegated to: David Miller
Headers show
Series
  • [net] ip6_tunnel: use the right value for ipv4 min mtu check in ip6_tnl_xmit
Related show

Commit Message

Xin Long Aug. 5, 2018, 2:46 p.m.
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 <sd@queasysnail.net>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 net/ipv6/ip6_tunnel.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

Comments

David Miller Aug. 6, 2018, 12:35 a.m. | #1
From: Xin Long <lucien.xin@gmail.com>
Date: Sun,  5 Aug 2018 22:46:07 +0800

> 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 <sd@queasysnail.net>
> Signed-off-by: Xin Long <lucien.xin@gmail.com>

Applied and queued up for -stable, thanks Xin.

Patch

diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 00e138a..1cc9650 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1133,12 +1133,8 @@  int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
 		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)) {