|
@@ -1155,6 +1155,7 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event,
|
|
|
static int fib_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
|
|
|
{
|
|
|
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
|
|
+ struct netdev_notifier_changeupper_info *info;
|
|
|
struct in_device *in_dev;
|
|
|
struct net *net = dev_net(dev);
|
|
|
unsigned int flags;
|
|
@@ -1193,6 +1194,14 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
|
|
|
case NETDEV_CHANGEMTU:
|
|
|
rt_cache_flush(net);
|
|
|
break;
|
|
|
+ case NETDEV_CHANGEUPPER:
|
|
|
+ info = ptr;
|
|
|
+ /* flush all routes if dev is linked to or unlinked from
|
|
|
+ * an L3 master device (e.g., VRF)
|
|
|
+ */
|
|
|
+ if (info->upper_dev && netif_is_l3_master(info->upper_dev))
|
|
|
+ fib_disable_ip(dev, NETDEV_DOWN, true);
|
|
|
+ break;
|
|
|
}
|
|
|
return NOTIFY_DONE;
|
|
|
}
|