Skip to content

Commit 4ea8efa

Browse files
David Aherndavem330
authored andcommitted
net: mpls: Delete route when all nexthops have been deleted
When all devices for all nexthops in a route have been deleted, the route is effectively dead, so remove it. Signed-off-by: David Ahern <[email protected]> Acked-by: Roopa Prabhu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c00e51d commit 4ea8efa

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

net/mpls/af_mpls.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ static void mpls_ifdown(struct net_device *dev, int event)
12991299
struct mpls_route __rcu **platform_label;
13001300
struct net *net = dev_net(dev);
13011301
unsigned int nh_flags = RTNH_F_DEAD | RTNH_F_LINKDOWN;
1302-
unsigned int alive;
1302+
unsigned int alive, deleted;
13031303
unsigned index;
13041304

13051305
platform_label = rtnl_dereference(net->mpls.platform_label);
@@ -1310,6 +1310,7 @@ static void mpls_ifdown(struct net_device *dev, int event)
13101310
continue;
13111311

13121312
alive = 0;
1313+
deleted = 0;
13131314
change_nexthops(rt) {
13141315
if (rtnl_dereference(nh->nh_dev) != dev)
13151316
goto next;
@@ -1328,9 +1329,15 @@ static void mpls_ifdown(struct net_device *dev, int event)
13281329
next:
13291330
if (!(nh->nh_flags & nh_flags))
13301331
alive++;
1332+
if (!rtnl_dereference(nh->nh_dev))
1333+
deleted++;
13311334
} endfor_nexthops(rt);
13321335

13331336
WRITE_ONCE(rt->rt_nhn_alive, alive);
1337+
1338+
/* if there are no more nexthops, delete the route */
1339+
if (event == NETDEV_UNREGISTER && deleted == rt->rt_nhn)
1340+
mpls_route_update(net, index, NULL, NULL);
13341341
}
13351342
}
13361343

0 commit comments

Comments
 (0)