⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bgp_snmp.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -