diff options
-rw-r--r-- | drivers/net/vxlan.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 65439188c582..e992c6a05f86 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -2367,29 +2367,43 @@ static void vxlan_set_multicast_list(struct net_device *dev) | |||
2367 | { | 2367 | { |
2368 | } | 2368 | } |
2369 | 2369 | ||
2370 | static int vxlan_change_mtu(struct net_device *dev, int new_mtu) | 2370 | static int __vxlan_change_mtu(struct net_device *dev, |
2371 | struct net_device *lowerdev, | ||
2372 | struct vxlan_rdst *dst, int new_mtu, bool strict) | ||
2371 | { | 2373 | { |
2372 | struct vxlan_dev *vxlan = netdev_priv(dev); | 2374 | int max_mtu = IP_MAX_MTU; |
2373 | struct vxlan_rdst *dst = &vxlan->default_dst; | ||
2374 | struct net_device *lowerdev; | ||
2375 | int max_mtu; | ||
2376 | 2375 | ||
2377 | lowerdev = __dev_get_by_index(vxlan->net, dst->remote_ifindex); | 2376 | if (lowerdev) |
2378 | if (lowerdev == NULL) | 2377 | max_mtu = lowerdev->mtu; |
2379 | return eth_change_mtu(dev, new_mtu); | ||
2380 | 2378 | ||
2381 | if (dst->remote_ip.sa.sa_family == AF_INET6) | 2379 | if (dst->remote_ip.sa.sa_family == AF_INET6) |
2382 | max_mtu = lowerdev->mtu - VXLAN6_HEADROOM; | 2380 | max_mtu -= VXLAN6_HEADROOM; |
2383 | else | 2381 | else |
2384 | max_mtu = lowerdev->mtu - VXLAN_HEADROOM; | 2382 | max_mtu -= VXLAN_HEADROOM; |
2385 | 2383 | ||
2386 | if (new_mtu < 68 || new_mtu > max_mtu) | 2384 | if (new_mtu < 68) |
2387 | return -EINVAL; | 2385 | return -EINVAL; |
2388 | 2386 | ||
2387 | if (new_mtu > max_mtu) { | ||
2388 | if (strict) | ||
2389 | return -EINVAL; | ||
2390 | |||
2391 | new_mtu = max_mtu; | ||
2392 | } | ||
2393 | |||
2389 | dev->mtu = new_mtu; | 2394 | dev->mtu = new_mtu; |
2390 | return 0; | 2395 | return 0; |
2391 | } | 2396 | } |
2392 | 2397 | ||
2398 | static int vxlan_change_mtu(struct net_device *dev, int new_mtu) | ||
2399 | { | ||
2400 | struct vxlan_dev *vxlan = netdev_priv(dev); | ||
2401 | struct vxlan_rdst *dst = &vxlan->default_dst; | ||
2402 | struct net_device *lowerdev = __dev_get_by_index(vxlan->net, | ||
2403 | dst->remote_ifindex); | ||
2404 | return __vxlan_change_mtu(dev, lowerdev, dst, new_mtu, true); | ||
2405 | } | ||
2406 | |||
2393 | static int egress_ipv4_tun_info(struct net_device *dev, struct sk_buff *skb, | 2407 | static int egress_ipv4_tun_info(struct net_device *dev, struct sk_buff *skb, |
2394 | struct ip_tunnel_info *info, | 2408 | struct ip_tunnel_info *info, |
2395 | __be16 sport, __be16 dport) | 2409 | __be16 sport, __be16 dport) |