diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 07bec23b29..efdc907971 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3225,11 +3225,6 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest, if (bgp_fibupd_safi(safi) && !bgp_option_check(BGP_OPT_NO_FIB)) { - if (BGP_SUPPRESS_FIB_ENABLED(bgp) - && new_select->sub_type == BGP_ROUTE_NORMAL) - SET_FLAG(dest->flags, - BGP_NODE_FIB_INSTALL_PENDING); - if (new_select->type == ZEBRA_ROUTE_BGP && (new_select->sub_type == BGP_ROUTE_NORMAL || new_select->sub_type @@ -3335,10 +3330,6 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest, || new_select->sub_type == BGP_ROUTE_AGGREGATE || new_select->sub_type == BGP_ROUTE_IMPORTED)) { - if (BGP_SUPPRESS_FIB_ENABLED(bgp)) - SET_FLAG(dest->flags, - BGP_NODE_FIB_INSTALL_PENDING); - /* if this is an evpn imported type-5 prefix, * we need to withdraw the route first to clear * the nh neigh and the RMAC entry. @@ -4268,18 +4259,6 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, bgp_attr_flush(&new_attr); goto filtered; } - /* The flag BGP_NODE_FIB_INSTALL_PENDING is for the following - * condition : - * Suppress fib is enabled - * BGP_OPT_NO_FIB is not enabled - * Route type is BGP_ROUTE_NORMAL (peer learnt routes) - * Route is being installed first time (BGP_NODE_FIB_INSTALLED not set) - */ - if (bgp_fibupd_safi(safi) && BGP_SUPPRESS_FIB_ENABLED(bgp) - && (sub_type == BGP_ROUTE_NORMAL) - && (!bgp_option_check(BGP_OPT_NO_FIB)) - && (!CHECK_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED))) - SET_FLAG(dest->flags, BGP_NODE_FIB_INSTALL_PENDING); /* If neighbor soo is configured, tag all incoming routes with * this SoO tag and then filter out advertisements in diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 3b17c99d6d..3d659d48d4 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -1309,6 +1309,14 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, uint32_t bos = 0; uint32_t exp = 0; + /* + * BGP is installing this route and bgp has been configured + * to suppress announcements until the route has been installed + * let's set the fact that we expect this route to be installed + */ + if (BGP_SUPPRESS_FIB_ENABLED(bgp)) + SET_FLAG(dest->flags, BGP_NODE_FIB_INSTALL_PENDING); + /* Don't try to install if we're not connected to Zebra or Zebra doesn't * know of this instance. */ @@ -1760,6 +1768,12 @@ void bgp_zebra_withdraw(const struct prefix *p, struct bgp_path_info *info, struct zapi_route api; struct peer *peer; + /* + * If we are withdrawing the route, we don't need to have this + * flag set. So unset it. + */ + UNSET_FLAG(info->net->flags, BGP_NODE_FIB_INSTALL_PENDING); + /* Don't try to install if we're not connected to Zebra or Zebra doesn't * know of this instance. */ diff --git a/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py b/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py index ed8e41903f..ef9200b197 100644 --- a/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py +++ b/tests/topotests/bgp_suppress_fib/test_bgp_suppress_fib.py @@ -217,6 +217,20 @@ def test_bgp_allow_as_in(): assertmsg = '"r2" 192.168.1.1/32 route should be gone' assert result is None, assertmsg +def test_local_vs_non_local(): + tgen = get_topogen() + + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + r2 = tgen.gears["r2"] + + output = json.loads(r2.vtysh_cmd("show bgp ipv4 uni 60.0.0.0/24 json")) + paths = output["paths"] + for i in range(len(paths)): + if "fibPending" in paths[i]: + assert(False), "Route 60.0.0.0/24 should not have fibPending" + if __name__ == "__main__": args = ["-s"] + sys.argv[1:]