summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2024-11-10 19:13:14 +0200
committerGitHub <noreply@github.com>2024-11-10 19:13:14 +0200
commit026f0ddb69ecc1a617fec876c7fd6045f091fe8c (patch)
tree2f7297e4fb89114a1aa599d18b8dbbd86e588ee2
parent6afff0c17ff207e197793318674f6083840f53d5 (diff)
parent031d4271018e827010abfa8f3ecfe60bbf1de21d (diff)
Merge pull request #17397 from FRRouting/mergify/bp/stable/10.2/pr-17362
bgpd: Fix for match source-protocol in route-map for redistribute cmd (backport #17362)
-rw-r--r--bgpd/bgp_route.c1
-rw-r--r--tests/topotests/bgp_route_map_match_source_protocol/test_bgp_route_map_match_source_protocol.py73
2 files changed, 72 insertions, 2 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 302feea58c..619252b0c4 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -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);
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 7116deaea4..f7b69f21c1 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
@@ -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:]