From 4d9fcf56ade0d47f850f47d55cda90200c65fba3 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Mon, 2 Dec 2024 11:07:34 +0100 Subject: [PATCH] bgpd: fix peer up message with wrong peer type At startup, there is no peer up message for loc-rib instance peer. Instead, a global peer up message with address 0.0.0.0 is sent. Such message is wrong, violates the RFC and should be dropped by a strict collector. Actually, the peer type message sent is wrong, and should be set to LOC-RIB peer type. Fix this by changing the peer type of peer up message to either loc-rib or global instance peer type. Fixes: 035304c25a38 ("bgpd: bmp loc-rib peer up/down for vrfs") Signed-off-by: Philippe Guibert --- bgpd/bgp_bmp.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/bgpd/bgp_bmp.c b/bgpd/bgp_bmp.c index 2e3a0388d0ed..72f1ca70afa4 100644 --- a/bgpd/bgp_bmp.c +++ b/bgpd/bgp_bmp.c @@ -467,13 +467,19 @@ static struct stream *bmp_peerstate(struct peer *peer, bool down) struct stream *s; size_t len; struct timeval uptime, uptime_real; + uint8_t peer_type; + bool is_locrib = true; uptime.tv_sec = peer->uptime; uptime.tv_usec = 0; monotime_to_realtime(&uptime, &uptime_real); - uint8_t peer_type = bmp_get_peer_type(peer); - bool is_locrib = peer_type == BMP_PEER_TYPE_LOC_RIB_INSTANCE; + peer_type = bmp_get_peer_type(peer); + if (peer_type == BMP_PEER_TYPE_LOC_RIB_INSTANCE) + is_locrib = true; + else + /* TODO: remove this when other RD and local instances supported */ + peer_type = BMP_PEER_TYPE_GLOBAL_INSTANCE; #define BGP_BMP_MAX_PACKET_SIZE 1024 #define BMP_PEERUP_INFO_TYPE_STRING 0 @@ -484,9 +490,7 @@ static struct stream *bmp_peerstate(struct peer *peer, bool down) bmp_common_hdr(s, BMP_VERSION_3, BMP_TYPE_PEER_UP_NOTIFICATION); - bmp_per_peer_hdr(s, peer->bgp, peer, 0, - BMP_PEER_TYPE_GLOBAL_INSTANCE, 0, - &uptime_real); + bmp_per_peer_hdr(s, peer->bgp, peer, 0, peer_type, 0, &uptime_real); /* Local Address (16 bytes) */ if (is_locrib)