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

📄 bgp_snmp.c

📁 大名鼎鼎的路由器源码。程序分ZEBRA、OSPFRIP等3个包。程序框架采用一个路由协议一个进程的方式
💻 C
📖 第 1 页 / 共 2 页
字号:
    case BGPPEERMINROUTEADVERTISEMENTINTERVAL:      peer->v_routeadv = intval;      break;    }  return SNMP_ERR_NOERROR;}u_char *bgpPeerTable (struct variable *v, oid name[], size_t *length,	      int exact, size_t *var_len, WriteMethod **write_method){  static struct in_addr addr;  struct peer *peer;  *write_method = NULL;  memset (&addr, 0, sizeof (struct in_addr));  peer = bgpPeerTable_lookup (v, name, length, &addr, exact);  if (! peer)    return NULL;  switch (v->magic)    {    case BGPPEERIDENTIFIER:      return SNMP_IPADDRESS (peer->remote_id);      break;    case BGPPEERSTATE:      return SNMP_INTEGER (peer->status);      break;    case BGPPEERADMINSTATUS:      *write_method = write_bgpPeerTable;#define BGP_PeerAdmin_stop  1#define BGP_PeerAdmin_start 2      if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))	return SNMP_INTEGER (BGP_PeerAdmin_stop);      else	return SNMP_INTEGER (BGP_PeerAdmin_start);      break;    case BGPPEERNEGOTIATEDVERSION:      return SNMP_INTEGER (peer->version);      break;    case BGPPEERLOCALADDR:      if (peer->su_local)	return SNMP_IPADDRESS (peer->su_local->sin.sin_addr);      else	return SNMP_IPADDRESS (bgp_empty_addr);      break;    case BGPPEERLOCALPORT:      if (peer->su_local)	return SNMP_INTEGER (ntohs (peer->su_local->sin.sin_port));      else	return SNMP_INTEGER (0);      break;    case BGPPEERREMOTEADDR:      if (peer->su_remote)	return SNMP_IPADDRESS (peer->su_remote->sin.sin_addr);      else	return SNMP_IPADDRESS (bgp_empty_addr);      break;    case BGPPEERREMOTEPORT:      if (peer->su_remote)	return SNMP_INTEGER (ntohs (peer->su_remote->sin.sin_port));      else	return SNMP_INTEGER (0);      break;    case BGPPEERREMOTEAS:      return SNMP_INTEGER (peer->as);      break;    case BGPPEERINUPDATES:      return SNMP_INTEGER (peer->update_in);      break;    case BGPPEEROUTUPDATES:      return SNMP_INTEGER (peer->update_out);      break;    case BGPPEERINTOTALMESSAGES:      return SNMP_INTEGER (peer->open_in + peer->update_in			   + peer->keepalive_in + peer->notify_in			   + peer->refresh_in + peer->dynamic_cap_in);      break;    case BGPPEEROUTTOTALMESSAGES:      return SNMP_INTEGER (peer->open_out + peer->update_out			   + peer->keepalive_out + peer->notify_out			   + peer->refresh_out + peer->dynamic_cap_out);      break;    case BGPPEERLASTERROR:      {	static u_char lasterror[2];	lasterror[0] = peer->notify.code;	lasterror[1] = peer->notify.subcode;	*var_len = 2;	return (u_char *)&lasterror;      }      break;    case BGPPEERFSMESTABLISHEDTRANSITIONS:      return SNMP_INTEGER (peer->established);      break;    case BGPPEERFSMESTABLISHEDTIME:      if (peer->uptime == 0)	return SNMP_INTEGER (0);      else	return SNMP_INTEGER (time (NULL) - peer->uptime);      break;    case BGPPEERCONNECTRETRYINTERVAL:      *write_method = write_bgpPeerTable;      return SNMP_INTEGER (peer->v_connect);      break;    case BGPPEERHOLDTIME:      return SNMP_INTEGER (peer->v_holdtime);      break;    case BGPPEERKEEPALIVE:      return SNMP_INTEGER (peer->v_keepalive);      break;    case BGPPEERHOLDTIMECONFIGURED:      *write_method = write_bgpPeerTable;      if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))	return SNMP_INTEGER (peer->holdtime);      else	return SNMP_INTEGER (peer->v_holdtime);      break;    case BGPPEERKEEPALIVECONFIGURED:      *write_method = write_bgpPeerTable;      if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))	return SNMP_INTEGER (peer->keepalive);      else	return SNMP_INTEGER (peer->v_keepalive);      break;    case BGPPEERMINASORIGINATIONINTERVAL:      *write_method = write_bgpPeerTable;      return SNMP_INTEGER (peer->v_asorig);      break;    case BGPPEERMINROUTEADVERTISEMENTINTERVAL:      *write_method = write_bgpPeerTable;      return SNMP_INTEGER (peer->v_routeadv);      break;    case BGPPEERINUPDATEELAPSEDTIME:      if (peer->update_time == 0)	return SNMP_INTEGER (0);      else	return SNMP_INTEGER (time (NULL) - peer->update_time);      break;    default:      return NULL;      break;    }    return NULL;}u_char *bgpIdentifier (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;  bgp = bgp_get_default ();  if (!bgp)    return NULL;  return SNMP_IPADDRESS (bgp->router_id);}u_char *bgpRcvdPathAttrTable (struct variable *v, oid name[], size_t *length,		      int exact, size_t *var_len, WriteMethod **write_method){  /* Received Path Attribute Table.  This table contains, one entry     per path to a network, path attributes received from all peers     running BGP version 3 or less.  This table is obsolete, having     been replaced in functionality with the bgp4PathAttrTable.  */  return NULL;}struct bgp_info *bgp4PathAttrLookup (struct variable *v, oid name[], size_t *length,		    struct bgp *bgp, struct prefix_ipv4 *addr, int exact){  oid *offset;  int offsetlen;  struct bgp_info *binfo;  struct bgp_info *min;  struct bgp_node *rn;  union sockunion su;  int len;  struct in_addr paddr;#define BGP_PATHATTR_ENTRY_OFFSET \          (IN_ADDR_SIZE + 1 + IN_ADDR_SIZE)  if (exact)    {      if (*length - v->namelen != BGP_PATHATTR_ENTRY_OFFSET)	return NULL;      /* Set OID offset for prefix. */      offset = name + v->namelen;      oid2in_addr (offset, IN_ADDR_SIZE, &addr->prefix);      offset += IN_ADDR_SIZE;      /* Prefix length. */      addr->prefixlen = *offset;      offset++;      /* Peer address. */      su.sin.sin_family = AF_INET;      oid2in_addr (offset, IN_ADDR_SIZE, &su.sin.sin_addr);      /* Lookup node. */      rn = bgp_node_lookup (bgp->rib[AFI_IP][SAFI_UNICAST], 			      (struct prefix *) addr);      if (rn)	{	  bgp_unlock_node (rn);	  for (binfo = rn->info; binfo; binfo = binfo->next)	    if (sockunion_same (&binfo->peer->su, &su))	      return binfo;	}    }  else    {      offset = name + v->namelen;      offsetlen = *length - v->namelen;      len = offsetlen;      if (offsetlen == 0)	rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_UNICAST]);      else	{	  if (len > IN_ADDR_SIZE)	    len = IN_ADDR_SIZE;      	  oid2in_addr (offset, len, &addr->prefix);	  offset += IN_ADDR_SIZE;	  offsetlen -= IN_ADDR_SIZE;	  if (offsetlen > 0)	    addr->prefixlen = *offset;	  else	    addr->prefixlen = len * 8;	  rn = bgp_node_get (bgp->rib[AFI_IP][SAFI_UNICAST],			       (struct prefix *) addr);	  offset++;	  offsetlen--;	}      if (offsetlen > 0)	{	  len = offsetlen;	  if (len > IN_ADDR_SIZE)	    len = IN_ADDR_SIZE;	  oid2in_addr (offset, len, &paddr);	}      else	paddr.s_addr = 0;      if (! rn)	return NULL;      do	{	  min = NULL;	  for (binfo = rn->info; binfo; binfo = binfo->next)	    {	      if (binfo->peer->su.sin.sin_family == AF_INET		  && ntohl (paddr.s_addr) 		  < ntohl (binfo->peer->su.sin.sin_addr.s_addr))		{		  if (min)		    {		      if (ntohl (binfo->peer->su.sin.sin_addr.s_addr) 			  < ntohl (min->peer->su.sin.sin_addr.s_addr))			min = binfo;		    }		  else		    min = binfo;		}	    }	  if (min)	    {	      *length = v->namelen + BGP_PATHATTR_ENTRY_OFFSET;	      offset = name + v->namelen;	      oid_copy_addr (offset, &rn->p.u.prefix4, IN_ADDR_SIZE);	      offset += IN_ADDR_SIZE;	      *offset = rn->p.prefixlen;	      offset++;	      oid_copy_addr (offset, &min->peer->su.sin.sin_addr, 			     IN_ADDR_SIZE);	      addr->prefix = rn->p.u.prefix4;	      addr->prefixlen = rn->p.prefixlen;	      bgp_unlock_node (rn);	      return min;	    }	  paddr.s_addr = 0;	}      while ((rn = bgp_route_next (rn)) != NULL);    }  return NULL;}u_char *bgp4PathAttrTable (struct variable *v, oid name[], size_t *length,		   int exact, size_t *var_len, WriteMethod **write_method){  struct bgp *bgp;  struct bgp_info *binfo;  struct prefix_ipv4 addr;    bgp = bgp_get_default ();  if (! bgp)    return NULL;  memset (&addr, 0, sizeof (struct prefix_ipv4));  binfo = bgp4PathAttrLookup (v, name, length, bgp, &addr, exact);  if (! binfo)    return NULL;  switch (v->magic)    {    case BGP4PATHATTRPEER:	/* 1 */      return SNMP_IPADDRESS (binfo->peer->su.sin.sin_addr);      break;    case BGP4PATHATTRIPADDRPREFIXLEN: /* 2 */      return SNMP_INTEGER (addr.prefixlen);      break;    case BGP4PATHATTRIPADDRPREFIX: /* 3 */      return SNMP_IPADDRESS (addr.prefix);      break;    case BGP4PATHATTRORIGIN:	/* 4 */      return SNMP_INTEGER (binfo->attr->origin);      break;    case BGP4PATHATTRASPATHSEGMENT: /* 5 */      *var_len = binfo->attr->aspath->length;      return (u_char *) binfo->attr->aspath->data;      break;    case BGP4PATHATTRNEXTHOP:	/* 6 */      return SNMP_IPADDRESS (binfo->attr->nexthop);      break;    case BGP4PATHATTRMULTIEXITDISC: /* 7 */      return SNMP_INTEGER (binfo->attr->med);      break;    case BGP4PATHATTRLOCALPREF:	/* 8 */      return SNMP_INTEGER (binfo->attr->local_pref);      break;    case BGP4PATHATTRATOMICAGGREGATE: /* 9 */      return SNMP_INTEGER (1);      break;    case BGP4PATHATTRAGGREGATORAS: /* 10 */      return SNMP_INTEGER (binfo->attr->aggregator_as);      break;    case BGP4PATHATTRAGGREGATORADDR: /* 11 */      return SNMP_IPADDRESS (binfo->attr->aggregator_addr);      break;    case BGP4PATHATTRCALCLOCALPREF: /* 12 */      return SNMP_INTEGER (-1);      break;    case BGP4PATHATTRBEST:	/* 13 */#define BGP4_PathAttrBest_false 1#define BGP4_PathAttrBest_true  2      if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))	return SNMP_INTEGER (BGP4_PathAttrBest_true);      else	return SNMP_INTEGER (BGP4_PathAttrBest_false);      break;    case BGP4PATHATTRUNKNOWN:	/* 14 */      *var_len = 0;      return NULL;      break;    }  return NULL;}/* BGP Traps. */struct trap_object bgpTrapList[] ={  {bgpPeerTable, 3, {3, 1, BGPPEERLASTERROR}},  {bgpPeerTable, 3, {3, 1, BGPPEERSTATE}}};voidbgpTrapEstablished (struct peer *peer){  int ret;  struct in_addr addr;  oid index[sizeof (oid) * IN_ADDR_SIZE];  ret = inet_aton (peer->host, &addr);  if (ret == 0)    return;  oid_copy_addr (index, &addr, IN_ADDR_SIZE);  smux_trap (bgp_oid, sizeof bgp_oid / sizeof (oid),	     index, IN_ADDR_SIZE,	     bgpTrapList, sizeof bgpTrapList / sizeof (struct trap_object),	     bm->start_time - time (NULL), BGPESTABLISHED);}voidbgpTrapBackwardTransition (struct peer *peer){  int ret;  struct in_addr addr;  oid index[sizeof (oid) * IN_ADDR_SIZE];  ret = inet_aton (peer->host, &addr);  if (ret == 0)    return;  oid_copy_addr (index, &addr, IN_ADDR_SIZE);  smux_trap (bgp_oid, sizeof bgp_oid / sizeof (oid),	     index, IN_ADDR_SIZE,	     bgpTrapList, sizeof bgpTrapList / sizeof (struct trap_object),	     bm->start_time - time (NULL), BGPBACKWARDTRANSITION);}voidbgp_snmp_init (){  smux_init (bgpd_oid, sizeof bgpd_oid / sizeof (oid));  REGISTER_MIB("mibII/bgp", bgp_variables, variable, bgp_oid);  smux_start ();}#endif /* HAVE_SNMP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -