Skip to content

Commit 8a11801

Browse files
committed
Merge branch 'tunnel-mtus'
Nicolas Dichtel says: ==================== ip[6] tunnels: fix mtu calculations The first patch restores the possibility to bind an ip4 tunnel to an interface whith a large mtu. The second patch was spotted after the first fix. I also target it to net because it fixes the max mtu value that can be used for ipv6 tunnels. v2: remove the 0xfff8 in ip_tunnel_newlink() ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents ccfde6e + f7ff1fd commit 8a11801

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

net/ipv4/ip_tunnel.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
328328

329329
if (tdev) {
330330
hlen = tdev->hard_header_len + tdev->needed_headroom;
331-
mtu = tdev->mtu;
331+
mtu = min(tdev->mtu, IP_MAX_MTU);
332332
}
333333

334334
dev->needed_headroom = t_hlen + hlen;
@@ -362,7 +362,7 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net,
362362
nt = netdev_priv(dev);
363363
t_hlen = nt->hlen + sizeof(struct iphdr);
364364
dev->min_mtu = ETH_MIN_MTU;
365-
dev->max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen;
365+
dev->max_mtu = IP_MAX_MTU - dev->hard_header_len - t_hlen;
366366
ip_tunnel_add(itn, nt);
367367
return nt;
368368

@@ -930,7 +930,7 @@ int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict)
930930
{
931931
struct ip_tunnel *tunnel = netdev_priv(dev);
932932
int t_hlen = tunnel->hlen + sizeof(struct iphdr);
933-
int max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen;
933+
int max_mtu = IP_MAX_MTU - dev->hard_header_len - t_hlen;
934934

935935
if (new_mtu < ETH_MIN_MTU)
936936
return -EINVAL;
@@ -1107,7 +1107,7 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
11071107

11081108
mtu = ip_tunnel_bind_dev(dev);
11091109
if (tb[IFLA_MTU]) {
1110-
unsigned int max = 0xfff8 - dev->hard_header_len - nt->hlen;
1110+
unsigned int max = IP_MAX_MTU - dev->hard_header_len - nt->hlen;
11111111

11121112
mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU,
11131113
(unsigned int)(max - sizeof(struct iphdr)));

net/ipv6/ip6_tunnel.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,8 +1692,13 @@ int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu)
16921692
if (new_mtu < ETH_MIN_MTU)
16931693
return -EINVAL;
16941694
}
1695-
if (new_mtu > 0xFFF8 - dev->hard_header_len)
1696-
return -EINVAL;
1695+
if (tnl->parms.proto == IPPROTO_IPV6 || tnl->parms.proto == 0) {
1696+
if (new_mtu > IP6_MAX_MTU - dev->hard_header_len)
1697+
return -EINVAL;
1698+
} else {
1699+
if (new_mtu > IP_MAX_MTU - dev->hard_header_len)
1700+
return -EINVAL;
1701+
}
16971702
dev->mtu = new_mtu;
16981703
return 0;
16991704
}
@@ -1841,7 +1846,7 @@ ip6_tnl_dev_init_gen(struct net_device *dev)
18411846
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
18421847
dev->mtu -= 8;
18431848
dev->min_mtu = ETH_MIN_MTU;
1844-
dev->max_mtu = 0xFFF8 - dev->hard_header_len;
1849+
dev->max_mtu = IP6_MAX_MTU - dev->hard_header_len;
18451850

18461851
return 0;
18471852

net/ipv6/sit.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,7 +1371,7 @@ static void ipip6_tunnel_setup(struct net_device *dev)
13711371
dev->hard_header_len = LL_MAX_HEADER + t_hlen;
13721372
dev->mtu = ETH_DATA_LEN - t_hlen;
13731373
dev->min_mtu = IPV6_MIN_MTU;
1374-
dev->max_mtu = 0xFFF8 - t_hlen;
1374+
dev->max_mtu = IP6_MAX_MTU - t_hlen;
13751375
dev->flags = IFF_NOARP;
13761376
netif_keep_dst(dev);
13771377
dev->addr_len = 4;
@@ -1583,7 +1583,8 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev,
15831583
if (tb[IFLA_MTU]) {
15841584
u32 mtu = nla_get_u32(tb[IFLA_MTU]);
15851585

1586-
if (mtu >= IPV6_MIN_MTU && mtu <= 0xFFF8 - dev->hard_header_len)
1586+
if (mtu >= IPV6_MIN_MTU &&
1587+
mtu <= IP6_MAX_MTU - dev->hard_header_len)
15871588
dev->mtu = mtu;
15881589
}
15891590

0 commit comments

Comments
 (0)