From a8c427ee392f087b9430a2ea9f5e04948bf5b937 Mon Sep 17 00:00:00 2001 From: Stephen Worley Date: Thu, 17 Oct 2019 15:41:25 -0400 Subject: [PATCH] zebra: Check active on OLD system/kernel routes We can assume that system/kernel routes are valid indeed if this is our first time procesing them. But since we don't get explicit deletion events for kernel routes anymore, we have to be prepared to process them if the nexthop becomes unreachable for instance. Therefore, if the route is not NEW, then don't assume its valid. Signed-off-by: Stephen Worley --- zebra/zebra_nhg.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index 35df02a19a..4e696b39ac 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -177,10 +177,16 @@ static int nexthop_active(afi_t afi, struct route_entry *re, re->nexthop_mtu = 0; /* - * If the kernel has sent us a route, then + * If the kernel has sent us a NEW route, then * by golly gee whiz it's a good route. + * + * If its an already INSTALLED route we have already handled, then the + * kernel route's nexthop might have became unreachable + * and we have to handle that. */ - if (re->type == ZEBRA_ROUTE_KERNEL || re->type == ZEBRA_ROUTE_SYSTEM) + if (!CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED) + && (re->type == ZEBRA_ROUTE_KERNEL + || re->type == ZEBRA_ROUTE_SYSTEM)) return 1; /*