|
@@ -3147,6 +3147,32 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
|
}
|
|
|
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_CHANGE:
|
|
|
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;
|
|
|
run_pending = 1;
|
|
|
}
|
|
|
- } else {
|
|
|
+ } else if (event == NETDEV_CHANGE) {
|
|
|
if (!addrconf_qdisc_ok(dev)) {
|
|
|
/* device is still not ready. */
|
|
|
break;
|
|
@@ -3235,24 +3261,6 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
|
}
|
|
|
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_UNREGISTER:
|
|
|
/*
|