diff options
| -rw-r--r-- | net/ipv4/ip_tunnel.c | 8 | ||||
| -rw-r--r-- | net/ipv6/ip6_tunnel.c | 11 | ||||
| -rw-r--r-- | net/ipv6/sit.c | 5 |
3 files changed, 15 insertions, 9 deletions
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 6b0e362cc99b..38d906baf1df 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -328,7 +328,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev) | |||
| 328 | 328 | ||
| 329 | if (tdev) { | 329 | if (tdev) { |
| 330 | hlen = tdev->hard_header_len + tdev->needed_headroom; | 330 | hlen = tdev->hard_header_len + tdev->needed_headroom; |
| 331 | mtu = tdev->mtu; | 331 | mtu = min(tdev->mtu, IP_MAX_MTU); |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | dev->needed_headroom = t_hlen + hlen; | 334 | dev->needed_headroom = t_hlen + hlen; |
| @@ -362,7 +362,7 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net, | |||
| 362 | nt = netdev_priv(dev); | 362 | nt = netdev_priv(dev); |
| 363 | t_hlen = nt->hlen + sizeof(struct iphdr); | 363 | t_hlen = nt->hlen + sizeof(struct iphdr); |
| 364 | dev->min_mtu = ETH_MIN_MTU; | 364 | 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; |
| 366 | ip_tunnel_add(itn, nt); | 366 | ip_tunnel_add(itn, nt); |
| 367 | return nt; | 367 | return nt; |
| 368 | 368 | ||
| @@ -930,7 +930,7 @@ int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict) | |||
| 930 | { | 930 | { |
| 931 | struct ip_tunnel *tunnel = netdev_priv(dev); | 931 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 932 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); | 932 | 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; |
| 934 | 934 | ||
| 935 | if (new_mtu < ETH_MIN_MTU) | 935 | if (new_mtu < ETH_MIN_MTU) |
| 936 | return -EINVAL; | 936 | return -EINVAL; |
| @@ -1107,7 +1107,7 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], | |||
| 1107 | 1107 | ||
| 1108 | mtu = ip_tunnel_bind_dev(dev); | 1108 | mtu = ip_tunnel_bind_dev(dev); |
| 1109 | if (tb[IFLA_MTU]) { | 1109 | 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; |
| 1111 | 1111 | ||
| 1112 | mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, | 1112 | mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, |
| 1113 | (unsigned int)(max - sizeof(struct iphdr))); | 1113 | (unsigned int)(max - sizeof(struct iphdr))); |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index da66aaac51ce..00e138a44cbb 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -1692,8 +1692,13 @@ int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu) | |||
| 1692 | if (new_mtu < ETH_MIN_MTU) | 1692 | if (new_mtu < ETH_MIN_MTU) |
| 1693 | return -EINVAL; | 1693 | return -EINVAL; |
| 1694 | } | 1694 | } |
| 1695 | if (new_mtu > 0xFFF8 - dev->hard_header_len) | 1695 | if (tnl->parms.proto == IPPROTO_IPV6 || tnl->parms.proto == 0) { |
| 1696 | return -EINVAL; | 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 | } | ||
| 1697 | dev->mtu = new_mtu; | 1702 | dev->mtu = new_mtu; |
| 1698 | return 0; | 1703 | return 0; |
| 1699 | } | 1704 | } |
| @@ -1841,7 +1846,7 @@ ip6_tnl_dev_init_gen(struct net_device *dev) | |||
| 1841 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) | 1846 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) |
| 1842 | dev->mtu -= 8; | 1847 | dev->mtu -= 8; |
| 1843 | dev->min_mtu = ETH_MIN_MTU; | 1848 | 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; |
| 1845 | 1850 | ||
| 1846 | return 0; | 1851 | return 0; |
| 1847 | 1852 | ||
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 2afce37a7177..e9400ffa7875 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -1371,7 +1371,7 @@ static void ipip6_tunnel_setup(struct net_device *dev) | |||
| 1371 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; | 1371 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; |
| 1372 | dev->mtu = ETH_DATA_LEN - t_hlen; | 1372 | dev->mtu = ETH_DATA_LEN - t_hlen; |
| 1373 | dev->min_mtu = IPV6_MIN_MTU; | 1373 | dev->min_mtu = IPV6_MIN_MTU; |
| 1374 | dev->max_mtu = 0xFFF8 - t_hlen; | 1374 | dev->max_mtu = IP6_MAX_MTU - t_hlen; |
| 1375 | dev->flags = IFF_NOARP; | 1375 | dev->flags = IFF_NOARP; |
| 1376 | netif_keep_dst(dev); | 1376 | netif_keep_dst(dev); |
| 1377 | dev->addr_len = 4; | 1377 | dev->addr_len = 4; |
| @@ -1583,7 +1583,8 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev, | |||
| 1583 | if (tb[IFLA_MTU]) { | 1583 | if (tb[IFLA_MTU]) { |
| 1584 | u32 mtu = nla_get_u32(tb[IFLA_MTU]); | 1584 | u32 mtu = nla_get_u32(tb[IFLA_MTU]); |
| 1585 | 1585 | ||
| 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) | ||
| 1587 | dev->mtu = mtu; | 1588 | dev->mtu = mtu; |
| 1588 | } | 1589 | } |
| 1589 | 1590 | ||
