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

📄 ospf_snmp.c

📁 router source code for the ospdf.
💻 C
📖 第 1 页 / 共 5 页
字号:
{  struct ospf_vl_data *vl_data;  struct ospf_interface *oi;  struct in_addr area_id;  struct in_addr neighbor;  memset (&area_id, 0, sizeof (struct in_addr));  memset (&neighbor, 0, sizeof (struct in_addr));  vl_data = ospfVirtIfLookup (v, name, length, &area_id, &neighbor, exact);  if (! vl_data)    return NULL;  oi = vl_data->vl_oi;  if (! oi)    return NULL;    /* Return the current value of the variable */  switch (v->magic)     {    case OSPFVIRTIFAREAID:      return SNMP_IPADDRESS (area_id);      break;    case OSPFVIRTIFNEIGHBOR:      return SNMP_IPADDRESS (neighbor);      break;    case OSPFVIRTIFTRANSITDELAY:      return SNMP_INTEGER (OSPF_IF_PARAM (oi, transmit_delay));      break;    case OSPFVIRTIFRETRANSINTERVAL:      return SNMP_INTEGER (OSPF_IF_PARAM (oi, retransmit_interval));      break;    case OSPFVIRTIFHELLOINTERVAL:      return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_hello));      break;    case OSPFVIRTIFRTRDEADINTERVAL:      return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_wait));      break;    case OSPFVIRTIFSTATE:      return SNMP_INTEGER (oi->state);      break;    case OSPFVIRTIFEVENTS:      return SNMP_INTEGER (oi->state_change);      break;    case OSPFVIRTIFAUTHKEY:      *var_len = 0;      return (u_char *) OSPF_IF_PARAM (oi, auth_simple);      break;    case OSPFVIRTIFSTATUS:      return SNMP_INTEGER (SNMP_VALID);      break;    case OSPFVIRTIFAUTHTYPE:      if (oi->area)	return SNMP_INTEGER (oi->area->auth_type);      else	return SNMP_INTEGER (0);      break;    default:      return NULL;      break;    }  return NULL;}struct ospf_neighbor *ospf_snmp_nbr_lookup (struct ospf *ospf, struct in_addr *nbr_addr,		      unsigned int *ifindex){  struct listnode *nn;  struct ospf_interface *oi;  struct ospf_neighbor *nbr;  struct route_node *rn;  LIST_LOOP (ospf->oiflist, oi, nn)    {      for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))	if ((nbr = rn->info) != NULL	    && nbr != oi->nbr_self	    && nbr->state != NSM_Down	    && nbr->src.s_addr != 0)	  {	    if (IPV4_ADDR_SAME (&nbr->src, nbr_addr))	      {		route_unlock_node (rn);		return nbr;	      }	  }    }  return NULL;}struct ospf_neighbor *ospf_snmp_nbr_lookup_next (struct in_addr *nbr_addr, unsigned int *ifindex,			   int first){  struct listnode *nn;  struct ospf_interface *oi;  struct ospf_neighbor *nbr;  struct route_node *rn;  struct ospf_neighbor *min = NULL;  struct ospf *ospf = ospf;  ospf = ospf_lookup ();  LIST_LOOP (ospf->oiflist, oi, nn)    {      for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))	if ((nbr = rn->info) != NULL	    && nbr != oi->nbr_self	    && nbr->state != NSM_Down	    && nbr->src.s_addr != 0)	  {	    if (first)	      {		if (! min)		  min = nbr;		else if (ntohl (nbr->src.s_addr) < ntohl (min->src.s_addr))		  min = nbr;	      }	    else if (ntohl (nbr->src.s_addr) > ntohl (nbr_addr->s_addr))	      {		if (! min)		  min = nbr;		else if (ntohl (nbr->src.s_addr) < ntohl (min->src.s_addr))		  min = nbr;	      }	  }    }  if (min)    {      *nbr_addr = min->src;      *ifindex = 0;      return min;    }  return NULL;}struct ospf_neighbor *ospfNbrLookup (struct variable *v, oid *name, size_t *length,	       struct in_addr *nbr_addr, unsigned int *ifindex, int exact){  int len;  int first;  struct ospf_neighbor *nbr;  struct ospf *ospf;  ospf = ospf_lookup ();  if (exact)    {      if (*length != v->namelen + IN_ADDR_SIZE + 1)	return NULL;      oid2in_addr (name + v->namelen, IN_ADDR_SIZE, nbr_addr);      *ifindex = name[v->namelen + IN_ADDR_SIZE];      return ospf_snmp_nbr_lookup (ospf, nbr_addr, ifindex);    }  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, nbr_addr);      len = *length - v->namelen - IN_ADDR_SIZE;      if (len >= 1)	*ifindex = name[v->namelen + IN_ADDR_SIZE];            nbr = ospf_snmp_nbr_lookup_next (nbr_addr, ifindex, first);      if (nbr)	{	  *length = v->namelen + IN_ADDR_SIZE + 1;	  oid_copy_addr (name + v->namelen, nbr_addr, IN_ADDR_SIZE);	  name[v->namelen + IN_ADDR_SIZE] = *ifindex;	  return nbr;	}    }  return NULL;}static u_char *ospfNbrEntry (struct variable *v, oid *name, size_t *length, int exact,	      size_t  *var_len, WriteMethod **write_method){  struct in_addr nbr_addr;  unsigned int ifindex;  struct ospf_neighbor *nbr;  struct ospf_interface *oi;  memset (&nbr_addr, 0, sizeof (struct in_addr));  ifindex = 0;    nbr = ospfNbrLookup (v, name, length, &nbr_addr, &ifindex, exact);  if (! nbr)    return NULL;  oi = nbr->oi;  if (! oi)    return NULL;  /* Return the current value of the variable */  switch (v->magic)     {    case OSPFNBRIPADDR:      return SNMP_IPADDRESS (nbr_addr);      break;    case OSPFNBRADDRESSLESSINDEX:      return SNMP_INTEGER (ifindex);      break;    case OSPFNBRRTRID:      return SNMP_IPADDRESS (nbr->router_id);      break;    case OSPFNBROPTIONS:      return SNMP_INTEGER (oi->nbr_self->options);      break;    case OSPFNBRPRIORITY:      return SNMP_INTEGER (nbr->priority);      break;    case OSPFNBRSTATE:      return SNMP_INTEGER (nbr->state);      break;    case OSPFNBREVENTS:      return SNMP_INTEGER (nbr->state_change);      break;    case OSPFNBRLSRETRANSQLEN:      return SNMP_INTEGER (ospf_ls_retransmit_count (nbr));      break;    case OSPFNBMANBRSTATUS:      return SNMP_INTEGER (SNMP_VALID);      break;    case OSPFNBMANBRPERMANENCE:      return SNMP_INTEGER (2);      break;    case OSPFNBRHELLOSUPPRESSED:      return SNMP_INTEGER (SNMP_FALSE);      break;    default:      return NULL;      break;    }  return NULL;}static u_char *ospfVirtNbrEntry (struct variable *v, oid *name, size_t *length, int exact,		  size_t  *var_len, WriteMethod **write_method){  struct ospf_vl_data *vl_data;  struct in_addr area_id;  struct in_addr neighbor;  struct ospf *ospf;  memset (&area_id, 0, sizeof (struct in_addr));  memset (&neighbor, 0, sizeof (struct in_addr));  /* Check OSPF instance. */  ospf = ospf_lookup ();  if (ospf == NULL)    return NULL;  vl_data = ospfVirtIfLookup (v, name, length, &area_id, &neighbor, exact);  if (! vl_data)    return NULL;  /* Return the current value of the variable */  switch (v->magic)     {    case OSPFVIRTNBRAREA:      return (u_char *) NULL;      break;    case OSPFVIRTNBRRTRID:      return (u_char *) NULL;      break;    case OSPFVIRTNBRIPADDR:      return (u_char *) NULL;      break;    case OSPFVIRTNBROPTIONS:      return (u_char *) NULL;      break;    case OSPFVIRTNBRSTATE:      return (u_char *) NULL;      break;    case OSPFVIRTNBREVENTS:      return (u_char *) NULL;      break;    case OSPFVIRTNBRLSRETRANSQLEN:      return (u_char *) NULL;      break;    case OSPFVIRTNBRHELLOSUPPRESSED:      return (u_char *) NULL;      break;    default:      return NULL;      break;    }  return NULL;}struct ospf_lsa *ospfExtLsdbLookup (struct variable *v, oid *name, size_t *length, u_char *type,		   struct in_addr *ls_id, struct in_addr *router_id, int exact){  int first;  oid *offset;  int offsetlen;  u_char lsa_type;  int len;  struct ospf_lsa *lsa;  struct ospf *ospf;  ospf = ospf_lookup ();  if (exact)    {      if (*length != v->namelen + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE)	return NULL;            offset = name + v->namelen;      /* Make it sure given value match to type. */      lsa_type = *offset;      offset++;      if (lsa_type != *type)	return NULL;            /* LS ID. */      oid2in_addr (offset, IN_ADDR_SIZE, ls_id);      offset += IN_ADDR_SIZE;      /* Router ID. */      oid2in_addr (offset, IN_ADDR_SIZE, router_id);      return ospf_lsdb_lookup_by_id (ospf->lsdb, *type, *ls_id, *router_id);    }  else    {      /* Get variable length. */      first = 0;      offset = name + v->namelen;      offsetlen = *length - v->namelen;      /* LSA type value. */      lsa_type = *offset;      offset++;      offsetlen--;      if (offsetlen <= 0 || lsa_type < OSPF_AS_EXTERNAL_LSA)	first = 1;      /* LS ID. */      len = offsetlen;      if (len > IN_ADDR_SIZE)	len = IN_ADDR_SIZE;      oid2in_addr (offset, len, ls_id);      offset += IN_ADDR_SIZE;      offsetlen -= IN_ADDR_SIZE;      /* Router ID. */      len = offsetlen;      if (len > IN_ADDR_SIZE)	len = IN_ADDR_SIZE;      oid2in_addr (offset, len, router_id);      lsa = ospf_lsdb_lookup_by_id_next (ospf->lsdb, *type, *ls_id,					*router_id, first);      if (lsa)	{	  /* Fill in length. */	  *length = v->namelen + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE;	  /* Fill in value. */	  offset = name + v->namelen;	  *offset = OSPF_AS_EXTERNAL_LSA;	  offset++;	  oid_copy_addr (offset, &lsa->data->id, IN_ADDR_SIZE);	  offset += IN_ADDR_SIZE;	  oid_copy_addr (offset, &lsa->data->adv_router, IN_ADDR_SIZE);	    	  return lsa;	}    }  return NULL;}static u_char *ospfExtLsdbEntry (struct variable *v, oid *name, size_t *length, int exact,		  size_t  *var_len, WriteMethod **write_method){  struct ospf_lsa *lsa;  struct lsa_header *lsah;  u_char type;  struct in_addr ls_id;  struct in_addr router_id;  struct ospf *ospf;  type = OSPF_AS_EXTERNAL_LSA;  memset (&ls_id, 0, sizeof (struct in_addr));  memset (&router_id, 0, sizeof (struct in_addr));  /* Check OSPF instance. */  ospf = ospf_lookup ();  if (ospf == NULL)    return NULL;  lsa = ospfExtLsdbLookup (v, name, length, &type, &ls_id, &router_id, exact);  if (! lsa)    return NULL;  lsah = lsa->data;  /* Return the current value of the variable */  switch (v->magic)     {    case OSPFEXTLSDBTYPE:      return SNMP_INTEGER (OSPF_AS_EXTERNAL_LSA);      break;    case OSPFEXTLSDBLSID:      return SNMP_IPADDRESS (lsah->id);      break;    case OSPFEXTLSDBROUTERID:      return SNMP_IPADDRESS (lsah->adv_router);      break;    case OSPFEXTLSDBSEQUENCE:      return SNMP_INTEGER (lsah->ls_seqnum);      break;    case OSPFEXTLSDBAGE:      return SNMP_INTEGER (lsah->ls_age);      break;    case OSPFEXTLSDBCHECKSUM:      return SNMP_INTEGER (lsah->checksum);      break;    case OSPFEXTLSDBADVERTISEMENT:      *var_len = ntohs (lsah->length);      return (u_char *) lsah;      break;    default:      return NULL;      break;    }  return NULL;}static u_char *ospfAreaAggregateEntry (struct variable *v, oid *name, size_t *length,			int exact, size_t *var_len, WriteMethod **write_method){  /* Return the current value of the variable */  switch (v->magic)     {    case OSPFAREAAGGREGATEAREAID:      return (u_char *) NULL;      break;    case OSPFAREAAGGREGATELSDBTYPE:      return (u_char *) NULL;      break;    case OSPFAREAAGGREGATENET:      return (u_char *) NULL;      break;    case OSPFAREAAGGREGATEMASK:      return (u_char *) NULL;      break;    case OSPFAREAAGGREGATESTATUS:      return (u_char *) NULL;      break;    case OSPFAREAAGGREGATEEFFECT:      return (u_char *) NULL;      break;    default:      return NULL;      break;    }  return NULL;}/* Register OSPF2-MIB. */voidospf_snmp_init (){  ospf_snmp_iflist = list_new ();  ospf_snmp_vl_table = route_table_init ();  smux_init (ospfd_oid, sizeof (ospfd_oid) / sizeof (oid));  REGISTER_MIB("mibII/ospf", ospf_variables, variable, ospf_oid);  smux_start ();}#endif /* HAVE_SNMP */

⌨️ 快捷键说明

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