From b4d46cc9b1a072c07ea5197bee8a83387c3d38bc Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Wed, 24 Apr 2019 21:40:50 +0200 Subject: [PATCH] bgpd: count some per-peer stats (for BMP) These counters are accessible through BMP and may be useful to monitor bgpd. A CLI to show them could also be added if people are interested. Signed-off-by: David Lamparter --- bgpd/bgp_packet.c | 2 ++ bgpd/bgp_route.c | 10 ++++++++++ bgpd/bgpd.h | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 9a836f2215..e907c6a10d 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -1518,6 +1518,8 @@ static int bgp_update_receive(struct peer *peer, bgp_size_t size) || BGP_DEBUG(update, UPDATE_PREFIX)) { ret = bgp_dump_attr(&attr, peer->rcvd_attr_str, BUFSIZ); + peer->stat_upd_7606++; + if (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW) flog_err( EC_BGP_UPDATE_RCV, diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 9e3ad4e8f2..683aa61e75 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3068,6 +3068,7 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, if (aspath_loop_check(attr->aspath, peer->change_local_as) > aspath_loop_count) { + peer->stat_pfx_aspath_loop++; reason = "as-path contains our own AS;"; goto filtered; } @@ -3088,6 +3089,7 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION) && aspath_loop_check(attr->aspath, bgp->confed_id) > peer->allowas_in[afi][safi])) { + peer->stat_pfx_aspath_loop++; reason = "as-path contains our own AS;"; goto filtered; } @@ -3096,18 +3098,21 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, /* Route reflector originator ID check. */ if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID) && IPV4_ADDR_SAME(&bgp->router_id, &attr->originator_id)) { + peer->stat_pfx_originator_loop++; reason = "originator is us;"; goto filtered; } /* Route reflector cluster ID check. */ if (bgp_cluster_filter(peer, attr)) { + peer->stat_pfx_cluster_loop++; reason = "reflected from the same cluster;"; goto filtered; } /* Apply incoming filter. */ if (bgp_input_filter(peer, p, attr, afi, safi) == FILTER_DENY) { + peer->stat_pfx_filter++; reason = "filter;"; goto filtered; } @@ -3138,6 +3143,7 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, * the attr (which takes over the memory references) */ if (bgp_input_modifier(peer, p, &new_attr, afi, safi, NULL) == RMAP_DENY) { + peer->stat_pfx_filter++; reason = "route-map;"; bgp_attr_flush(&new_attr); goto filtered; @@ -3163,12 +3169,14 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, /* next hop check. */ if (!CHECK_FLAG(peer->flags, PEER_FLAG_IS_RFAPI_HD) && bgp_update_martian_nexthop(bgp, afi, safi, &new_attr)) { + peer->stat_pfx_nh_invalid++; reason = "martian or self next-hop;"; bgp_attr_flush(&new_attr); goto filtered; } if (bgp_mac_entry_exists(p) || bgp_mac_exist(&attr->rmac)) { + peer->stat_pfx_nh_invalid++; reason = "self mac;"; goto filtered; } @@ -3727,6 +3735,8 @@ int bgp_withdraw(struct peer *peer, struct prefix *p, uint32_t addpath_id, if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG) && peer != bgp->peer_self) if (!bgp_adj_in_unset(rn, peer, addpath_id)) { + peer->stat_pfx_dup_withdraw++; + if (bgp_debug_update(peer, p, NULL, 1)) { bgp_debug_rdpfxpath2str( afi, safi, prd, p, label, num_labels, diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 8bdc0099ae..c329c8a7ea 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1077,6 +1077,14 @@ struct peer { _Atomic uint32_t dynamic_cap_in; /* Dynamic Capability input count. */ _Atomic uint32_t dynamic_cap_out; /* Dynamic Capability output count. */ + uint32_t stat_pfx_filter; + uint32_t stat_pfx_aspath_loop; + uint32_t stat_pfx_originator_loop; + uint32_t stat_pfx_cluster_loop; + uint32_t stat_pfx_nh_invalid; + uint32_t stat_pfx_dup_withdraw; + uint32_t stat_upd_7606; /* RFC7606: treat-as-withdraw */ + /* BGP state count */ uint32_t established; /* Established */ uint32_t dropped; /* Dropped */ -- 2.39.5