From e6374a20f3074ba2744476048daa4cbe85e5438b Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Thu, 25 Apr 2024 16:53:21 +0200 Subject: [PATCH] bgpd: add bmp adj-rib-in 64 bit gauge value There is no support for option 7, as per RFC7854. Add the 64 bit counter in the peer structure. Add the 64 bit bmp value write api. Add the missing per peer statistic. Signed-off-by: Philippe Guibert --- bgpd/bgp_advertise.c | 3 +++ bgpd/bgp_bmp.c | 11 +++++++++++ bgpd/bgpd.h | 1 + doc/user/bmp.rst | 1 + 4 files changed, 16 insertions(+) diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c index a81f288c7a..d519749f6b 100644 --- a/bgpd/bgp_advertise.c +++ b/bgpd/bgp_advertise.c @@ -182,12 +182,15 @@ void bgp_adj_in_set(struct bgp_dest *dest, struct peer *peer, struct attr *attr, adj->uptime = monotime(NULL); adj->addpath_rx_id = addpath_id; BGP_ADJ_IN_ADD(dest, adj); + peer->stat_pfx_adj_rib_in++; bgp_dest_lock_node(dest); } void bgp_adj_in_remove(struct bgp_dest **dest, struct bgp_adj_in *bai) { bgp_attr_unintern(&bai->attr); + if (bai->peer) + bai->peer->stat_pfx_adj_rib_in--; BGP_ADJ_IN_DEL(*dest, bai); *dest = bgp_dest_unlock_node(*dest); peer_unlock(bai->peer); /* adj_in peer reference */ diff --git a/bgpd/bgp_bmp.c b/bgpd/bgp_bmp.c index 5fcb8c5645..d4e1f871ab 100644 --- a/bgpd/bgp_bmp.c +++ b/bgpd/bgp_bmp.c @@ -1592,6 +1592,15 @@ static void bmp_stat_put_u32(struct stream *s, size_t *cnt, uint16_t type, (*cnt)++; } +static void bmp_stat_put_u64(struct stream *s, size_t *cnt, uint16_t type, + uint64_t value) +{ + stream_putw(s, type); + stream_putw(s, 8); + stream_putq(s, value); + (*cnt)++; +} + static void bmp_stats(struct event *thread) { struct bmp_targets *bt = EVENT_ARG(thread); @@ -1635,6 +1644,8 @@ static void bmp_stats(struct event *thread) peer->stat_upd_7606); bmp_stat_put_u32(s, &count, BMP_STATS_FRR_NH_INVALID, peer->stat_pfx_nh_invalid); + bmp_stat_put_u64(s, &count, BMP_STATS_SIZE_ADJ_RIB_IN, + peer->stat_pfx_adj_rib_in); stream_putl_at(s, count_pos, count); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index e882a181b5..107fc8b95c 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1667,6 +1667,7 @@ struct peer { uint32_t stat_pfx_nh_invalid; uint32_t stat_pfx_dup_withdraw; uint32_t stat_upd_7606; /* RFC7606: treat-as-withdraw */ + uint64_t stat_pfx_adj_rib_in; /* RFC7854 : Number of routes in Adj-RIBs-In */ /* BGP state count */ uint32_t established; /* Established */ diff --git a/doc/user/bmp.rst b/doc/user/bmp.rst index 0f46832059..c553b7c985 100644 --- a/doc/user/bmp.rst +++ b/doc/user/bmp.rst @@ -23,6 +23,7 @@ The `BMP` implementation in FRR has the following properties: - 3: count of **prefixes** with loop in cluster id - 4: count of **prefixes** with loop in AS-path - 5: count of **prefixes** with loop in originator + - 7: count of **routes** in adj-rib-in - 11: count of updates subjected to :rfc:`7607` "treat as withdrawal" handling due to errors - 65531: *experimental* count of prefixes rejected due to invalid next-hop