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>
22 #include "bgpd/bgpd.h"
23 #include "bgpd/bgp_table.h"
24 #include "bgpd/bgp_aspath.h"
25 #include "bgpd/bgp_attr.h"
26 #include "bgpd/bgp_debug.h"
27 #include "bgpd/bgp_route.h"
28 #include "bgpd/bgp_fsm.h"
29 #include "bgpd/bgp_snmp.h"
30 #include "bgpd/bgp_snmp_bgp4v2.h"
34 static oid bgpv2_oid
[] = {BGP4V2MIB
};
35 static struct in_addr bgp_empty_addr
= {};
37 static struct peer
*peer_lookup_all_vrf(struct ipaddr
*addr
)
41 struct listnode
*node
;
42 struct listnode
*bgpnode
;
44 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, bgpnode
, bgp
)) {
45 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
46 switch (sockunion_family(&peer
->su
)) {
48 if (IPV4_ADDR_SAME(&peer
->su
.sin
.sin_addr
,
53 if (IPV6_ADDR_SAME(&peer
->su
.sin6
.sin6_addr
,
66 static struct peer
*peer_lookup_all_vrf_next(struct ipaddr
*addr
, oid
*offset
,
71 struct peer
*next_peer
= NULL
;
72 struct listnode
*node
;
73 struct listnode
*bgpnode
;
75 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, bgpnode
, bgp
)) {
76 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
77 sa_family_t peer_family
= sockunion_family(&peer
->su
);
79 if (peer_family
!= family
)
82 switch (sockunion_family(&peer
->su
)) {
84 oid2in_addr(offset
, IN_ADDR_SIZE
,
86 if (IPV4_ADDR_CMP(&peer
->su
.sin
.sin_addr
,
87 &addr
->ip
._v4_addr
) < 0 ||
88 IPV4_ADDR_SAME(&peer
->su
.sin
.sin_addr
,
93 IPV4_ADDR_CMP(&next_peer
->su
.sin
.sin_addr
,
94 &peer
->su
.sin
.sin_addr
) > 0)
99 oid2in6_addr(offset
, &addr
->ip
._v6_addr
);
100 if (IPV6_ADDR_CMP(&peer
->su
.sin6
.sin6_addr
,
101 &addr
->ip
._v6_addr
) < 0 ||
102 IPV6_ADDR_SAME(&peer
->su
.sin6
.sin6_addr
,
107 IPV6_ADDR_CMP(&next_peer
->su
.sin6
.sin6_addr
,
108 &peer
->su
.sin6
.sin6_addr
) > 0)
124 static struct peer
*bgpv2PeerTable_lookup(struct variable
*v
, oid name
[],
125 size_t *length
, int exact
,
128 struct peer
*peer
= NULL
;
129 size_t namelen
= v
? v
->namelen
: BGP4V2_PEER_ENTRY_OFFSET
;
130 oid
*offset
= name
+ namelen
;
131 sa_family_t family
= name
[namelen
- 1] == 4 ? AF_INET
: AF_INET6
;
132 int afi_len
= IN_ADDR_SIZE
;
133 size_t offsetlen
= *length
- namelen
;
135 if (family
== AF_INET6
)
136 afi_len
= IN6_ADDR_SIZE
;
138 /* Somehow with net-snmp 5.7.3, every OID item in an array
139 * is uninitialized and has a max random value, let's zero it.
140 * With 5.8, 5.9, it works fine even without this hack.
143 for (int i
= 0; i
< afi_len
; i
++)
148 if (family
== AF_INET
) {
149 oid2in_addr(offset
, afi_len
, &addr
->ip
._v4_addr
);
150 peer
= peer_lookup_all_vrf(addr
);
152 } else if (family
== AF_INET6
) {
153 oid2in6_addr(offset
, &addr
->ip
._v6_addr
);
154 return peer_lookup_all_vrf(addr
);
157 peer
= peer_lookup_all_vrf_next(addr
, offset
, family
);
161 switch (sockunion_family(&peer
->su
)) {
163 oid_copy_in_addr(offset
, &peer
->su
.sin
.sin_addr
);
164 *length
= afi_len
+ namelen
;
167 oid_copy_in6_addr(offset
, &peer
->su
.sin6
.sin6_addr
);
168 *length
= afi_len
+ namelen
;
178 static uint8_t *bgpv2PeerTable(struct variable
*v
, oid name
[], size_t *length
,
179 int exact
, size_t *var_len
,
180 WriteMethod
**write_method
)
183 struct ipaddr addr
= {};
185 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
189 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
194 case BGP4V2_PEER_INSTANCE
:
195 return SNMP_INTEGER(peer
->bgp
->vrf_id
);
196 case BGP4V2_PEER_LOCAL_ADDR_TYPE
:
198 return SNMP_INTEGER(peer
->su_local
->sa
.sa_family
==
203 return SNMP_INTEGER(0);
204 case BGP4V2_PEER_LOCAL_ADDR
:
206 if (peer
->su_local
->sa
.sa_family
== AF_INET
)
207 return SNMP_IPADDRESS(
208 peer
->su_local
->sin
.sin_addr
);
210 return SNMP_IP6ADDRESS(
211 peer
->su_local
->sin6
.sin6_addr
);
213 return SNMP_IPADDRESS(bgp_empty_addr
);
214 case BGP4V2_PEER_REMOTE_ADDR_TYPE
:
216 return SNMP_INTEGER(peer
->su_remote
->sa
.sa_family
==
221 return SNMP_INTEGER(0);
222 case BGP4V2_PEER_REMOTE_ADDR
:
224 if (peer
->su_remote
->sa
.sa_family
== AF_INET
)
225 return SNMP_IPADDRESS(
226 peer
->su_remote
->sin
.sin_addr
);
228 return SNMP_IP6ADDRESS(
229 peer
->su_remote
->sin6
.sin6_addr
);
231 return SNMP_IPADDRESS(bgp_empty_addr
);
232 case BGP4V2_PEER_LOCAL_PORT
:
234 if (peer
->su_local
->sa
.sa_family
== AF_INET
)
236 ntohs(peer
->su_local
->sin
.sin_port
));
239 ntohs(peer
->su_local
->sin6
.sin6_port
));
241 return SNMP_INTEGER(0);
242 case BGP4V2_PEER_LOCAL_AS
:
243 return SNMP_INTEGER(peer
->local_as
);
244 case BGP4V2_PEER_LOCAL_IDENTIFIER
:
245 return SNMP_IPADDRESS(peer
->local_id
);
246 case BGP4V2_PEER_REMOTE_PORT
:
248 if (peer
->su_remote
->sa
.sa_family
== AF_INET
)
250 ntohs(peer
->su_remote
->sin
.sin_port
));
253 ntohs(peer
->su_remote
->sin6
.sin6_port
));
255 return SNMP_INTEGER(0);
256 case BGP4V2_PEER_REMOTE_AS
:
257 return SNMP_INTEGER(peer
->as
);
258 case BGP4V2_PEER_REMOTE_IDENTIFIER
:
259 return SNMP_IPADDRESS(peer
->remote_id
);
260 case BGP4V2_PEER_ADMIN_STATUS
:
261 #define BGP_PEER_ADMIN_STATUS_HALTED 1
262 #define BGP_PEER_ADMIN_STATUS_RUNNING 2
263 if (BGP_PEER_START_SUPPRESSED(peer
))
264 return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_HALTED
);
266 return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_RUNNING
);
267 case BGP4V2_PEER_STATE
:
268 return SNMP_INTEGER(peer
->status
);
269 case BGP4V2_PEER_DESCRIPTION
:
271 return SNMP_STRING(peer
->desc
);
280 static uint8_t *bgpv2PeerErrorsTable(struct variable
*v
, oid name
[],
281 size_t *length
, int exact
, size_t *var_len
,
282 WriteMethod
**write_method
)
285 struct ipaddr addr
= {};
287 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
291 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
296 case BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
:
297 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
298 return SNMP_INTEGER(peer
->notify
.code
);
300 return SNMP_INTEGER(0);
301 case BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
:
302 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
303 return SNMP_INTEGER(peer
->notify
.subcode
);
305 return SNMP_INTEGER(0);
306 case BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
:
307 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
308 return SNMP_INTEGER(peer
->resettime
);
310 return SNMP_INTEGER(0);
311 case BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
:
312 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
313 struct bgp_notify notify
= peer
->notify
;
315 const char *msg_str
= NULL
;
317 if (notify
.code
== BGP_NOTIFY_CEASE
&&
319 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
||
320 notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)) {
321 msg_str
= bgp_notify_admin_message(
322 msg_buf
, sizeof(msg_buf
),
323 (uint8_t *)notify
.data
, notify
.length
);
324 return SNMP_STRING(msg_str
);
327 return SNMP_STRING("");
328 case BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
:
329 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
330 return SNMP_STRING(peer
->notify
.data
);
332 return SNMP_STRING("");
333 case BGP4V2_PEER_LAST_ERROR_CODE_SENT
:
334 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
335 return SNMP_INTEGER(peer
->notify
.code
);
337 return SNMP_INTEGER(0);
338 case BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
:
339 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
340 return SNMP_INTEGER(peer
->notify
.subcode
);
342 return SNMP_INTEGER(0);
343 case BGP4V2_PEER_LAST_ERROR_SENT_TIME
:
344 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
345 return SNMP_INTEGER(peer
->resettime
);
347 return SNMP_INTEGER(0);
348 case BGP4V2_PEER_LAST_ERROR_SENT_TEXT
:
349 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
350 peer
->last_reset
== PEER_DOWN_RTT_SHUTDOWN
||
351 peer
->last_reset
== PEER_DOWN_USER_SHUTDOWN
) {
352 struct bgp_notify notify
= peer
->notify
;
354 const char *msg_str
= NULL
;
356 if (notify
.code
== BGP_NOTIFY_CEASE
&&
358 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
||
359 notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)) {
360 msg_str
= bgp_notify_admin_message(
361 msg_buf
, sizeof(msg_buf
),
362 (uint8_t *)notify
.data
, notify
.length
);
363 return SNMP_STRING(msg_str
);
366 return SNMP_STRING("");
367 case BGP4V2_PEER_LAST_ERROR_SENT_DATA
:
368 if ((peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
369 peer
->last_reset
== PEER_DOWN_RTT_SHUTDOWN
||
370 peer
->last_reset
== PEER_DOWN_USER_SHUTDOWN
) &&
372 return SNMP_STRING(peer
->notify
.data
);
374 return SNMP_STRING("");
382 static uint8_t *bgpv2PeerEventTimesTable(struct variable
*v
, oid name
[],
383 size_t *length
, int exact
,
385 WriteMethod
**write_method
)
388 struct ipaddr addr
= {};
390 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
394 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
399 case BGP4V2_PEER_FSM_ESTABLISHED_TIME
:
401 return SNMP_INTEGER(0);
403 return SNMP_INTEGER(monotime(NULL
) - peer
->uptime
);
404 case BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
:
405 if (!peer
->update_time
)
406 return SNMP_INTEGER(0);
408 return SNMP_INTEGER(monotime(NULL
) - peer
->update_time
);
416 static struct bgp_path_info
*
417 bgp4v2PathAttrLookup(struct variable
*v
, oid name
[], size_t *length
,
418 struct bgp
*bgp
, struct prefix
*addr
, int exact
)
422 struct bgp_path_info
*path
, *min
;
423 struct bgp_dest
*dest
;
426 struct ipaddr paddr
= {};
427 size_t namelen
= v
? v
->namelen
: BGP4V2_NLRI_ENTRY_OFFSET
;
428 sa_family_t family
= name
[namelen
- 1] == 4 ? AF_INET
: AF_INET6
;
430 size_t afi_len
= IN_ADDR_SIZE
;
432 if (family
== AF_INET6
) {
434 afi_len
= IN6_ADDR_SIZE
;
437 #define BGP_NLRI_ENTRY_OFFSET (afi_len + 1 + afi_len)
442 if (*length
- namelen
!= BGP_NLRI_ENTRY_OFFSET
)
445 /* Set OID offset for prefix */
446 offset
= name
+ namelen
;
447 if (family
== AF_INET
)
448 oid2in_addr(offset
, afi_len
, &addr
->u
.prefix4
);
450 oid2in6_addr(offset
, &addr
->u
.prefix6
);
454 addr
->prefixlen
= *offset
;
455 addr
->family
= family
;
459 su
.sin
.sin_family
= family
;
460 if (family
== AF_INET
)
461 oid2in_addr(offset
, afi_len
, &su
.sin
.sin_addr
);
463 oid2in6_addr(offset
, &su
.sin6
.sin6_addr
);
466 dest
= bgp_node_lookup(bgp
->rib
[afi
][SAFI_UNICAST
], addr
);
468 for (path
= bgp_dest_get_bgp_path_info(dest
); path
;
470 if (sockunion_same(&path
->peer
->su
, &su
))
473 bgp_dest_unlock_node(dest
);
479 offset
= name
+ namelen
;
480 offsetlen
= *length
- namelen
;
483 if (offsetlen
== 0) {
484 dest
= bgp_table_top(bgp
->rib
[afi
][SAFI_UNICAST
]);
489 if (family
== AF_INET
)
490 oid2in_addr(offset
, len
, &addr
->u
.prefix4
);
492 oid2in6_addr(offset
, &addr
->u
.prefix6
);
495 offsetlen
-= afi_len
;
498 addr
->prefixlen
= *offset
;
500 addr
->prefixlen
= len
* 8;
502 addr
->family
= family
;
504 dest
= bgp_node_get(bgp
->rib
[afi
][SAFI_UNICAST
], addr
);
515 if (family
== AF_INET
)
516 oid2in_addr(offset
, len
, &paddr
.ip
._v4_addr
);
518 oid2in6_addr(offset
, &paddr
.ip
._v6_addr
);
520 if (family
== AF_INET
)
521 memset(&paddr
.ip
._v4_addr
, 0, afi_len
);
523 memset(&paddr
.ip
._v6_addr
, 0, afi_len
);
532 for (path
= bgp_dest_get_bgp_path_info(dest
); path
;
534 sa_family_t path_family
=
535 sockunion_family(&path
->peer
->su
);
537 if (path_family
== AF_INET
&&
538 IPV4_ADDR_CMP(&paddr
.ip
._v4_addr
,
539 &path
->peer
->su
.sin
.sin_addr
) < 0) {
543 &path
->peer
->su
.sin
.sin_addr
,
544 &min
->peer
->su
.sin
.sin_addr
) < 0))
546 } else if (path_family
== AF_INET6
&&
549 &path
->peer
->su
.sin6
.sin6_addr
) <
554 &path
->peer
->su
.sin6
.sin6_addr
,
555 &min
->peer
->su
.sin6
.sin6_addr
) <
562 const struct prefix
*rn_p
= bgp_dest_get_prefix(dest
);
564 *length
= namelen
+ BGP_NLRI_ENTRY_OFFSET
;
566 offset
= name
+ namelen
;
568 /* Encode prefix into OID */
569 if (family
== AF_INET
)
570 oid_copy_in_addr(offset
, &rn_p
->u
.prefix4
);
572 oid_copy_in6_addr(offset
, &rn_p
->u
.prefix6
);
575 *offset
= rn_p
->prefixlen
;
578 /* Encode peer's IP into OID */
579 if (family
== AF_INET
) {
580 oid_copy_in_addr(offset
,
581 &min
->peer
->su
.sin
.sin_addr
);
582 addr
->u
.prefix4
= rn_p
->u
.prefix4
;
585 offset
, &min
->peer
->su
.sin6
.sin6_addr
);
586 addr
->u
.prefix6
= rn_p
->u
.prefix6
;
589 addr
->prefixlen
= rn_p
->prefixlen
;
590 addr
->family
= rn_p
->family
;
592 bgp_dest_unlock_node(dest
);
597 if (family
== AF_INET
)
598 memset(&paddr
.ip
._v4_addr
, 0, afi_len
);
600 memset(&paddr
.ip
._v6_addr
, 0, afi_len
);
601 } while ((dest
= bgp_route_next(dest
)));
606 static uint8_t *bgp4v2PathAttrTable(struct variable
*v
, oid name
[],
607 size_t *length
, int exact
, size_t *var_len
,
608 WriteMethod
**write_method
)
611 struct bgp_path_info
*path
;
612 struct peer_af
*paf
= NULL
;
613 struct prefix addr
= {};
614 const struct prefix
*prefix
= NULL
;
615 enum bgp_af_index index
;
617 bgp
= bgp_get_default();
621 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
625 path
= bgp4v2PathAttrLookup(v
, name
, length
, bgp
, &addr
, exact
);
629 prefix
= bgp_dest_get_prefix(path
->net
);
632 paf
= path
->peer
->peer_af_array
[index
];
638 case BGP4V2_NLRI_INDEX
:
639 return SNMP_INTEGER(0);
640 case BGP4V2_NLRI_AFI
:
642 return SNMP_INTEGER(paf
->afi
);
644 return SNMP_INTEGER(0);
645 case BGP4V2_NLRI_SAFI
:
647 return SNMP_INTEGER(paf
->safi
);
649 return SNMP_INTEGER(0);
650 case BGP4V2_NLRI_PREFIX_TYPE
:
652 return SNMP_INTEGER(paf
->afi
);
654 return SNMP_INTEGER(0);
655 case BGP4V2_NLRI_PREFIX
:
656 if (prefix
->family
== AF_INET6
)
657 return SNMP_IP6ADDRESS(prefix
->u
.prefix6
);
659 return SNMP_IPADDRESS(prefix
->u
.prefix4
);
660 case BGP4V2_NLRI_PREFIX_LEN
:
661 return SNMP_INTEGER(prefix
->prefixlen
);
662 case BGP4V2_NLRI_BEST
:
663 if (CHECK_FLAG(path
->flags
, BGP_PATH_SELECTED
))
664 return SNMP_INTEGER(1);
666 return SNMP_INTEGER(0);
667 case BGP4V2_NLRI_CALC_LOCAL_PREF
:
668 if (CHECK_FLAG(path
->attr
->flag
,
669 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
670 return SNMP_INTEGER(path
->attr
->local_pref
);
672 return SNMP_INTEGER(0);
673 case BGP4V2_NLRI_ORIGIN
:
674 switch (path
->attr
->origin
) {
676 return SNMP_INTEGER(1);
678 return SNMP_INTEGER(2);
679 case BGP_ORIGIN_INCOMPLETE
:
680 return SNMP_INTEGER(3);
682 return SNMP_INTEGER(0);
684 case BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
:
685 switch (path
->attr
->mp_nexthop_len
) {
686 case BGP_ATTR_NHLEN_IPV4
:
687 return SNMP_INTEGER(1);
688 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
689 return SNMP_INTEGER(2);
690 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
691 if (path
->attr
->mp_nexthop_prefer_global
)
692 return SNMP_INTEGER(2);
694 return SNMP_INTEGER(4);
696 return SNMP_INTEGER(1);
698 case BGP4V2_NLRI_NEXT_HOP_ADDR
:
699 switch (path
->attr
->mp_nexthop_len
) {
700 case BGP_ATTR_NHLEN_IPV4
:
701 return SNMP_IPADDRESS(path
->attr
->mp_nexthop_global_in
);
702 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
703 return SNMP_IP6ADDRESS(path
->attr
->mp_nexthop_global
);
704 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
705 if (path
->attr
->mp_nexthop_prefer_global
)
706 return SNMP_IP6ADDRESS(
707 path
->attr
->mp_nexthop_global
);
709 return SNMP_IP6ADDRESS(
710 path
->attr
->mp_nexthop_local
);
712 return SNMP_IPADDRESS(path
->attr
->nexthop
);
715 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
:
716 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
:
717 /* Not properly defined in specification what should be here. */
719 case BGP4V2_NLRI_LOCAL_PREF_PRESENT
:
720 if (CHECK_FLAG(path
->attr
->flag
,
721 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
722 return SNMP_INTEGER(1);
724 return SNMP_INTEGER(0);
725 case BGP4V2_NLRI_LOCAL_PREF
:
726 if (CHECK_FLAG(path
->attr
->flag
,
727 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
728 return SNMP_INTEGER(path
->attr
->local_pref
);
730 return SNMP_INTEGER(0);
731 case BGP4V2_NLRI_MED_PRESENT
:
732 if (CHECK_FLAG(path
->attr
->flag
,
733 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
734 return SNMP_INTEGER(1);
736 return SNMP_INTEGER(0);
737 case BGP4V2_NLRI_MED
:
738 if (CHECK_FLAG(path
->attr
->flag
,
739 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
740 return SNMP_INTEGER(path
->attr
->med
);
742 return SNMP_INTEGER(0);
743 case BGP4V2_NLRI_ATOMIC_AGGREGATE
:
744 if (CHECK_FLAG(path
->attr
->flag
,
745 ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE
)))
746 return SNMP_INTEGER(1);
748 return SNMP_INTEGER(0);
749 case BGP4V2_NLRI_AGGREGATOR_PRESENT
:
750 if (CHECK_FLAG(path
->attr
->flag
,
751 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
752 return SNMP_INTEGER(1);
754 return SNMP_INTEGER(0);
755 case BGP4V2_NLRI_AGGREGATOR_AS
:
756 if (CHECK_FLAG(path
->attr
->flag
,
757 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
758 return SNMP_INTEGER(path
->attr
->aggregator_as
);
760 return SNMP_INTEGER(0);
761 case BGP4V2_NLRI_AGGREGATOR_ADDR
:
762 if (CHECK_FLAG(path
->attr
->flag
,
763 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
764 return SNMP_IPADDRESS(path
->attr
->aggregator_addr
);
766 return SNMP_IPADDRESS(bgp_empty_addr
);
767 case BGP4V2_NLRI_AS_PATH_CALC_LENGTH
:
768 return SNMP_INTEGER(path
->attr
->aspath
->segments
->length
);
769 case BGP4V2_NLRI_AS_PATH
:
770 return aspath_snmp_pathseg(path
->attr
->aspath
, var_len
);
771 case BGP4V2_NLRI_PATH_ATTR_UNKNOWN
:
778 static struct variable bgpv2_variables
[] = {
779 /* bgp4V2PeerEntry */
780 {BGP4V2_PEER_INSTANCE
,
785 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 1, 4}},
786 {BGP4V2_PEER_INSTANCE
,
791 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 2, 16}},
792 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
797 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 1, 4}},
798 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
803 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 2, 16}},
804 {BGP4V2_PEER_LOCAL_ADDR
,
809 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 1, 4}},
810 {BGP4V2_PEER_LOCAL_ADDR
,
815 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 2, 16}},
816 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
821 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 1, 4}},
822 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
827 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 2, 16}},
828 {BGP4V2_PEER_REMOTE_ADDR
,
833 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 1, 4}},
834 {BGP4V2_PEER_REMOTE_ADDR
,
839 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 2, 16}},
840 {BGP4V2_PEER_LOCAL_PORT
,
845 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 1, 4}},
846 {BGP4V2_PEER_LOCAL_PORT
,
851 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 2, 16}},
852 {BGP4V2_PEER_LOCAL_AS
,
857 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 1, 4}},
858 {BGP4V2_PEER_LOCAL_AS
,
863 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 2, 16}},
864 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
869 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 1, 4}},
870 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
875 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 2, 16}},
876 {BGP4V2_PEER_REMOTE_PORT
,
881 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 1, 4}},
882 {BGP4V2_PEER_REMOTE_PORT
,
887 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 2, 16}},
888 {BGP4V2_PEER_REMOTE_AS
,
893 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 1, 4}},
894 {BGP4V2_PEER_REMOTE_AS
,
899 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 2, 16}},
900 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
905 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 1, 4}},
906 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
911 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 2, 16}},
912 {BGP4V2_PEER_ADMIN_STATUS
,
917 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 1, 4}},
918 {BGP4V2_PEER_ADMIN_STATUS
,
923 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 2, 16}},
929 {1, 2, 1, BGP4V2_PEER_STATE
, 1, 4}},
935 {1, 2, 1, BGP4V2_PEER_STATE
, 2, 16}},
936 {BGP4V2_PEER_DESCRIPTION
,
941 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 1, 4}},
942 {BGP4V2_PEER_DESCRIPTION
,
947 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 2, 16}},
948 /* bgp4V2PeerErrorsEntry */
949 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
952 bgpv2PeerErrorsTable
,
954 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 1, 4}},
955 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
958 bgpv2PeerErrorsTable
,
960 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 2, 16}},
961 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
964 bgpv2PeerErrorsTable
,
966 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 1, 4}},
967 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
970 bgpv2PeerErrorsTable
,
972 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 2, 16}},
973 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
976 bgpv2PeerErrorsTable
,
978 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 1, 4}},
979 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
982 bgpv2PeerErrorsTable
,
984 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 2, 16}},
985 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
988 bgpv2PeerErrorsTable
,
990 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 1, 4}},
991 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
994 bgpv2PeerErrorsTable
,
996 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 2, 16}},
997 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1000 bgpv2PeerErrorsTable
,
1002 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 1, 4}},
1003 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1006 bgpv2PeerErrorsTable
,
1008 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 2, 16}},
1009 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1012 bgpv2PeerErrorsTable
,
1014 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 1, 4}},
1015 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1018 bgpv2PeerErrorsTable
,
1020 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 2, 16}},
1021 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1024 bgpv2PeerErrorsTable
,
1026 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 1, 4}},
1027 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1030 bgpv2PeerErrorsTable
,
1032 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 2, 16}},
1033 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1036 bgpv2PeerErrorsTable
,
1038 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 1, 4}},
1039 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1042 bgpv2PeerErrorsTable
,
1044 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 2, 16}},
1045 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1048 bgpv2PeerErrorsTable
,
1050 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 1, 4}},
1051 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1054 bgpv2PeerErrorsTable
,
1056 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 2, 16}},
1057 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1060 bgpv2PeerErrorsTable
,
1062 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 1, 4}},
1063 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1066 bgpv2PeerErrorsTable
,
1068 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 2, 16}},
1069 /* bgp4V2PeerEventTimesEntry */
1070 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1073 bgpv2PeerEventTimesTable
,
1075 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 1, 4}},
1076 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1079 bgpv2PeerEventTimesTable
,
1081 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 2, 16}},
1082 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1085 bgpv2PeerEventTimesTable
,
1087 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 1, 4}},
1088 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1091 bgpv2PeerEventTimesTable
,
1093 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 2, 16}},
1094 /* bgp4V2NlriTable */
1098 bgp4v2PathAttrTable
,
1100 {1, 9, 1, BGP4V2_NLRI_INDEX
, 1, 4}},
1104 bgp4v2PathAttrTable
,
1106 {1, 9, 1, BGP4V2_NLRI_INDEX
, 2, 16}},
1110 bgp4v2PathAttrTable
,
1112 {1, 9, 1, BGP4V2_NLRI_AFI
, 1, 4}},
1116 bgp4v2PathAttrTable
,
1118 {1, 9, 1, BGP4V2_NLRI_AFI
, 2, 16}},
1122 bgp4v2PathAttrTable
,
1124 {1, 9, 1, BGP4V2_NLRI_SAFI
, 1, 4}},
1128 bgp4v2PathAttrTable
,
1130 {1, 9, 1, BGP4V2_NLRI_SAFI
, 2, 16}},
1131 {BGP4V2_NLRI_PREFIX_TYPE
,
1134 bgp4v2PathAttrTable
,
1136 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 1, 4}},
1137 {BGP4V2_NLRI_PREFIX_TYPE
,
1140 bgp4v2PathAttrTable
,
1142 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 2, 16}},
1143 {BGP4V2_NLRI_PREFIX
,
1146 bgp4v2PathAttrTable
,
1148 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 1, 4}},
1149 {BGP4V2_NLRI_PREFIX
,
1152 bgp4v2PathAttrTable
,
1154 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 2, 16}},
1155 {BGP4V2_NLRI_PREFIX_LEN
,
1158 bgp4v2PathAttrTable
,
1160 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 1, 4}},
1161 {BGP4V2_NLRI_PREFIX_LEN
,
1164 bgp4v2PathAttrTable
,
1166 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 2, 16}},
1170 bgp4v2PathAttrTable
,
1172 {1, 9, 1, BGP4V2_NLRI_BEST
, 1, 4}},
1176 bgp4v2PathAttrTable
,
1178 {1, 9, 1, BGP4V2_NLRI_BEST
, 2, 16}},
1179 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1182 bgp4v2PathAttrTable
,
1184 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 1, 4}},
1185 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1188 bgp4v2PathAttrTable
,
1190 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 2, 16}},
1191 {BGP4V2_NLRI_ORIGIN
,
1194 bgp4v2PathAttrTable
,
1196 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 1, 4}},
1197 {BGP4V2_NLRI_ORIGIN
,
1200 bgp4v2PathAttrTable
,
1202 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 2, 16}},
1203 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1206 bgp4v2PathAttrTable
,
1208 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1209 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1212 bgp4v2PathAttrTable
,
1214 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1215 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1218 bgp4v2PathAttrTable
,
1220 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 1, 4}},
1221 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1224 bgp4v2PathAttrTable
,
1226 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 2, 16}},
1227 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1230 bgp4v2PathAttrTable
,
1232 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1233 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1236 bgp4v2PathAttrTable
,
1238 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1239 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1242 bgp4v2PathAttrTable
,
1244 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 1, 4}},
1245 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1248 bgp4v2PathAttrTable
,
1250 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 2, 16}},
1251 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1254 bgp4v2PathAttrTable
,
1256 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 1, 4}},
1257 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1260 bgp4v2PathAttrTable
,
1262 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 2, 16}},
1263 {BGP4V2_NLRI_LOCAL_PREF
,
1266 bgp4v2PathAttrTable
,
1268 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 1, 4}},
1269 {BGP4V2_NLRI_LOCAL_PREF
,
1272 bgp4v2PathAttrTable
,
1274 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 2, 16}},
1275 {BGP4V2_NLRI_MED_PRESENT
,
1278 bgp4v2PathAttrTable
,
1280 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 1, 4}},
1281 {BGP4V2_NLRI_MED_PRESENT
,
1284 bgp4v2PathAttrTable
,
1286 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 2, 16}},
1290 bgp4v2PathAttrTable
,
1292 {1, 9, 1, BGP4V2_NLRI_MED
, 1, 4}},
1296 bgp4v2PathAttrTable
,
1298 {1, 9, 1, BGP4V2_NLRI_MED
, 2, 16}},
1299 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1302 bgp4v2PathAttrTable
,
1304 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 1, 4}},
1305 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1308 bgp4v2PathAttrTable
,
1310 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 2, 16}},
1311 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1314 bgp4v2PathAttrTable
,
1316 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 1, 4}},
1317 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1320 bgp4v2PathAttrTable
,
1322 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 2, 16}},
1323 {BGP4V2_NLRI_AGGREGATOR_AS
,
1326 bgp4v2PathAttrTable
,
1328 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 1, 4}},
1329 {BGP4V2_NLRI_AGGREGATOR_AS
,
1332 bgp4v2PathAttrTable
,
1334 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 2, 16}},
1335 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1338 bgp4v2PathAttrTable
,
1340 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 1, 4}},
1341 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1344 bgp4v2PathAttrTable
,
1346 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 2, 16}},
1347 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1350 bgp4v2PathAttrTable
,
1352 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 1, 4}},
1353 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1356 bgp4v2PathAttrTable
,
1358 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 2, 16}},
1359 {BGP4V2_NLRI_AS_PATH_STRING
,
1362 bgp4v2PathAttrTable
,
1364 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 1, 4}},
1365 {BGP4V2_NLRI_AS_PATH_STRING
,
1368 bgp4v2PathAttrTable
,
1370 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 2, 16}},
1371 {BGP4V2_NLRI_AS_PATH
,
1374 bgp4v2PathAttrTable
,
1376 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 1, 4}},
1377 {BGP4V2_NLRI_AS_PATH
,
1380 bgp4v2PathAttrTable
,
1382 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 2, 16}},
1383 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1386 bgp4v2PathAttrTable
,
1388 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 1, 4}},
1389 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1392 bgp4v2PathAttrTable
,
1394 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 2, 16}},
1397 int bgp_snmp_bgp4v2_init(struct event_loop
*tm
)
1399 REGISTER_MIB("mibII/bgpv2", bgpv2_variables
, variable
, bgpv2_oid
);