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 (CHECK_FLAG(path
->attr
->nh_flag
,
708 BGP_ATTR_NH_MP_PREFER_GLOBAL
))
709 return SNMP_INTEGER(2);
711 return SNMP_INTEGER(4);
713 return SNMP_INTEGER(1);
715 case BGP4V2_NLRI_NEXT_HOP_ADDR
:
716 switch (path
->attr
->mp_nexthop_len
) {
717 case BGP_ATTR_NHLEN_IPV4
:
718 return SNMP_IPADDRESS(path
->attr
->mp_nexthop_global_in
);
719 case BGP_ATTR_NHLEN_IPV6_GLOBAL
:
720 return SNMP_IP6ADDRESS(path
->attr
->mp_nexthop_global
);
721 case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
:
722 if (CHECK_FLAG(path
->attr
->nh_flag
,
723 BGP_ATTR_NH_MP_PREFER_GLOBAL
))
724 return SNMP_IP6ADDRESS(
725 path
->attr
->mp_nexthop_global
);
727 return SNMP_IP6ADDRESS(
728 path
->attr
->mp_nexthop_local
);
730 return SNMP_IPADDRESS(path
->attr
->nexthop
);
733 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
:
734 case BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
:
735 /* Not properly defined in specification what should be here. */
737 case BGP4V2_NLRI_LOCAL_PREF_PRESENT
:
738 if (CHECK_FLAG(path
->attr
->flag
,
739 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
740 return SNMP_INTEGER(1);
742 return SNMP_INTEGER(0);
743 case BGP4V2_NLRI_LOCAL_PREF
:
744 if (CHECK_FLAG(path
->attr
->flag
,
745 ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF
)))
746 return SNMP_INTEGER(path
->attr
->local_pref
);
748 return SNMP_INTEGER(0);
749 case BGP4V2_NLRI_MED_PRESENT
:
750 if (CHECK_FLAG(path
->attr
->flag
,
751 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
752 return SNMP_INTEGER(1);
754 return SNMP_INTEGER(0);
755 case BGP4V2_NLRI_MED
:
756 if (CHECK_FLAG(path
->attr
->flag
,
757 ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC
)))
758 return SNMP_INTEGER(path
->attr
->med
);
760 return SNMP_INTEGER(0);
761 case BGP4V2_NLRI_ATOMIC_AGGREGATE
:
762 if (CHECK_FLAG(path
->attr
->flag
,
763 ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE
)))
764 return SNMP_INTEGER(1);
766 return SNMP_INTEGER(0);
767 case BGP4V2_NLRI_AGGREGATOR_PRESENT
:
768 if (CHECK_FLAG(path
->attr
->flag
,
769 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
770 return SNMP_INTEGER(1);
772 return SNMP_INTEGER(0);
773 case BGP4V2_NLRI_AGGREGATOR_AS
:
774 if (CHECK_FLAG(path
->attr
->flag
,
775 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
776 return SNMP_INTEGER(path
->attr
->aggregator_as
);
778 return SNMP_INTEGER(0);
779 case BGP4V2_NLRI_AGGREGATOR_ADDR
:
780 if (CHECK_FLAG(path
->attr
->flag
,
781 ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR
)))
782 return SNMP_IPADDRESS(path
->attr
->aggregator_addr
);
784 return SNMP_IPADDRESS(bgp_empty_addr
);
785 case BGP4V2_NLRI_AS_PATH_CALC_LENGTH
:
786 return SNMP_INTEGER(path
->attr
->aspath
->segments
->length
);
787 case BGP4V2_NLRI_AS_PATH
:
788 return aspath_snmp_pathseg(path
->attr
->aspath
, var_len
);
789 case BGP4V2_NLRI_PATH_ATTR_UNKNOWN
:
796 static struct variable bgpv2_variables
[] = {
797 /* bgp4V2PeerEntry */
798 {BGP4V2_PEER_INSTANCE
,
803 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 1, 4}},
804 {BGP4V2_PEER_INSTANCE
,
809 {1, 2, 1, BGP4V2_PEER_INSTANCE
, 2, 16}},
810 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
815 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 1, 4}},
816 {BGP4V2_PEER_LOCAL_ADDR_TYPE
,
821 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR_TYPE
, 2, 16}},
822 {BGP4V2_PEER_LOCAL_ADDR
,
827 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 1, 4}},
828 {BGP4V2_PEER_LOCAL_ADDR
,
833 {1, 2, 1, BGP4V2_PEER_LOCAL_ADDR
, 2, 16}},
834 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
839 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 1, 4}},
840 {BGP4V2_PEER_REMOTE_ADDR_TYPE
,
845 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR_TYPE
, 2, 16}},
846 {BGP4V2_PEER_REMOTE_ADDR
,
851 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 1, 4}},
852 {BGP4V2_PEER_REMOTE_ADDR
,
857 {1, 2, 1, BGP4V2_PEER_REMOTE_ADDR
, 2, 16}},
858 {BGP4V2_PEER_LOCAL_PORT
,
863 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 1, 4}},
864 {BGP4V2_PEER_LOCAL_PORT
,
869 {1, 2, 1, BGP4V2_PEER_LOCAL_PORT
, 2, 16}},
870 {BGP4V2_PEER_LOCAL_AS
,
875 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 1, 4}},
876 {BGP4V2_PEER_LOCAL_AS
,
881 {1, 2, 1, BGP4V2_PEER_LOCAL_AS
, 2, 16}},
882 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
887 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 1, 4}},
888 {BGP4V2_PEER_LOCAL_IDENTIFIER
,
893 {1, 2, 1, BGP4V2_PEER_LOCAL_IDENTIFIER
, 2, 16}},
894 {BGP4V2_PEER_REMOTE_PORT
,
899 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 1, 4}},
900 {BGP4V2_PEER_REMOTE_PORT
,
905 {1, 2, 1, BGP4V2_PEER_REMOTE_PORT
, 2, 16}},
906 {BGP4V2_PEER_REMOTE_AS
,
911 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 1, 4}},
912 {BGP4V2_PEER_REMOTE_AS
,
917 {1, 2, 1, BGP4V2_PEER_REMOTE_AS
, 2, 16}},
918 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
923 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 1, 4}},
924 {BGP4V2_PEER_REMOTE_IDENTIFIER
,
929 {1, 2, 1, BGP4V2_PEER_REMOTE_IDENTIFIER
, 2, 16}},
930 {BGP4V2_PEER_ADMIN_STATUS
,
935 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 1, 4}},
936 {BGP4V2_PEER_ADMIN_STATUS
,
941 {1, 2, 1, BGP4V2_PEER_ADMIN_STATUS
, 2, 16}},
947 {1, 2, 1, BGP4V2_PEER_STATE
, 1, 4}},
953 {1, 2, 1, BGP4V2_PEER_STATE
, 2, 16}},
954 {BGP4V2_PEER_DESCRIPTION
,
959 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 1, 4}},
960 {BGP4V2_PEER_DESCRIPTION
,
965 {1, 2, 1, BGP4V2_PEER_DESCRIPTION
, 2, 16}},
966 /* bgp4V2PeerErrorsEntry */
967 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
970 bgpv2PeerErrorsTable
,
972 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 1, 4}},
973 {BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
,
976 bgpv2PeerErrorsTable
,
978 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED
, 2, 16}},
979 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
982 bgpv2PeerErrorsTable
,
984 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 1, 4}},
985 {BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
,
988 bgpv2PeerErrorsTable
,
990 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED
, 2, 16}},
991 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
994 bgpv2PeerErrorsTable
,
996 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 1, 4}},
997 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
,
1000 bgpv2PeerErrorsTable
,
1002 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TIME
, 2, 16}},
1003 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
1006 bgpv2PeerErrorsTable
,
1008 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 1, 4}},
1009 {BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
,
1012 bgpv2PeerErrorsTable
,
1014 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT
, 2, 16}},
1015 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1018 bgpv2PeerErrorsTable
,
1020 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 1, 4}},
1021 {BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
,
1024 bgpv2PeerErrorsTable
,
1026 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_DATA
, 2, 16}},
1027 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1030 bgpv2PeerErrorsTable
,
1032 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 1, 4}},
1033 {BGP4V2_PEER_LAST_ERROR_CODE_SENT
,
1036 bgpv2PeerErrorsTable
,
1038 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_SENT
, 2, 16}},
1039 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1042 bgpv2PeerErrorsTable
,
1044 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 1, 4}},
1045 {BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
,
1048 bgpv2PeerErrorsTable
,
1050 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_SENT
, 2, 16}},
1051 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1054 bgpv2PeerErrorsTable
,
1056 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 1, 4}},
1057 {BGP4V2_PEER_LAST_ERROR_SENT_TIME
,
1060 bgpv2PeerErrorsTable
,
1062 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TIME
, 2, 16}},
1063 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1066 bgpv2PeerErrorsTable
,
1068 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 1, 4}},
1069 {BGP4V2_PEER_LAST_ERROR_SENT_TEXT
,
1072 bgpv2PeerErrorsTable
,
1074 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_TEXT
, 2, 16}},
1075 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1078 bgpv2PeerErrorsTable
,
1080 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 1, 4}},
1081 {BGP4V2_PEER_LAST_ERROR_SENT_DATA
,
1084 bgpv2PeerErrorsTable
,
1086 {1, 3, 1, BGP4V2_PEER_LAST_ERROR_SENT_DATA
, 2, 16}},
1087 /* bgp4V2PeerEventTimesEntry */
1088 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1091 bgpv2PeerEventTimesTable
,
1093 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 1, 4}},
1094 {BGP4V2_PEER_FSM_ESTABLISHED_TIME
,
1097 bgpv2PeerEventTimesTable
,
1099 {1, 4, 1, BGP4V2_PEER_FSM_ESTABLISHED_TIME
, 2, 16}},
1100 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1103 bgpv2PeerEventTimesTable
,
1105 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 1, 4}},
1106 {BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
,
1109 bgpv2PeerEventTimesTable
,
1111 {1, 4, 1, BGP4V2_PEER_PEER_IN_UPDATES_ELAPSED_TIME
, 2, 16}},
1112 /* bgp4V2NlriTable */
1116 bgp4v2PathAttrTable
,
1118 {1, 9, 1, BGP4V2_NLRI_INDEX
, 1, 4}},
1122 bgp4v2PathAttrTable
,
1124 {1, 9, 1, BGP4V2_NLRI_INDEX
, 2, 16}},
1128 bgp4v2PathAttrTable
,
1130 {1, 9, 1, BGP4V2_NLRI_AFI
, 1, 4}},
1134 bgp4v2PathAttrTable
,
1136 {1, 9, 1, BGP4V2_NLRI_AFI
, 2, 16}},
1140 bgp4v2PathAttrTable
,
1142 {1, 9, 1, BGP4V2_NLRI_SAFI
, 1, 4}},
1146 bgp4v2PathAttrTable
,
1148 {1, 9, 1, BGP4V2_NLRI_SAFI
, 2, 16}},
1149 {BGP4V2_NLRI_PREFIX_TYPE
,
1152 bgp4v2PathAttrTable
,
1154 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 1, 4}},
1155 {BGP4V2_NLRI_PREFIX_TYPE
,
1158 bgp4v2PathAttrTable
,
1160 {1, 9, 1, BGP4V2_NLRI_PREFIX_TYPE
, 2, 16}},
1161 {BGP4V2_NLRI_PREFIX
,
1164 bgp4v2PathAttrTable
,
1166 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 1, 4}},
1167 {BGP4V2_NLRI_PREFIX
,
1170 bgp4v2PathAttrTable
,
1172 {1, 9, 1, BGP4V2_NLRI_PREFIX
, 2, 16}},
1173 {BGP4V2_NLRI_PREFIX_LEN
,
1176 bgp4v2PathAttrTable
,
1178 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 1, 4}},
1179 {BGP4V2_NLRI_PREFIX_LEN
,
1182 bgp4v2PathAttrTable
,
1184 {1, 9, 1, BGP4V2_NLRI_PREFIX_LEN
, 2, 16}},
1188 bgp4v2PathAttrTable
,
1190 {1, 9, 1, BGP4V2_NLRI_BEST
, 1, 4}},
1194 bgp4v2PathAttrTable
,
1196 {1, 9, 1, BGP4V2_NLRI_BEST
, 2, 16}},
1197 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1200 bgp4v2PathAttrTable
,
1202 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 1, 4}},
1203 {BGP4V2_NLRI_CALC_LOCAL_PREF
,
1206 bgp4v2PathAttrTable
,
1208 {1, 9, 1, BGP4V2_NLRI_CALC_LOCAL_PREF
, 2, 16}},
1209 {BGP4V2_NLRI_ORIGIN
,
1212 bgp4v2PathAttrTable
,
1214 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 1, 4}},
1215 {BGP4V2_NLRI_ORIGIN
,
1218 bgp4v2PathAttrTable
,
1220 {1, 9, 1, BGP4V2_NLRI_ORIGIN
, 2, 16}},
1221 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1224 bgp4v2PathAttrTable
,
1226 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1227 {BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
,
1230 bgp4v2PathAttrTable
,
1232 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1233 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1236 bgp4v2PathAttrTable
,
1238 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 1, 4}},
1239 {BGP4V2_NLRI_NEXT_HOP_ADDR
,
1242 bgp4v2PathAttrTable
,
1244 {1, 9, 1, BGP4V2_NLRI_NEXT_HOP_ADDR
, 2, 16}},
1245 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1248 bgp4v2PathAttrTable
,
1250 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 1, 4}},
1251 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
,
1254 bgp4v2PathAttrTable
,
1256 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR_TYPE
, 2, 16}},
1257 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1260 bgp4v2PathAttrTable
,
1262 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 1, 4}},
1263 {BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
,
1266 bgp4v2PathAttrTable
,
1268 {1, 9, 1, BGP4V2_NLRI_LINK_LOCAL_NEXT_HOP_ADDR
, 2, 16}},
1269 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1272 bgp4v2PathAttrTable
,
1274 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 1, 4}},
1275 {BGP4V2_NLRI_LOCAL_PREF_PRESENT
,
1278 bgp4v2PathAttrTable
,
1280 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF_PRESENT
, 2, 16}},
1281 {BGP4V2_NLRI_LOCAL_PREF
,
1284 bgp4v2PathAttrTable
,
1286 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 1, 4}},
1287 {BGP4V2_NLRI_LOCAL_PREF
,
1290 bgp4v2PathAttrTable
,
1292 {1, 9, 1, BGP4V2_NLRI_LOCAL_PREF
, 2, 16}},
1293 {BGP4V2_NLRI_MED_PRESENT
,
1296 bgp4v2PathAttrTable
,
1298 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 1, 4}},
1299 {BGP4V2_NLRI_MED_PRESENT
,
1302 bgp4v2PathAttrTable
,
1304 {1, 9, 1, BGP4V2_NLRI_MED_PRESENT
, 2, 16}},
1308 bgp4v2PathAttrTable
,
1310 {1, 9, 1, BGP4V2_NLRI_MED
, 1, 4}},
1314 bgp4v2PathAttrTable
,
1316 {1, 9, 1, BGP4V2_NLRI_MED
, 2, 16}},
1317 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1320 bgp4v2PathAttrTable
,
1322 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 1, 4}},
1323 {BGP4V2_NLRI_ATOMIC_AGGREGATE
,
1326 bgp4v2PathAttrTable
,
1328 {1, 9, 1, BGP4V2_NLRI_ATOMIC_AGGREGATE
, 2, 16}},
1329 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1332 bgp4v2PathAttrTable
,
1334 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 1, 4}},
1335 {BGP4V2_NLRI_AGGREGATOR_PRESENT
,
1338 bgp4v2PathAttrTable
,
1340 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_PRESENT
, 2, 16}},
1341 {BGP4V2_NLRI_AGGREGATOR_AS
,
1344 bgp4v2PathAttrTable
,
1346 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 1, 4}},
1347 {BGP4V2_NLRI_AGGREGATOR_AS
,
1350 bgp4v2PathAttrTable
,
1352 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_AS
, 2, 16}},
1353 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1356 bgp4v2PathAttrTable
,
1358 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 1, 4}},
1359 {BGP4V2_NLRI_AGGREGATOR_ADDR
,
1362 bgp4v2PathAttrTable
,
1364 {1, 9, 1, BGP4V2_NLRI_AGGREGATOR_ADDR
, 2, 16}},
1365 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1368 bgp4v2PathAttrTable
,
1370 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 1, 4}},
1371 {BGP4V2_NLRI_AS_PATH_CALC_LENGTH
,
1374 bgp4v2PathAttrTable
,
1376 {1, 9, 1, BGP4V2_NLRI_AS_PATH_CALC_LENGTH
, 2, 16}},
1377 {BGP4V2_NLRI_AS_PATH_STRING
,
1380 bgp4v2PathAttrTable
,
1382 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 1, 4}},
1383 {BGP4V2_NLRI_AS_PATH_STRING
,
1386 bgp4v2PathAttrTable
,
1388 {1, 9, 1, BGP4V2_NLRI_AS_PATH_STRING
, 2, 16}},
1389 {BGP4V2_NLRI_AS_PATH
,
1392 bgp4v2PathAttrTable
,
1394 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 1, 4}},
1395 {BGP4V2_NLRI_AS_PATH
,
1398 bgp4v2PathAttrTable
,
1400 {1, 9, 1, BGP4V2_NLRI_AS_PATH
, 2, 16}},
1401 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1404 bgp4v2PathAttrTable
,
1406 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 1, 4}},
1407 {BGP4V2_NLRI_PATH_ATTR_UNKNOWN
,
1410 bgp4v2PathAttrTable
,
1412 {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN
, 2, 16}},
1415 int bgp_snmp_bgp4v2_init(struct thread_master
*tm
)
1417 REGISTER_MIB("mibII/bgpv2", bgpv2_variables
, variable
, bgpv2_oid
);