📄 bgp_snmp.c
字号:
/* BGP4 SNMP support Copyright (C) 1999, 2000 Kunihiro IshiguroThis file is part of GNU Zebra.GNU Zebra is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by theFree Software Foundation; either version 2, or (at your option) anylater version.GNU Zebra is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Zebra; see the file COPYING. If not, write to the FreeSoftware Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA02111-1307, USA. */#include <zebra.h>#ifdef HAVE_SNMP#include <asn1.h>#include <snmp.h>#include <snmp_impl.h>#include "if.h"#include "log.h"#include "prefix.h"#include "command.h"#include "thread.h"#include "smux.h"#include "bgpd/bgpd.h"#include "bgpd/bgp_table.h"#include "bgpd/bgp_aspath.h"#include "bgpd/bgp_attr.h"#include "bgpd/bgp_route.h"#include "bgpd/bgp_fsm.h"/* BGP4-MIB described in RFC1657. */#define BGP4MIB 1,3,6,1,2,1,15/* BGP TRAP. */#define BGPESTABLISHED 1#define BGPBACKWARDTRANSITION 2 /* Zebra enterprise BGP MIB. This variable is used for register OSPF MIB to SNMP agent under SMUX protocol. */#define BGPDMIB 1,3,6,1,4,1,3317,1,2,2/* BGP MIB bgpVersion. */#define BGPVERSION 0/* BGP MIB bgpLocalAs. */#define BGPLOCALAS 0/* BGP MIB bgpPeerTable. */#define BGPPEERIDENTIFIER 1#define BGPPEERSTATE 2#define BGPPEERADMINSTATUS 3#define BGPPEERNEGOTIATEDVERSION 4#define BGPPEERLOCALADDR 5#define BGPPEERLOCALPORT 6#define BGPPEERREMOTEADDR 7#define BGPPEERREMOTEPORT 8#define BGPPEERREMOTEAS 9#define BGPPEERINUPDATES 10#define BGPPEEROUTUPDATES 11#define BGPPEERINTOTALMESSAGES 12#define BGPPEEROUTTOTALMESSAGES 13#define BGPPEERLASTERROR 14#define BGPPEERFSMESTABLISHEDTRANSITIONS 15#define BGPPEERFSMESTABLISHEDTIME 16#define BGPPEERCONNECTRETRYINTERVAL 17#define BGPPEERHOLDTIME 18#define BGPPEERKEEPALIVE 19#define BGPPEERHOLDTIMECONFIGURED 20#define BGPPEERKEEPALIVECONFIGURED 21#define BGPPEERMINASORIGINATIONINTERVAL 22#define BGPPEERMINROUTEADVERTISEMENTINTERVAL 23#define BGPPEERINUPDATEELAPSEDTIME 24/* BGP MIB bgpIdentifier. */#define BGPIDENTIFIER 0/* BGP MIB bgpRcvdPathAttrTable */#define BGPPATHATTRPEER 1#define BGPPATHATTRDESTNETWORK 2#define BGPPATHATTRORIGIN 3#define BGPPATHATTRASPATH 4#define BGPPATHATTRNEXTHOP 5#define BGPPATHATTRINTERASMETRIC 6/* BGP MIB bgp4PathAttrTable. */#define BGP4PATHATTRPEER 1#define BGP4PATHATTRIPADDRPREFIXLEN 2#define BGP4PATHATTRIPADDRPREFIX 3#define BGP4PATHATTRORIGIN 4#define BGP4PATHATTRASPATHSEGMENT 5#define BGP4PATHATTRNEXTHOP 6#define BGP4PATHATTRMULTIEXITDISC 7#define BGP4PATHATTRLOCALPREF 8#define BGP4PATHATTRATOMICAGGREGATE 9#define BGP4PATHATTRAGGREGATORAS 10#define BGP4PATHATTRAGGREGATORADDR 11#define BGP4PATHATTRCALCLOCALPREF 12#define BGP4PATHATTRBEST 13#define BGP4PATHATTRUNKNOWN 14/* 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-MIB instances. */oid bgp_oid [] = { BGP4MIB };oid bgpd_oid [] = { BGPDMIB };/* IP address 0.0.0.0. */static struct in_addr bgp_empty_addr = {0};/* Hook functions. */static u_char *bgpVersion ();static u_char *bgpLocalAs ();static u_char *bgpPeerTable ();static u_char *bgpRcvdPathAttrTable ();static u_char *bgpIdentifier ();static u_char *bgp4PathAttrTable ();/* static u_char *bgpTraps (); */struct variable bgp_variables[] = { /* BGP version. */ {BGPVERSION, OCTET_STRING, RONLY, bgpVersion, 1, {1}}, /* BGP local AS. */ {BGPLOCALAS, INTEGER, RONLY, bgpLocalAs, 1, {2}}, /* BGP peer table. */ {BGPPEERIDENTIFIER, IPADDRESS, RONLY, bgpPeerTable, 3, {3, 1, 1}}, {BGPPEERSTATE, INTEGER, RONLY, bgpPeerTable, 3, {3, 1, 2}}, {BGPPEERADMINSTATUS, INTEGER, RWRITE, bgpPeerTable, 3, {3, 1, 3}}, {BGPPEERNEGOTIATEDVERSION, INTEGER32, RONLY, bgpPeerTable, 3, {3, 1, 4}}, {BGPPEERLOCALADDR, IPADDRESS, RONLY, bgpPeerTable, 3, {3, 1, 5}}, {BGPPEERLOCALPORT, INTEGER, RONLY, bgpPeerTable, 3, {3, 1, 6}}, {BGPPEERREMOTEADDR, IPADDRESS, RONLY, bgpPeerTable, 3, {3, 1, 7}}, {BGPPEERREMOTEPORT, INTEGER, RONLY, bgpPeerTable, 3, {3, 1, 8}}, {BGPPEERREMOTEAS, INTEGER, RONLY, bgpPeerTable, 3, {3, 1, 9}}, {BGPPEERINUPDATES, COUNTER32, RONLY, bgpPeerTable, 3, {3, 1, 10}}, {BGPPEEROUTUPDATES, COUNTER32, RONLY, bgpPeerTable, 3, {3, 1, 11}}, {BGPPEERINTOTALMESSAGES, COUNTER32, RONLY, bgpPeerTable, 3, {3, 1, 12}}, {BGPPEEROUTTOTALMESSAGES, COUNTER32, RONLY, bgpPeerTable, 3, {3, 1, 13}}, {BGPPEERLASTERROR, OCTET_STRING, RONLY, bgpPeerTable, 3, {3, 1, 14}}, {BGPPEERFSMESTABLISHEDTRANSITIONS, COUNTER32, RONLY, bgpPeerTable, 3, {3, 1, 15}}, {BGPPEERFSMESTABLISHEDTIME, GAUGE32, RONLY, bgpPeerTable, 3, {3, 1, 16}}, {BGPPEERCONNECTRETRYINTERVAL, INTEGER, RWRITE, bgpPeerTable, 3, {3, 1, 17}}, {BGPPEERHOLDTIME, INTEGER, RONLY, bgpPeerTable, 3, {3, 1, 18}}, {BGPPEERKEEPALIVE, INTEGER, RONLY, bgpPeerTable, 3, {3, 1, 19}}, {BGPPEERHOLDTIMECONFIGURED, INTEGER, RWRITE, bgpPeerTable, 3, {3, 1, 20}}, {BGPPEERKEEPALIVECONFIGURED, INTEGER, RWRITE, bgpPeerTable, 3, {3, 1, 21}}, {BGPPEERMINASORIGINATIONINTERVAL, INTEGER, RWRITE, bgpPeerTable, 3, {3, 1, 22}}, {BGPPEERMINROUTEADVERTISEMENTINTERVAL, INTEGER, RWRITE, bgpPeerTable, 3, {3, 1, 23}}, {BGPPEERINUPDATEELAPSEDTIME, GAUGE32, RONLY, bgpPeerTable, 3, {3, 1, 24}}, /* BGP identifier. */ {BGPIDENTIFIER, IPADDRESS, RONLY, bgpIdentifier, 1, {4}}, /* BGP received path attribute table. */ {BGPPATHATTRPEER, IPADDRESS, RONLY, bgpRcvdPathAttrTable, 3, {5, 1, 1}}, {BGPPATHATTRDESTNETWORK, IPADDRESS, RONLY, bgpRcvdPathAttrTable, 3, {5, 1, 2}}, {BGPPATHATTRORIGIN, INTEGER, RONLY, bgpRcvdPathAttrTable, 3, {5, 1, 3}}, {BGPPATHATTRASPATH, OCTET_STRING, RONLY, bgpRcvdPathAttrTable, 3, {5, 1, 4}}, {BGPPATHATTRNEXTHOP, IPADDRESS, RONLY, bgpRcvdPathAttrTable, 3, {5, 1, 5}}, {BGPPATHATTRINTERASMETRIC, INTEGER32, RONLY, bgpRcvdPathAttrTable, 3, {5, 1, 6}}, /* BGP-4 received path attribute table. */ {BGP4PATHATTRPEER, IPADDRESS, RONLY, bgp4PathAttrTable, 3, {6, 1, 1}}, {BGP4PATHATTRIPADDRPREFIXLEN, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 2}}, {BGP4PATHATTRIPADDRPREFIX, IPADDRESS, RONLY, bgp4PathAttrTable, 3, {6, 1, 3}}, {BGP4PATHATTRORIGIN, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 4}}, {BGP4PATHATTRASPATHSEGMENT, OCTET_STRING, RONLY, bgp4PathAttrTable, 3, {6, 1, 5}}, {BGP4PATHATTRNEXTHOP, IPADDRESS, RONLY, bgp4PathAttrTable, 3, {6, 1, 6}}, {BGP4PATHATTRMULTIEXITDISC, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 7}}, {BGP4PATHATTRLOCALPREF, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 8}}, {BGP4PATHATTRATOMICAGGREGATE, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 9}}, {BGP4PATHATTRAGGREGATORAS, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 10}}, {BGP4PATHATTRAGGREGATORADDR, IPADDRESS, RONLY, bgp4PathAttrTable, 3, {6, 1, 11}}, {BGP4PATHATTRCALCLOCALPREF, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 12}}, {BGP4PATHATTRBEST, INTEGER, RONLY, bgp4PathAttrTable, 3, {6, 1, 13}}, {BGP4PATHATTRUNKNOWN, OCTET_STRING, RONLY, bgp4PathAttrTable, 3, {6, 1, 14}},};static u_char *bgpVersion (struct variable *v, oid name[], size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ static u_char version; if (smux_header_generic(v, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; /* Retrun BGP version. Zebra bgpd only support version 4. */ version = (0x80 >> (BGP_VERSION_4 - 1)); /* Return octet string length 1. */ *var_len = 1; return (u_char *)&version;}static u_char *bgpLocalAs (struct variable *v, oid name[], size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ struct bgp *bgp; if (smux_header_generic(v, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; /* Get BGP structure. */ bgp = bgp_get_default (); if (! bgp) return NULL; return SNMP_INTEGER (bgp->as);}struct peer *peer_lookup_addr_ipv4 (struct in_addr *src){ struct bgp *bgp; struct peer *peer; struct listnode *nn; struct in_addr addr; int ret; bgp = bgp_get_default (); if (! bgp) return NULL; LIST_LOOP (bgp->peer, peer, nn) { ret = inet_pton (AF_INET, peer->host, &addr); if (ret > 0) { if (IPV4_ADDR_SAME (&addr, src)) return peer; } } return NULL;}struct peer *bgp_peer_lookup_next (struct in_addr *src){ struct bgp *bgp; struct peer *peer; struct listnode *nn; struct in_addr *p; union sockunion su; int ret; memset (&su, 0, sizeof (union sockunion)); bgp = bgp_get_default (); if (! bgp) return NULL; LIST_LOOP (bgp->peer, peer, nn) { ret = inet_pton (AF_INET, peer->host, &su.sin.sin_addr); if (ret > 0) { p = &su.sin.sin_addr; if (ntohl (p->s_addr) > ntohl (src->s_addr)) { src->s_addr = p->s_addr; return peer; } } } return NULL;}struct peer *bgpPeerTable_lookup (struct variable *v, oid name[], size_t *length, struct in_addr *addr, int exact){ struct peer *peer = NULL; int len; if (exact) { /* Check the length. */ if (*length - v->namelen != sizeof (struct in_addr)) return NULL; oid2in_addr (name + v->namelen, IN_ADDR_SIZE, addr); peer = peer_lookup_addr_ipv4 (addr); return peer; } else { len = *length - v->namelen; if (len > 4) len = 4; oid2in_addr (name + v->namelen, len, addr); peer = bgp_peer_lookup_next (addr); if (peer == NULL) return NULL; oid_copy_addr (name + v->namelen, addr, sizeof (struct in_addr)); *length = sizeof (struct in_addr) + v->namelen; return peer; } return NULL;}/* BGP write methods. */intwrite_bgpPeerTable (int action, u_char *var_val, u_char var_val_type, size_t var_val_len, u_char *statP, oid *name, size_t length, struct variable *v){ struct in_addr addr; struct peer *peer; long intval; int bigsize = SNMP_MAX_LEN; if (var_val_type != ASN_INTEGER) { return SNMP_ERR_WRONGTYPE; } if (var_val_len != sizeof (long)) { return SNMP_ERR_WRONGLENGTH; } if (! asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(long))) { return SNMP_ERR_WRONGENCODING; } memset (&addr, 0, sizeof (struct in_addr)); peer = bgpPeerTable_lookup (v, name, &length, &addr, 1); if (! peer) return SNMP_ERR_NOSUCHNAME; printf ("val: %ld\n", intval); switch (v->magic) { case BGPPEERADMINSTATUS:#define BGP_PeerAdmin_stop 1#define BGP_PeerAdmin_start 2 /* When the peer is established, */ if (intval == BGP_PeerAdmin_stop) BGP_EVENT_ADD (peer, BGP_Stop); else if (intval == BGP_PeerAdmin_start) ; /* Do nothing. */ else return SNMP_ERR_NOSUCHNAME; break; case BGPPEERCONNECTRETRYINTERVAL: SET_FLAG (peer->config, PEER_CONFIG_CONNECT); peer->connect = intval; peer->v_connect = intval; break; case BGPPEERHOLDTIMECONFIGURED: SET_FLAG (peer->config, PEER_CONFIG_TIMER); peer->holdtime = intval; peer->v_holdtime = intval; break; case BGPPEERKEEPALIVECONFIGURED: SET_FLAG (peer->config, PEER_CONFIG_TIMER); peer->keepalive = intval; peer->v_keepalive = intval; break; case BGPPEERMINASORIGINATIONINTERVAL: peer->v_asorig = intval; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -