Merge pull request #13086 from donaldsharp/suppress_fib_pending

bgpd: Ensure suppress-fib-pending works with network statements
This commit is contained in:
Donatas Abraitis 2023-03-27 21:55:58 +03:00 committed by GitHub
commit c4e3d5569f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 21 deletions

View File

@ -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

View File

@ -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.
*/

View File

@ -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:]