From: Mark Stapp Date: Wed, 11 Dec 2019 16:22:53 +0000 (-0500) Subject: zebra: accept async notification for un-install X-Git-Tag: base_7.3~80^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=4c0b5436f949001056486c4bf53f1c7038cb81f1;p=matthieu%2Ffrr.git zebra: accept async notification for un-install Handle an async notification when a route-update operation uninstalls one route in favor of another. Signed-off-by: Mark Stapp --- diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index dbd6daae9f..fb5dadd2d6 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1788,18 +1788,40 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) /* Ensure we clear the QUEUED flag */ UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); - /* Is this a notification that ... matters? We only really care about - * the route that is currently selected for installation. + /* Is this a notification that ... matters? We mostly care about + * the route that is currently selected for installation; we may also + * get an un-install notification, and handle that too. */ if (re != dest->selected_fib) { - /* TODO -- don't skip processing entirely? We might like to - * at least report on the event. + /* + * If we need to, clean up after a delete that was part of + * an update operation. */ - if (debug_p) - zlog_debug("%u:%s dplane notif, but type %s not selected_fib", - dplane_ctx_get_vrf(ctx), dest_str, - zebra_route_string( - dplane_ctx_get_type(ctx))); + end_count = 0; + for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), nexthop)) { + if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB)) + end_count++; + } + + /* If no nexthops or none installed, ensure that this re + * gets its 'installed' flag cleared. + */ + if (end_count == 0) { + if (CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED)) + UNSET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); + if (debug_p) + zlog_debug("%u:%s dplane notif, uninstalled type %s route", + dplane_ctx_get_vrf(ctx), dest_str, + zebra_route_string( + dplane_ctx_get_type(ctx))); + } else { + /* At least report on the event. */ + if (debug_p) + zlog_debug("%u:%s dplane notif, but type %s not selected_fib", + dplane_ctx_get_vrf(ctx), dest_str, + zebra_route_string( + dplane_ctx_get_type(ctx))); + } goto done; }