Skip to content

Commit

Permalink
bgpd, topotests: bmp imported bgp, send peer up events when config pa…
Browse files Browse the repository at this point in the history
…ram changed

When a BGP instance is created or becomes valid, and when a parameter
is updated (router-id, route distinguisher), the peer up messages other
than loc rib peer up messages, are sent. Add a test that controls if
peer down and peer up messages are sent accordingly with correct route
distinguisher values.

Signed-off-by: Philippe Guibert <[email protected]>
  • Loading branch information
pguibert6WIND committed Jan 7, 2025
1 parent ca7699f commit 6c7b2ab
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 1 deletion.
24 changes: 23 additions & 1 deletion bgpd/bgp_bmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -3443,6 +3443,7 @@ static int bmp_bgp_attribute_updated(struct bgp *bgp, bool withdraw)
struct bmp_imported_bgp *bib;
int ret = 0;
struct stream *s = bmp_peerstate(bgp->peer_self, withdraw);
struct bmp *bmp;

if (!s)
return 0;
Expand All @@ -3451,6 +3452,10 @@ static int bmp_bgp_attribute_updated(struct bgp *bgp, bool withdraw)
frr_each (bmp_targets, &bmpbgp->targets, bt) {
ret = bmp_bgp_attribute_updated_instance(bt, &bmpbgp->vrf_state, bgp,
withdraw, s);
if (withdraw)
continue;
frr_each (bmp_session, &bt->sessions, bmp)
bmp_send_peerup_per_instance(bmp, bgp);
}
}

Expand All @@ -3466,6 +3471,10 @@ static int bmp_bgp_attribute_updated(struct bgp *bgp, bool withdraw)
continue;
ret += bmp_bgp_attribute_updated_instance(bt, &bib->vrf_state, bgp,
withdraw, s);
if (withdraw)
continue;
frr_each (bmp_session, &bt->sessions, bmp)
bmp_send_peerup_per_instance(bmp, bgp);
}
}
}
Expand All @@ -3490,10 +3499,18 @@ static void _bmp_vrf_state_changed_internal(struct bgp *bgp, enum bmp_vrf_state
struct bmp_targets *bt;
struct listnode *node;
struct bmp_imported_bgp *bib;
struct bmp *bmp;

if (bmpbgp && bmp_bgp_update_vrf_status(&bmpbgp->vrf_state, bgp, vrf_state))
if (bmpbgp && bmp_bgp_update_vrf_status(&bmpbgp->vrf_state, bgp, vrf_state)) {
bmp_send_all_safe(bmpbgp, bmp_peerstate(bgp->peer_self,
bmpbgp->vrf_state == vrf_state_down));
if (vrf_state == vrf_state_up && bmpbgp->vrf_state == vrf_state_up) {
frr_each (bmp_targets, &bmpbgp->targets, bt) {
frr_each (bmp_session, &bt->sessions, bmp)
bmp_send_peerup_per_instance(bmp, bgp);
}
}
}

for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp_vrf)) {
bmpbgp = bmp_bgp_find(bgp_vrf);
Expand All @@ -3509,6 +3526,11 @@ static void _bmp_vrf_state_changed_internal(struct bgp *bgp, enum bmp_vrf_state
bmp_send_bt_safe(bt, bmp_peerstate(bgp->peer_self,
bib->vrf_state ==
vrf_state_down));
if (vrf_state == vrf_state_up &&
bib->vrf_state == vrf_state_up) {
frr_each (bmp_session, &bt->sessions, bmp)
bmp_send_peerup_per_instance(bmp, bgp);
}
break;
}
}
Expand Down
75 changes: 75 additions & 0 deletions tests/topotests/bgp_bmp/test_bgp_bmp_3.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,81 @@ def test_peer_down():
assert success, "Checking the updated prefixes has been failed !."


def test_reconfigure_route_distinguisher_vrf1():
"""
Checking for BMP peers down messages
"""
tgen = get_topogen()

bmp_update_seq(
tgen.gears["bmp1import"], os.path.join(tgen.logdir, "bmp1import", "bmp.log")
)
peers = ["0.0.0.0"]

tgen.gears["r1import"].vtysh_cmd(
"""
configure terminal
router bgp 65501 vrf vrf1
address-family ipv4 unicast
rd vpn export 666:22
exit-address-family
address-family ipv6 unicast
rd vpn export 666:22
"""
)
logger.info(
"checking for BMP peer down LOC-RIB message with route-distinguisher set to 444:1"
)
test_func = partial(
bmp_check_for_peer_message,
peers,
"peer down",
tgen.gears["bmp1import"],
os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
is_rd_instance=True,
peer_distinguisher="444:1",
)
success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
assert (
success
), "Checking the BMP peer down LOC-RIB message with route-distinguisher set to 444:1 failed !."

logger.info(
"checking for BMP peer up LOC-RIB messages with route-distinguisher set to 666:22"
)
test_func = partial(
bmp_check_for_peer_message,
peers,
"peer up",
tgen.gears["bmp1import"],
os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
is_rd_instance=True,
peer_distinguisher="666:22",
)
success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
assert (
success
), "Checking the BMP peer up LOC-RIB message with route-distinguisher set to 666:22 failed !."

logger.info(
"checking for BMP peer up messages with route-distinguisher set to 666:22"
)
peers = ["192.168.1.3", "192:167::3"]
test_func = partial(
bmp_check_for_peer_message,
peers,
"peer up",
tgen.gears["bmp1import"],
os.path.join(tgen.logdir, "bmp1import", "bmp.log"),
is_rd_instance=True,
peer_distinguisher="666:22",
)
success, _ = topotest.run_and_expect(test_func, True, count=30, wait=1)
assert (
success
), "Checking the BMP peer up messages with route-distinguisher set to 666:22 failed !."


def test_bgp_routerid_changed():
"""
Checking for BGP loc-rib up messages with new router-id
Expand Down

0 comments on commit 6c7b2ab

Please sign in to comment.