From: David Ahern Date: Fri, 24 Mar 2017 22:21:57 +0000 (-0700) Subject: net: mpls: Delete route when all nexthops have been deleted X-Git-Tag: v4.14-rc1~960^3~336^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4ea8efadf5690c1ab22f981a5fcff819bd09ff31;p=platform%2Fkernel%2Flinux-rpi.git 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 Acked-by: Roopa Prabhu Signed-off-by: David S. Miller --- diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 3861f8d..7475592 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -1299,7 +1299,7 @@ static void mpls_ifdown(struct net_device *dev, int event) struct mpls_route __rcu **platform_label; struct net *net = dev_net(dev); unsigned int nh_flags = RTNH_F_DEAD | RTNH_F_LINKDOWN; - unsigned int alive; + unsigned int alive, deleted; unsigned index; platform_label = rtnl_dereference(net->mpls.platform_label); @@ -1310,6 +1310,7 @@ static void mpls_ifdown(struct net_device *dev, int event) continue; alive = 0; + deleted = 0; change_nexthops(rt) { if (rtnl_dereference(nh->nh_dev) != dev) goto next; @@ -1328,9 +1329,15 @@ static void mpls_ifdown(struct net_device *dev, int event) next: if (!(nh->nh_flags & nh_flags)) alive++; + if (!rtnl_dereference(nh->nh_dev)) + deleted++; } endfor_nexthops(rt); WRITE_ONCE(rt->rt_nhn_alive, alive); + + /* if there are no more nexthops, delete the route */ + if (event == NETDEV_UNREGISTER && deleted == rt->rt_nhn) + mpls_route_update(net, index, NULL, NULL); } }