From 5695d9ac5d4095872218e74c203fd7f023833713 Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Wed, 20 Mar 2019 14:44:29 -0400 Subject: [PATCH] zebra: set nexthop install state more accurately When setting route nexthops' installation state based on a dataplane context struct, unset the installed state if a nexthop was not present in the dataplane context. Signed-off-by: Mark Stapp --- zebra/zebra_rib.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 13799ac890..977316ef7c 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1858,31 +1858,30 @@ static int rib_update_re_from_ctx(struct route_entry *re, /* Update zebra nexthop FIB flag for each * nexthop that was installed. */ - for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), - ctx_nexthop)) { + for (ALL_NEXTHOPS(re->ng, nexthop)) { - if (!re) + if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) continue; - for (ALL_NEXTHOPS(re->ng, nexthop)) { + for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), + ctx_nexthop)) { + if (nexthop_same(ctx_nexthop, nexthop)) break; } - if (nexthop == NULL) - continue; - - if (CHECK_FLAG(nexthop->flags, - NEXTHOP_FLAG_RECURSIVE)) + /* If the FIB doesn't know about the nexthop, + * it's not installed + */ + if (ctx_nexthop == NULL) { + UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB); continue; + } - if (CHECK_FLAG(ctx_nexthop->flags, - NEXTHOP_FLAG_FIB)) - SET_FLAG(nexthop->flags, - NEXTHOP_FLAG_FIB); + if (CHECK_FLAG(ctx_nexthop->flags, NEXTHOP_FLAG_FIB)) + SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB); else - UNSET_FLAG(nexthop->flags, - NEXTHOP_FLAG_FIB); + UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB); } /* Redistribute */ -- 2.39.5