43#include "lwip/ip_addr.h"
52const s32_t snmp_version = 0;
54const char snmp_publiccommunity[7] =
"public";
59struct udp_pcb *snmp1_pcb;
61static void snmp_recv(
void *arg,
struct udp_pcb *pcb,
struct pbuf *p,
ip_addr_t *addr,
u16_t port);
62static err_t snmp_pdu_header_check(
struct pbuf *p,
u16_t ofs,
u16_t pdu_len,
u16_t *ofs_ret,
struct snmp_msg_pstat *m_stat);
63static err_t snmp_pdu_dec_varbindlist(
struct pbuf *p,
u16_t ofs,
u16_t *ofs_ret,
struct snmp_msg_pstat *m_stat);
73 struct snmp_msg_pstat *msg_ps;
76 snmp1_pcb = udp_new();
77 if (snmp1_pcb !=
NULL)
79 udp_recv(snmp1_pcb, snmp_recv, (
void *)SNMP_IN_PORT);
82 msg_ps = &msg_input_list[0];
85 msg_ps->state = SNMP_MSG_EMPTY;
86 msg_ps->error_index = 0;
87 msg_ps->error_status = SNMP_ES_NOERROR;
90 trap_msg.pcb = snmp1_pcb;
92#ifdef SNMP_PRIVATE_MIB_INIT
97 SNMP_PRIVATE_MIB_INIT();
102 snmp_coldstart_trap();
106snmp_error_response(
struct snmp_msg_pstat *msg_ps,
u8_t error)
110 struct snmp_varbind *vbi = msg_ps->invb.head;
111 struct snmp_varbind *vbo = msg_ps->outvb.head;
112 for (v=0; v<msg_ps->vb_idx; v++) {
113 vbi->ident_len = vbo->ident_len;
115 vbi->ident = vbo->ident;
121 snmp_varbind_list_free(&msg_ps->outvb);
123 msg_ps->outvb = msg_ps->invb;
124 msg_ps->invb.head =
NULL;
125 msg_ps->invb.tail =
NULL;
126 msg_ps->invb.count = 0;
127 msg_ps->error_status = error;
129 msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
130 snmp_send_response(msg_ps);
131 snmp_varbind_list_free(&msg_ps->outvb);
132 msg_ps->state = SNMP_MSG_EMPTY;
136snmp_ok_response(
struct snmp_msg_pstat *msg_ps)
140 err_ret = snmp_send_response(msg_ps);
150 snmp_varbind_list_free(&msg_ps->invb);
151 snmp_varbind_list_free(&msg_ps->outvb);
152 msg_ps->state = SNMP_MSG_EMPTY;
162snmp_msg_get_event(
u8_t request_id,
struct snmp_msg_pstat *msg_ps)
166 if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
168 struct mib_external_node *en;
169 struct snmp_name_ptr np;
172 en = msg_ps->ext_mib_node;
173 np = msg_ps->ext_name_ptr;
176 en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
177 if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
178 (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
180 msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
181 en->get_value_q(request_id, &msg_ps->ext_object_def);
185 en->get_object_def_pc(request_id, np.ident_len, np.ident);
187 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
190 else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
192 struct mib_external_node *en;
193 struct snmp_varbind *vb;
196 en = msg_ps->ext_mib_node;
199 vb = (
struct snmp_varbind *)
memp_malloc(MEMP_SNMP_VARBIND);
206 vb->ident = msg_ps->vb_ptr->ident;
207 vb->ident_len = msg_ps->vb_ptr->ident_len;
209 msg_ps->vb_ptr->ident =
NULL;
210 msg_ps->vb_ptr->ident_len = 0;
212 vb->value_type = msg_ps->ext_object_def.asn_type;
213 LWIP_ASSERT(
"invalid length", msg_ps->ext_object_def.v_len <= 0xff);
214 vb->value_len = (
u8_t)msg_ps->ext_object_def.v_len;
215 if (vb->value_len > 0)
219 if (vb->value !=
NULL)
221 en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
222 snmp_varbind_tail_add(&msg_ps->outvb, vb);
224 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
229 en->get_value_pc(request_id, &msg_ps->ext_object_def);
231 msg_ps->vb_ptr->ident = vb->ident;
232 msg_ps->vb_ptr->ident_len = vb->ident_len;
234 snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
240 en->get_value_a(request_id, &msg_ps->ext_object_def, 0,
NULL);
242 snmp_varbind_tail_add(&msg_ps->outvb, vb);
244 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
250 en->get_value_pc(request_id, &msg_ps->ext_object_def);
252 snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
256 while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
257 (msg_ps->vb_idx < msg_ps->invb.count))
260 struct snmp_name_ptr np;
262 if (msg_ps->vb_idx == 0)
264 msg_ps->vb_ptr = msg_ps->invb.head;
268 msg_ps->vb_ptr = msg_ps->vb_ptr->next;
271 if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
273 mn = snmp_search_tree((
struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
274 msg_ps->vb_ptr->ident + 4, &np);
277 if (mn->node_type == MIB_NODE_EX)
280 struct mib_external_node *en = (
struct mib_external_node*)mn;
282 msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
284 msg_ps->ext_mib_node = en;
285 msg_ps->ext_name_ptr = np;
287 en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
292 struct obj_def object_def;
294 msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
295 mn->get_object_def(np.ident_len, np.ident, &object_def);
296 if ((object_def.instance != MIB_OBJECT_NONE) &&
297 (object_def.access & MIB_ACCESS_READ))
308 struct snmp_varbind *vb;
310 msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
312 vb = (
struct snmp_varbind *)
memp_malloc(MEMP_SNMP_VARBIND);
319 vb->ident = msg_ps->vb_ptr->ident;
320 vb->ident_len = msg_ps->vb_ptr->ident_len;
322 msg_ps->vb_ptr->ident =
NULL;
323 msg_ps->vb_ptr->ident_len = 0;
325 vb->value_type = object_def.asn_type;
326 LWIP_ASSERT(
"invalid length", object_def.v_len <= 0xff);
327 vb->value_len = (
u8_t)object_def.v_len;
328 if (vb->value_len > 0)
330 LWIP_ASSERT(
"SNMP_MAX_OCTET_STRING_LEN is configured too low",
333 if (vb->value !=
NULL)
335 mn->get_value(&object_def, vb->value_len, vb->value);
336 snmp_varbind_tail_add(&msg_ps->outvb, vb);
337 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
343 msg_ps->vb_ptr->ident = vb->ident;
344 msg_ps->vb_ptr->ident_len = vb->ident_len;
348 snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
355 snmp_varbind_tail_add(&msg_ps->outvb, vb);
356 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
363 snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
376 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
379 if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
380 (msg_ps->vb_idx == msg_ps->invb.count))
382 snmp_ok_response(msg_ps);
393snmp_msg_getnext_event(
u8_t request_id,
struct snmp_msg_pstat *msg_ps)
397 if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
399 struct mib_external_node *en;
402 en = msg_ps->ext_mib_node;
405 en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
406 if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
408 msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
409 en->get_value_q(request_id, &msg_ps->ext_object_def);
413 en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]);
415 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
418 else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
420 struct mib_external_node *en;
421 struct snmp_varbind *vb;
424 en = msg_ps->ext_mib_node;
426 LWIP_ASSERT(
"invalid length", msg_ps->ext_object_def.v_len <= 0xff);
427 vb = snmp_varbind_alloc(&msg_ps->ext_oid,
428 msg_ps->ext_object_def.asn_type,
429 (
u8_t)msg_ps->ext_object_def.v_len);
432 en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
433 snmp_varbind_tail_add(&msg_ps->outvb, vb);
434 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
439 en->get_value_pc(request_id, &msg_ps->ext_object_def);
441 snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
445 while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
446 (msg_ps->vb_idx < msg_ps->invb.count))
449 struct snmp_obj_id oid;
451 if (msg_ps->vb_idx == 0)
453 msg_ps->vb_ptr = msg_ps->invb.head;
457 msg_ps->vb_ptr = msg_ps->vb_ptr->next;
459 if (snmp_iso_prefix_expand(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident, &oid))
461 if (msg_ps->vb_ptr->ident_len > 3)
464 mn = snmp_expand_tree((
struct mib_node*)&internet,
465 msg_ps->vb_ptr->ident_len - 4,
466 msg_ps->vb_ptr->ident + 4, &oid);
471 mn = snmp_expand_tree((
struct mib_node*)&internet, 0,
NULL, &oid);
480 if (mn->node_type == MIB_NODE_EX)
483 struct mib_external_node *en = (
struct mib_external_node*)mn;
485 msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
487 msg_ps->ext_mib_node = en;
488 msg_ps->ext_oid = oid;
490 en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]);
495 struct obj_def object_def;
496 struct snmp_varbind *vb;
498 msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
499 mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
501 LWIP_ASSERT(
"invalid length", object_def.v_len <= 0xff);
502 vb = snmp_varbind_alloc(&oid, object_def.asn_type, (
u8_t)object_def.v_len);
505 msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
506 mn->get_value(&object_def, object_def.v_len, vb->value);
507 snmp_varbind_tail_add(&msg_ps->outvb, vb);
508 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
514 snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
521 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
524 if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
525 (msg_ps->vb_idx == msg_ps->invb.count))
527 snmp_ok_response(msg_ps);
538snmp_msg_set_event(
u8_t request_id,
struct snmp_msg_pstat *msg_ps)
542 if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
544 struct mib_external_node *en;
545 struct snmp_name_ptr np;
548 en = msg_ps->ext_mib_node;
549 np = msg_ps->ext_name_ptr;
552 en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
553 if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
555 msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST;
556 en->set_test_q(request_id, &msg_ps->ext_object_def);
560 en->get_object_def_pc(request_id, np.ident_len, np.ident);
562 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
565 else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
567 struct mib_external_node *en;
570 en = msg_ps->ext_mib_node;
572 if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
574 if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
575 (en->set_test_a(request_id,&msg_ps->ext_object_def,
576 msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
578 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
583 en->set_test_pc(request_id,&msg_ps->ext_object_def);
585 snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
590 en->set_test_pc(request_id,&msg_ps->ext_object_def);
592 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
595 else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S)
597 struct mib_external_node *en;
598 struct snmp_name_ptr np;
601 en = msg_ps->ext_mib_node;
602 np = msg_ps->ext_name_ptr;
605 en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
606 if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
608 msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
609 en->set_value_q(request_id, &msg_ps->ext_object_def,
610 msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
614 en->get_object_def_pc(request_id, np.ident_len, np.ident);
616 snmp_error_response(msg_ps,SNMP_ES_GENERROR);
619 else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE)
621 struct mib_external_node *en;
624 en = msg_ps->ext_mib_node;
625 en->set_value_a(request_id, &msg_ps->ext_object_def,
626 msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
629 msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
634 while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
635 (msg_ps->vb_idx < msg_ps->invb.count))
638 struct snmp_name_ptr np;
640 if (msg_ps->vb_idx == 0)
642 msg_ps->vb_ptr = msg_ps->invb.head;
646 msg_ps->vb_ptr = msg_ps->vb_ptr->next;
649 if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
651 mn = snmp_search_tree((
struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
652 msg_ps->vb_ptr->ident + 4, &np);
655 if (mn->node_type == MIB_NODE_EX)
658 struct mib_external_node *en = (
struct mib_external_node*)mn;
660 msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
662 msg_ps->ext_mib_node = en;
663 msg_ps->ext_name_ptr = np;
665 en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
670 struct obj_def object_def;
672 msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
673 mn->get_object_def(np.ident_len, np.ident, &object_def);
674 if (object_def.instance != MIB_OBJECT_NONE)
685 msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
687 if (object_def.access & MIB_ACCESS_WRITE)
689 if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
690 (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
692 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
698 snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
704 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
717 snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
721 if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
722 (msg_ps->vb_idx == msg_ps->invb.count))
725 msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
729 while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
730 (msg_ps->vb_idx < msg_ps->invb.count))
733 struct snmp_name_ptr np;
735 if (msg_ps->vb_idx == 0)
737 msg_ps->vb_ptr = msg_ps->invb.head;
741 msg_ps->vb_ptr = msg_ps->vb_ptr->next;
744 mn = snmp_search_tree((
struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
745 msg_ps->vb_ptr->ident + 4, &np);
750 if (mn->node_type == MIB_NODE_EX)
753 struct mib_external_node *en = (
struct mib_external_node*)mn;
755 msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
757 msg_ps->ext_mib_node = en;
758 msg_ps->ext_name_ptr = np;
760 en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
765 struct obj_def object_def;
767 msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S;
768 mn->get_object_def(np.ident_len, np.ident, &object_def);
769 msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
770 mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
775 if ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
776 (msg_ps->vb_idx == msg_ps->invb.count))
781 msg_ps->outvb = msg_ps->invb;
782 msg_ps->invb.head =
NULL;
783 msg_ps->invb.tail =
NULL;
784 msg_ps->invb.count = 0;
785 snmp_ok_response(msg_ps);
797snmp_msg_event(
u8_t request_id)
799 struct snmp_msg_pstat *msg_ps;
803 msg_ps = &msg_input_list[request_id];
804 if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
806 snmp_msg_getnext_event(request_id, msg_ps);
808 else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
810 snmp_msg_get_event(request_id, msg_ps);
812 else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
814 snmp_msg_set_event(request_id, msg_ps);
824 struct snmp_msg_pstat *msg_ps;
828 u16_t payload_ofs = 0;
829 u16_t varbind_ofs = 0;
835 msg_ps = &msg_input_list[0];
859 err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
862 if ((err_ret !=
ERR_OK) ||
863 ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
864 (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
865 (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
866 ((msg_ps->error_status != SNMP_ES_NOERROR) ||
867 (msg_ps->error_index != 0)) )
878 err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
881 if ((err_ret !=
ERR_OK) || (msg_ps->invb.count == 0))
890 msg_ps->error_status = SNMP_ES_NOERROR;
891 msg_ps->error_index = 0;
893 msg_ps->state = SNMP_MSG_SEARCH_OBJ;
900 snmp_msg_event(req_idx);
916snmp_pdu_header_check(
struct pbuf *p,
u16_t ofs,
u16_t pdu_len,
u16_t *ofs_ret,
struct snmp_msg_pstat *m_stat)
925 snmp_asn1_dec_type(p, ofs, &
type);
926 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
928 (pdu_len != (1 + len_octets + len)) ||
929 (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
934 ofs += (1 + len_octets);
935 snmp_asn1_dec_type(p, ofs, &
type);
936 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
937 if ((derr !=
ERR_OK) || (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
943 derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &
version);
956 ofs += (1 + len_octets + len);
957 snmp_asn1_dec_type(p, ofs, &
type);
958 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
959 if ((derr !=
ERR_OK) || (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
965 derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community);
972 len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
973 m_stat->community[len] = 0;
974 m_stat->com_strlen = (
u8_t)len;
975 if (strncmp(snmp_publiccommunity, (
const char*)m_stat->community, SNMP_COMMUNITY_STR_LEN) != 0)
979 snmp_authfail_trap();
982 ofs += (1 + len_octets + len);
983 snmp_asn1_dec_type(p, ofs, &
type);
984 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
992 case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):
997 case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):
1002 case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):
1007 case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):
1012 case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):
1027 m_stat->rt =
type & 0x1F;
1028 ofs += (1 + len_octets);
1029 if (len != (pdu_len - (ofs - ofs_base)))
1035 snmp_asn1_dec_type(p, ofs, &
type);
1036 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
1037 if ((derr !=
ERR_OK) || (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
1043 derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);
1050 ofs += (1 + len_octets + len);
1051 snmp_asn1_dec_type(p, ofs, &
type);
1052 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
1053 if ((derr !=
ERR_OK) || (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
1061 derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status);
1068 switch (m_stat->error_status)
1070 case SNMP_ES_TOOBIG:
1073 case SNMP_ES_NOSUCHNAME:
1076 case SNMP_ES_BADVALUE:
1079 case SNMP_ES_READONLY:
1082 case SNMP_ES_GENERROR:
1086 ofs += (1 + len_octets + len);
1087 snmp_asn1_dec_type(p, ofs, &
type);
1088 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
1089 if ((derr !=
ERR_OK) || (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
1097 derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index);
1104 ofs += (1 + len_octets + len);
1110snmp_pdu_dec_varbindlist(
struct pbuf *p,
u16_t ofs,
u16_t *ofs_ret,
struct snmp_msg_pstat *m_stat)
1118 snmp_asn1_dec_type(p, ofs, &
type);
1119 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
1121 (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
1126 ofs += (1 + len_octets);
1129 m_stat->invb.count = 0;
1130 m_stat->invb.head =
NULL;
1131 m_stat->invb.tail =
NULL;
1135 struct snmp_obj_id oid, oid_value;
1136 struct snmp_varbind *vb;
1138 snmp_asn1_dec_type(p, ofs, &
type);
1139 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
1141 (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
1142 (len == 0) || (len > vb_len))
1146 snmp_varbind_list_free(&m_stat->invb);
1149 ofs += (1 + len_octets);
1150 vb_len -= (1 + len_octets);
1152 snmp_asn1_dec_type(p, ofs, &
type);
1153 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
1154 if ((derr !=
ERR_OK) || (
type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))
1159 snmp_varbind_list_free(&m_stat->invb);
1162 derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid);
1168 snmp_varbind_list_free(&m_stat->invb);
1171 ofs += (1 + len_octets + len);
1172 vb_len -= (1 + len_octets + len);
1174 snmp_asn1_dec_type(p, ofs, &
type);
1175 derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
1181 snmp_varbind_list_free(&m_stat->invb);
1187 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
1188 vb = snmp_varbind_alloc(&oid,
type,
sizeof(
s32_t));
1193 derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr);
1194 snmp_varbind_tail_add(&m_stat->invb, vb);
1201 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
1202 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
1203 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
1204 vb = snmp_varbind_alloc(&oid,
type,
sizeof(
u32_t));
1209 derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr);
1210 snmp_varbind_tail_add(&m_stat->invb, vb);
1217 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
1218 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
1220 vb = snmp_varbind_alloc(&oid,
type, (
u8_t)len);
1223 derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (
u8_t*)vb->value);
1224 snmp_varbind_tail_add(&m_stat->invb, vb);
1231 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
1232 vb = snmp_varbind_alloc(&oid,
type, 0);
1235 snmp_varbind_tail_add(&m_stat->invb, vb);
1243 case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
1244 derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value);
1247 vb = snmp_varbind_alloc(&oid,
type, oid_value.len *
sizeof(
s32_t));
1250 u8_t i = oid_value.len;
1256 vptr[i] = oid_value.id[i];
1258 snmp_varbind_tail_add(&m_stat->invb, vb);
1267 case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
1271 vb = snmp_varbind_alloc(&oid,
type, 4);
1274 derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (
u8_t*)vb->value);
1275 snmp_varbind_tail_add(&m_stat->invb, vb);
1295 snmp_varbind_list_free(&m_stat->invb);
1298 ofs += (1 + len_octets + len);
1299 vb_len -= (1 + len_octets + len);
1302 if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)
1316snmp_varbind_alloc(
struct snmp_obj_id *oid,
u8_t type,
u8_t len)
1318 struct snmp_varbind *vb;
1320 vb = (
struct snmp_varbind *)
memp_malloc(MEMP_SNMP_VARBIND);
1334 if (vb->ident ==
NULL)
1343 vb->ident[i] = oid->id[i];
1351 vb->value_type =
type;
1352 vb->value_len = len;
1358 if (vb->value ==
NULL)
1361 if (vb->ident !=
NULL)
1383snmp_varbind_free(
struct snmp_varbind *vb)
1385 if (vb->value !=
NULL )
1389 if (vb->ident !=
NULL )
1397snmp_varbind_list_free(
struct snmp_varbind_root *root)
1399 struct snmp_varbind *vb, *prev;
1402 while ( vb !=
NULL )
1405 snmp_varbind_free(vb);
1414snmp_varbind_tail_add(
struct snmp_varbind_root *root,
struct snmp_varbind *vb)
1416 if (root->count == 0)
1425 root->tail->next = vb;
1426 vb->prev = root->tail;
1433snmp_varbind_tail_remove(
struct snmp_varbind_root *root)
1435 struct snmp_varbind* vb;
1437 if (root->count > 0)
1441 root->tail = vb->prev;
1442 vb->prev->next =
NULL;
#define LWIP_UNUSED_ARG(x)
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
void * memp_malloc(memp_t type)
void memp_free(memp_t type, void *mem)
#define SNMP_MAX_TREE_DEPTH
#define SNMP_MAX_VALUE_SIZE
#define SNMP_CONCURRENT_REQUESTS
u8_t pbuf_free(struct pbuf *p)
#define snmp_inc_snmpinbadcommunitynames()
#define snmp_inc_snmpinnosuchnames()
#define snmp_inc_snmpingetnexts()
#define snmp_inc_snmpinasnparseerrs()
#define snmp_inc_snmpingetrequests()
#define snmp_inc_snmpinbadvalues()
#define snmp_inc_snmpintraps()
#define snmp_inc_snmpintoobigs()
#define snmp_inc_snmpinbadversions()
#define snmp_inc_snmpinreadonlys()
#define snmp_inc_snmpinpkts()
#define snmp_add_snmpintotalreqvars(value)
#define snmp_inc_snmpingetresponses()
#define snmp_inc_snmpingenerrs()
#define snmp_inc_snmpinsetrequests()
#define snmp_add_snmpintotalsetvars(value)