From 109cd5f5d02b5788ed59c6f94a8acb06dfe664b3 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 1 Dec 2022 13:26:19 +0200 Subject: [PATCH 1/3] bgpd: Implement SNMP BGP4V2-MIB (bgp4V2PeerEventTimesTable) ``` $ snmpwalk -c public -v1 localhost .1.3.6.1.3.5.1.1.4.1 iso.3.6.1.3.5.1.1.4.1.1.1.4.192.168.10.64 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.1.1.4.192.168.10.65 = Gauge32: 18 iso.3.6.1.3.5.1.1.4.1.1.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.1.2.16.42.12.47.7.72.150.6.102.0.0.0.0.0.0.177.121 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.1.2.16.42.12.47.7.72.150.6.102.0.0.0.0.0.0.177.128 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.2.1.4.192.168.10.64 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.2.1.4.192.168.10.65 = Gauge32: 17 iso.3.6.1.3.5.1.1.4.1.2.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.2.2.16.42.12.47.7.72.150.6.102.0.0.0.0.0.0.177.121 = Gauge32: 0 iso.3.6.1.3.5.1.1.4.1.2.2.16.42.12.47.7.72.150.6.102.0.0.0.0.0.0.177.128 = Gauge32: 0 ``` Signed-off-by: Donatas Abraitis --- bgpd/bgp_snmp_bgp4v2.c | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/bgpd/bgp_snmp_bgp4v2.c b/bgpd/bgp_snmp_bgp4v2.c index 1be28e0b2d..f1a664bc4b 100644 --- a/bgpd/bgp_snmp_bgp4v2.c +++ b/bgpd/bgp_snmp_bgp4v2.c @@ -380,6 +380,40 @@ static uint8_t *bgpv2PeerErrorsTable(struct variable *v, oid name[], return NULL; } +static uint8_t *bgpv2PeerEventTimesTable(struct variable *v, oid name[], + size_t *length, int exact, + size_t *var_len, + WriteMethod **write_method) +{ + struct peer *peer; + struct ipaddr addr = {}; + + if (smux_header_table(v, name, length, exact, var_len, write_method) == + MATCH_FAILED) + return NULL; + + peer = bgpv2PeerTable_lookup(v, name, length, exact, &addr); + if (!peer) + return NULL; + + switch (v->magic) { + case BGP4V2_PEER_FSM_ESTABLISHED_TIME: + if (!peer->uptime) + return SNMP_INTEGER(0); + else + return SNMP_INTEGER(monotime(NULL) - peer->uptime); + case BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME: + if (!peer->update_time) + return SNMP_INTEGER(0); + else + return SNMP_INTEGER(monotime(NULL) - peer->update_time); + default: + break; + } + + return NULL; +} + static struct variable bgpv2_variables[] = { /* bgp4V2PeerEntry */ {BGP4V2_PEER_INSTANCE, @@ -671,6 +705,31 @@ static struct variable bgpv2_variables[] = { bgpv2PeerErrorsTable, 6, {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA, 2, 16}}, + /* bgp4V2PeerEventTimesEntry */ + {BGP4V2_PEER_FSM_ESTABLISHED_TIME, + ASN_UNSIGNED, + RONLY, + bgpv2PeerEventTimesTable, + 6, + {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME, 1, 4}}, + {BGP4V2_PEER_FSM_ESTABLISHED_TIME, + ASN_UNSIGNED, + RONLY, + bgpv2PeerEventTimesTable, + 6, + {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME, 2, 16}}, + {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME, + ASN_UNSIGNED, + RONLY, + bgpv2PeerEventTimesTable, + 6, + {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME, 1, 4}}, + {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME, + ASN_UNSIGNED, + RONLY, + bgpv2PeerEventTimesTable, + 6, + {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME, 2, 16}}, }; int bgp_snmp_bgp4v2_init(struct thread_master *tm) From c681e937d7ae8904f748819fce37498ce0ea8f7d Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 1 Dec 2022 14:12:03 +0200 Subject: [PATCH 2/3] bgpd: Implement SNMP BGP4V2-MIB (bgp4V2NlriTable), part 1 ``` iso.3.6.1.3.5.1.1.9.1.1.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.2.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.3.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 ``` Signed-off-by: Donatas Abraitis --- bgpd/bgp_snmp_bgp4v2.c | 576 +++++++++++++++++++++++++++++++++++++++++ bgpd/bgp_snmp_bgp4v2.h | 5 +- 2 files changed, 580 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_snmp_bgp4v2.c b/bgpd/bgp_snmp_bgp4v2.c index f1a664bc4b..2d167c1b93 100644 --- a/bgpd/bgp_snmp_bgp4v2.c +++ b/bgpd/bgp_snmp_bgp4v2.c @@ -414,6 +414,281 @@ static uint8_t *bgpv2PeerEventTimesTable(struct variable *v, oid name[], return NULL; } +static struct bgp_path_info * +bgp4v2PathAttrLookup(struct variable *v, oid name[], size_t *length, + struct bgp *bgp, struct prefix *addr, int exact) +{ + oid *offset; + int offsetlen; + struct bgp_path_info *path; + struct bgp_dest *dest; + union sockunion su; + unsigned int len; + struct ipaddr paddr = {}; + size_t namelen = v ? v->namelen : BGP4V2_NLRI_ENTRY_OFFSET; + sa_family_t family = name[namelen - 1] == 4 ? AF_INET : AF_INET6; + afi_t afi = AFI_IP; + size_t afi_len = IN_ADDR_SIZE; + + if (family == AF_INET6) { + afi = AFI_IP6; + afi_len = IN6_ADDR_SIZE; + } + +#define BGP_NLRI_ENTRY_OFFSET (afi_len + 1 + afi_len) + + sockunion_init(&su); + + if (exact) { + if (*length - v->namelen != BGP_NLRI_ENTRY_OFFSET) + return NULL; + + /* Set OID offset for prefix */ + offset = name + v->namelen; + if (family == AF_INET) + oid2in_addr(offset, afi_len, &addr->u.prefix4); + else + oid2in6_addr(offset, &addr->u.prefix6); + offset += afi_len; + + /* Prefix length */ + addr->prefixlen = *offset; + addr->family = family; + offset++; + + /* Peer address */ + su.sin.sin_family = family; + if (family == AF_INET) + oid2in_addr(offset, afi_len, &su.sin.sin_addr); + else + oid2in6_addr(offset, &su.sin6.sin6_addr); + + /* Lookup node */ + dest = bgp_node_lookup(bgp->rib[afi][SAFI_UNICAST], addr); + if (dest) { + for (path = bgp_dest_get_bgp_path_info(dest); path; + path = path->next) + if (sockunion_same(&path->peer->su, &su)) + return path; + + bgp_dest_unlock_node(dest); + } + + return NULL; + } + + offset = name + v->namelen; + offsetlen = *length - v->namelen; + len = offsetlen; + + if (offsetlen == 0) { + dest = bgp_table_top(bgp->rib[afi][SAFI_UNICAST]); + } else { + if (len > afi_len) + len = afi_len; + + if (family == AF_INET) + oid2in_addr(offset, len, &addr->u.prefix4); + else + oid2in6_addr(offset, &addr->u.prefix6); + + offset += afi_len; + offsetlen -= afi_len; + + if (offsetlen > 0) + addr->prefixlen = *offset; + else + addr->prefixlen = len * 8; + + dest = bgp_node_get(bgp->rib[afi][SAFI_UNICAST], addr); + + offset++; + offsetlen--; + } + + if (offsetlen > 0) { + len = offsetlen; + if (len > afi_len) + len = afi_len; + + if (family == AF_INET) + oid2in_addr(offset, len, &paddr.ip._v4_addr); + else + oid2in6_addr(offset, &paddr.ip._v6_addr); + } else { + if (family == AF_INET) + memset(&paddr.ip._v4_addr, 0, afi_len); + else + memset(&paddr.ip._v6_addr, 0, afi_len); + } + + if (!dest) + return NULL; + + while ((dest = bgp_route_next(dest))) { + struct bgp_path_info *min = NULL; + + for (path = bgp_dest_get_bgp_path_info(dest); path; + path = path->next) { + sa_family_t path_family = + sockunion_family(&path->peer->su); + + if (path_family == AF_INET && + IPV4_ADDR_CMP(&paddr.ip._v4_addr, + &path->peer->su.sin.sin_addr) < 0) { + if (!min || + (min && + IPV4_ADDR_CMP( + &path->peer->su.sin.sin_addr, + &min->peer->su.sin.sin_addr) < 0)) + min = path; + } else if (path_family == AF_INET6 && + IPV6_ADDR_CMP( + &paddr.ip._v6_addr, + &path->peer->su.sin6.sin6_addr) < + 0) { + if (!min || + (min && + IPV6_ADDR_CMP( + &path->peer->su.sin6.sin6_addr, + &min->peer->su.sin6.sin6_addr) < + 0)) + min = path; + } + } + + if (min) { + const struct prefix *rn_p = bgp_dest_get_prefix(dest); + + *length = v->namelen + BGP_NLRI_ENTRY_OFFSET; + + offset = name + v->namelen; + + if (family == AF_INET) + oid_copy_in_addr(offset, &rn_p->u.prefix4); + else + oid_copy_in6_addr(offset, &rn_p->u.prefix6); + + offset += afi_len; + *offset = rn_p->prefixlen; + offset++; + + if (family == AF_INET) { + oid_copy_in_addr(offset, + &min->peer->su.sin.sin_addr); + addr->u.prefix4 = rn_p->u.prefix4; + } else { + oid_copy_in6_addr( + offset, &min->peer->su.sin6.sin6_addr); + addr->u.prefix6 = rn_p->u.prefix6; + } + + addr->prefixlen = rn_p->prefixlen; + + bgp_dest_unlock_node(dest); + + return min; + } + + if (family == AF_INET) + memset(&paddr.ip._v4_addr, 0, afi_len); + else + memset(&paddr.ip._v6_addr, 0, afi_len); + } + + return NULL; +} + +static uint8_t *bgp4v2PathAttrTable(struct variable *v, oid name[], + size_t *length, int exact, size_t *var_len, + WriteMethod **write_method) +{ + struct bgp *bgp; + struct bgp_path_info *path; + struct peer_af *paf = NULL; + struct prefix addr = {}; + enum bgp_af_index index; + + bgp = bgp_get_default(); + if (!bgp) + return NULL; + + if (smux_header_table(v, name, length, exact, var_len, write_method) == + MATCH_FAILED) + return NULL; + + path = bgp4v2PathAttrLookup(v, name, length, bgp, &addr, exact); + if (!path) + return NULL; + + AF_FOREACH (index) { + paf = path->peer->peer_af_array[index]; + if (paf) + break; + } + + switch (v->magic) { + case BGP4V2_NLRI_INDEX: + return SNMP_INTEGER(0); + case BGP4V2_NLRI_AFI: + if (paf) + return SNMP_INTEGER(paf->afi); + else + return SNMP_INTEGER(0); + case BGP4V2_NLRI_SAFI: + if (paf) + return SNMP_INTEGER(paf->safi); + else + return SNMP_INTEGER(0); + case BGP4V2_NLRI_PREFIX_TYPE: + break; + case BGP4V2_NLRI_PREFIX: + break; + case BGP4V2_NLRI_PREFIX_LEN: + break; + case BGP4V2_NLRI_BEST: + break; + case BGP4V2_NLRI_CALC_LOCAL_PREF: + break; + case BGP4V2_NLRI_ORIGIN: + break; + case BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE: + break; + case BGP4V2_NLRI_NEXT_HOP_ADDR: + break; + case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE: + break; + case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR: + break; + case BGP4V2_NLRI_LOCAL_PREF_PRESENT: + break; + case BGP4V2_NLRI_LOCAL_PREF: + break; + case BGP4V2_NLRI_MED_PRESENT: + break; + case BGP4V2_NLRI_MED: + break; + case BGP4V2_NLRI_ATOMIC_AGGREGATE: + break; + case BGP4V2_NLRI_AGGREGATOR_PRESENT: + break; + case BGP4V2_NLRI_AGGREGATOR_AS: + break; + case BGP4V2_NLRI_AGGREGATOR_ADDR: + break; + case BGP4V2_NLRI_AS_PATH_CALC_LENGTH: + break; + case BGP4V2_NLRI_AS_PATH_STRING: + break; + case BGP4V2_NLRI_AS_PATH: + break; + case BGP4V2_NLRI_PATH_ATTR_UNKNOWN: + *var_len = 0; + return NULL; + } + return NULL; +} + static struct variable bgpv2_variables[] = { /* bgp4V2PeerEntry */ {BGP4V2_PEER_INSTANCE, @@ -730,6 +1005,307 @@ static struct variable bgpv2_variables[] = { bgpv2PeerEventTimesTable, 6, {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME, 2, 16}}, + /* bgp4V2NlriTable */ + {BGP4V2_NLRI_INDEX, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_INDEX, 1, 4}}, + {BGP4V2_NLRI_INDEX, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_INDEX, 2, 16}}, + {BGP4V2_NLRI_AFI, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AFI, 1, 4}}, + {BGP4V2_NLRI_AFI, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AFI, 2, 16}}, + {BGP4V2_NLRI_SAFI, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_SAFI, 1, 4}}, + {BGP4V2_NLRI_SAFI, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_SAFI, 2, 16}}, + {BGP4V2_NLRI_PREFIX_TYPE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE, 1, 4}}, + {BGP4V2_NLRI_PREFIX_TYPE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE, 2, 16}}, + {BGP4V2_NLRI_PREFIX, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PREFIX, 1, 4}}, + {BGP4V2_NLRI_PREFIX, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PREFIX, 2, 16}}, + {BGP4V2_NLRI_PREFIX_LEN, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN, 1, 4}}, + {BGP4V2_NLRI_PREFIX_LEN, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN, 2, 16}}, + {BGP4V2_NLRI_BEST, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_BEST, 1, 4}}, + {BGP4V2_NLRI_BEST, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_BEST, 2, 16}}, + {BGP4V2_NLRI_CALC_LOCAL_PREF, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF, 1, 4}}, + {BGP4V2_NLRI_CALC_LOCAL_PREF, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF, 2, 16}}, + {BGP4V2_NLRI_ORIGIN, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_ORIGIN, 1, 4}}, + {BGP4V2_NLRI_ORIGIN, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_ORIGIN, 2, 16}}, + {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE, 1, 4}}, + {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE, 2, 16}}, + {BGP4V2_NLRI_NEXT_HOP_ADDR, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR, 1, 4}}, + {BGP4V2_NLRI_NEXT_HOP_ADDR, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR, 2, 16}}, + {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE, 1, 4}}, + {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE, 2, 16}}, + {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR, 1, 4}}, + {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR, 2, 16}}, + {BGP4V2_NLRI_LOCAL_PREF_PRESENT, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT, 1, 4}}, + {BGP4V2_NLRI_LOCAL_PREF_PRESENT, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT, 2, 16}}, + {BGP4V2_NLRI_LOCAL_PREF, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF, 1, 4}}, + {BGP4V2_NLRI_LOCAL_PREF, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF, 2, 16}}, + {BGP4V2_NLRI_MED_PRESENT, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_MED_PRESENT, 1, 4}}, + {BGP4V2_NLRI_MED_PRESENT, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_MED_PRESENT, 2, 16}}, + {BGP4V2_NLRI_MED, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_MED, 1, 4}}, + {BGP4V2_NLRI_MED, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_MED, 2, 16}}, + {BGP4V2_NLRI_ATOMIC_AGGREGATE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE, 1, 4}}, + {BGP4V2_NLRI_ATOMIC_AGGREGATE, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE, 2, 16}}, + {BGP4V2_NLRI_AGGREGATOR_PRESENT, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT, 1, 4}}, + {BGP4V2_NLRI_AGGREGATOR_PRESENT, + ASN_INTEGER, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT, 2, 16}}, + {BGP4V2_NLRI_AGGREGATOR_AS, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS, 1, 4}}, + {BGP4V2_NLRI_AGGREGATOR_AS, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS, 2, 16}}, + {BGP4V2_NLRI_AGGREGATOR_ADDR, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR, 1, 4}}, + {BGP4V2_NLRI_AGGREGATOR_ADDR, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR, 2, 16}}, + {BGP4V2_NLRI_AS_PATH_CALC_LENGTH, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH, 1, 4}}, + {BGP4V2_NLRI_AS_PATH_CALC_LENGTH, + ASN_UNSIGNED, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH, 2, 16}}, + {BGP4V2_NLRI_AS_PATH_STRING, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING, 1, 4}}, + {BGP4V2_NLRI_AS_PATH_STRING, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING, 2, 16}}, + {BGP4V2_NLRI_AS_PATH, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AS_PATH, 1, 4}}, + {BGP4V2_NLRI_AS_PATH, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_AS_PATH, 2, 16}}, + {BGP4V2_NLRI_PATH_ATTR_UNKNOWN, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN, 1, 4}}, + {BGP4V2_NLRI_PATH_ATTR_UNKNOWN, + ASN_OCTET_STR, + RONLY, + bgp4v2PathAttrTable, + 6, + {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN, 2, 16}}, }; int bgp_snmp_bgp4v2_init(struct thread_master *tm) diff --git a/bgpd/bgp_snmp_bgp4v2.h b/bgpd/bgp_snmp_bgp4v2.h index 6980db9f8d..8b474c3887 100644 --- a/bgpd/bgp_snmp_bgp4v2.h +++ b/bgpd/bgp_snmp_bgp4v2.h @@ -61,7 +61,10 @@ #define BGP4V2_PEER_FSM_ESTABLISHED_TIME 1 #define BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME 2 -/* bgp4V2NlriEntry */ +/* bgp4V2NlriEntry + * offset 1.3.6.1.3.5.1.1.9.1.x.(1|2).(4|16) = 13 + */ +#define BGP4V2_NLRI_ENTRY_OFFSET 13 #define BGP4V2_NLRI_INDEX 1 #define BGP4V2_NLRI_AFI 2 #define BGP4V2_NLRI_SAFI 3 From 2ce69011c4199bead8172b5ee7e63485e2f861c8 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Mon, 12 Dec 2022 21:59:16 +0200 Subject: [PATCH 3/3] bgpd: Implement SNMP BGP4V2-MIB (bgp4V2NlriTable), part 2 ``` iso.3.6.1.3.5.1.1.9.1.1.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.1.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.2.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.2.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.3.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.3.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.4.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.4.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.4.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.4.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.4.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.4.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.4.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.4.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.4.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 2 iso.3.6.1.3.5.1.1.9.1.5.1.4.10.0.0.0.24.192.168.10.65 = Hex-STRING: 0A 00 00 00 iso.3.6.1.3.5.1.1.9.1.5.1.4.100.100.100.100.32.192.168.10.65 = STRING: "dddd" iso.3.6.1.3.5.1.1.9.1.5.1.4.172.17.0.0.24.192.168.10.65 = Hex-STRING: AC 11 00 00 iso.3.6.1.3.5.1.1.9.1.5.1.4.192.168.0.0.24.192.168.10.65 = Hex-STRING: C0 A8 00 00 iso.3.6.1.3.5.1.1.9.1.5.1.4.192.168.10.0.23.192.168.10.65 = Hex-STRING: C0 A8 0A 00 iso.3.6.1.3.5.1.1.9.1.5.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 2A 02 47 80 00 00 00 00 00 00 00 00 00 00 11 11 iso.3.6.1.3.5.1.1.9.1.5.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 2A 02 47 80 01 23 00 00 00 00 00 00 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.5.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 2A 03 06 80 00 00 00 00 00 00 00 00 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.5.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 2A 03 06 80 00 01 00 00 00 00 00 00 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.6.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 24 iso.3.6.1.3.5.1.1.9.1.6.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 32 iso.3.6.1.3.5.1.1.9.1.6.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 24 iso.3.6.1.3.5.1.1.9.1.6.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 24 iso.3.6.1.3.5.1.1.9.1.6.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 23 iso.3.6.1.3.5.1.1.9.1.6.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 128 iso.3.6.1.3.5.1.1.9.1.6.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 64 iso.3.6.1.3.5.1.1.9.1.6.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 48 iso.3.6.1.3.5.1.1.9.1.6.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 48 iso.3.6.1.3.5.1.1.9.1.7.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.7.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.8.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.8.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.9.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.9.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 3 iso.3.6.1.3.5.1.1.9.1.10.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.10.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.10.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.10.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.10.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.10.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 4 iso.3.6.1.3.5.1.1.9.1.10.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 4 iso.3.6.1.3.5.1.1.9.1.10.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 4 iso.3.6.1.3.5.1.1.9.1.10.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 4 iso.3.6.1.3.5.1.1.9.1.11.1.4.10.0.0.0.24.192.168.10.65 = Hex-STRING: C0 A8 0A 41 iso.3.6.1.3.5.1.1.9.1.11.1.4.100.100.100.100.32.192.168.10.65 = Hex-STRING: C0 A8 0A 41 iso.3.6.1.3.5.1.1.9.1.11.1.4.172.17.0.0.24.192.168.10.65 = Hex-STRING: C0 A8 0A 41 iso.3.6.1.3.5.1.1.9.1.11.1.4.192.168.0.0.24.192.168.10.65 = Hex-STRING: C0 A8 0A 41 iso.3.6.1.3.5.1.1.9.1.11.1.4.192.168.10.0.23.192.168.10.65 = Hex-STRING: C0 A8 0A 41 iso.3.6.1.3.5.1.1.9.1.11.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: FE 80 00 00 00 00 00 00 0A 00 27 FF FE 2C E3 88 iso.3.6.1.3.5.1.1.9.1.11.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: FE 80 00 00 00 00 00 00 0A 00 27 FF FE 2C E3 88 iso.3.6.1.3.5.1.1.9.1.11.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: FE 80 00 00 00 00 00 00 0A 00 27 FF FE 2C E3 88 iso.3.6.1.3.5.1.1.9.1.11.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: FE 80 00 00 00 00 00 00 0A 00 27 FF FE 2C E3 88 iso.3.6.1.3.5.1.1.9.1.14.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.14.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.15.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.15.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.16.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.16.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 1 iso.3.6.1.3.5.1.1.9.1.17.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.17.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.18.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.18.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.1.4.10.0.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.1.4.100.100.100.100.32.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.1.4.172.17.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.1.4.192.168.0.0.24.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.1.4.192.168.10.0.23.192.168.10.65 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.19.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = INTEGER: 0 iso.3.6.1.3.5.1.1.9.1.20.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.20.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 0 iso.3.6.1.3.5.1.1.9.1.21.1.4.10.0.0.0.24.192.168.10.65 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.1.4.100.100.100.100.32.192.168.10.65 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.1.4.172.17.0.0.24.192.168.10.65 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.1.4.192.168.0.0.24.192.168.10.65 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.1.4.192.168.10.0.23.192.168.10.65 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.21.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 00 00 00 00 iso.3.6.1.3.5.1.1.9.1.22.1.4.10.0.0.0.24.192.168.10.65 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.1.4.100.100.100.100.32.192.168.10.65 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.1.4.172.17.0.0.24.192.168.10.65 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.1.4.192.168.0.0.24.192.168.10.65 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.1.4.192.168.10.0.23.192.168.10.65 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.2.16.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.22.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Gauge32: 1 iso.3.6.1.3.5.1.1.9.1.24.1.4.10.0.0.0.24.192.168.10.65 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.1.4.100.100.100.100.32.192.168.10.65 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.1.4.172.17.0.0.24.192.168.10.65 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.1.4.192.168.0.0.24.192.168.10.65 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.1.4.192.168.10.0.23.192.168.10.65 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.2.16.42.2.71.128.0.0.0.0.0.0.0.0.0.0.17.17.128.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.2.16.42.2.71.128.10.188.0.0.0.0.0.0.0.0.0.0.64.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.2.16.42.3.6.128.0.0.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 02 01 FD EA iso.3.6.1.3.5.1.1.9.1.24.2.16.42.3.6.128.0.1.0.0.0.0.0.0.0.0.0.0.48.42.2.71.128.1.35.0.0.0.0.0.0.0.0.0.2 = Hex-STRING: 02 01 FD EA ``` Signed-off-by: Donatas Abraitis --- bgpd/bgp_snmp_bgp4v2.c | 122 ++++++++++++++++++++++++++++++++++------- 1 file changed, 102 insertions(+), 20 deletions(-) diff --git a/bgpd/bgp_snmp_bgp4v2.c b/bgpd/bgp_snmp_bgp4v2.c index 2d167c1b93..9c91a30804 100644 --- a/bgpd/bgp_snmp_bgp4v2.c +++ b/bgpd/bgp_snmp_bgp4v2.c @@ -607,6 +607,7 @@ static uint8_t *bgp4v2PathAttrTable(struct variable *v, oid name[], struct bgp_path_info *path; struct peer_af *paf = NULL; struct prefix addr = {}; + const struct prefix *prefix = NULL; enum bgp_af_index index; bgp = bgp_get_default(); @@ -621,6 +622,8 @@ static uint8_t *bgp4v2PathAttrTable(struct variable *v, oid name[], if (!path) return NULL; + prefix = bgp_dest_get_prefix(path->net); + AF_FOREACH (index) { paf = path->peer->peer_af_array[index]; if (paf) @@ -641,47 +644,126 @@ static uint8_t *bgp4v2PathAttrTable(struct variable *v, oid name[], else return SNMP_INTEGER(0); case BGP4V2_NLRI_PREFIX_TYPE: - break; + if (paf) + return SNMP_INTEGER(paf->afi); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_PREFIX: - break; + if (prefix->family == AF_INET6) + return SNMP_IP6ADDRESS(prefix->u.prefix6); + else + return SNMP_IPADDRESS(prefix->u.prefix4); case BGP4V2_NLRI_PREFIX_LEN: - break; + return SNMP_INTEGER(prefix->prefixlen); case BGP4V2_NLRI_BEST: - break; + if (CHECK_FLAG(path->flags, BGP_PATH_SELECTED)) + return SNMP_INTEGER(1); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_CALC_LOCAL_PREF: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))) + return SNMP_INTEGER(path->attr->local_pref); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_ORIGIN: - break; + switch (path->attr->origin) { + case BGP_ORIGIN_IGP: + return SNMP_INTEGER(1); + case BGP_ORIGIN_EGP: + return SNMP_INTEGER(2); + case BGP_ORIGIN_INCOMPLETE: + return SNMP_INTEGER(3); + default: + return SNMP_INTEGER(0); + } case BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE: - break; + switch (path->attr->mp_nexthop_len) { + case BGP_ATTR_NHLEN_IPV4: + return SNMP_INTEGER(1); + case BGP_ATTR_NHLEN_IPV6_GLOBAL: + return SNMP_INTEGER(2); + case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL: + if (path->attr->mp_nexthop_prefer_global) + return SNMP_INTEGER(2); + else + return SNMP_INTEGER(4); + default: + return SNMP_INTEGER(1); + } case BGP4V2_NLRI_NEXT_HOP_ADDR: + switch (path->attr->mp_nexthop_len) { + case BGP_ATTR_NHLEN_IPV4: + return SNMP_IPADDRESS(path->attr->mp_nexthop_global_in); + case BGP_ATTR_NHLEN_IPV6_GLOBAL: + return SNMP_IP6ADDRESS(path->attr->mp_nexthop_global); + case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL: + if (path->attr->mp_nexthop_prefer_global) + return SNMP_IP6ADDRESS( + path->attr->mp_nexthop_global); + else + return SNMP_IP6ADDRESS( + path->attr->mp_nexthop_local); + default: + return SNMP_IPADDRESS(path->attr->nexthop); + } break; case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE: - break; case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR: + /* Not properly defined in specification what should be here. */ break; case BGP4V2_NLRI_LOCAL_PREF_PRESENT: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))) + return SNMP_INTEGER(1); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_LOCAL_PREF: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))) + return SNMP_INTEGER(path->attr->local_pref); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_MED_PRESENT: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))) + return SNMP_INTEGER(1); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_MED: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))) + return SNMP_INTEGER(path->attr->local_pref); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_ATOMIC_AGGREGATE: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))) + return SNMP_INTEGER(1); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_AGGREGATOR_PRESENT: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR))) + return SNMP_INTEGER(1); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_AGGREGATOR_AS: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR))) + return SNMP_INTEGER(path->attr->aggregator_as); + else + return SNMP_INTEGER(0); case BGP4V2_NLRI_AGGREGATOR_ADDR: - break; + if (CHECK_FLAG(path->attr->flag, + ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR))) + return SNMP_IPADDRESS(path->attr->aggregator_addr); + else + return SNMP_IPADDRESS(bgp_empty_addr); case BGP4V2_NLRI_AS_PATH_CALC_LENGTH: - break; - case BGP4V2_NLRI_AS_PATH_STRING: - break; + return SNMP_INTEGER(path->attr->aspath->segments->length); case BGP4V2_NLRI_AS_PATH: - break; + return aspath_snmp_pathseg(path->attr->aspath, var_len); case BGP4V2_NLRI_PATH_ATTR_UNKNOWN: *var_len = 0; return NULL;