mirror of https://gitee.com/openkylin/linux.git
ipv6: recreate ipv6 link-local addresses when increasing MTU over IPV6_MIN_MTU
This change makes it so that we reinitialize the interface if the MTU is increased back above IPV6_MIN_MTU and the interface is up. Cc: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ee6259382c
commit
b7b0b1d290
|
@ -3147,6 +3147,32 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NETDEV_CHANGEMTU:
|
||||||
|
/* if MTU under IPV6_MIN_MTU stop IPv6 on this interface. */
|
||||||
|
if (dev->mtu < IPV6_MIN_MTU) {
|
||||||
|
addrconf_ifdown(dev, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idev) {
|
||||||
|
rt6_mtu_change(dev, dev->mtu);
|
||||||
|
idev->cnf.mtu6 = dev->mtu;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate new idev */
|
||||||
|
idev = ipv6_add_dev(dev);
|
||||||
|
if (IS_ERR(idev))
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* device is still not ready */
|
||||||
|
if (!(idev->if_flags & IF_READY))
|
||||||
|
break;
|
||||||
|
|
||||||
|
run_pending = 1;
|
||||||
|
|
||||||
|
/* fall through */
|
||||||
|
|
||||||
case NETDEV_UP:
|
case NETDEV_UP:
|
||||||
case NETDEV_CHANGE:
|
case NETDEV_CHANGE:
|
||||||
if (dev->flags & IFF_SLAVE)
|
if (dev->flags & IFF_SLAVE)
|
||||||
|
@ -3170,7 +3196,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
||||||
idev->if_flags |= IF_READY;
|
idev->if_flags |= IF_READY;
|
||||||
run_pending = 1;
|
run_pending = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (event == NETDEV_CHANGE) {
|
||||||
if (!addrconf_qdisc_ok(dev)) {
|
if (!addrconf_qdisc_ok(dev)) {
|
||||||
/* device is still not ready. */
|
/* device is still not ready. */
|
||||||
break;
|
break;
|
||||||
|
@ -3235,24 +3261,6 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NETDEV_CHANGEMTU:
|
|
||||||
if (idev && dev->mtu >= IPV6_MIN_MTU) {
|
|
||||||
rt6_mtu_change(dev, dev->mtu);
|
|
||||||
idev->cnf.mtu6 = dev->mtu;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!idev && dev->mtu >= IPV6_MIN_MTU) {
|
|
||||||
idev = ipv6_add_dev(dev);
|
|
||||||
if (!IS_ERR(idev))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if MTU under IPV6_MIN_MTU.
|
|
||||||
* Stop IPv6 on this interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
case NETDEV_DOWN:
|
case NETDEV_DOWN:
|
||||||
case NETDEV_UNREGISTER:
|
case NETDEV_UNREGISTER:
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue