diff options
-rw-r--r-- | net/ipv6/ip6_vti.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index fa3ae1cb50d3..2ceef41cc097 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c | |||
@@ -627,6 +627,7 @@ static void vti6_link_config(struct ip6_tnl *t) | |||
627 | struct net_device *dev = t->dev; | 627 | struct net_device *dev = t->dev; |
628 | struct __ip6_tnl_parm *p = &t->parms; | 628 | struct __ip6_tnl_parm *p = &t->parms; |
629 | struct net_device *tdev = NULL; | 629 | struct net_device *tdev = NULL; |
630 | int mtu; | ||
630 | 631 | ||
631 | memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr)); | 632 | memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr)); |
632 | memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr)); | 633 | memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr)); |
@@ -656,8 +657,11 @@ static void vti6_link_config(struct ip6_tnl *t) | |||
656 | tdev = __dev_get_by_index(t->net, p->link); | 657 | tdev = __dev_get_by_index(t->net, p->link); |
657 | 658 | ||
658 | if (tdev) | 659 | if (tdev) |
659 | dev->mtu = max_t(int, tdev->mtu - dev->hard_header_len, | 660 | mtu = tdev->mtu - sizeof(struct ipv6hdr); |
660 | IPV6_MIN_MTU); | 661 | else |
662 | mtu = ETH_DATA_LEN - LL_MAX_HEADER - sizeof(struct ipv6hdr); | ||
663 | |||
664 | dev->mtu = max_t(int, mtu, IPV6_MIN_MTU); | ||
661 | } | 665 | } |
662 | 666 | ||
663 | /** | 667 | /** |
@@ -866,8 +870,6 @@ static void vti6_dev_setup(struct net_device *dev) | |||
866 | dev->priv_destructor = vti6_dev_free; | 870 | dev->priv_destructor = vti6_dev_free; |
867 | 871 | ||
868 | dev->type = ARPHRD_TUNNEL6; | 872 | dev->type = ARPHRD_TUNNEL6; |
869 | dev->hard_header_len = LL_MAX_HEADER + sizeof(struct ipv6hdr); | ||
870 | dev->mtu = ETH_DATA_LEN; | ||
871 | dev->min_mtu = IPV6_MIN_MTU; | 873 | dev->min_mtu = IPV6_MIN_MTU; |
872 | dev->max_mtu = IP_MAX_MTU; | 874 | dev->max_mtu = IP_MAX_MTU; |
873 | dev->flags |= IFF_NOARP; | 875 | dev->flags |= IFF_NOARP; |