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

📄 mib_structs.c

📁 《嵌入式网络系统设计-基于Atmel ARM7 系列》这个本书的光盘资料
💻 C
📖 第 1 页 / 共 2 页
字号:
            return (struct mib_node*)en;          }          else          {            /* found it, proceed to child */            ident_len--;            ident++;            ext_level++;          }        }        else        {          /* search failed */          LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed *ident==%"S32_F"\n",*ident));          return NULL;        }      }      else      {        /* search failed, short object identifier (nosuchname) */        LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n"));        return NULL;      }    }    else if (node_type == MIB_NODE_SC)    {      mib_scalar_node *sn;      sn = (mib_scalar_node *)node;      if ((ident_len == 1) && (*ident == 0))      {        np->ident_len = ident_len;        np->ident = ident;        return (struct mib_node*)sn;      }      else      {        /* search failed, short object identifier (nosuchname) */        LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, invalid object identifier length\n"));        return NULL;      }    }    else    {      /* unknown node_type */      LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node_type %"U16_F" unkown\n",(u16_t)node_type));      return NULL;    }  }  /* done, found nothing */  LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));  return NULL;}/** * Test table for presence of at least one table entry. */static u8_tempty_table(struct mib_node *node){  u8_t node_type;  u8_t empty = 0;  if (node != NULL)  {    node_type = node->node_type;    if (node_type == MIB_NODE_LR)    {      struct mib_list_rootnode *lrn;      lrn = (struct mib_list_rootnode *)node;      if ((lrn->count == 0) || (lrn->head == NULL))      {        empty = 1;      }    }    else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))    {      struct mib_array_node *an;      an = (struct mib_array_node *)node;      if ((an->maxlength == 0) || (an->nptr == NULL))      {        empty = 1;      }    }    else if (node_type == MIB_NODE_EX)    {      struct mib_external_node *en;      en = (struct mib_external_node *)node;      if (en->tree_levels == 0)      {        empty = 1;      }    }  }  return empty;}/** * Tree expansion. */struct mib_node *snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret){  u8_t node_type, ext_level, climb_tree;  ext_level = 0;  /* reset node stack */  node_stack_cnt = 0;  while (node != NULL)  {    climb_tree = 0;    node_type = node->node_type;    if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))    {      struct mib_array_node *an;      u16_t i;      /* array node (internal ROM or RAM, fixed length) */      an = (struct mib_array_node *)node;      if (ident_len > 0)      {        i = 0;        while ((i < an->maxlength) && (an->objid[i] < *ident))        {          i++;        }        if (i < an->maxlength)        {          LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));          /* add identifier to oidret */          oidret->id[oidret->len] = an->objid[i];          (oidret->len)++;          if (an->nptr[i] == NULL)          {            LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));            /* leaf node (e.g. in a fixed size table) */            if (an->objid[i] > *ident)            {              return (struct mib_node*)an;            }            else if ((i + 1) < an->maxlength)            {              /* an->objid[i] == *ident */              (oidret->len)--;              oidret->id[oidret->len] = an->objid[i + 1];              (oidret->len)++;              return (struct mib_node*)an;            }            else            {              /* (i + 1) == an->maxlength */              (oidret->len)--;              climb_tree = 1;            }          }          else          {            u8_t j;            struct nse cur_node;            LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));            /* non-leaf, store right child ptr and id */            j = i + 1;            while ((j < an->maxlength) && (empty_table(an->nptr[j])))            {              j++;            }            if (j < an->maxlength)            {              cur_node.r_ptr = an->nptr[j];              cur_node.r_id = an->objid[j];              cur_node.r_nl = 0;            }            else            {              cur_node.r_ptr = NULL;            }            push_node(&cur_node);            if (an->objid[i] == *ident)            {              ident_len--;              ident++;            }            else            {              /* an->objid[i] < *ident */              ident_len = 0;            }            /* follow next child pointer */            node = an->nptr[i];          }        }        else        {          /* i == an->maxlength */          climb_tree = 1;        }      }      else      {        u8_t j;        /* ident_len == 0, complete with leftmost '.thing' */        j = 0;        while ((j < an->maxlength) && empty_table(an->nptr[j]))        {          j++;        }        if (j < an->maxlength)        {          LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));          oidret->id[oidret->len] = an->objid[j];          (oidret->len)++;          if (an->nptr[j] == NULL)          {            /* leaf node */            return (struct mib_node*)an;          }          else          {            /* no leaf, continue */            node = an->nptr[j];          }        }        else        {          /* j == an->maxlength */          climb_tree = 1;        }      }    }    else if(node_type == MIB_NODE_LR)    {      struct mib_list_rootnode *lrn;      struct mib_list_node *ln;      /* list root node (internal 'RAM', variable length) */      lrn = (struct mib_list_rootnode *)node;      if (ident_len > 0)      {        ln = lrn->head;        /* iterate over list, head to tail */        while ((ln != NULL) && (ln->objid < *ident))        {          ln = ln->next;        }        if (ln != NULL)        {          LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));          oidret->id[oidret->len] = ln->objid;          (oidret->len)++;          if (ln->nptr == NULL)          {            /* leaf node */            if (ln->objid > *ident)            {              return (struct mib_node*)lrn;            }            else if (ln->next != NULL)            {              /* ln->objid == *ident */              (oidret->len)--;              oidret->id[oidret->len] = ln->next->objid;              (oidret->len)++;              return (struct mib_node*)lrn;            }            else            {              /* ln->next == NULL */              (oidret->len)--;              climb_tree = 1;            }          }          else          {            struct mib_list_node *jn;            struct nse cur_node;            /* non-leaf, store right child ptr and id */            jn = ln->next;            while ((jn != NULL) && empty_table(jn->nptr))            {              jn = jn->next;            }            if (jn != NULL)            {              cur_node.r_ptr = jn->nptr;              cur_node.r_id = jn->objid;              cur_node.r_nl = 0;            }            else            {              cur_node.r_ptr = NULL;            }            push_node(&cur_node);            if (ln->objid == *ident)            {              ident_len--;              ident++;            }            else            {              /* ln->objid < *ident */              ident_len = 0;            }            /* follow next child pointer */            node = ln->nptr;          }        }        else        {          /* ln == NULL */          climb_tree = 1;        }      }      else      {        struct mib_list_node *jn;        /* ident_len == 0, complete with leftmost '.thing' */        jn = lrn->head;        while ((jn != NULL) && empty_table(jn->nptr))        {          jn = jn->next;        }        if (jn != NULL)        {          LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));          oidret->id[oidret->len] = jn->objid;          (oidret->len)++;          if (jn->nptr == NULL)          {            /* leaf node */            LWIP_DEBUGF(SNMP_MIB_DEBUG,("jn->nptr == NULL\n"));            return (struct mib_node*)lrn;          }          else          {            /* no leaf, continue */            node = jn->nptr;          }        }        else        {          /* jn == NULL */          climb_tree = 1;        }      }    }    else if(node_type == MIB_NODE_EX)    {      struct mib_external_node *en;      s32_t ex_id;      /* external node (addressing and access via functions) */      en = (struct mib_external_node *)node;      if (ident_len > 0)      {        u16_t i, len;        i = 0;        len = en->level_length(en->addr_inf,ext_level);        while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))        {          i++;        }        if (i < len)        {          /* add identifier to oidret */          en->get_objid(en->addr_inf,ext_level,i,&ex_id);          LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));          oidret->id[oidret->len] = ex_id;          (oidret->len)++;          if ((ext_level + 1) == en->tree_levels)          {            LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));            /* leaf node */            if (ex_id > *ident)            {              return (struct mib_node*)en;            }            else if ((i + 1) < len)            {              /* ex_id == *ident */              en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id);              (oidret->len)--;              oidret->id[oidret->len] = ex_id;              (oidret->len)++;              return (struct mib_node*)en;            }            else            {              /* (i + 1) == len */              (oidret->len)--;              climb_tree = 1;            }          }          else          {            u8_t j;            struct nse cur_node;            LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));            /* non-leaf, store right child ptr and id */            j = i + 1;            if (j < len)            {              /* right node is the current external node */              cur_node.r_ptr = node;              en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);              cur_node.r_nl = ext_level + 1;            }            else            {              cur_node.r_ptr = NULL;            }            push_node(&cur_node);            if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0)            {              ident_len--;              ident++;            }            else            {              /* external id < *ident */              ident_len = 0;            }            /* proceed to child */            ext_level++;          }        }        else        {          /* i == len (en->level_len()) */          climb_tree = 1;        }      }      else      {        /* ident_len == 0, complete with leftmost '.thing' */        en->get_objid(en->addr_inf,ext_level,0,&ex_id);        LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));        oidret->id[oidret->len] = ex_id;        (oidret->len)++;        if ((ext_level + 1) == en->tree_levels)        {          /* leaf node */          LWIP_DEBUGF(SNMP_MIB_DEBUG,("(ext_level + 1) == en->tree_levels\n"));          return (struct mib_node*)en;        }        else        {          /* no leaf, proceed to child */          ext_level++;        }      }    }    else if(node_type == MIB_NODE_SC)    {      mib_scalar_node *sn;      /* scalar node  */      sn = (mib_scalar_node *)node;      if (ident_len > 0)      {        /* at .0 */        climb_tree = 1;      }      else      {        /* ident_len == 0, complete object identifier */        oidret->id[oidret->len] = 0;        (oidret->len)++;        /* leaf node */        LWIP_DEBUGF(SNMP_MIB_DEBUG,("completed scalar leaf\n"));        return (struct mib_node*)sn;      }    }    else    {      /* unknown/unhandled node_type */      LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));      return NULL;    }    if (climb_tree)    {      struct nse child;      /* find right child ptr */      child.r_ptr = NULL;      child.r_id = 0;      child.r_nl = 0;      while ((node_stack_cnt > 0) && (child.r_ptr == NULL))      {        pop_node(&child);        /* trim returned oid */        (oidret->len)--;      }      if (child.r_ptr != NULL)      {        /* incoming ident is useless beyond this point */        ident_len = 0;        oidret->id[oidret->len] = child.r_id;        oidret->len++;        node = child.r_ptr;        ext_level = child.r_nl;      }      else      {        /* tree ends here ... */        LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed, tree ends here\n"));        return NULL;      }    }  }  /* done, found nothing */  LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));  return NULL;}/** * Test object identifier for the iso.org.dod.internet prefix. * * @param ident_len the length of the supplied object identifier * @param ident points to the array of sub identifiers * @return 1 if it matches, 0 otherwise */u8_tsnmp_iso_prefix_tst(u8_t ident_len, s32_t *ident){  if ((ident_len > 3) &&      (ident[0] == 1) && (ident[1] == 3) &&      (ident[2] == 6) && (ident[3] == 1))  {    return 1;  }  else  {    return 0;  }}/** * Expands object identifier to the iso.org.dod.internet * prefix for use in getnext operation. * * @param ident_len the length of the supplied object identifier * @param ident points to the array of sub identifiers * @param oidret points to returned expanded object identifier * @return 1 if it matches, 0 otherwise * * @note ident_len 0 is allowed, expanding to the first known object id!! */u8_tsnmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret){  const s32_t *prefix_ptr;  s32_t *ret_ptr;  u8_t i;  i = 0;  prefix_ptr = &prefix[0];  ret_ptr = &oidret->id[0];  ident_len = ((ident_len < 4)?ident_len:4);  while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))  {    *ret_ptr++ = *prefix_ptr++;    ident++;    i++;  }  if (i == ident_len)  {    /* match, complete missing bits */    while (i < 4)    {      *ret_ptr++ = *prefix_ptr++;      i++;    }    oidret->len = i;    return 1;  }  else  {    /* i != ident_len */    return 0;  }}#endif /* LWIP_SNMP */

⌨️ 快捷键说明

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