]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Fix for match source-protocol in route-map for redistribute cmd
authorRajasekar Raja <rajasekarr@nvidia.com>
Mon, 21 Oct 2024 17:53:27 +0000 (10:53 -0700)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Sat, 9 Nov 2024 20:02:57 +0000 (20:02 +0000)
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 <sharpd@nvidia.com>
Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
(cherry picked from commit 68358c0f928eafe50c9e73b0cb6a443c03f2a33f)

bgpd/bgp_route.c
tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py

index 302feea58c4bc3da5edf8ade18cb2c6d3cbae0e0..619252b0c4015acd5d59833170b758f02a56129a 100644 (file)
@@ -9043,6 +9043,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);
index 7116deaea46aecc45f055bed25ae71a6f10d7b8b..f7b69f21c199d67aefc653c0668606fff80e61ca 100644 (file)
@@ -22,7 +22,7 @@ sys.path.append(os.path.join(CWD, "../"))
 
 # pylint: disable=C0413
 from lib import topotest
-from lib.topogen import Topogen, get_topogen
+from lib.topogen import Topogen, TopoRouter, get_topogen
 
 pytestmark = [pytest.mark.bgpd]
 
@@ -47,7 +47,14 @@ def setup_module(mod):
     router_list = tgen.routers()
 
     for _, (rname, router) in enumerate(router_list.items(), 1):
-        router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
+        router.load_frr_config(
+            os.path.join(CWD, "{}/frr.conf".format(rname)),
+            [
+                (TopoRouter.RD_ZEBRA, None),
+                (TopoRouter.RD_SHARP, None),
+                (TopoRouter.RD_BGP, None),
+            ],
+        )
 
     tgen.start_router()
 
@@ -109,6 +116,68 @@ def test_bgp_route_map_match_source_protocol():
     _, 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:]