1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* BGP4V2-MIB SNMP support
4 * Copyright (C) 2022 Donatas Abraitis <donatas@opensourcerouting.org>
9 #include <net-snmp/net-snmp-config.h>
10 #include <net-snmp/net-snmp-includes.h>
21 #include "lib/version.h"
23 #include "bgpd/bgpd.h"
24 #include "bgpd/bgp_table.h"
25 #include "bgpd/bgp_aspath.h"
26 #include "bgpd/bgp_attr.h"
27 #include "bgpd/bgp_debug.h"
28 #include "bgpd/bgp_route.h"
29 #include "bgpd/bgp_fsm.h"
30 #include "bgpd/bgp_snmp.h"
31 #include "bgpd/bgp_snmp_bgp4v2.h"
35 static oid bgpv2_oid
[] = {BGP4V2MIB
};
36 static struct in_addr bgp_empty_addr
= {};
38 static struct peer
*peer_lookup_all_vrf(struct ipaddr
*addr
)
42 struct listnode
*node
;
43 struct listnode
*bgpnode
;
45 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, bgpnode
, bgp
)) {
46 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
47 switch (sockunion_family(&peer
->su
)) {
49 if (IPV4_ADDR_SAME(&peer
->su
.sin
.sin_addr
,
54 if (IPV6_ADDR_SAME(&peer
->su
.sin6
.sin6_addr
,
67 static struct peer
*peer_lookup_all_vrf_next(struct ipaddr
*addr
, oid
*offset
,
72 struct peer
*next_peer
= NULL
;
73 struct listnode
*node
;
74 struct listnode
*bgpnode
;
76 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, bgpnode
, bgp
)) {
77 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
78 sa_family_t peer_family
= sockunion_family(&peer
->su
);
80 if (peer_family
!= family
)
83 switch (sockunion_family(&peer
->su
)) {
85 oid2in_addr(offset
, IN_ADDR_SIZE
,
87 if (IPV4_ADDR_CMP(&peer
->su
.sin
.sin_addr
,
88 &addr
->ip
._v4_addr
) < 0 ||
89 IPV4_ADDR_SAME(&peer
->su
.sin
.sin_addr
,
94 IPV4_ADDR_CMP(&next_peer
->su
.sin
.sin_addr
,
95 &peer
->su
.sin
.sin_addr
) > 0)
100 oid2in6_addr(offset
, &addr
->ip
._v6_addr
);
101 if (IPV6_ADDR_CMP(&peer
->su
.sin6
.sin6_addr
,
102 &addr
->ip
._v6_addr
) < 0 ||
103 IPV6_ADDR_SAME(&peer
->su
.sin6
.sin6_addr
,
108 IPV6_ADDR_CMP(&next_peer
->su
.sin6
.sin6_addr
,
109 &peer
->su
.sin6
.sin6_addr
) > 0)
125 static struct peer
*bgpv2PeerTable_lookup(struct variable
*v
, oid name
[],
126 size_t *length
, int exact
,
129 struct peer
*peer
= NULL
;
130 size_t namelen
= v
? v
->namelen
: BGP4V2_PEER_ENTRY_OFFSET
;
131 oid
*offset
= name
+ namelen
;
132 sa_family_t family
= name
[namelen
- 1] == 4 ? AF_INET
: AF_INET6
;
133 int afi_len
= IN_ADDR_SIZE
;
134 size_t offsetlen
= *length
- namelen
;
136 if (family
== AF_INET6
)
137 afi_len
= IN6_ADDR_SIZE
;
139 /* Somehow with net-snmp 5.7.3, every OID item in an array
140 * is uninitialized and has a max random value, let's zero it.
141 * With 5.8, 5.9, it works fine even without this hack.
144 for (int i
= 0; i
< afi_len
; i
++)
149 if (family
== AF_INET
) {
150 oid2in_addr(offset
, afi_len
, &addr
->ip
._v4_addr
);
151 peer
= peer_lookup_all_vrf(addr
);
153 } else if (family
== AF_INET6
) {
154 oid2in6_addr(offset
, &addr
->ip
._v6_addr
);
155 return peer_lookup_all_vrf(addr
);
158 peer
= peer_lookup_all_vrf_next(addr
, offset
, family
);
162 switch (sockunion_family(&peer
->su
)) {
164 oid_copy_in_addr(offset
, &peer
->su
.sin
.sin_addr
);
165 *length
= afi_len
+ namelen
;
168 oid_copy_in6_addr(offset
, &peer
->su
.sin6
.sin6_addr
);
169 *length
= afi_len
+ namelen
;
179 static uint8_t *bgpv2PeerTable(struct variable
*v
, oid name
[], size_t *length
,
180 int exact
, size_t *var_len
,
181 WriteMethod
**write_method
)
184 struct ipaddr addr
= {};
186 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
190 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
195 case BGP4V2_PEER_INSTANCE
:
196 return SNMP_INTEGER(peer
->bgp
->vrf_id
);
197 case BGP4V2_PEER_LOCAL_ADDR_TYPE
:
199 return SNMP_INTEGER(peer
->su_local
->sa
.sa_family
==
204 return SNMP_INTEGER(0);
205 case BGP4V2_PEER_LOCAL_ADDR
:
207 if (peer
->su_local
->sa
.sa_family
== AF_INET
)
208 return SNMP_IPADDRESS(
209 peer
->su_local
->sin
.sin_addr
);
211 return SNMP_IP6ADDRESS(
212 peer
->su_local
->sin6
.sin6_addr
);
214 return SNMP_IPADDRESS(bgp_empty_addr
);
215 case BGP4V2_PEER_REMOTE_ADDR_TYPE
:
217 return SNMP_INTEGER(peer
->su_remote
->sa
.sa_family
==
222 return SNMP_INTEGER(0);
223 case BGP4V2_PEER_REMOTE_ADDR
:
225 if (peer
->su_remote
->sa
.sa_family
== AF_INET
)
226 return SNMP_IPADDRESS(
227 peer
->su_remote
->sin
.sin_addr
);
229 return SNMP_IP6ADDRESS(
230 peer
->su_remote
->sin6
.sin6_addr
);
232 return SNMP_IPADDRESS(bgp_empty_addr
);
233 case BGP4V2_PEER_LOCAL_PORT
:
235 if (peer
->su_local
->sa
.sa_family
== AF_INET
)
237 ntohs(peer
->su_local
->sin
.sin_port
));
240 ntohs(peer
->su_local
->sin6
.sin6_port
));
242 return SNMP_INTEGER(0);
243 case BGP4V2_PEER_LOCAL_AS
:
244 return SNMP_INTEGER(peer
->local_as
);
245 case BGP4V2_PEER_LOCAL_IDENTIFIER
:
246 return SNMP_IPADDRESS(peer
->local_id
);
247 case BGP4V2_PEER_REMOTE_PORT
:
249 if (peer
->su_remote
->sa
.sa_family
== AF_INET
)
251 ntohs(peer
->su_remote
->sin
.sin_port
));
254 ntohs(peer
->su_remote
->sin6
.sin6_port
));
256 return SNMP_INTEGER(0);
257 case BGP4V2_PEER_REMOTE_AS
:
258 return SNMP_INTEGER(peer
->as
);
259 case BGP4V2_PEER_REMOTE_IDENTIFIER
:
260 return SNMP_IPADDRESS(peer
->remote_id
);
261 case BGP4V2_PEER_ADMIN_STATUS
:
262 #define BGP_PEER_ADMIN_STATUS_HALTED 1
263 #define BGP_PEER_ADMIN_STATUS_RUNNING 2
264 if (BGP_PEER_START_SUPPRESSED(peer
))
265 return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_HALTED
);
267 return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_RUNNING
);
268 case BGP4V2_PEER_STATE
:
269 return SNMP_INTEGER(peer
->status
);
270 case BGP4V2_PEER_DESCRIPTION
:
272 return SNMP_STRING(peer
->desc
);
281 static uint8_t *bgpv2PeerErrorsTable(struct variable
*v
, oid name
[],
282 size_t *length
, int exact
, size_t *var_len
,
283 WriteMethod
**write_method
)
286 struct ipaddr addr
= {};
288 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
292 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
297 case BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
:
298 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
299 return SNMP_INTEGER(peer
->notify
.code
);
301 return SNMP_INTEGER(0);
302 case BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
:
303 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
304 return SNMP_INTEGER(peer
->notify
.subcode
);
306 return SNMP_INTEGER(0);
307 case BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
:
308 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
309 return SNMP_INTEGER(peer
->resettime
);
311 return SNMP_INTEGER(0);
312 case BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
:
313 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
314 struct bgp_notify notify
= peer
->notify
;
316 const char *msg_str
= NULL
;
318 if (notify
.code
== BGP_NOTIFY_CEASE
&&
320 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
||
321 notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)) {
322 msg_str
= bgp_notify_admin_message(
323 msg_buf
, sizeof(msg_buf
),
324 (uint8_t *)notify
.data
, notify
.length
);
325 return SNMP_STRING(msg_str
);
328 return SNMP_STRING("");
329 case BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
:
330 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
331 return SNMP_STRING(peer
->notify
.data
);
333 return SNMP_STRING("");
334 case BGP4V2_PEER_LAST_ERROR_CODE_SENT
:
335 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
336 return SNMP_INTEGER(peer
->notify
.code
);
338 return SNMP_INTEGER(0);
339 case BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
:
340 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
341 return SNMP_INTEGER(peer
->notify
.subcode
);
343 return SNMP_INTEGER(0);
344 case BGP4V2_PEER_LAST_ERROR_SENT_TIME
:
345 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
346 return SNMP_INTEGER(peer
->resettime
);
348 return SNMP_INTEGER(0);
349 case BGP4V2_PEER_LAST_ERROR_SENT_TEXT
:
350 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
351 peer
->last_reset
== PEER_DOWN_RTT_SHUTDOWN
||
352 peer
->last_reset
== PEER_DOWN_USER_SHUTDOWN
) {
353 struct bgp_notify notify
= peer
->notify
;
355 const char *msg_str
= NULL
;
357 if (notify
.code
== BGP_NOTIFY_CEASE
&&
359 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
||
360 notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)) {
361 msg_str
= bgp_notify_admin_message(
362 msg_buf
, sizeof(msg_buf
),
363 (uint8_t *)notify
.data
, notify
.length
);
364 return SNMP_STRING(msg_str
);
367 return SNMP_STRING("");
368 case BGP4V2_PEER_LAST_ERROR_SENT_DATA
:
369 if ((peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
370 peer
->last_reset
== PEER_DOWN_RTT_SHUTDOWN
||
371 peer
->last_reset
== PEER_DOWN_USER_SHUTDOWN
) &&
373 return SNMP_STRING(peer
->notify
.data
);
375 return SNMP_STRING("");
383 static uint8_t *bgpv2PeerEventTimesTable(struct variable
*v
, oid name
[],
384 size_t *length
, int exact
,
386 WriteMethod
**write_method
)
389 struct ipaddr addr
= {};
391 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
395 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
400 case BGP4V2_PEER_FSM_ESTABLISHED_TIME
:
402 return SNMP_INTEGER(0);
404 return SNMP_INTEGER(monotime(NULL
) - peer
->uptime
);
405 case BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
:
406 if (!peer
->update_time
)
407 return SNMP_INTEGER(0);
409 return SNMP_INTEGER(monotime(NULL
) - peer
->update_time
);
417 static struct bgp_path_info
*
418 bgp4v2PathAttrLookup(struct variable
*v
, oid name
[], size_t *length
,
419 struct bgp
*bgp
, struct prefix
*addr
, int exact
)
423 struct bgp_path_info
*path
, *min
;
424 struct bgp_dest
*dest
;
427 struct ipaddr paddr
= {};
428 size_t namelen
= v
? v
->namelen
: BGP4V2_NLRI_ENTRY_OFFSET
;
429 sa_family_t family
= name
[namelen
- 1] == 4 ? AF_INET
: AF_INET6
;
431 size_t afi_len
= IN_ADDR_SIZE
;
433 if (family
== AF_INET6
) {
435 afi_len
= IN6_ADDR_SIZE
;
438 #define BGP_NLRI_ENTRY_OFFSET (afi_len + 1 + afi_len)
443 if (*length
- namelen
!= BGP_NLRI_ENTRY_OFFSET
)
446 /* Set OID offset for prefix */
447 offset
= name
+ namelen
;
448 if (family
== AF_INET
)
449 oid2in_addr(offset
, afi_len
, &addr
->u
.prefix4
);
451 oid2in6_addr(offset
, &addr
->u
.prefix6
);
455 addr
->prefixlen
= *offset
;
456 addr
->family
= family
;
460 su
.sin
.sin_family
= family
;
461 if (family
== AF_INET
)
462 oid2in_addr(offset
, afi_len
, &su
.sin
.sin_addr
);
464 oid2in6_addr(offset
, &su
.sin6
.sin6_addr
);
467 dest
= bgp_node_lookup(bgp
->rib
[afi
][SAFI_UNICAST
], addr
);
469 for (path
= bgp_dest_get_bgp_path_info(dest
); path
;
471 if (sockunion_same(&path
->peer
->su
, &su
))
474 bgp_dest_unlock_node(dest
);
480 offset
= name
+ namelen
;
481 offsetlen
= *length
- namelen
;
484 if (offsetlen
== 0) {
485 dest
= bgp_table_top(bgp
->rib
[afi
][SAFI_UNICAST
]);
490 if (family
== AF_INET
)
491 oid2in_addr(offset
, len
, &addr
->u
.prefix4
);
493 oid2in6_addr(offset
, &addr
->u
.prefix6
);
496 offsetlen
-= afi_len
;
499 addr
->prefixlen
= *offset
;
501 addr
->prefixlen
= len
* 8;
503 addr
->family
= family
;
505 dest
= bgp_node_get(bgp
->rib
[afi
][SAFI_UNICAST
], addr
);
516 if (family
== AF_INET
)
517 oid2in_addr(offset
, len
, &paddr
.ip
._v4_addr
);
519 oid2in6_addr(offset
, &paddr
.ip
._v6_addr
);
521 if (family
== AF_INET
)
522 memset(&paddr
.ip
._v4_addr
, 0, afi_len
);
524 memset(&paddr
.ip
._v6_addr
, 0, afi_len
);
533 for (path
= bgp_dest_get_bgp_path_info(dest
); path
;
535 sa_family_t path_family
=
536 sockunion_family(&path
->peer
->su
);
538 if (path_family
== AF_INET
&&
539 IPV4_ADDR_CMP(&paddr
.ip
._v4_addr
,
540 &path
->peer
->su
.sin
.sin_addr
) < 0) {
544 &path
->peer
->su
.sin
.sin_addr
,
545 &min
->peer
->su
.sin
.sin_addr
) < 0))
547 } else if (path_family
== AF_INET6
&&
550 &path
->peer
->su
.sin6
.sin6_addr
) <
555 &path
->peer
->su
.sin6
.sin6_addr
,
556 &min
->peer
->su
.sin6
.sin6_addr
) <
563 const struct prefix
*rn_p
= bgp_dest_get_prefix(dest
);
565 *length
= namelen
+ BGP_NLRI_ENTRY_OFFSET
;
567 offset
= name
+ namelen
;
569 /* Encode prefix into OID */
570 if (family
== AF_INET
)
571 oid_copy_in_addr(offset
, &rn_p
->u
.prefix4
);
573 oid_copy_in6_addr(offset
, &rn_p
->u
.prefix6
);
576 *offset
= rn_p
->prefixlen
;
579 /* Encode peer's IP into OID */
580 if (family
== AF_INET
) {
581 oid_copy_in_addr(offset
,
582 &min
->peer
->su
.sin
.sin_addr
);
583 addr
->u
.prefix4
= rn_p
->u
.prefix4
;
586 offset
, &min
->peer
->su
.sin6
.sin6_addr
);
587 addr
->u
.prefix6
= rn_p
->u
.prefix6
;
590 addr
->prefixlen
= rn_p
->prefixlen
;
591 addr
->family
= rn_p
->family
;
593 bgp_dest_unlock_node(dest
);
598 if (family
== AF_INET
)
599 memset(&paddr
.ip
._v4_addr
, 0, afi_len
);
601 memset(&paddr
.ip
._v6_addr
, 0, afi_len
);
602 } while ((dest
= bgp_route_next(dest
)));
607 static uint8_t *bgp4v2PathAttrTable(struct variable
*v
, oid name
[],
608 size_t *length
, int exact
, size_t *var_len
,
609 WriteMethod
**write_method
)
612 struct bgp_path_info
*path
;
613 struct peer_af
*paf
= NULL
;
614 struct prefix addr
= {};
615 const struct prefix
*prefix
= NULL
;
616 enum bgp_af_index index
;
618 bgp
= bgp_get_default();
622 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
626 path
= bgp4v2PathAttrLookup(v
, name
, length
, bgp
, &addr
, exact
);
630 prefix
= bgp_dest_get_prefix(path
->net
);
633 paf
= path
->peer
->peer_af_array
[index
];
639 case BGP4V2_NLRI_INDEX
:
640 return SNMP_INTEGER(0);
641 case BGP4V2_NLRI_AFI
:
643 return SNMP_INTEGER(paf
->afi
);
645 return SNMP_INTEGER(0);
646 case BGP4V2_NLRI_SAFI
:
648 return SNMP_INTEGER(paf
->safi
);
650 return SNMP_INTEGER(0);
651 case BGP4V2_NLRI_PREFIX_TYPE
:
653 return SNMP_INTEGER(paf
->afi
);
655 return SNMP_INTEGER(0);
656 case BGP4V2_NLRI_PREFIX
:
657 if (prefix
->family
== AF_INET6
)
658 return SNMP_IP6ADDRESS(prefix
->u
.prefix6
);
660 return SNMP_IPADDRESS(prefix
->u
.prefix4
);
661 case BGP4V2_NLRI_PREFIX_LEN
:
662 return SNMP_INTEGER(prefix
->prefixlen
);
663 case BGP4V2_NLRI_BEST
:
664 if (CHECK_FLAG(path
->flags
, BGP_PATH_SELECTED
))
665 return SNMP_INTEGER(1);
667 return SNMP_INTEGER(0);
668 case BGP4V2_NLRI_CALC_LOCAL_PREF
:
669 if (CHECK_FLAG(path
->attr
->flag
,
670 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
671 return SNMP_INTEGER(path
->attr
->local_pref
);
673 return SNMP_INTEGER(0);
674 case BGP4V2_NLRI_ORIGIN
:
675 switch (path
->attr
->origin
) {
677 return SNMP_INTEGER(1);
679 return SNMP_INTEGER(2);
680 case BGP_ORIGIN_INCOMPLETE
:
681 return SNMP_INTEGER(3);
683 return SNMP_INTEGER(0);
685 case BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
:
686 switch (path
->attr
->mp_nexthop_len
) {
687 case BGP_ATTR_NHLEN_IPV4
:
688 return SNMP_INTEGER(1);
689 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
690 return SNMP_INTEGER(2);
691 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
692 if (path
->attr
->mp_nexthop_prefer_global
)
693 return SNMP_INTEGER(2);
695 return SNMP_INTEGER(4);
697 return SNMP_INTEGER(1);
699 case BGP4V2_NLRI_NEXT_HOP_ADDR
:
700 switch (path
->attr
->mp_nexthop_len
) {
701 case BGP_ATTR_NHLEN_IPV4
:
702 return SNMP_IPADDRESS(path
->attr
->mp_nexthop_global_in
);
703 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
704 return SNMP_IP6ADDRESS(path
->attr
->mp_nexthop_global
);
705 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
706 if (path
->attr
->mp_nexthop_prefer_global
)
707 return SNMP_IP6ADDRESS(
708 path
->attr
->mp_nexthop_global
);
710 return SNMP_IP6ADDRESS(
711 path
->attr
->mp_nexthop_local
);
713 return SNMP_IPADDRESS(path
->attr
->nexthop
);
716 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
:
717 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
:
718 /* Not properly defined in specification what should be here. */
720 case BGP4V2_NLRI_LOCAL_PREF_PRESENT
:
721 if (CHECK_FLAG(path
->attr
->flag
,
722 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
723 return SNMP_INTEGER(1);
725 return SNMP_INTEGER(0);
726 case BGP4V2_NLRI_LOCAL_PREF
:
727 if (CHECK_FLAG(path
->attr
->flag
,
728 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
729 return SNMP_INTEGER(path
->attr
->local_pref
);
731 return SNMP_INTEGER(0);
732 case BGP4V2_NLRI_MED_PRESENT
:
733 if (CHECK_FLAG(path
->attr
->flag
,
734 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
735 return SNMP_INTEGER(1);
737 return SNMP_INTEGER(0);
738 case BGP4V2_NLRI_MED
:
739 if (CHECK_FLAG(path
->attr
->flag
,
740 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
741 return SNMP_INTEGER(path
->attr
->med
);
743 return SNMP_INTEGER(0);
744 case BGP4V2_NLRI_ATOMIC_AGGREGATE
:
745 if (CHECK_FLAG(path
->attr
->flag
,
746 ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE
)))
747 return SNMP_INTEGER(1);
749 return SNMP_INTEGER(0);
750 case BGP4V2_NLRI_AGGREGATOR_PRESENT
:
751 if (CHECK_FLAG(path
->attr
->flag
,
752 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
753 return SNMP_INTEGER(1);
755 return SNMP_INTEGER(0);
756 case BGP4V2_NLRI_AGGREGATOR_AS
:
757 if (CHECK_FLAG(path
->attr
->flag
,
758 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
759 return SNMP_INTEGER(path
->attr
->aggregator_as
);
761 return SNMP_INTEGER(0);
762 case BGP4V2_NLRI_AGGREGATOR_ADDR
:
763 if (CHECK_FLAG(path
->attr
->flag
,
764 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
765 return SNMP_IPADDRESS(path
->attr
->aggregator_addr
);
767 return SNMP_IPADDRESS(bgp_empty_addr
);
768 case BGP4V2_NLRI_AS_PATH_CALC_LENGTH
:
769 return SNMP_INTEGER(path
->attr
->aspath
->segments
->length
);
770 case BGP4V2_NLRI_AS_PATH
:
771 return aspath_snmp_pathseg(path
->attr
->aspath
, var_len
);
772 case BGP4V2_NLRI_PATH_ATTR_UNKNOWN
:
779 static struct variable bgpv2_variables
[] = {
780 /* bgp4V2PeerEntry */
781 {BGP4V2_PEER_INSTANCE
,
786 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 1, 4}},
787 {BGP4V2_PEER_INSTANCE
,
792 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 2, 16}},
793 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
798 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 1, 4}},
799 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
804 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 2, 16}},
805 {BGP4V2_PEER_LOCAL_ADDR
,
810 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 1, 4}},
811 {BGP4V2_PEER_LOCAL_ADDR
,
816 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 2, 16}},
817 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
822 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 1, 4}},
823 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
828 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 2, 16}},
829 {BGP4V2_PEER_REMOTE_ADDR
,
834 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 1, 4}},
835 {BGP4V2_PEER_REMOTE_ADDR
,
840 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 2, 16}},
841 {BGP4V2_PEER_LOCAL_PORT
,
846 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 1, 4}},
847 {BGP4V2_PEER_LOCAL_PORT
,
852 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 2, 16}},
853 {BGP4V2_PEER_LOCAL_AS
,
858 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 1, 4}},
859 {BGP4V2_PEER_LOCAL_AS
,
864 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 2, 16}},
865 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
870 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 1, 4}},
871 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
876 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 2, 16}},
877 {BGP4V2_PEER_REMOTE_PORT
,
882 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 1, 4}},
883 {BGP4V2_PEER_REMOTE_PORT
,
888 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 2, 16}},
889 {BGP4V2_PEER_REMOTE_AS
,
894 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 1, 4}},
895 {BGP4V2_PEER_REMOTE_AS
,
900 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 2, 16}},
901 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
906 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 1, 4}},
907 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
912 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 2, 16}},
913 {BGP4V2_PEER_ADMIN_STATUS
,
918 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 1, 4}},
919 {BGP4V2_PEER_ADMIN_STATUS
,
924 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 2, 16}},
930 {1, 2, 1, BGP4V2_PEER_STATE
, 1, 4}},
936 {1, 2, 1, BGP4V2_PEER_STATE
, 2, 16}},
937 {BGP4V2_PEER_DESCRIPTION
,
942 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 1, 4}},
943 {BGP4V2_PEER_DESCRIPTION
,
948 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 2, 16}},
949 /* bgp4V2PeerErrorsEntry */
950 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
953 bgpv2PeerErrorsTable
,
955 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 1, 4}},
956 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
959 bgpv2PeerErrorsTable
,
961 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 2, 16}},
962 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
965 bgpv2PeerErrorsTable
,
967 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 1, 4}},
968 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
971 bgpv2PeerErrorsTable
,
973 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 2, 16}},
974 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
977 bgpv2PeerErrorsTable
,
979 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 1, 4}},
980 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
983 bgpv2PeerErrorsTable
,
985 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 2, 16}},
986 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
989 bgpv2PeerErrorsTable
,
991 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 1, 4}},
992 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
995 bgpv2PeerErrorsTable
,
997 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 2, 16}},
998 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1001 bgpv2PeerErrorsTable
,
1003 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 1, 4}},
1004 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1007 bgpv2PeerErrorsTable
,
1009 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 2, 16}},
1010 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1013 bgpv2PeerErrorsTable
,
1015 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 1, 4}},
1016 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1019 bgpv2PeerErrorsTable
,
1021 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 2, 16}},
1022 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1025 bgpv2PeerErrorsTable
,
1027 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 1, 4}},
1028 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1031 bgpv2PeerErrorsTable
,
1033 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 2, 16}},
1034 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1037 bgpv2PeerErrorsTable
,
1039 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 1, 4}},
1040 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1043 bgpv2PeerErrorsTable
,
1045 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 2, 16}},
1046 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1049 bgpv2PeerErrorsTable
,
1051 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 1, 4}},
1052 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1055 bgpv2PeerErrorsTable
,
1057 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 2, 16}},
1058 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1061 bgpv2PeerErrorsTable
,
1063 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 1, 4}},
1064 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1067 bgpv2PeerErrorsTable
,
1069 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 2, 16}},
1070 /* bgp4V2PeerEventTimesEntry */
1071 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1074 bgpv2PeerEventTimesTable
,
1076 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 1, 4}},
1077 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1080 bgpv2PeerEventTimesTable
,
1082 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 2, 16}},
1083 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1086 bgpv2PeerEventTimesTable
,
1088 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 1, 4}},
1089 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1092 bgpv2PeerEventTimesTable
,
1094 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 2, 16}},
1095 /* bgp4V2NlriTable */
1099 bgp4v2PathAttrTable
,
1101 {1, 9, 1, BGP4V2_NLRI_INDEX
, 1, 4}},
1105 bgp4v2PathAttrTable
,
1107 {1, 9, 1, BGP4V2_NLRI_INDEX
, 2, 16}},
1111 bgp4v2PathAttrTable
,
1113 {1, 9, 1, BGP4V2_NLRI_AFI
, 1, 4}},
1117 bgp4v2PathAttrTable
,
1119 {1, 9, 1, BGP4V2_NLRI_AFI
, 2, 16}},
1123 bgp4v2PathAttrTable
,
1125 {1, 9, 1, BGP4V2_NLRI_SAFI
, 1, 4}},
1129 bgp4v2PathAttrTable
,
1131 {1, 9, 1, BGP4V2_NLRI_SAFI
, 2, 16}},
1132 {BGP4V2_NLRI_PREFIX_TYPE
,
1135 bgp4v2PathAttrTable
,
1137 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 1, 4}},
1138 {BGP4V2_NLRI_PREFIX_TYPE
,
1141 bgp4v2PathAttrTable
,
1143 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 2, 16}},
1144 {BGP4V2_NLRI_PREFIX
,
1147 bgp4v2PathAttrTable
,
1149 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 1, 4}},
1150 {BGP4V2_NLRI_PREFIX
,
1153 bgp4v2PathAttrTable
,
1155 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 2, 16}},
1156 {BGP4V2_NLRI_PREFIX_LEN
,
1159 bgp4v2PathAttrTable
,
1161 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 1, 4}},
1162 {BGP4V2_NLRI_PREFIX_LEN
,
1165 bgp4v2PathAttrTable
,
1167 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 2, 16}},
1171 bgp4v2PathAttrTable
,
1173 {1, 9, 1, BGP4V2_NLRI_BEST
, 1, 4}},
1177 bgp4v2PathAttrTable
,
1179 {1, 9, 1, BGP4V2_NLRI_BEST
, 2, 16}},
1180 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1183 bgp4v2PathAttrTable
,
1185 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 1, 4}},
1186 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1189 bgp4v2PathAttrTable
,
1191 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 2, 16}},
1192 {BGP4V2_NLRI_ORIGIN
,
1195 bgp4v2PathAttrTable
,
1197 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 1, 4}},
1198 {BGP4V2_NLRI_ORIGIN
,
1201 bgp4v2PathAttrTable
,
1203 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 2, 16}},
1204 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1207 bgp4v2PathAttrTable
,
1209 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1210 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1213 bgp4v2PathAttrTable
,
1215 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1216 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1219 bgp4v2PathAttrTable
,
1221 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 1, 4}},
1222 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1225 bgp4v2PathAttrTable
,
1227 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 2, 16}},
1228 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1231 bgp4v2PathAttrTable
,
1233 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1234 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1237 bgp4v2PathAttrTable
,
1239 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1240 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1243 bgp4v2PathAttrTable
,
1245 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 1, 4}},
1246 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1249 bgp4v2PathAttrTable
,
1251 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 2, 16}},
1252 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1255 bgp4v2PathAttrTable
,
1257 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 1, 4}},
1258 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1261 bgp4v2PathAttrTable
,
1263 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 2, 16}},
1264 {BGP4V2_NLRI_LOCAL_PREF
,
1267 bgp4v2PathAttrTable
,
1269 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 1, 4}},
1270 {BGP4V2_NLRI_LOCAL_PREF
,
1273 bgp4v2PathAttrTable
,
1275 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 2, 16}},
1276 {BGP4V2_NLRI_MED_PRESENT
,
1279 bgp4v2PathAttrTable
,
1281 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 1, 4}},
1282 {BGP4V2_NLRI_MED_PRESENT
,
1285 bgp4v2PathAttrTable
,
1287 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 2, 16}},
1291 bgp4v2PathAttrTable
,
1293 {1, 9, 1, BGP4V2_NLRI_MED
, 1, 4}},
1297 bgp4v2PathAttrTable
,
1299 {1, 9, 1, BGP4V2_NLRI_MED
, 2, 16}},
1300 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1303 bgp4v2PathAttrTable
,
1305 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 1, 4}},
1306 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1309 bgp4v2PathAttrTable
,
1311 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 2, 16}},
1312 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1315 bgp4v2PathAttrTable
,
1317 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 1, 4}},
1318 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1321 bgp4v2PathAttrTable
,
1323 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 2, 16}},
1324 {BGP4V2_NLRI_AGGREGATOR_AS
,
1327 bgp4v2PathAttrTable
,
1329 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 1, 4}},
1330 {BGP4V2_NLRI_AGGREGATOR_AS
,
1333 bgp4v2PathAttrTable
,
1335 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 2, 16}},
1336 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1339 bgp4v2PathAttrTable
,
1341 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 1, 4}},
1342 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1345 bgp4v2PathAttrTable
,
1347 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 2, 16}},
1348 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1351 bgp4v2PathAttrTable
,
1353 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 1, 4}},
1354 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1357 bgp4v2PathAttrTable
,
1359 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 2, 16}},
1360 {BGP4V2_NLRI_AS_PATH_STRING
,
1363 bgp4v2PathAttrTable
,
1365 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 1, 4}},
1366 {BGP4V2_NLRI_AS_PATH_STRING
,
1369 bgp4v2PathAttrTable
,
1371 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 2, 16}},
1372 {BGP4V2_NLRI_AS_PATH
,
1375 bgp4v2PathAttrTable
,
1377 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 1, 4}},
1378 {BGP4V2_NLRI_AS_PATH
,
1381 bgp4v2PathAttrTable
,
1383 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 2, 16}},
1384 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1387 bgp4v2PathAttrTable
,
1389 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 1, 4}},
1390 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1393 bgp4v2PathAttrTable
,
1395 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 2, 16}},
1398 int bgp_snmp_bgp4v2_init(struct thread_master
*tm
)
1400 REGISTER_MIB("mibII/bgpv2", bgpv2_variables
, variable
, bgpv2_oid
);