mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-11-03 08:33:00 +00:00
bgpd: add MPLSVPN SNMP boilerplate
Add infrastructure for mplsvpn MIB (RFC-4382) and the top level ScalarGroup. Signed-off-by: Pat Ruddy <pat@voltanet.io>
This commit is contained in:
parent
2fceba1fa7
commit
aa53f69348
283
bgpd/bgp_mplsvpn_snmp.c
Normal file
283
bgpd/bgp_mplsvpn_snmp.c
Normal file
@ -0,0 +1,283 @@
|
||||
/* MPLS/BGP L3VPN MIB
|
||||
* Copyright (C) 2020 Volta Networks Inc
|
||||
*
|
||||
* This file is part of FRR.
|
||||
*
|
||||
* FRRouting is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2, or (at your option) any
|
||||
* later version.
|
||||
*
|
||||
* FRRouting is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <zebra.h>
|
||||
|
||||
#include <net-snmp/net-snmp-config.h>
|
||||
#include <net-snmp/net-snmp-includes.h>
|
||||
|
||||
#include "if.h"
|
||||
#include "log.h"
|
||||
#include "prefix.h"
|
||||
#include "command.h"
|
||||
#include "thread.h"
|
||||
#include "smux.h"
|
||||
#include "filter.h"
|
||||
#include "hook.h"
|
||||
#include "libfrr.h"
|
||||
#include "version.h"
|
||||
|
||||
#include "bgpd/bgpd.h"
|
||||
#include "bgpd/bgp_mplsvpn.h"
|
||||
#include "bgpd/bgp_mplsvpn_snmp.h"
|
||||
|
||||
#define BGP_mplsvpn_notif_enable_true 1
|
||||
#define BGP_mplsvpn_notif_enable_false 2
|
||||
|
||||
static uint8_t bgp_mplsvpn_notif_enable = SNMP_FALSE;
|
||||
|
||||
/* MPLSL3VPN MIB described in RFC4382 */
|
||||
#define MPLSL3VPNMIB 1, 3, 6, 1, 2, 1, 10, 166, 11
|
||||
|
||||
/* MPLSL3VPN Scalars */
|
||||
#define MPLSL3VPNCONFIGUREDVRFS 1
|
||||
#define MPLSL3VPNACTIVEVRFS 2
|
||||
#define MPLSL3VPNCONNECTEDINTERFACES 3
|
||||
#define MPLSL3VPNNOTIFICATIONENABLE 4
|
||||
#define MPLSL3VPNCONFMAXPOSSRTS 5
|
||||
#define MPLSL3VPNVRFCONFRTEMXTHRSHTIME 6
|
||||
#define MPLSL3VPNILLLBLRCVTHRSH 7
|
||||
|
||||
/* SNMP value hack. */
|
||||
#define INTEGER ASN_INTEGER
|
||||
#define INTEGER32 ASN_INTEGER
|
||||
#define COUNTER32 ASN_COUNTER
|
||||
#define OCTET_STRING ASN_OCTET_STR
|
||||
#define IPADDRESS ASN_IPADDRESS
|
||||
#define GAUGE32 ASN_UNSIGNED
|
||||
|
||||
/* Declare static local variables for convenience. */
|
||||
SNMP_LOCAL_VARIABLES
|
||||
|
||||
/* BGP-MPLS-MIB innstances */
|
||||
static oid mpls_l3vpn_oid[] = {MPLSL3VPNMIB};
|
||||
|
||||
static uint8_t *mplsL3vpnConfiguredVrfs(struct variable *, oid[], size_t *, int,
|
||||
size_t *, WriteMethod **);
|
||||
|
||||
static uint8_t *mplsL3vpnActiveVrfs(struct variable *, oid[], size_t *, int,
|
||||
size_t *, WriteMethod **);
|
||||
|
||||
static uint8_t *mplsL3vpnConnectedInterfaces(struct variable *, oid[], size_t *,
|
||||
int, size_t *, WriteMethod **);
|
||||
|
||||
static uint8_t *mplsL3vpnNotificationEnable(struct variable *, oid[], size_t *,
|
||||
int, size_t *, WriteMethod **);
|
||||
|
||||
static uint8_t *mplsL3vpnVrfConfMaxPossRts(struct variable *, oid[], size_t *,
|
||||
int, size_t *, WriteMethod **);
|
||||
|
||||
static uint8_t *mplsL3vpnVrfConfRteMxThrshTime(struct variable *, oid[],
|
||||
size_t *, int, size_t *,
|
||||
WriteMethod **);
|
||||
|
||||
static uint8_t *mplsL3vpnIllLblRcvThrsh(struct variable *, oid[], size_t *, int,
|
||||
size_t *, WriteMethod **);
|
||||
|
||||
static struct variable mpls_l3vpn_variables[] = {
|
||||
/* BGP version. */
|
||||
{MPLSL3VPNCONFIGUREDVRFS,
|
||||
GAUGE32,
|
||||
RONLY,
|
||||
mplsL3vpnConfiguredVrfs,
|
||||
3,
|
||||
{1, 1, 1} },
|
||||
{MPLSL3VPNACTIVEVRFS,
|
||||
GAUGE32,
|
||||
RONLY,
|
||||
mplsL3vpnActiveVrfs,
|
||||
3,
|
||||
{1, 1, 2} },
|
||||
{MPLSL3VPNCONNECTEDINTERFACES,
|
||||
GAUGE32,
|
||||
RONLY,
|
||||
mplsL3vpnConnectedInterfaces,
|
||||
3,
|
||||
{1, 1, 3} },
|
||||
{MPLSL3VPNNOTIFICATIONENABLE,
|
||||
INTEGER,
|
||||
RWRITE,
|
||||
mplsL3vpnNotificationEnable,
|
||||
3,
|
||||
{1, 1, 4} },
|
||||
{MPLSL3VPNCONFMAXPOSSRTS,
|
||||
GAUGE32,
|
||||
RONLY,
|
||||
mplsL3vpnVrfConfMaxPossRts,
|
||||
3,
|
||||
{1, 1, 5} },
|
||||
{MPLSL3VPNVRFCONFRTEMXTHRSHTIME,
|
||||
GAUGE32,
|
||||
RONLY,
|
||||
mplsL3vpnVrfConfRteMxThrshTime,
|
||||
3,
|
||||
{1, 1, 6} },
|
||||
{MPLSL3VPNILLLBLRCVTHRSH,
|
||||
GAUGE32,
|
||||
RONLY,
|
||||
mplsL3vpnIllLblRcvThrsh,
|
||||
3,
|
||||
{1, 1, 7} },
|
||||
|
||||
};
|
||||
|
||||
static uint8_t *mplsL3vpnConfiguredVrfs(struct variable *v, oid name[],
|
||||
size_t *length, int exact,
|
||||
size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
struct listnode *node, *nnode;
|
||||
struct bgp *bgp;
|
||||
uint32_t count = 0;
|
||||
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
|
||||
if (is_bgp_vrf_mplsvpn(bgp))
|
||||
count++;
|
||||
}
|
||||
return SNMP_INTEGER(count);
|
||||
}
|
||||
|
||||
static uint8_t *mplsL3vpnActiveVrfs(struct variable *v, oid name[],
|
||||
size_t *length, int exact, size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
struct listnode *node, *nnode;
|
||||
struct bgp *bgp;
|
||||
uint32_t count = 0;
|
||||
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
|
||||
if (is_bgp_vrf_mplsvpn(bgp) && is_bgp_vrf_active(bgp))
|
||||
count++;
|
||||
}
|
||||
return SNMP_INTEGER(count);
|
||||
}
|
||||
|
||||
static uint8_t *mplsL3vpnConnectedInterfaces(struct variable *v, oid name[],
|
||||
size_t *length, int exact,
|
||||
size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
struct listnode *node, *nnode;
|
||||
struct bgp *bgp;
|
||||
uint32_t count = 0;
|
||||
struct vrf *vrf;
|
||||
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
|
||||
if (is_bgp_vrf_mplsvpn(bgp)) {
|
||||
vrf = vrf_lookup_by_name(bgp->name);
|
||||
if (vrf == NULL)
|
||||
continue;
|
||||
|
||||
count += vrf_interface_count(vrf);
|
||||
}
|
||||
}
|
||||
|
||||
return SNMP_INTEGER(count);
|
||||
}
|
||||
|
||||
static int write_mplsL3vpnNotificationEnable(int action, uint8_t *var_val,
|
||||
uint8_t var_val_type,
|
||||
size_t var_val_len, uint8_t *statP,
|
||||
oid *name, size_t length)
|
||||
{
|
||||
uint32_t intval;
|
||||
|
||||
zlog_debug("PJDR: %s", __func__);
|
||||
if (var_val_type != ASN_INTEGER) {
|
||||
return SNMP_ERR_WRONGTYPE;
|
||||
}
|
||||
|
||||
if (var_val_len != sizeof(long)) {
|
||||
return SNMP_ERR_WRONGLENGTH;
|
||||
}
|
||||
|
||||
intval = *(long *)var_val;
|
||||
bgp_mplsvpn_notif_enable = intval;
|
||||
return SNMP_ERR_NOERROR;
|
||||
}
|
||||
|
||||
static uint8_t *mplsL3vpnNotificationEnable(struct variable *v, oid name[],
|
||||
size_t *length, int exact,
|
||||
size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
zlog_debug("PJDR: %s", __func__);
|
||||
*write_method = write_mplsL3vpnNotificationEnable;
|
||||
return SNMP_INTEGER(bgp_mplsvpn_notif_enable);
|
||||
}
|
||||
|
||||
static uint8_t *mplsL3vpnVrfConfMaxPossRts(struct variable *v, oid name[],
|
||||
size_t *length, int exact,
|
||||
size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
return SNMP_INTEGER(0);
|
||||
}
|
||||
|
||||
static uint8_t *mplsL3vpnVrfConfRteMxThrshTime(struct variable *v, oid name[],
|
||||
size_t *length, int exact,
|
||||
size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
return SNMP_INTEGER(0);
|
||||
}
|
||||
|
||||
static uint8_t *mplsL3vpnIllLblRcvThrsh(struct variable *v, oid name[],
|
||||
size_t *length, int exact,
|
||||
size_t *var_len,
|
||||
WriteMethod **write_method)
|
||||
{
|
||||
if (smux_header_generic(v, name, length, exact, var_len, write_method)
|
||||
== MATCH_FAILED)
|
||||
return NULL;
|
||||
|
||||
return SNMP_INTEGER(0);
|
||||
}
|
||||
|
||||
|
||||
void bgp_mpls_l3vpn_module_init(void)
|
||||
{
|
||||
REGISTER_MIB("mplsL3VpnMIB", mpls_l3vpn_variables, variable,
|
||||
mpls_l3vpn_oid);
|
||||
}
|
||||
21
bgpd/bgp_mplsvpn_snmp.h
Normal file
21
bgpd/bgp_mplsvpn_snmp.h
Normal file
@ -0,0 +1,21 @@
|
||||
/* MPLS/BGP L3VPN MIB
|
||||
* Copyright (C) 2020 Volta Networks Inc
|
||||
*
|
||||
* This file is part of FRR.
|
||||
*
|
||||
* FRRouting is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2, or (at your option) any
|
||||
* later version.
|
||||
*
|
||||
* FRRouting is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
void bgp_mpls_l3vpn_module_init(void);
|
||||
@ -40,6 +40,7 @@
|
||||
#include "bgpd/bgp_attr.h"
|
||||
#include "bgpd/bgp_route.h"
|
||||
#include "bgpd/bgp_fsm.h"
|
||||
#include "bgpd/bgp_mplsvpn_snmp.h"
|
||||
|
||||
/* BGP4-MIB described in RFC1657. */
|
||||
#define BGP4MIB 1,3,6,1,2,1,15
|
||||
@ -898,6 +899,7 @@ static int bgp_snmp_init(struct thread_master *tm)
|
||||
{
|
||||
smux_init(tm);
|
||||
REGISTER_MIB("mibII/bgp", bgp_variables, variable, bgp_oid);
|
||||
bgp_mpls_l3vpn_module_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -167,6 +167,7 @@ noinst_HEADERS += \
|
||||
bgpd/bgp_memory.h \
|
||||
bgpd/bgp_mpath.h \
|
||||
bgpd/bgp_mplsvpn.h \
|
||||
bgpd/bgp_mplsvpn_snmp.h \
|
||||
bgpd/bgp_network.h \
|
||||
bgpd/bgp_nexthop.h \
|
||||
bgpd/bgp_nht.h \
|
||||
@ -218,7 +219,7 @@ bgpd_bgp_btoa_CFLAGS = $(AM_CFLAGS)
|
||||
bgpd_bgpd_LDADD = bgpd/libbgp.a $(RFPLDADD) lib/libfrr.la $(LIBCAP) $(LIBM) $(UST_LIBS)
|
||||
bgpd_bgp_btoa_LDADD = bgpd/libbgp.a $(RFPLDADD) lib/libfrr.la $(LIBCAP) $(LIBM) $(UST_LIBS)
|
||||
|
||||
bgpd_bgpd_snmp_la_SOURCES = bgpd/bgp_snmp.c
|
||||
bgpd_bgpd_snmp_la_SOURCES = bgpd/bgp_snmp.c bgpd/bgp_mplsvpn_snmp.c
|
||||
bgpd_bgpd_snmp_la_CFLAGS = $(WERROR) $(SNMP_CFLAGS) -std=gnu99
|
||||
bgpd_bgpd_snmp_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
|
||||
bgpd_bgpd_snmp_la_LIBADD = lib/libfrrsnmp.la
|
||||
|
||||
Loading…
Reference in New Issue
Block a user