|
@@ -1029,6 +1029,11 @@ skip:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static inline bool inetdev_valid_mtu(unsigned mtu)
|
|
|
+{
|
|
|
+ return mtu >= 68;
|
|
|
+}
|
|
|
+
|
|
|
/* Called only under RTNL semaphore */
|
|
|
|
|
|
static int inetdev_event(struct notifier_block *this, unsigned long event,
|
|
@@ -1048,6 +1053,10 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
|
|
|
IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
|
|
|
IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
|
|
|
}
|
|
|
+ } else if (event == NETDEV_CHANGEMTU) {
|
|
|
+ /* Re-enabling IP */
|
|
|
+ if (inetdev_valid_mtu(dev->mtu))
|
|
|
+ in_dev = inetdev_init(dev);
|
|
|
}
|
|
|
goto out;
|
|
|
}
|
|
@@ -1058,7 +1067,7 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
|
|
|
dev->ip_ptr = NULL;
|
|
|
break;
|
|
|
case NETDEV_UP:
|
|
|
- if (dev->mtu < 68)
|
|
|
+ if (!inetdev_valid_mtu(dev->mtu))
|
|
|
break;
|
|
|
if (dev->flags & IFF_LOOPBACK) {
|
|
|
struct in_ifaddr *ifa;
|
|
@@ -1080,9 +1089,9 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
|
|
|
ip_mc_down(in_dev);
|
|
|
break;
|
|
|
case NETDEV_CHANGEMTU:
|
|
|
- if (dev->mtu >= 68)
|
|
|
+ if (inetdev_valid_mtu(dev->mtu))
|
|
|
break;
|
|
|
- /* MTU falled under 68, disable IP */
|
|
|
+ /* disable IP when MTU is not enough */
|
|
|
case NETDEV_UNREGISTER:
|
|
|
inetdev_destroy(in_dev);
|
|
|
break;
|