1 /* BGP4V2-MIB SNMP support
3 * Copyright (C) 2022 Donatas Abraitis <donatas@opensourcerouting.org>
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 #include <net-snmp/net-snmp-config.h>
25 #include <net-snmp/net-snmp-includes.h>
36 #include "lib/version.h"
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_table.h"
40 #include "bgpd/bgp_aspath.h"
41 #include "bgpd/bgp_attr.h"
42 #include "bgpd/bgp_debug.h"
43 #include "bgpd/bgp_route.h"
44 #include "bgpd/bgp_fsm.h"
45 #include "bgpd/bgp_snmp.h"
46 #include "bgpd/bgp_snmp_bgp4v2.h"
50 static oid bgpv2_oid
[] = {BGP4V2MIB
};
51 static struct in_addr bgp_empty_addr
= {};
53 static struct peer
*peer_lookup_all_vrf(struct ipaddr
*addr
)
57 struct listnode
*node
;
58 struct listnode
*bgpnode
;
60 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, bgpnode
, bgp
)) {
61 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
62 switch (sockunion_family(&peer
->su
)) {
64 if (IPV4_ADDR_SAME(&peer
->su
.sin
.sin_addr
,
69 if (IPV6_ADDR_SAME(&peer
->su
.sin6
.sin6_addr
,
82 static struct peer
*peer_lookup_all_vrf_next(struct ipaddr
*addr
, oid
*offset
,
87 struct peer
*next_peer
= NULL
;
88 struct listnode
*node
;
89 struct listnode
*bgpnode
;
91 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, bgpnode
, bgp
)) {
92 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
93 sa_family_t peer_family
= sockunion_family(&peer
->su
);
95 if (peer_family
!= family
)
98 switch (sockunion_family(&peer
->su
)) {
100 oid2in_addr(offset
, IN_ADDR_SIZE
,
102 if (IPV4_ADDR_CMP(&peer
->su
.sin
.sin_addr
,
103 &addr
->ip
._v4_addr
) < 0 ||
104 IPV4_ADDR_SAME(&peer
->su
.sin
.sin_addr
,
109 IPV4_ADDR_CMP(&next_peer
->su
.sin
.sin_addr
,
110 &peer
->su
.sin
.sin_addr
) > 0)
115 oid2in6_addr(offset
, &addr
->ip
._v6_addr
);
116 if (IPV6_ADDR_CMP(&peer
->su
.sin6
.sin6_addr
,
117 &addr
->ip
._v6_addr
) < 0 ||
118 IPV6_ADDR_SAME(&peer
->su
.sin6
.sin6_addr
,
123 IPV6_ADDR_CMP(&next_peer
->su
.sin6
.sin6_addr
,
124 &peer
->su
.sin6
.sin6_addr
) > 0)
140 static struct peer
*bgpv2PeerTable_lookup(struct variable
*v
, oid name
[],
141 size_t *length
, int exact
,
144 struct peer
*peer
= NULL
;
145 size_t namelen
= v
? v
->namelen
: BGP4V2_PEER_ENTRY_OFFSET
;
146 oid
*offset
= name
+ namelen
;
147 sa_family_t family
= name
[namelen
- 1] == 4 ? AF_INET
: AF_INET6
;
148 int afi_len
= IN_ADDR_SIZE
;
149 size_t offsetlen
= *length
- namelen
;
151 if (family
== AF_INET6
)
152 afi_len
= IN6_ADDR_SIZE
;
154 /* Somehow with net-snmp 5.7.3, every OID item in an array
155 * is uninitialized and has a max random value, let's zero it.
156 * With 5.8, 5.9, it works fine even without this hack.
159 for (int i
= 0; i
< afi_len
; i
++)
164 if (family
== AF_INET
) {
165 oid2in_addr(offset
, afi_len
, &addr
->ip
._v4_addr
);
166 peer
= peer_lookup_all_vrf(addr
);
168 } else if (family
== AF_INET6
) {
169 oid2in6_addr(offset
, &addr
->ip
._v6_addr
);
170 return peer_lookup_all_vrf(addr
);
173 peer
= peer_lookup_all_vrf_next(addr
, offset
, family
);
177 switch (sockunion_family(&peer
->su
)) {
179 oid_copy_in_addr(offset
, &peer
->su
.sin
.sin_addr
);
180 *length
= afi_len
+ namelen
;
183 oid_copy_in6_addr(offset
, &peer
->su
.sin6
.sin6_addr
);
184 *length
= afi_len
+ namelen
;
194 static uint8_t *bgpv2PeerTable(struct variable
*v
, oid name
[], size_t *length
,
195 int exact
, size_t *var_len
,
196 WriteMethod
**write_method
)
199 struct ipaddr addr
= {};
201 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
205 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
210 case BGP4V2_PEER_INSTANCE
:
211 return SNMP_INTEGER(peer
->bgp
->vrf_id
);
212 case BGP4V2_PEER_LOCAL_ADDR_TYPE
:
214 return SNMP_INTEGER(peer
->su_local
->sa
.sa_family
==
219 return SNMP_INTEGER(0);
220 case BGP4V2_PEER_LOCAL_ADDR
:
222 if (peer
->su_local
->sa
.sa_family
== AF_INET
)
223 return SNMP_IPADDRESS(
224 peer
->su_local
->sin
.sin_addr
);
226 return SNMP_IP6ADDRESS(
227 peer
->su_local
->sin6
.sin6_addr
);
229 return SNMP_IPADDRESS(bgp_empty_addr
);
230 case BGP4V2_PEER_REMOTE_ADDR_TYPE
:
232 return SNMP_INTEGER(peer
->su_remote
->sa
.sa_family
==
237 return SNMP_INTEGER(0);
238 case BGP4V2_PEER_REMOTE_ADDR
:
240 if (peer
->su_remote
->sa
.sa_family
== AF_INET
)
241 return SNMP_IPADDRESS(
242 peer
->su_remote
->sin
.sin_addr
);
244 return SNMP_IP6ADDRESS(
245 peer
->su_remote
->sin6
.sin6_addr
);
247 return SNMP_IPADDRESS(bgp_empty_addr
);
248 case BGP4V2_PEER_LOCAL_PORT
:
250 if (peer
->su_local
->sa
.sa_family
== AF_INET
)
252 ntohs(peer
->su_local
->sin
.sin_port
));
255 ntohs(peer
->su_local
->sin6
.sin6_port
));
257 return SNMP_INTEGER(0);
258 case BGP4V2_PEER_LOCAL_AS
:
259 return SNMP_INTEGER(peer
->local_as
);
260 case BGP4V2_PEER_LOCAL_IDENTIFIER
:
261 return SNMP_IPADDRESS(peer
->local_id
);
262 case BGP4V2_PEER_REMOTE_PORT
:
264 if (peer
->su_remote
->sa
.sa_family
== AF_INET
)
266 ntohs(peer
->su_remote
->sin
.sin_port
));
269 ntohs(peer
->su_remote
->sin6
.sin6_port
));
271 return SNMP_INTEGER(0);
272 case BGP4V2_PEER_REMOTE_AS
:
273 return SNMP_INTEGER(peer
->as
);
274 case BGP4V2_PEER_REMOTE_IDENTIFIER
:
275 return SNMP_IPADDRESS(peer
->remote_id
);
276 case BGP4V2_PEER_ADMIN_STATUS
:
277 #define BGP_PEER_ADMIN_STATUS_HALTED 1
278 #define BGP_PEER_ADMIN_STATUS_RUNNING 2
279 if (BGP_PEER_START_SUPPRESSED(peer
))
280 return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_HALTED
);
282 return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_RUNNING
);
283 case BGP4V2_PEER_STATE
:
284 return SNMP_INTEGER(peer
->status
);
285 case BGP4V2_PEER_DESCRIPTION
:
287 return SNMP_STRING(peer
->desc
);
296 static uint8_t *bgpv2PeerErrorsTable(struct variable
*v
, oid name
[],
297 size_t *length
, int exact
, size_t *var_len
,
298 WriteMethod
**write_method
)
301 struct ipaddr addr
= {};
303 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
307 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
312 case BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
:
313 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
314 return SNMP_INTEGER(peer
->notify
.code
);
316 return SNMP_INTEGER(0);
317 case BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
:
318 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
319 return SNMP_INTEGER(peer
->notify
.subcode
);
321 return SNMP_INTEGER(0);
322 case BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
:
323 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
324 return SNMP_INTEGER(peer
->resettime
);
326 return SNMP_INTEGER(0);
327 case BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
:
328 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
329 struct bgp_notify notify
= peer
->notify
;
331 const char *msg_str
= NULL
;
333 if (notify
.code
== BGP_NOTIFY_CEASE
&&
335 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
||
336 notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)) {
337 msg_str
= bgp_notify_admin_message(
338 msg_buf
, sizeof(msg_buf
),
339 (uint8_t *)notify
.data
, notify
.length
);
340 return SNMP_STRING(msg_str
);
343 return SNMP_STRING("");
344 case BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
:
345 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
346 return SNMP_STRING(peer
->notify
.data
);
348 return SNMP_STRING("");
349 case BGP4V2_PEER_LAST_ERROR_CODE_SENT
:
350 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
351 return SNMP_INTEGER(peer
->notify
.code
);
353 return SNMP_INTEGER(0);
354 case BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
:
355 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
356 return SNMP_INTEGER(peer
->notify
.subcode
);
358 return SNMP_INTEGER(0);
359 case BGP4V2_PEER_LAST_ERROR_SENT_TIME
:
360 if (peer
->last_reset
!= PEER_DOWN_NOTIFY_RECEIVED
)
361 return SNMP_INTEGER(peer
->resettime
);
363 return SNMP_INTEGER(0);
364 case BGP4V2_PEER_LAST_ERROR_SENT_TEXT
:
365 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
366 peer
->last_reset
== PEER_DOWN_RTT_SHUTDOWN
||
367 peer
->last_reset
== PEER_DOWN_USER_SHUTDOWN
) {
368 struct bgp_notify notify
= peer
->notify
;
370 const char *msg_str
= NULL
;
372 if (notify
.code
== BGP_NOTIFY_CEASE
&&
374 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
||
375 notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)) {
376 msg_str
= bgp_notify_admin_message(
377 msg_buf
, sizeof(msg_buf
),
378 (uint8_t *)notify
.data
, notify
.length
);
379 return SNMP_STRING(msg_str
);
382 return SNMP_STRING("");
383 case BGP4V2_PEER_LAST_ERROR_SENT_DATA
:
384 if ((peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
385 peer
->last_reset
== PEER_DOWN_RTT_SHUTDOWN
||
386 peer
->last_reset
== PEER_DOWN_USER_SHUTDOWN
) &&
388 return SNMP_STRING(peer
->notify
.data
);
390 return SNMP_STRING("");
398 static uint8_t *bgpv2PeerEventTimesTable(struct variable
*v
, oid name
[],
399 size_t *length
, int exact
,
401 WriteMethod
**write_method
)
404 struct ipaddr addr
= {};
406 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
410 peer
= bgpv2PeerTable_lookup(v
, name
, length
, exact
, &addr
);
415 case BGP4V2_PEER_FSM_ESTABLISHED_TIME
:
417 return SNMP_INTEGER(0);
419 return SNMP_INTEGER(monotime(NULL
) - peer
->uptime
);
420 case BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
:
421 if (!peer
->update_time
)
422 return SNMP_INTEGER(0);
424 return SNMP_INTEGER(monotime(NULL
) - peer
->update_time
);
432 static struct bgp_path_info
*
433 bgp4v2PathAttrLookup(struct variable
*v
, oid name
[], size_t *length
,
434 struct bgp
*bgp
, struct prefix
*addr
, int exact
)
438 struct bgp_path_info
*path
, *min
;
439 struct bgp_dest
*dest
;
442 struct ipaddr paddr
= {};
443 size_t namelen
= v
? v
->namelen
: BGP4V2_NLRI_ENTRY_OFFSET
;
444 sa_family_t family
= name
[namelen
- 1] == 4 ? AF_INET
: AF_INET6
;
446 size_t afi_len
= IN_ADDR_SIZE
;
448 if (family
== AF_INET6
) {
450 afi_len
= IN6_ADDR_SIZE
;
453 #define BGP_NLRI_ENTRY_OFFSET (afi_len + 1 + afi_len)
458 if (*length
- namelen
!= BGP_NLRI_ENTRY_OFFSET
)
461 /* Set OID offset for prefix */
462 offset
= name
+ namelen
;
463 if (family
== AF_INET
)
464 oid2in_addr(offset
, afi_len
, &addr
->u
.prefix4
);
466 oid2in6_addr(offset
, &addr
->u
.prefix6
);
470 addr
->prefixlen
= *offset
;
471 addr
->family
= family
;
475 su
.sin
.sin_family
= family
;
476 if (family
== AF_INET
)
477 oid2in_addr(offset
, afi_len
, &su
.sin
.sin_addr
);
479 oid2in6_addr(offset
, &su
.sin6
.sin6_addr
);
482 dest
= bgp_node_lookup(bgp
->rib
[afi
][SAFI_UNICAST
], addr
);
484 for (path
= bgp_dest_get_bgp_path_info(dest
); path
;
486 if (sockunion_same(&path
->peer
->su
, &su
))
489 bgp_dest_unlock_node(dest
);
495 offset
= name
+ namelen
;
496 offsetlen
= *length
- namelen
;
499 if (offsetlen
== 0) {
500 dest
= bgp_table_top(bgp
->rib
[afi
][SAFI_UNICAST
]);
505 if (family
== AF_INET
)
506 oid2in_addr(offset
, len
, &addr
->u
.prefix4
);
508 oid2in6_addr(offset
, &addr
->u
.prefix6
);
511 offsetlen
-= afi_len
;
514 addr
->prefixlen
= *offset
;
516 addr
->prefixlen
= len
* 8;
518 addr
->family
= family
;
520 dest
= bgp_node_get(bgp
->rib
[afi
][SAFI_UNICAST
], addr
);
531 if (family
== AF_INET
)
532 oid2in_addr(offset
, len
, &paddr
.ip
._v4_addr
);
534 oid2in6_addr(offset
, &paddr
.ip
._v6_addr
);
536 if (family
== AF_INET
)
537 memset(&paddr
.ip
._v4_addr
, 0, afi_len
);
539 memset(&paddr
.ip
._v6_addr
, 0, afi_len
);
548 for (path
= bgp_dest_get_bgp_path_info(dest
); path
;
550 sa_family_t path_family
=
551 sockunion_family(&path
->peer
->su
);
553 if (path_family
== AF_INET
&&
554 IPV4_ADDR_CMP(&paddr
.ip
._v4_addr
,
555 &path
->peer
->su
.sin
.sin_addr
) < 0) {
559 &path
->peer
->su
.sin
.sin_addr
,
560 &min
->peer
->su
.sin
.sin_addr
) < 0))
562 } else if (path_family
== AF_INET6
&&
565 &path
->peer
->su
.sin6
.sin6_addr
) <
570 &path
->peer
->su
.sin6
.sin6_addr
,
571 &min
->peer
->su
.sin6
.sin6_addr
) <
578 const struct prefix
*rn_p
= bgp_dest_get_prefix(dest
);
580 *length
= namelen
+ BGP_NLRI_ENTRY_OFFSET
;
582 offset
= name
+ namelen
;
584 /* Encode prefix into OID */
585 if (family
== AF_INET
)
586 oid_copy_in_addr(offset
, &rn_p
->u
.prefix4
);
588 oid_copy_in6_addr(offset
, &rn_p
->u
.prefix6
);
591 *offset
= rn_p
->prefixlen
;
594 /* Encode peer's IP into OID */
595 if (family
== AF_INET
) {
596 oid_copy_in_addr(offset
,
597 &min
->peer
->su
.sin
.sin_addr
);
598 addr
->u
.prefix4
= rn_p
->u
.prefix4
;
601 offset
, &min
->peer
->su
.sin6
.sin6_addr
);
602 addr
->u
.prefix6
= rn_p
->u
.prefix6
;
605 addr
->prefixlen
= rn_p
->prefixlen
;
606 addr
->family
= rn_p
->family
;
608 bgp_dest_unlock_node(dest
);
613 if (family
== AF_INET
)
614 memset(&paddr
.ip
._v4_addr
, 0, afi_len
);
616 memset(&paddr
.ip
._v6_addr
, 0, afi_len
);
617 } while ((dest
= bgp_route_next(dest
)));
622 static uint8_t *bgp4v2PathAttrTable(struct variable
*v
, oid name
[],
623 size_t *length
, int exact
, size_t *var_len
,
624 WriteMethod
**write_method
)
627 struct bgp_path_info
*path
;
628 struct peer_af
*paf
= NULL
;
629 struct prefix addr
= {};
630 const struct prefix
*prefix
= NULL
;
631 enum bgp_af_index index
;
633 bgp
= bgp_get_default();
637 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
) ==
641 path
= bgp4v2PathAttrLookup(v
, name
, length
, bgp
, &addr
, exact
);
645 prefix
= bgp_dest_get_prefix(path
->net
);
648 paf
= path
->peer
->peer_af_array
[index
];
654 case BGP4V2_NLRI_INDEX
:
655 return SNMP_INTEGER(0);
656 case BGP4V2_NLRI_AFI
:
658 return SNMP_INTEGER(paf
->afi
);
660 return SNMP_INTEGER(0);
661 case BGP4V2_NLRI_SAFI
:
663 return SNMP_INTEGER(paf
->safi
);
665 return SNMP_INTEGER(0);
666 case BGP4V2_NLRI_PREFIX_TYPE
:
668 return SNMP_INTEGER(paf
->afi
);
670 return SNMP_INTEGER(0);
671 case BGP4V2_NLRI_PREFIX
:
672 if (prefix
->family
== AF_INET6
)
673 return SNMP_IP6ADDRESS(prefix
->u
.prefix6
);
675 return SNMP_IPADDRESS(prefix
->u
.prefix4
);
676 case BGP4V2_NLRI_PREFIX_LEN
:
677 return SNMP_INTEGER(prefix
->prefixlen
);
678 case BGP4V2_NLRI_BEST
:
679 if (CHECK_FLAG(path
->flags
, BGP_PATH_SELECTED
))
680 return SNMP_INTEGER(1);
682 return SNMP_INTEGER(0);
683 case BGP4V2_NLRI_CALC_LOCAL_PREF
:
684 if (CHECK_FLAG(path
->attr
->flag
,
685 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
686 return SNMP_INTEGER(path
->attr
->local_pref
);
688 return SNMP_INTEGER(0);
689 case BGP4V2_NLRI_ORIGIN
:
690 switch (path
->attr
->origin
) {
692 return SNMP_INTEGER(1);
694 return SNMP_INTEGER(2);
695 case BGP_ORIGIN_INCOMPLETE
:
696 return SNMP_INTEGER(3);
698 return SNMP_INTEGER(0);
700 case BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
:
701 switch (path
->attr
->mp_nexthop_len
) {
702 case BGP_ATTR_NHLEN_IPV4
:
703 return SNMP_INTEGER(1);
704 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
705 return SNMP_INTEGER(2);
706 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
707 if (path
->attr
->mp_nexthop_prefer_global
)
708 return SNMP_INTEGER(2);
710 return SNMP_INTEGER(4);
712 return SNMP_INTEGER(1);
714 case BGP4V2_NLRI_NEXT_HOP_ADDR
:
715 switch (path
->attr
->mp_nexthop_len
) {
716 case BGP_ATTR_NHLEN_IPV4
:
717 return SNMP_IPADDRESS(path
->attr
->mp_nexthop_global_in
);
718 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
719 return SNMP_IP6ADDRESS(path
->attr
->mp_nexthop_global
);
720 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
721 if (path
->attr
->mp_nexthop_prefer_global
)
722 return SNMP_IP6ADDRESS(
723 path
->attr
->mp_nexthop_global
);
725 return SNMP_IP6ADDRESS(
726 path
->attr
->mp_nexthop_local
);
728 return SNMP_IPADDRESS(path
->attr
->nexthop
);
731 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
:
732 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
:
733 /* Not properly defined in specification what should be here. */
735 case BGP4V2_NLRI_LOCAL_PREF_PRESENT
:
736 if (CHECK_FLAG(path
->attr
->flag
,
737 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
738 return SNMP_INTEGER(1);
740 return SNMP_INTEGER(0);
741 case BGP4V2_NLRI_LOCAL_PREF
:
742 if (CHECK_FLAG(path
->attr
->flag
,
743 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
744 return SNMP_INTEGER(path
->attr
->local_pref
);
746 return SNMP_INTEGER(0);
747 case BGP4V2_NLRI_MED_PRESENT
:
748 if (CHECK_FLAG(path
->attr
->flag
,
749 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
750 return SNMP_INTEGER(1);
752 return SNMP_INTEGER(0);
753 case BGP4V2_NLRI_MED
:
754 if (CHECK_FLAG(path
->attr
->flag
,
755 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
756 return SNMP_INTEGER(path
->attr
->med
);
758 return SNMP_INTEGER(0);
759 case BGP4V2_NLRI_ATOMIC_AGGREGATE
:
760 if (CHECK_FLAG(path
->attr
->flag
,
761 ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE
)))
762 return SNMP_INTEGER(1);
764 return SNMP_INTEGER(0);
765 case BGP4V2_NLRI_AGGREGATOR_PRESENT
:
766 if (CHECK_FLAG(path
->attr
->flag
,
767 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
768 return SNMP_INTEGER(1);
770 return SNMP_INTEGER(0);
771 case BGP4V2_NLRI_AGGREGATOR_AS
:
772 if (CHECK_FLAG(path
->attr
->flag
,
773 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
774 return SNMP_INTEGER(path
->attr
->aggregator_as
);
776 return SNMP_INTEGER(0);
777 case BGP4V2_NLRI_AGGREGATOR_ADDR
:
778 if (CHECK_FLAG(path
->attr
->flag
,
779 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
780 return SNMP_IPADDRESS(path
->attr
->aggregator_addr
);
782 return SNMP_IPADDRESS(bgp_empty_addr
);
783 case BGP4V2_NLRI_AS_PATH_CALC_LENGTH
:
784 return SNMP_INTEGER(path
->attr
->aspath
->segments
->length
);
785 case BGP4V2_NLRI_AS_PATH
:
786 return aspath_snmp_pathseg(path
->attr
->aspath
, var_len
);
787 case BGP4V2_NLRI_PATH_ATTR_UNKNOWN
:
794 static struct variable bgpv2_variables
[] = {
795 /* bgp4V2PeerEntry */
796 {BGP4V2_PEER_INSTANCE
,
801 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 1, 4}},
802 {BGP4V2_PEER_INSTANCE
,
807 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 2, 16}},
808 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
813 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 1, 4}},
814 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
819 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 2, 16}},
820 {BGP4V2_PEER_LOCAL_ADDR
,
825 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 1, 4}},
826 {BGP4V2_PEER_LOCAL_ADDR
,
831 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 2, 16}},
832 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
837 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 1, 4}},
838 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
843 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 2, 16}},
844 {BGP4V2_PEER_REMOTE_ADDR
,
849 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 1, 4}},
850 {BGP4V2_PEER_REMOTE_ADDR
,
855 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 2, 16}},
856 {BGP4V2_PEER_LOCAL_PORT
,
861 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 1, 4}},
862 {BGP4V2_PEER_LOCAL_PORT
,
867 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 2, 16}},
868 {BGP4V2_PEER_LOCAL_AS
,
873 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 1, 4}},
874 {BGP4V2_PEER_LOCAL_AS
,
879 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 2, 16}},
880 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
885 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 1, 4}},
886 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
891 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 2, 16}},
892 {BGP4V2_PEER_REMOTE_PORT
,
897 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 1, 4}},
898 {BGP4V2_PEER_REMOTE_PORT
,
903 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 2, 16}},
904 {BGP4V2_PEER_REMOTE_AS
,
909 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 1, 4}},
910 {BGP4V2_PEER_REMOTE_AS
,
915 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 2, 16}},
916 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
921 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 1, 4}},
922 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
927 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 2, 16}},
928 {BGP4V2_PEER_ADMIN_STATUS
,
933 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 1, 4}},
934 {BGP4V2_PEER_ADMIN_STATUS
,
939 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 2, 16}},
945 {1, 2, 1, BGP4V2_PEER_STATE
, 1, 4}},
951 {1, 2, 1, BGP4V2_PEER_STATE
, 2, 16}},
952 {BGP4V2_PEER_DESCRIPTION
,
957 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 1, 4}},
958 {BGP4V2_PEER_DESCRIPTION
,
963 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 2, 16}},
964 /* bgp4V2PeerErrorsEntry */
965 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
968 bgpv2PeerErrorsTable
,
970 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 1, 4}},
971 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
974 bgpv2PeerErrorsTable
,
976 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 2, 16}},
977 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
980 bgpv2PeerErrorsTable
,
982 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 1, 4}},
983 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
986 bgpv2PeerErrorsTable
,
988 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 2, 16}},
989 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
992 bgpv2PeerErrorsTable
,
994 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 1, 4}},
995 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
998 bgpv2PeerErrorsTable
,
1000 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 2, 16}},
1001 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
1004 bgpv2PeerErrorsTable
,
1006 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 1, 4}},
1007 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
1010 bgpv2PeerErrorsTable
,
1012 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 2, 16}},
1013 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1016 bgpv2PeerErrorsTable
,
1018 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 1, 4}},
1019 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1022 bgpv2PeerErrorsTable
,
1024 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 2, 16}},
1025 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1028 bgpv2PeerErrorsTable
,
1030 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 1, 4}},
1031 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1034 bgpv2PeerErrorsTable
,
1036 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 2, 16}},
1037 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1040 bgpv2PeerErrorsTable
,
1042 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 1, 4}},
1043 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1046 bgpv2PeerErrorsTable
,
1048 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 2, 16}},
1049 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1052 bgpv2PeerErrorsTable
,
1054 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 1, 4}},
1055 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1058 bgpv2PeerErrorsTable
,
1060 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 2, 16}},
1061 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1064 bgpv2PeerErrorsTable
,
1066 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 1, 4}},
1067 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1070 bgpv2PeerErrorsTable
,
1072 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 2, 16}},
1073 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1076 bgpv2PeerErrorsTable
,
1078 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 1, 4}},
1079 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1082 bgpv2PeerErrorsTable
,
1084 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 2, 16}},
1085 /* bgp4V2PeerEventTimesEntry */
1086 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1089 bgpv2PeerEventTimesTable
,
1091 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 1, 4}},
1092 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1095 bgpv2PeerEventTimesTable
,
1097 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 2, 16}},
1098 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1101 bgpv2PeerEventTimesTable
,
1103 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 1, 4}},
1104 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1107 bgpv2PeerEventTimesTable
,
1109 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 2, 16}},
1110 /* bgp4V2NlriTable */
1114 bgp4v2PathAttrTable
,
1116 {1, 9, 1, BGP4V2_NLRI_INDEX
, 1, 4}},
1120 bgp4v2PathAttrTable
,
1122 {1, 9, 1, BGP4V2_NLRI_INDEX
, 2, 16}},
1126 bgp4v2PathAttrTable
,
1128 {1, 9, 1, BGP4V2_NLRI_AFI
, 1, 4}},
1132 bgp4v2PathAttrTable
,
1134 {1, 9, 1, BGP4V2_NLRI_AFI
, 2, 16}},
1138 bgp4v2PathAttrTable
,
1140 {1, 9, 1, BGP4V2_NLRI_SAFI
, 1, 4}},
1144 bgp4v2PathAttrTable
,
1146 {1, 9, 1, BGP4V2_NLRI_SAFI
, 2, 16}},
1147 {BGP4V2_NLRI_PREFIX_TYPE
,
1150 bgp4v2PathAttrTable
,
1152 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 1, 4}},
1153 {BGP4V2_NLRI_PREFIX_TYPE
,
1156 bgp4v2PathAttrTable
,
1158 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 2, 16}},
1159 {BGP4V2_NLRI_PREFIX
,
1162 bgp4v2PathAttrTable
,
1164 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 1, 4}},
1165 {BGP4V2_NLRI_PREFIX
,
1168 bgp4v2PathAttrTable
,
1170 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 2, 16}},
1171 {BGP4V2_NLRI_PREFIX_LEN
,
1174 bgp4v2PathAttrTable
,
1176 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 1, 4}},
1177 {BGP4V2_NLRI_PREFIX_LEN
,
1180 bgp4v2PathAttrTable
,
1182 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 2, 16}},
1186 bgp4v2PathAttrTable
,
1188 {1, 9, 1, BGP4V2_NLRI_BEST
, 1, 4}},
1192 bgp4v2PathAttrTable
,
1194 {1, 9, 1, BGP4V2_NLRI_BEST
, 2, 16}},
1195 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1198 bgp4v2PathAttrTable
,
1200 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 1, 4}},
1201 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1204 bgp4v2PathAttrTable
,
1206 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 2, 16}},
1207 {BGP4V2_NLRI_ORIGIN
,
1210 bgp4v2PathAttrTable
,
1212 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 1, 4}},
1213 {BGP4V2_NLRI_ORIGIN
,
1216 bgp4v2PathAttrTable
,
1218 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 2, 16}},
1219 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1222 bgp4v2PathAttrTable
,
1224 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1225 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1228 bgp4v2PathAttrTable
,
1230 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1231 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1234 bgp4v2PathAttrTable
,
1236 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 1, 4}},
1237 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1240 bgp4v2PathAttrTable
,
1242 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 2, 16}},
1243 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1246 bgp4v2PathAttrTable
,
1248 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1249 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1252 bgp4v2PathAttrTable
,
1254 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1255 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1258 bgp4v2PathAttrTable
,
1260 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 1, 4}},
1261 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1264 bgp4v2PathAttrTable
,
1266 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 2, 16}},
1267 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1270 bgp4v2PathAttrTable
,
1272 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 1, 4}},
1273 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1276 bgp4v2PathAttrTable
,
1278 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 2, 16}},
1279 {BGP4V2_NLRI_LOCAL_PREF
,
1282 bgp4v2PathAttrTable
,
1284 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 1, 4}},
1285 {BGP4V2_NLRI_LOCAL_PREF
,
1288 bgp4v2PathAttrTable
,
1290 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 2, 16}},
1291 {BGP4V2_NLRI_MED_PRESENT
,
1294 bgp4v2PathAttrTable
,
1296 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 1, 4}},
1297 {BGP4V2_NLRI_MED_PRESENT
,
1300 bgp4v2PathAttrTable
,
1302 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 2, 16}},
1306 bgp4v2PathAttrTable
,
1308 {1, 9, 1, BGP4V2_NLRI_MED
, 1, 4}},
1312 bgp4v2PathAttrTable
,
1314 {1, 9, 1, BGP4V2_NLRI_MED
, 2, 16}},
1315 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1318 bgp4v2PathAttrTable
,
1320 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 1, 4}},
1321 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1324 bgp4v2PathAttrTable
,
1326 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 2, 16}},
1327 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1330 bgp4v2PathAttrTable
,
1332 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 1, 4}},
1333 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1336 bgp4v2PathAttrTable
,
1338 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 2, 16}},
1339 {BGP4V2_NLRI_AGGREGATOR_AS
,
1342 bgp4v2PathAttrTable
,
1344 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 1, 4}},
1345 {BGP4V2_NLRI_AGGREGATOR_AS
,
1348 bgp4v2PathAttrTable
,
1350 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 2, 16}},
1351 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1354 bgp4v2PathAttrTable
,
1356 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 1, 4}},
1357 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1360 bgp4v2PathAttrTable
,
1362 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 2, 16}},
1363 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1366 bgp4v2PathAttrTable
,
1368 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 1, 4}},
1369 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1372 bgp4v2PathAttrTable
,
1374 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 2, 16}},
1375 {BGP4V2_NLRI_AS_PATH_STRING
,
1378 bgp4v2PathAttrTable
,
1380 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 1, 4}},
1381 {BGP4V2_NLRI_AS_PATH_STRING
,
1384 bgp4v2PathAttrTable
,
1386 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 2, 16}},
1387 {BGP4V2_NLRI_AS_PATH
,
1390 bgp4v2PathAttrTable
,
1392 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 1, 4}},
1393 {BGP4V2_NLRI_AS_PATH
,
1396 bgp4v2PathAttrTable
,
1398 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 2, 16}},
1399 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1402 bgp4v2PathAttrTable
,
1404 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 1, 4}},
1405 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1408 bgp4v2PathAttrTable
,
1410 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 2, 16}},
1413 int bgp_snmp_bgp4v2_init(struct thread_master
*tm
)
1415 REGISTER_MIB("mibII/bgpv2", bgpv2_variables
, variable
, bgpv2_oid
);