mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
bgpd: add snmp traps for bgp4-mibv2
This commit add the support of traps for bgp4-mibv2. It is conformant to draft-ietf-idr-bgp4-mibv2-11. The following traps are supported: - bgp4V2EstablishedNotification - bgp4V2BackwardTransitionNotification Signed-off-by: Francois Dumontet <francois.dumontet@6wind.com>
This commit is contained in:
parent
83ca9a605e
commit
d78854f438
|
@ -59,9 +59,31 @@ static void bgp_snmp_traps_init(void)
|
|||
|
||||
int bgp_cli_snmp_traps_config_write(struct vty *vty)
|
||||
{
|
||||
if (CHECK_FLAG(bgp_snmp_traps_flags, BGP_SNMP_TRAPS_RFC4273_ENABLED))
|
||||
return 0;
|
||||
vty_out(vty, "traps rfc4273 disable\n");
|
||||
int write = 0;
|
||||
|
||||
if (!CHECK_FLAG(bm->options, BGP_OPT_TRAPS_RFC4273)) {
|
||||
vty_out(vty, "no bgp snmp traps rfc4273\n");
|
||||
write++;
|
||||
}
|
||||
if (CHECK_FLAG(bm->options, BGP_OPT_TRAPS_BGP4MIBV2)) {
|
||||
vty_out(vty, "bgp snmp traps bgp4-mibv2\n");
|
||||
write++;
|
||||
}
|
||||
|
||||
return write;
|
||||
}
|
||||
|
||||
int bgpTrapEstablished(struct peer *peer)
|
||||
{
|
||||
bgp4TrapEstablished(peer);
|
||||
bgpv2TrapEstablished(peer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bgpTrapBackwardTransition(struct peer *peer)
|
||||
{
|
||||
bgp4TrapBackwardTransition(peer);
|
||||
bgpv2TrapBackwardTransition(peer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,4 +19,7 @@ extern uint32_t bgp_snmp_traps_flags;
|
|||
|
||||
#define BGP_SNMP_TRAPS_RFC4273_ENABLED (1 << 0)
|
||||
|
||||
extern int bgpTrapEstablished(struct peer *peer);
|
||||
extern int bgpTrapBackwardTransition(struct peer *peer);
|
||||
|
||||
#endif /* _FRR_BGP_SNMP_H_ */
|
||||
|
|
|
@ -757,7 +757,7 @@ static struct variable bgp_variables[] = {
|
|||
{6, 1, 14}},
|
||||
};
|
||||
|
||||
int bgpTrapEstablished(struct peer *peer)
|
||||
int bgp4TrapEstablished(struct peer *peer)
|
||||
{
|
||||
int ret;
|
||||
struct in_addr addr;
|
||||
|
@ -785,7 +785,7 @@ int bgpTrapEstablished(struct peer *peer)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int bgpTrapBackwardTransition(struct peer *peer)
|
||||
int bgp4TrapBackwardTransition(struct peer *peer)
|
||||
{
|
||||
int ret;
|
||||
struct in_addr addr;
|
||||
|
|
|
@ -69,8 +69,8 @@
|
|||
#define BGP4PATHATTRBEST 13
|
||||
#define BGP4PATHATTRUNKNOWN 14
|
||||
|
||||
extern int bgpTrapEstablished(struct peer *peer);
|
||||
extern int bgpTrapBackwardTransition(struct peer *peer);
|
||||
extern int bgp4TrapEstablished(struct peer *peer);
|
||||
extern int bgp4TrapBackwardTransition(struct peer *peer);
|
||||
extern int bgp_snmp_bgp4_init(struct event_loop *tm);
|
||||
|
||||
#endif /* _FRR_BGP_SNMP_BGP4_H_ */
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
SNMP_LOCAL_VARIABLES
|
||||
|
||||
static oid bgpv2_oid[] = {BGP4V2MIB};
|
||||
static oid bgpv2_trap_oid[] = { BGP4V2MIB, 0 };
|
||||
static struct in_addr bgp_empty_addr = {};
|
||||
|
||||
static struct peer *peer_lookup_all_vrf(struct ipaddr *addr)
|
||||
|
@ -793,6 +794,38 @@ static uint8_t *bgp4v2PathAttrTable(struct variable *v, oid name[],
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* BGP V2 Traps. */
|
||||
static struct trap_object bgpv2TrapEstListv4[] = {
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 1 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 1 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 1 } }
|
||||
};
|
||||
|
||||
static struct trap_object bgpv2TrapEstListv6[] = {
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 2 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 2 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 2 } }
|
||||
};
|
||||
|
||||
static struct trap_object bgpv2TrapBackListv4[] = {
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 1 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 1 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 1 } },
|
||||
{ 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED, 1, 1 } },
|
||||
{ 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED, 1, 1 } },
|
||||
{ 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT, 1, 1 } }
|
||||
};
|
||||
|
||||
static struct trap_object bgpv2TrapBackListv6[] = {
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 2 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 2 } },
|
||||
{ 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 2 } },
|
||||
{ 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED, 1, 2 } },
|
||||
{ 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED, 1, 2 } },
|
||||
{ 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT, 1, 2 } }
|
||||
};
|
||||
|
||||
|
||||
static struct variable bgpv2_variables[] = {
|
||||
/* bgp4V2PeerEntry */
|
||||
{BGP4V2_PEER_INSTANCE,
|
||||
|
@ -1412,6 +1445,76 @@ static struct variable bgpv2_variables[] = {
|
|||
{1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN, 1, 2}},
|
||||
};
|
||||
|
||||
int bgpv2TrapEstablished(struct peer *peer)
|
||||
{
|
||||
oid index[sizeof(oid) * IN6_ADDR_SIZE];
|
||||
size_t length;
|
||||
|
||||
/* Check if this peer just went to Established */
|
||||
if ((peer->connection->ostatus != OpenConfirm) ||
|
||||
!(peer_established(peer->connection)))
|
||||
return 0;
|
||||
|
||||
switch (sockunion_family(&peer->connection->su)) {
|
||||
case AF_INET:
|
||||
oid_copy_in_addr(index, &peer->connection->su.sin.sin_addr);
|
||||
length = IN_ADDR_SIZE;
|
||||
smux_trap(bgpv2_variables, array_size(bgpv2_variables),
|
||||
bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid,
|
||||
sizeof(bgpv2_oid) / sizeof(oid), index, length,
|
||||
bgpv2TrapEstListv4, array_size(bgpv2TrapEstListv4),
|
||||
BGP4V2ESTABLISHED);
|
||||
break;
|
||||
case AF_INET6:
|
||||
oid_copy_in6_addr(index, &peer->connection->su.sin6.sin6_addr);
|
||||
length = IN6_ADDR_SIZE;
|
||||
smux_trap(bgpv2_variables, array_size(bgpv2_variables),
|
||||
bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid,
|
||||
sizeof(bgpv2_oid) / sizeof(oid), index, length,
|
||||
bgpv2TrapEstListv6, array_size(bgpv2TrapEstListv6),
|
||||
BGP4V2ESTABLISHED);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bgpv2TrapBackwardTransition(struct peer *peer)
|
||||
{
|
||||
oid index[sizeof(oid) * IN6_ADDR_SIZE];
|
||||
size_t length;
|
||||
|
||||
switch (sockunion_family(&peer->connection->su)) {
|
||||
case AF_INET:
|
||||
oid_copy_in_addr(index, &peer->connection->su.sin.sin_addr);
|
||||
length = IN_ADDR_SIZE;
|
||||
smux_trap(bgpv2_variables, array_size(bgpv2_variables),
|
||||
bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid,
|
||||
sizeof(bgpv2_oid) / sizeof(oid), index, length,
|
||||
bgpv2TrapBackListv4, array_size(bgpv2TrapBackListv4),
|
||||
BGP4V2BACKWARDTRANSITION);
|
||||
break;
|
||||
case AF_INET6:
|
||||
oid_copy_in6_addr(index, &peer->connection->su.sin6.sin6_addr);
|
||||
length = IN6_ADDR_SIZE;
|
||||
smux_trap(bgpv2_variables, array_size(bgpv2_variables),
|
||||
bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid,
|
||||
sizeof(bgpv2_oid) / sizeof(oid), index, length,
|
||||
bgpv2TrapBackListv6, array_size(bgpv2TrapBackListv6),
|
||||
BGP4V2BACKWARDTRANSITION);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int bgp_snmp_bgp4v2_init(struct event_loop *tm)
|
||||
{
|
||||
REGISTER_MIB("mibII/bgpv2", bgpv2_variables, variable, bgpv2_oid);
|
||||
|
|
|
@ -16,6 +16,14 @@
|
|||
* offset 1.3.6.1.3.5.1.1.2.1.x.(1|2).(4|16) = 13
|
||||
* offset 1.3.6.1.4.1.7336.3.2.1.1.2.1.x.1.(1|2) = 16
|
||||
*/
|
||||
|
||||
|
||||
/* bgpTraps */
|
||||
#define BGP4V2ESTABLISHED 1
|
||||
#define BGP4V2BACKWARDTRANSITION 2
|
||||
|
||||
/* bgpPeerTable */
|
||||
|
||||
#define BGP4V2_PEER_ENTRY_OFFSET 13
|
||||
#define BGP4V2_PEER_INSTANCE 1
|
||||
#define BGP4V2_PEER_LOCAL_ADDR_TYPE 2
|
||||
|
@ -84,5 +92,7 @@
|
|||
#define BGP4V2_BACKWARD_TRANSITION_NOTIFICATION 2
|
||||
|
||||
extern int bgp_snmp_bgp4v2_init(struct event_loop *tm);
|
||||
extern int bgpv2TrapEstablished(struct peer *peer);
|
||||
extern int bgpv2TrapBackwardTransition(struct peer *peer);
|
||||
|
||||
#endif /* _FRR_BGP_SNMP_BGP4V2_H_ */
|
||||
|
|
Loading…
Reference in a new issue