|
@@ -3255,6 +3255,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
void *ptr)
|
|
void *ptr)
|
|
{
|
|
{
|
|
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
|
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
|
|
|
+ struct netdev_notifier_changeupper_info *info;
|
|
struct inet6_dev *idev = __in6_dev_get(dev);
|
|
struct inet6_dev *idev = __in6_dev_get(dev);
|
|
int run_pending = 0;
|
|
int run_pending = 0;
|
|
int err;
|
|
int err;
|
|
@@ -3413,6 +3414,15 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
if (idev)
|
|
if (idev)
|
|
addrconf_type_change(dev, event);
|
|
addrconf_type_change(dev, event);
|
|
break;
|
|
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))
|
|
|
|
+ addrconf_ifdown(dev, 0);
|
|
}
|
|
}
|
|
|
|
|
|
return NOTIFY_OK;
|
|
return NOTIFY_OK;
|