summaryrefslogtreecommitdiff
path: root/bgpd/bgp_snmp_bgp4v2.c
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2022-12-15 16:50:52 +0200
committerDonatas Abraitis <donatas@opensourcerouting.org>2022-12-19 23:27:33 +0200
commit71a055c9d1e8d4c647a8c9940eeff641a68a52c7 (patch)
tree5034c63042a281777479e9e514dcf60f70ed1c8d /bgpd/bgp_snmp_bgp4v2.c
parent2b9d7b2c9b23be41a9e188402a3de0cbae95aa83 (diff)
bgpd: Specify prefix address-family before looking into BGP table
Otherwise, lookup behaves a bit weird. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
Diffstat (limited to 'bgpd/bgp_snmp_bgp4v2.c')
-rw-r--r--bgpd/bgp_snmp_bgp4v2.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/bgpd/bgp_snmp_bgp4v2.c b/bgpd/bgp_snmp_bgp4v2.c
index 20854ff64e..d74c13c9c5 100644
--- a/bgpd/bgp_snmp_bgp4v2.c
+++ b/bgpd/bgp_snmp_bgp4v2.c
@@ -421,7 +421,7 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
{
oid *offset;
int offsetlen;
- struct bgp_path_info *path;
+ struct bgp_path_info *path, *min;
struct bgp_dest *dest;
union sockunion su;
unsigned int len;
@@ -501,6 +501,8 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
else
addr->prefixlen = len * 8;
+ addr->family = family;
+
dest = bgp_node_get(bgp->rib[afi][SAFI_UNICAST], addr);
offset++;
@@ -526,8 +528,8 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
if (!dest)
return NULL;
- while ((dest = bgp_route_next(dest))) {
- struct bgp_path_info *min = NULL;
+ do {
+ min = NULL;
for (path = bgp_dest_get_bgp_path_info(dest); path;
path = path->next) {
@@ -565,6 +567,7 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
offset = name + namelen;
+ /* Encode prefix into OID */
if (family == AF_INET)
oid_copy_in_addr(offset, &rn_p->u.prefix4);
else
@@ -574,6 +577,7 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
*offset = rn_p->prefixlen;
offset++;
+ /* Encode peer's IP into OID */
if (family == AF_INET) {
oid_copy_in_addr(offset,
&min->peer->su.sin.sin_addr);
@@ -585,6 +589,7 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
}
addr->prefixlen = rn_p->prefixlen;
+ addr->family = rn_p->family;
bgp_dest_unlock_node(dest);
@@ -595,7 +600,7 @@ bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length,
memset(&paddr.ip._v4_addr, 0, afi_len);
else
memset(&paddr.ip._v6_addr, 0, afi_len);
- }
+ } while ((dest = bgp_route_next(dest)));
return NULL;
}