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

📄 msg_out.c

📁 《嵌入式网络系统设计-基于Atmel ARM7 系列》这个本书的光盘资料
💻 C
📖 第 1 页 / 共 2 页
字号:
  snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);  tot_len += 1 + rhl->pdulenlen;  rhl->comlen = m_stat->com_strlen;  snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);  tot_len += 1 + rhl->comlenlen + rhl->comlen;  snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);  snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);  tot_len += 1 + rhl->verlen + rhl->verlenlen;  rhl->seqlen = tot_len;  snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);  tot_len += 1 + rhl->seqlenlen;  return tot_len;}/** * Sums trap header field lengths from tail to head and * returns trap_header_lengths for second encoding pass. * * @param vb_len varbind-list length * @param thl points to returned header lengths * @return the required lenght for encoding the trap header */static u16_tsnmp_trap_header_sum(struct snmp_msg_trap *m_trap, u16_t vb_len){  u16_t tot_len;  struct snmp_trap_header_lengths *thl;  thl = &m_trap->thl;  tot_len = vb_len;  snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);  snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);  tot_len += 1 + thl->tslen + thl->tslenlen;  snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);  snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);  tot_len += 1 + thl->strplen + thl->strplenlen;  snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);  snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);  tot_len += 1 + thl->gtrplen + thl->gtrplenlen;  thl->aaddrlen = 4;  snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);  tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;  snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);  snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);  tot_len += 1 + thl->eidlen + thl->eidlenlen;  thl->pdulen = tot_len;  snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);  tot_len += 1 + thl->pdulenlen;  thl->comlen = sizeof(snmp_publiccommunity) - 1;  snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);  tot_len += 1 + thl->comlenlen + thl->comlen;  snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);  snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);  tot_len += 1 + thl->verlen + thl->verlenlen;  thl->seqlen = tot_len;  snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);  tot_len += 1 + thl->seqlenlen;  return tot_len;}/** * Sums varbind lengths from tail to head and * annotates lengths in varbind for second encoding pass. * * @param root points to the root of the variable binding list * @return the required lenght for encoding the variable bindings */static u16_tsnmp_varbind_list_sum(struct snmp_varbind_root *root){  struct snmp_varbind *vb;  u32_t *uint_ptr;  s32_t *sint_ptr;  u16_t tot_len;  tot_len = 0;  vb = root->tail;  while ( vb != NULL )  {    /* encoded value lenght depends on type */    switch (vb->value_type)    {      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):        sint_ptr = vb->value;        snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen);        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):        uint_ptr = vb->value;        snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen);        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):        vb->vlen = vb->value_len;        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):        sint_ptr = vb->value;        snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);        break;      default:        /* unsupported type */        vb->vlen = 0;        break;    };    /* encoding length of value length field */    snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen);    snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen);    snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen);    vb->seqlen = 1 + vb->vlenlen + vb->vlen;    vb->seqlen += 1 + vb->olenlen + vb->olen;    snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);    /* varbind seq */    tot_len += 1 + vb->seqlenlen + vb->seqlen;    vb = vb->prev;  }  /* varbind-list seq */  root->seqlen = tot_len;  snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);  tot_len += 1 + root->seqlenlen;  return tot_len;}/** * Encodes response header from head to tail. */static u16_tsnmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p){  u16_t ofs;  ofs = 0;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);  ofs += m_stat->rhl.seqlenlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);  ofs += m_stat->rhl.verlenlen;  snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);  ofs += m_stat->rhl.verlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);  ofs += m_stat->rhl.comlenlen;  snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);  ofs += m_stat->rhl.comlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);  ofs += m_stat->rhl.pdulenlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);  ofs += m_stat->rhl.ridlenlen;  snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);  ofs += m_stat->rhl.ridlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);  ofs += m_stat->rhl.errstatlenlen;  snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);  ofs += m_stat->rhl.errstatlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);  ofs += m_stat->rhl.erridxlenlen;  snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);  ofs += m_stat->rhl.erridxlen;  return ofs;}/** * Encodes trap header from head to tail. */static u16_tsnmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p){  u16_t ofs;  ofs = 0;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);  ofs += m_trap->thl.seqlenlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);  ofs += m_trap->thl.verlenlen;  snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);  ofs += m_trap->thl.verlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);  ofs += m_trap->thl.comlenlen;  snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);  ofs += m_trap->thl.comlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);  ofs += m_trap->thl.pdulenlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);  ofs += m_trap->thl.eidlenlen;  snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);  ofs += m_trap->thl.eidlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);  ofs += m_trap->thl.aaddrlenlen;  snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);  ofs += m_trap->thl.aaddrlen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);  ofs += m_trap->thl.gtrplenlen;  snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);  ofs += m_trap->thl.gtrplen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);  ofs += m_trap->thl.strplenlen;  snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);  ofs += m_trap->thl.strplen;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));  ofs += 1;  snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);  ofs += m_trap->thl.tslenlen;  snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);  ofs += m_trap->thl.tslen;  return ofs;}/** * Encodes varbind list from head to tail. */static u16_tsnmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs){  struct snmp_varbind *vb;  s32_t *sint_ptr;  u32_t *uint_ptr;  u8_t *raw_ptr;  snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));  ofs += 1;  snmp_asn1_enc_length(p, ofs, root->seqlen);  ofs += root->seqlenlen;  vb = root->head;  while ( vb != NULL )  {    snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));    ofs += 1;    snmp_asn1_enc_length(p, ofs, vb->seqlen);    ofs += vb->seqlenlen;    snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));    ofs += 1;    snmp_asn1_enc_length(p, ofs, vb->olen);    ofs += vb->olenlen;    snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);    ofs += vb->olen;    snmp_asn1_enc_type(p, ofs, vb->value_type);    ofs += 1;    snmp_asn1_enc_length(p, ofs, vb->vlen);    ofs += vb->vlenlen;    switch (vb->value_type)    {      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):        sint_ptr = vb->value;        snmp_asn1_enc_s32t(p, ofs, vb->vlen, *sint_ptr);        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):        uint_ptr = vb->value;        snmp_asn1_enc_u32t(p, ofs, vb->vlen, *uint_ptr);        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):      case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):        raw_ptr = vb->value;        snmp_asn1_enc_raw(p, ofs, vb->vlen, raw_ptr);        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):        break;      case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):        sint_ptr = vb->value;        snmp_asn1_enc_oid(p, ofs, vb->value_len / sizeof(s32_t), sint_ptr);        break;      default:        /* unsupported type */        break;    };    ofs += vb->vlen;    vb = vb->next;  }  return ofs;}#endif /* LWIP_SNMP */

⌨️ 快捷键说明

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