From d58847913b6791d78884dab2b5d7497410a72f92 Mon Sep 17 00:00:00 2001 From: Rajasekar Raja Date: Mon, 21 Oct 2024 10:53:27 -0700 Subject: [PATCH] bgpd: Fix for match source-protocol in route-map for redistribute cmd A redistribute cmd can have a route-map attached to it and adding the match source-protocol to that route-map means BGP to filter which protocol routes to accept among the bunch of routes zebra is sending. Fixing this since this wasnt implemented earlier. Ticket :#4119692 Signed-off-by: Donald Sharp Signed-off-by: Rajasekar Raja (cherry picked from commit 68358c0f928eafe50c9e73b0cb6a443c03f2a33f) # Conflicts: # tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py --- bgpd/bgp_route.c | 1 + ...est_bgp_route_map_match_source_protocol.py | 74 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index c62f3e00bb70..fadade24b3d6 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -8963,6 +8963,7 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p, memset(&rmap_path, 0, sizeof(rmap_path)); rmap_path.peer = bgp->peer_self; rmap_path.attr = &attr_new; + rmap_path.type = type; SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE); diff --git a/tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py b/tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py index 2828796405cd..e991710989f3 100644 --- a/tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py +++ b/tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py @@ -46,8 +46,20 @@ def setup_module(mod): router_list = tgen.routers() +<<<<<<< HEAD for i, (rname, router) in enumerate(router_list.items(), 1): router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname))) +======= + for _, (rname, router) in enumerate(router_list.items(), 1): + router.load_frr_config( + os.path.join(CWD, "{}/frr.conf".format(rname)), + [ + (TopoRouter.RD_ZEBRA, None), + (TopoRouter.RD_SHARP, None), + (TopoRouter.RD_BGP, None), + ], + ) +>>>>>>> 68358c0f92 (bgpd: Fix for match source-protocol in route-map for redistribute cmd) tgen.start_router() @@ -109,6 +121,68 @@ def _bgp_check_advertised_routes_r3(): _, result = topotest.run_and_expect(test_func, None, count=30, wait=1) assert result is None, "Failed to filter routes by source-protocol for r3" + def _bgp_check_advertised_routes_r4(): + # Remove match source-protocol towards Nbr out policy for Nbr 192.168.1.2 so it receives all routes + tgen.gears["r1"].vtysh_cmd( + """ + configure terminal + route-map r2 permit 10 + no match source-protocol + """ + ) + + tgen.gears["r1"].vtysh_cmd( + "sharp install route 192.168.11.0 nexthop 172.16.255.1 5" + ) + + # Configure a r4 with source protocol sharp and apply it to all redistribute cmds + tgen.gears["r1"].vtysh_cmd( + """ + configure terminal + route-map r4 permit 10 + match source-protocol sharp + router bgp 65001 + address-family ipv4 unicast + redistribute connected route-map r4 + redistribute static route-map r4 + redistribute sharp route-map r4 + """ + ) + + # Since match protocol is sharp, only sharp protocol routes are to be advertised + output = json.loads( + tgen.gears["r1"].vtysh_cmd( + "show bgp ipv4 unicast neighbors 192.168.1.2 advertised-routes json" + ) + ) + + expected = { + "advertisedRoutes": { + "192.168.11.0/32": { + "valid": True, + }, + "192.168.11.1/32": { + "valid": True, + }, + "192.168.11.2/32": { + "valid": True, + }, + "192.168.11.3/32": { + "valid": True, + }, + "192.168.11.4/32": { + "valid": True, + }, + }, + "totalPrefixCounter": 5, + } + + return topotest.json_cmp(output, expected) + + test_func = functools.partial(_bgp_check_advertised_routes_r4) + _, result = topotest.run_and_expect(test_func, None, count=30, wait=1) + assert result is None, "Failed to match the source-protocol for redistribute cmds" + if __name__ == "__main__": args = ["-s"] + sys.argv[1:]