From 9efe82343e5f5e761f0c0ededf7655df737fb78c Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Thu, 31 Oct 2024 09:31:04 +0100 Subject: [PATCH] bgpd, topotests: bmp, fix wrong peer type for peer up/down events When running the bgp_bmp_2 vrf test, peer up/down events from the pre and post policy are received with a wrong peer type value > {"peer_type": "global instance", "policy": "pre-policy", "ipv6": false, > "peer_ip": "192.168.0.2", "peer_distinguisher": "0:0", "peer_asn": 65502, > "peer_bgp_id": "192.168.0.2", "timestamp": "2024-10-16 21:59:53.111962", > "bmp_log_type": "peer up", "local_ip": "192.168.0.1", "local_port": 179, > "remote_port": 50710, "seq": 4} RFC7854 defines RD instance peer type, and later in 4.2 requests that the peer distinguisher value be set to non zero value when the peer type is not global. This is the case for peer vrf instances. Fix this by modifying the BMP client, update the peer type value by updating the peer type value when sending peer up/down messages. Add a check in the bgp_bmp_2 test to ensure that peer type is correctly set. > {"peer_type": "route distinguisher instance", "policy": "pre-policy", > "ipv6": true, "peer_ip": "192:168::2", "peer_distinguisher": "0:0", > "peer_asn": 65502, "peer_bgp_id": "192.168.0.2", "timestamp": > "2024-10-16 21:59:53.111962", "bmp_log_type": "peer up", "local_ip": > "192:168::1", "local_port": 179, "remote_port": 50836, "seq": 5} Signed-off-by: Philippe Guibert --- bgpd/bgp_bmp.c | 3 --- tests/topotests/bgp_bmp/bgpbmp.py | 4 +++- tests/topotests/bgp_bmp/test_bgp_bmp_2.py | 2 ++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/bgpd/bgp_bmp.c b/bgpd/bgp_bmp.c index d74454269f8b..8979068ed464 100644 --- a/bgpd/bgp_bmp.c +++ b/bgpd/bgp_bmp.c @@ -472,9 +472,6 @@ static struct stream *bmp_peerstate(struct peer *peer, bool down) uint8_t peer_type = bmp_get_peer_type(peer); bool is_locrib = peer_type == BMP_PEER_TYPE_LOC_RIB_INSTANCE; - if (is_locrib == false) - peer_type = BMP_PEER_TYPE_GLOBAL_INSTANCE; - if (bmp_get_peer_distinguisher(peer->bgp, AFI_UNSPEC, peer_type, &peer_distinguisher)) { zlog_warn("skipping bmp message for peer %s: can't get peer distinguisher", peer->host); diff --git a/tests/topotests/bgp_bmp/bgpbmp.py b/tests/topotests/bgp_bmp/bgpbmp.py index 0a0a845b3ab3..4f770ebcd1d4 100644 --- a/tests/topotests/bgp_bmp/bgpbmp.py +++ b/tests/topotests/bgp_bmp/bgpbmp.py @@ -187,7 +187,7 @@ def bmp_check_for_prefixes( def bmp_check_for_peer_message( - expected_peers, bmp_log_type, bmp_collector, bmp_log_file + expected_peers, bmp_log_type, bmp_collector, bmp_log_file, is_rd_instance=False ): """ Check for the presence of a peer up message for the peer @@ -211,6 +211,8 @@ def bmp_check_for_peer_message( and m["peer_ip"] != "0.0.0.0" and m["bmp_log_type"] == bmp_log_type ): + if is_rd_instance and m["peer_type"] != "route distinguisher instance": + continue peers.append(m["peer_ip"]) elif m["policy"] == "loc-rib" and m["bmp_log_type"] == bmp_log_type: peers.append("0.0.0.0") diff --git a/tests/topotests/bgp_bmp/test_bgp_bmp_2.py b/tests/topotests/bgp_bmp/test_bgp_bmp_2.py index 618d41a6261f..bc648dcfd8f1 100644 --- a/tests/topotests/bgp_bmp/test_bgp_bmp_2.py +++ b/tests/topotests/bgp_bmp/test_bgp_bmp_2.py @@ -210,6 +210,7 @@ def test_peer_up(): "peer up", tgen.gears["bmp1vrf"], os.path.join(tgen.logdir, "bmp1vrf", "bmp.log"), + is_rd_instance=True, ) success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1) assert success, "Checking the updated prefixes has been failed !." @@ -245,6 +246,7 @@ def test_peer_down(): "peer down", tgen.gears["bmp1vrf"], os.path.join(tgen.logdir, "bmp1vrf", "bmp.log"), + is_rd_instance=True, ) success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1) assert success, "Checking the updated prefixes has been failed !."