diff options
author | Pat Ruddy <pat@voltanet.io> | 2020-10-21 19:28:41 +0200 |
---|---|---|
committer | Pat Ruddy <pat@voltanet.io> | 2021-02-02 10:37:15 +0100 |
commit | 8db8e86a91e37c7f67160f4afedb8dec59f0be05 (patch) | |
tree | a0c504d9c0e84fcd4a01cb15ac1bbbdbc879961a /bgpd | |
parent | lib: allow traps with differently indexed objects (diff) | |
download | frr-8db8e86a91e37c7f67160f4afedb8dec59f0be05.tar.xz frr-8db8e86a91e37c7f67160f4afedb8dec59f0be05.zip |
bgp: add mplsl3vpn notifications
Add support for mplsL3VpnVrfUp and mplsL3VpnVrfDown notifications
from [RFC4382]
Signed-off-by: Pat Ruddy <pat@voltanet.io>
Diffstat (limited to 'bgpd')
-rw-r--r-- | bgpd/bgp_mplsvpn_snmp.c | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/bgpd/bgp_mplsvpn_snmp.c b/bgpd/bgp_mplsvpn_snmp.c index 06e1b4ead..ef5556be1 100644 --- a/bgpd/bgp_mplsvpn_snmp.c +++ b/bgpd/bgp_mplsvpn_snmp.c @@ -108,6 +108,10 @@ #define MPLSL3VPNVRFRTEINETCIDRXCPOINTER 17 #define MPLSL3VPNVRFRTEINETCIDRSTATUS 18 +/* BGP Trap */ +#define MPLSL3VPNVRFUP 1 +#define MPLSL3VPNDOWN 2 + /* SNMP value hack. */ #define INTEGER ASN_INTEGER #define INTEGER32 ASN_INTEGER @@ -125,8 +129,10 @@ SNMP_LOCAL_VARIABLES /* BGP-MPLS-MIB instances */ static oid mpls_l3vpn_oid[] = {MPLSL3VPNMIB}; +static oid mpls_l3vpn_trap_oid[] = {MPLSL3VPNMIB, 0}; static char rd_buf[RD_ADDRSTRLEN]; -static uint8_t bgp_mplsvpn_notif_enable = SNMP_FALSE; +/* Notifications enabled by default */ +static uint8_t bgp_mplsvpn_notif_enable = SNMP_TRUE; static oid mpls_l3vpn_policy_oid[2] = {0, 0}; static const char *empty_nhop = ""; char rt_description[VRF_NAMSIZ + RT_PREAMBLE_SIZE]; @@ -581,17 +587,52 @@ static bool is_bgp_vrf_active(struct bgp *bgp) return false; } +/* BGP Traps. */ +static struct trap_object l3vpn_trap_list[] = {{5, {1, 2, 1, 1, 5} }, + {5, {1, 2, 2, 1, 6} } }; + static int bgp_vrf_check_update_active(struct bgp *bgp, struct interface *ifp) { bool new_active = false; + oid trap; + struct index_oid trap_index[2]; - if (!is_bgp_vrf_mplsvpn(bgp) || bgp->snmp_stats == NULL) + if (!is_bgp_vrf_mplsvpn(bgp) || bgp->snmp_stats == NULL + || !bgp_mplsvpn_notif_enable) return 0; new_active = is_bgp_vrf_active(bgp); if (bgp->snmp_stats->active != new_active) { /* add trap in here */ bgp->snmp_stats->active = new_active; + + /* send relevent trap */ + if (bgp->snmp_stats->active) + trap = MPLSL3VPNVRFUP; + else + trap = MPLSL3VPNDOWN; + + /* + * first index vrf_name + ifindex + * second index vrf_name + */ + trap_index[1].indexlen = strnlen(bgp->name, VRF_NAMSIZ); + oid_copy_str(trap_index[0].indexname, bgp->name, + trap_index[1].indexlen); + oid_copy_str(trap_index[1].indexname, bgp->name, + trap_index[1].indexlen); + trap_index[0].indexlen = + trap_index[1].indexlen + sizeof(ifindex_t); + oid_copy_int(trap_index[0].indexname + trap_index[1].indexlen, + (int *)&(ifp->ifindex)); + + smux_trap_multi_index( + mpls_l3vpn_variables, array_size(mpls_l3vpn_variables), + mpls_l3vpn_trap_oid, array_size(mpls_l3vpn_trap_oid), + mpls_l3vpn_oid, sizeof(mpls_l3vpn_oid) / sizeof(oid), + trap_index, array_size(trap_index), l3vpn_trap_list, + array_size(l3vpn_trap_list), trap); } + bgp_mpls_l3vpn_update_last_changed(bgp); return 0; } @@ -668,13 +709,11 @@ static int write_mplsL3vpnNotificationEnable(int action, uint8_t *var_val, { uint32_t intval; - if (var_val_type != ASN_INTEGER) { + if (var_val_type != ASN_INTEGER) return SNMP_ERR_WRONGTYPE; - } - if (var_val_len != sizeof(long)) { + if (var_val_len != sizeof(long)) return SNMP_ERR_WRONGLENGTH; - } intval = *(long *)var_val; bgp_mplsvpn_notif_enable = intval; |