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

📄 msg_in.c

📁 lwip-1.4.0
💻 C
📖 第 1 页 / 共 3 页
字号:
  m_stat->com_strlen = (u8_t)len;  if (strncmp(snmp_publiccommunity, (const char*)m_stat->community, SNMP_COMMUNITY_STR_LEN) != 0)  {    /** @todo: move this if we need to check more names */    snmp_inc_snmpinbadcommunitynames();    snmp_authfail_trap();    return ERR_ARG;  }  ofs += (1 + len_octets + len);  snmp_asn1_dec_type(p, ofs, &type);  derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);  if (derr != ERR_OK)  {    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  switch(type)  {    case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):      /* GetRequest PDU */      snmp_inc_snmpingetrequests();      derr = ERR_OK;      break;    case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):      /* GetNextRequest PDU */      snmp_inc_snmpingetnexts();      derr = ERR_OK;      break;    case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):      /* GetResponse PDU */      snmp_inc_snmpingetresponses();      derr = ERR_ARG;      break;    case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):      /* SetRequest PDU */      snmp_inc_snmpinsetrequests();      derr = ERR_OK;      break;    case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):      /* Trap PDU */      snmp_inc_snmpintraps();      derr = ERR_ARG;      break;    default:      snmp_inc_snmpinasnparseerrs();      derr = ERR_ARG;      break;  }  if (derr != ERR_OK)  {    /* unsupported input PDU for this agent (no parse error) */    return ERR_ARG;  }  m_stat->rt = type & 0x1F;  ofs += (1 + len_octets);  if (len != (pdu_len - (ofs - ofs_base)))  {    /* decoded PDU length does not equal actual payload length */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  snmp_asn1_dec_type(p, ofs, &type);  derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);  if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))  {    /* can't decode or no integer (request ID) */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);  if (derr != ERR_OK)  {    /* can't decode */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  ofs += (1 + len_octets + len);  snmp_asn1_dec_type(p, ofs, &type);  derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);  if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))  {    /* can't decode or no integer (error-status) */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  /* must be noError (0) for incoming requests.     log errors for mib-2 completeness and for debug purposes */  derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status);  if (derr != ERR_OK)  {    /* can't decode */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  switch (m_stat->error_status)  {    case SNMP_ES_TOOBIG:      snmp_inc_snmpintoobigs();      break;    case SNMP_ES_NOSUCHNAME:      snmp_inc_snmpinnosuchnames();      break;    case SNMP_ES_BADVALUE:      snmp_inc_snmpinbadvalues();      break;    case SNMP_ES_READONLY:      snmp_inc_snmpinreadonlys();      break;    case SNMP_ES_GENERROR:      snmp_inc_snmpingenerrs();      break;  }  ofs += (1 + len_octets + len);  snmp_asn1_dec_type(p, ofs, &type);  derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);  if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))  {    /* can't decode or no integer (error-index) */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  /* must be 0 for incoming requests.     decode anyway to catch bad integers (and dirty tricks) */  derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index);  if (derr != ERR_OK)  {    /* can't decode */    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  ofs += (1 + len_octets + len);  *ofs_ret = ofs;  return ERR_OK;}static err_tsnmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat){  err_t derr;  u16_t len, vb_len;  u8_t  len_octets;  u8_t type;  /* variable binding list */  snmp_asn1_dec_type(p, ofs, &type);  derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);  if ((derr != ERR_OK) ||      (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))  {    snmp_inc_snmpinasnparseerrs();    return ERR_ARG;  }  ofs += (1 + len_octets);  /* start with empty list */  m_stat->invb.count = 0;  m_stat->invb.head = NULL;  m_stat->invb.tail = NULL;  while (vb_len > 0)  {    struct snmp_obj_id oid, oid_value;    struct snmp_varbind *vb;    snmp_asn1_dec_type(p, ofs, &type);    derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);    if ((derr != ERR_OK) ||        (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||        (len == 0) || (len > vb_len))    {      snmp_inc_snmpinasnparseerrs();      /* free varbinds (if available) */      snmp_varbind_list_free(&m_stat->invb);      return ERR_ARG;    }    ofs += (1 + len_octets);    vb_len -= (1 + len_octets);    snmp_asn1_dec_type(p, ofs, &type);    derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);    if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))    {      /* can't decode object name length */      snmp_inc_snmpinasnparseerrs();      /* free varbinds (if available) */      snmp_varbind_list_free(&m_stat->invb);      return ERR_ARG;    }    derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid);    if (derr != ERR_OK)    {      /* can't decode object name */      snmp_inc_snmpinasnparseerrs();      /* free varbinds (if available) */      snmp_varbind_list_free(&m_stat->invb);      return ERR_ARG;    }    ofs += (1 + len_octets + len);    vb_len -= (1 + len_octets + len);    snmp_asn1_dec_type(p, ofs, &type);    derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);    if (derr != ERR_OK)    {      /* can't decode object value length */      snmp_inc_snmpinasnparseerrs();      /* free varbinds (if available) */      snmp_varbind_list_free(&m_stat->invb);      return ERR_ARG;    }    switch (type)    {      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):        vb = snmp_varbind_alloc(&oid, type, sizeof(s32_t));        if (vb != NULL)        {          s32_t *vptr = (s32_t*)vb->value;          derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr);          snmp_varbind_tail_add(&m_stat->invb, vb);        }        else        {          derr = ERR_ARG;        }        break;      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):        vb = snmp_varbind_alloc(&oid, type, sizeof(u32_t));        if (vb != NULL)        {          u32_t *vptr = (u32_t*)vb->value;          derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr);          snmp_varbind_tail_add(&m_stat->invb, vb);        }        else        {          derr = ERR_ARG;        }        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):        LWIP_ASSERT("invalid length", len <= 0xff);        vb = snmp_varbind_alloc(&oid, type, (u8_t)len);        if (vb != NULL)        {          derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value);          snmp_varbind_tail_add(&m_stat->invb, vb);        }        else        {          derr = ERR_ARG;        }        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):        vb = snmp_varbind_alloc(&oid, type, 0);        if (vb != NULL)        {          snmp_varbind_tail_add(&m_stat->invb, vb);          derr = ERR_OK;        }        else        {          derr = ERR_ARG;        }        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):        derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value);        if (derr == ERR_OK)        {          vb = snmp_varbind_alloc(&oid, type, oid_value.len * sizeof(s32_t));          if (vb != NULL)          {            u8_t i = oid_value.len;            s32_t *vptr = (s32_t*)vb->value;            while(i > 0)            {              i--;              vptr[i] = oid_value.id[i];            }            snmp_varbind_tail_add(&m_stat->invb, vb);            derr = ERR_OK;          }          else          {            derr = ERR_ARG;          }        }        break;      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):        if (len == 4)        {          /* must be exactly 4 octets! */          vb = snmp_varbind_alloc(&oid, type, 4);          if (vb != NULL)          {            derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value);            snmp_varbind_tail_add(&m_stat->invb, vb);          }          else          {            derr = ERR_ARG;          }        }        else        {          derr = ERR_ARG;        }        break;      default:        derr = ERR_ARG;        break;    }    if (derr != ERR_OK)    {      snmp_inc_snmpinasnparseerrs();      /* free varbinds (if available) */      snmp_varbind_list_free(&m_stat->invb);      return ERR_ARG;    }    ofs += (1 + len_octets + len);    vb_len -= (1 + len_octets + len);  }  if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)  {    snmp_add_snmpintotalsetvars(m_stat->invb.count);  }  else  {    snmp_add_snmpintotalreqvars(m_stat->invb.count);  }  *ofs_ret = ofs;  return ERR_OK;}struct snmp_varbind*snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len){  struct snmp_varbind *vb;  vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);  LWIP_ASSERT("vb != NULL",vb != NULL);  if (vb != NULL)  {    u8_t i;    vb->next = NULL;    vb->prev = NULL;    i = oid->len;    vb->ident_len = i;    if (i > 0)    {      LWIP_ASSERT("SNMP_MAX_TREE_DEPTH is configured too low", i <= SNMP_MAX_TREE_DEPTH);      /* allocate array of s32_t for our object identifier */      vb->ident = (s32_t*)memp_malloc(MEMP_SNMP_VALUE);      LWIP_ASSERT("vb->ident != NULL",vb->ident != NULL);      if (vb->ident == NULL)      {        memp_free(MEMP_SNMP_VARBIND, vb);        return NULL;      }      while(i > 0)      {        i--;        vb->ident[i] = oid->id[i];      }    }    else    {      /* i == 0, pass zero length object identifier */      vb->ident = NULL;    }    vb->value_type = type;    vb->value_len = len;    if (len > 0)    {      LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);      /* allocate raw bytes for our object value */      vb->value = memp_malloc(MEMP_SNMP_VALUE);      LWIP_ASSERT("vb->value != NULL",vb->value != NULL);      if (vb->value == NULL)      {        if (vb->ident != NULL)        {          memp_free(MEMP_SNMP_VALUE, vb->ident);        }        memp_free(MEMP_SNMP_VARBIND, vb);        return NULL;      }    }    else    {      /* ASN1_NUL type, or zero length ASN1_OC_STR */      vb->value = NULL;    }  }  return vb;}voidsnmp_varbind_free(struct snmp_varbind *vb){  if (vb->value != NULL )  {    memp_free(MEMP_SNMP_VALUE, vb->value);  }  if (vb->ident != NULL )  {    memp_free(MEMP_SNMP_VALUE, vb->ident);  }  memp_free(MEMP_SNMP_VARBIND, vb);}voidsnmp_varbind_list_free(struct snmp_varbind_root *root){  struct snmp_varbind *vb, *prev;  vb = root->tail;  while ( vb != NULL )  {    prev = vb->prev;    snmp_varbind_free(vb);    vb = prev;  }  root->count = 0;  root->head = NULL;  root->tail = NULL;}voidsnmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb){  if (root->count == 0)  {    /* add first varbind to list */    root->head = vb;    root->tail = vb;  }  else  {    /* add nth varbind to list tail */    root->tail->next = vb;    vb->prev = root->tail;    root->tail = vb;  }  root->count += 1;}struct snmp_varbind*snmp_varbind_tail_remove(struct snmp_varbind_root *root){  struct snmp_varbind* vb;  if (root->count > 0)  {    /* remove tail varbind */    vb = root->tail;    root->tail = vb->prev;    vb->prev->next = NULL;    root->count -= 1;  }  else  {    /* nothing to remove */    vb = NULL;  }  return vb;}#endif /* LWIP_SNMP */

⌨️ 快捷键说明

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