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

📄 ospf_snmp.c

📁 router source code for the ospdf.
💻 C
📖 第 1 页 / 共 5 页
字号:
	  if (IPV4_ADDR_SAME (&osif->addr, ifaddr))	    return osif->ifp;	}      else	{	  if (osif->ifindex == *ifindex)	    return osif->ifp;	}    }  return NULL;}struct interface *ospf_snmp_if_lookup_next (struct in_addr *ifaddr, unsigned int *ifindex,			  int ifaddr_next, int ifindex_next){  struct ospf_snmp_if *osif;  struct listnode *nn;  if (ifaddr_next)    {      nn = listhead (ospf_snmp_iflist);      if (nn)	{	  osif = getdata (nn);	  *ifaddr = osif->addr;	  *ifindex = osif->ifindex;	  return osif->ifp;	}      return NULL;    }  LIST_LOOP (ospf_snmp_iflist, osif, nn)    {      if (ifaddr->s_addr)	{	  if (ntohl (osif->addr.s_addr) > ntohl (ifaddr->s_addr))	    {	      *ifaddr = osif->addr;	      *ifindex = osif->ifindex;	      return osif->ifp;	    }	}      else	{	  if (osif->ifindex > *ifindex || osif->addr.s_addr)	    {	      *ifaddr = osif->addr;	      *ifindex = osif->ifindex;	      return osif->ifp;	    }	}    }  return NULL;}intospf_snmp_iftype (struct interface *ifp){#define ospf_snmp_iftype_broadcast         1#define ospf_snmp_iftype_nbma              2#define ospf_snmp_iftype_pointToPoint      3#define ospf_snmp_iftype_pointToMultipoint 5  if (if_is_broadcast (ifp))    return ospf_snmp_iftype_broadcast;  if (if_is_pointopoint (ifp))    return ospf_snmp_iftype_pointToPoint;  return ospf_snmp_iftype_broadcast;}struct interface *ospfIfLookup (struct variable *v, oid *name, size_t *length,	      struct in_addr *ifaddr, unsigned int *ifindex, int exact){  int len;  int ifaddr_next = 0;  int ifindex_next = 0;  struct interface *ifp;  oid *offset;  if (exact)    {      if (*length != v->namelen + IN_ADDR_SIZE + 1)	return NULL;      oid2in_addr (name + v->namelen, IN_ADDR_SIZE, ifaddr);      *ifindex = name[v->namelen + IN_ADDR_SIZE];      return ospf_snmp_if_lookup (ifaddr, ifindex);    }  else    {      len = *length - v->namelen;      if (len >= IN_ADDR_SIZE)	len = IN_ADDR_SIZE;      if (len <= 0)	ifaddr_next = 1;      oid2in_addr (name + v->namelen, len, ifaddr);      len = *length - v->namelen - IN_ADDR_SIZE;      if (len >= 1)	len = 1;      else	ifindex_next = 1;      if (len == 1)	*ifindex = name[v->namelen + IN_ADDR_SIZE];      ifp = ospf_snmp_if_lookup_next (ifaddr, ifindex, ifaddr_next,				      ifindex_next);      if (ifp)	{	  *length = v->namelen + IN_ADDR_SIZE + 1;	  offset = name + v->namelen;	  oid_copy_addr (offset, ifaddr, IN_ADDR_SIZE);	  offset += IN_ADDR_SIZE;	  *offset = *ifindex;	  return ifp;	}    }  return NULL;}static u_char *ospfIfEntry (struct variable *v, oid *name, size_t *length, int exact,	     size_t  *var_len, WriteMethod **write_method){  struct interface *ifp;  unsigned int ifindex;  struct in_addr ifaddr;  struct ospf_interface *oi;  struct ospf *ospf;  ifindex = 0;  memset (&ifaddr, 0, sizeof (struct in_addr));  /* Check OSPF instance. */  ospf = ospf_lookup ();  if (ospf == NULL)    return NULL;  ifp = ospfIfLookup (v, name, length, &ifaddr, &ifindex, exact);  if (ifp == NULL)    return NULL;  oi = ospf_if_lookup_by_local_addr (ospf, ifp, ifaddr);  if (oi == NULL)    return NULL;  /* Return the current value of the variable */  switch (v->magic)     {    case OSPFIFIPADDRESS:	/* 1 */      return SNMP_IPADDRESS (ifaddr);      break;    case OSPFADDRESSLESSIF:	/* 2 */      return SNMP_INTEGER (ifindex);      break;    case OSPFIFAREAID:		/* 3 */      if (oi->area)	return SNMP_IPADDRESS (oi->area->area_id);      else	return SNMP_IPADDRESS (ospf_empty_addr);      break;    case OSPFIFTYPE:		/* 4 */      return SNMP_INTEGER (ospf_snmp_iftype (ifp));      break;    case OSPFIFADMINSTAT:	/* 5 */      if (oi)	return SNMP_INTEGER (OSPF_STATUS_ENABLED);      else	return SNMP_INTEGER (OSPF_STATUS_DISABLED);      break;    case OSPFIFRTRPRIORITY:	/* 6 */      return SNMP_INTEGER (PRIORITY (oi));      break;    case OSPFIFTRANSITDELAY:	/* 7 */      return SNMP_INTEGER (OSPF_IF_PARAM (oi, transmit_delay));      break;    case OSPFIFRETRANSINTERVAL:	/* 8 */      return SNMP_INTEGER (OSPF_IF_PARAM (oi, retransmit_interval));      break;    case OSPFIFHELLOINTERVAL:	/* 9 */      return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_hello));      break;    case OSPFIFRTRDEADINTERVAL:	/* 10 */      return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_wait));      break;    case OSPFIFPOLLINTERVAL:	/* 11 */      return SNMP_INTEGER (OSPF_POLL_INTERVAL_DEFAULT);      break;    case OSPFIFSTATE:		/* 12 */      return SNMP_INTEGER (oi->state);      break;    case OSPFIFDESIGNATEDROUTER: /* 13 */      return SNMP_IPADDRESS (DR (oi));      break;    case OSPFIFBACKUPDESIGNATEDROUTER: /* 14 */      return SNMP_IPADDRESS (BDR (oi));      break;    case OSPFIFEVENTS:		/* 15 */      return SNMP_INTEGER (oi->state_change);      break;    case OSPFIFAUTHKEY:		/* 16 */      *var_len = 0;      return (u_char *) OSPF_IF_PARAM (oi, auth_simple);      break;    case OSPFIFSTATUS:		/* 17 */      return SNMP_INTEGER (SNMP_VALID);      break;    case OSPFIFMULTICASTFORWARDING: /* 18 */#define ospf_snmp_multiforward_blocked    1#define ospf_snmp_multiforward_multicast  2#define ospf_snmp_multiforward_unicast    3      return SNMP_INTEGER (ospf_snmp_multiforward_blocked);      break;    case OSPFIFDEMAND:		/* 19 */      return SNMP_INTEGER (SNMP_FALSE);      break;    case OSPFIFAUTHTYPE:	/* 20 */      if (oi->area)	return SNMP_INTEGER (oi->area->auth_type);      else	return SNMP_INTEGER (0);      break;    default:      return NULL;      break;    }  return NULL;}#define OSPF_SNMP_METRIC_VALUE 1struct interface *ospfIfMetricLookup (struct variable *v, oid *name, size_t *length,		    struct in_addr *ifaddr, unsigned int *ifindex, int exact){  int len;  int ifaddr_next = 0;  int ifindex_next = 0;  struct interface *ifp;  oid *offset;  int metric;  if (exact)    {      if (*length != v->namelen + IN_ADDR_SIZE + 1 + 1)	return NULL;      oid2in_addr (name + v->namelen, IN_ADDR_SIZE, ifaddr);      *ifindex = name[v->namelen + IN_ADDR_SIZE];      metric = name[v->namelen + IN_ADDR_SIZE + 1];      if (metric != OSPF_SNMP_METRIC_VALUE)	return NULL;      return ospf_snmp_if_lookup (ifaddr, ifindex);    }  else    {      len = *length - v->namelen;      if (len >= IN_ADDR_SIZE)	len = IN_ADDR_SIZE;      else	ifaddr_next = 1;      oid2in_addr (name + v->namelen, len, ifaddr);      len = *length - v->namelen - IN_ADDR_SIZE;      if (len >= 1)	len = 1;      else	ifindex_next = 1;      if (len == 1)	*ifindex = name[v->namelen + IN_ADDR_SIZE];      ifp = ospf_snmp_if_lookup_next (ifaddr, ifindex, ifaddr_next,				      ifindex_next);      if (ifp)	{	  *length = v->namelen + IN_ADDR_SIZE + 1 + 1;	  offset = name + v->namelen;	  oid_copy_addr (offset, ifaddr, IN_ADDR_SIZE);	  offset += IN_ADDR_SIZE;	  *offset = *ifindex;	  offset++;	  *offset = OSPF_SNMP_METRIC_VALUE;	  return ifp;	}    }  return NULL;}static u_char *ospfIfMetricEntry (struct variable *v, oid *name, size_t *length, int exact,		   size_t *var_len, WriteMethod **write_method){  /* Currently we support metric 1 only. */  struct interface *ifp;  unsigned int ifindex;  struct in_addr ifaddr;  struct ospf_interface *oi;  struct ospf *ospf;  ifindex = 0;  memset (&ifaddr, 0, sizeof (struct in_addr));  /* Check OSPF instance. */  ospf = ospf_lookup ();  if (ospf == NULL)    return NULL;  ifp = ospfIfMetricLookup (v, name, length, &ifaddr, &ifindex, exact);  if (ifp == NULL)    return NULL;  oi = ospf_if_lookup_by_local_addr (ospf, ifp, ifaddr);  if (oi == NULL)    return NULL;  /* Return the current value of the variable */  switch (v->magic)     {    case OSPFIFMETRICIPADDRESS:      return SNMP_IPADDRESS (ifaddr);      break;    case OSPFIFMETRICADDRESSLESSIF:      return SNMP_INTEGER (ifindex);      break;    case OSPFIFMETRICTOS:      return SNMP_INTEGER (0);      break;    case OSPFIFMETRICVALUE:      return SNMP_INTEGER (OSPF_SNMP_METRIC_VALUE);      break;    case OSPFIFMETRICSTATUS:      return SNMP_INTEGER (1);      break;    default:      return NULL;      break;    }  return NULL;}struct route_table *ospf_snmp_vl_table;voidospf_snmp_vl_add (struct ospf_vl_data *vl_data){  struct prefix_ls lp;  struct route_node *rn;  memset (&lp, 0, sizeof (struct prefix_ls));  lp.family = 0;  lp.prefixlen = 64;  lp.id = vl_data->vl_area_id;  lp.adv_router = vl_data->vl_peer;  rn = route_node_get (ospf_snmp_vl_table, (struct prefix *) &lp);  rn->info = vl_data;}voidospf_snmp_vl_delete (struct ospf_vl_data *vl_data){  struct prefix_ls lp;  struct route_node *rn;  memset (&lp, 0, sizeof (struct prefix_ls));  lp.family = 0;  lp.prefixlen = 64;  lp.id = vl_data->vl_area_id;  lp.adv_router = vl_data->vl_peer;  rn = route_node_lookup (ospf_snmp_vl_table, (struct prefix *) &lp);  if (! rn)    return;  rn->info = NULL;  route_unlock_node (rn);  route_unlock_node (rn);}struct ospf_vl_data *ospf_snmp_vl_lookup (struct in_addr *area_id, struct in_addr *neighbor){  struct prefix_ls lp;  struct route_node *rn;  struct ospf_vl_data *vl_data;  memset (&lp, 0, sizeof (struct prefix_ls));  lp.family = 0;  lp.prefixlen = 64;  lp.id = *area_id;  lp.adv_router = *neighbor;  rn = route_node_lookup (ospf_snmp_vl_table, (struct prefix *) &lp);  if (rn)    {      vl_data = rn->info;      route_unlock_node (rn);      return vl_data;    }  return NULL;}struct ospf_vl_data *ospf_snmp_vl_lookup_next (struct in_addr *area_id, struct in_addr *neighbor,			  int first){  struct prefix_ls lp;  struct route_node *rn;  struct ospf_vl_data *vl_data;  memset (&lp, 0, sizeof (struct prefix_ls));  lp.family = 0;  lp.prefixlen = 64;  lp.id = *area_id;  lp.adv_router = *neighbor;  if (first)    rn = route_top (ospf_snmp_vl_table);  else    {      rn = route_node_get (ospf_snmp_vl_table, (struct prefix *) &lp);      rn = route_next (rn);    }  for (; rn; rn = route_next (rn))    if (rn->info)      break;  if (rn && rn->info)    {      vl_data = rn->info;      *area_id = vl_data->vl_area_id;      *neighbor = vl_data->vl_peer;      route_unlock_node (rn);      return vl_data;    }  return NULL;}struct ospf_vl_data *ospfVirtIfLookup (struct variable *v, oid *name, size_t *length,		  struct in_addr *area_id, struct in_addr *neighbor, int exact){  int first;  int len;  struct ospf_vl_data *vl_data;  if (exact)    {      if (*length != v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE)	return NULL;      oid2in_addr (name + v->namelen, IN_ADDR_SIZE, area_id);      oid2in_addr (name + v->namelen + IN_ADDR_SIZE, IN_ADDR_SIZE, neighbor);      return ospf_snmp_vl_lookup (area_id, neighbor);    }  else    {      first = 0;      len = *length - v->namelen;      if (len <= 0)	first = 1;      if (len > IN_ADDR_SIZE)	len = IN_ADDR_SIZE;      oid2in_addr (name + v->namelen, len, area_id);      len = *length - v->namelen - IN_ADDR_SIZE;      if (len > IN_ADDR_SIZE)	len = IN_ADDR_SIZE;      oid2in_addr (name + v->namelen + IN_ADDR_SIZE, len, neighbor);      vl_data = ospf_snmp_vl_lookup_next (area_id, neighbor, first);      if (vl_data)	{	  *length = v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE;	  oid_copy_addr (name + v->namelen, area_id, IN_ADDR_SIZE);	  oid_copy_addr (name + v->namelen + IN_ADDR_SIZE, neighbor,			 IN_ADDR_SIZE);	  return vl_data;	}    }  return NULL;}static u_char *ospfVirtIfEntry (struct variable *v, oid *name, size_t *length, int exact,		 size_t  *var_len, WriteMethod **write_method)

⌨️ 快捷键说明

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