51#ifdef LWIP_HOOK_FILENAME
52#include LWIP_HOOK_FILENAME
58#define SNMP_V3_AUTH_FLAG 0x01
59#define SNMP_V3_PRIV_FLAG 0x02
62#define SNMP_V3_NOAUTHNOPRIV 0x00
63#define SNMP_V3_AUTHNOPRIV SNMP_V3_AUTH_FLAG
64#define SNMP_V3_AUTHPRIV (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)
74snmp_write_callback_fct snmp_write_callback;
75void *snmp_write_callback_arg;
77snmp_inform_callback_fct snmp_inform_callback;
78void *snmp_inform_callback_arg;
80#if LWIP_SNMP_CONFIGURE_VERSIONS
82static u8_t v1_enabled = 1;
83static u8_t v2c_enabled = 1;
84static u8_t v3_enabled = 1;
89 if (
version == SNMP_VERSION_1) {
91 }
else if (
version == SNMP_VERSION_2c) {
95 else if (
version == SNMP_VERSION_3) {
108 return snmp_version_enabled(SNMP_VERSION_1);
112snmp_v2c_enabled(
void)
114 return snmp_version_enabled(SNMP_VERSION_2c);
120 return snmp_version_enabled(SNMP_VERSION_3);
126 if (
version == SNMP_VERSION_1) {
128 }
else if (
version == SNMP_VERSION_2c) {
132 else if (
version == SNMP_VERSION_3) {
144 snmp_version_enable(SNMP_VERSION_1,
enable);
150 snmp_version_enable(SNMP_VERSION_2c,
enable);
156 snmp_version_enable(SNMP_VERSION_3,
enable);
167snmp_get_community(
void)
169 return snmp_community;
181snmp_set_community(
const char *
const community)
183 LWIP_ASSERT_SNMP_LOCKED();
185 snmp_community = community;
194snmp_get_community_write(
void)
196 return snmp_community_write;
205snmp_get_community_trap(
void)
207 return snmp_community_trap;
219snmp_set_community_write(
const char *
const community)
221 LWIP_ASSERT_SNMP_LOCKED();
224 snmp_community_write = community;
236snmp_set_community_trap(
const char *
const community)
238 LWIP_ASSERT_SNMP_LOCKED();
240 snmp_community_trap = community;
248snmp_set_write_callback(snmp_write_callback_fct write_callback,
void *callback_arg)
250 LWIP_ASSERT_SNMP_LOCKED();
251 snmp_write_callback = write_callback;
252 snmp_write_callback_arg = callback_arg;
260snmp_set_inform_callback(snmp_inform_callback_fct inform_callback,
void* callback_arg)
262 snmp_inform_callback = inform_callback;
263 snmp_inform_callback_arg = callback_arg;
270static err_t snmp_process_get_request(
struct snmp_request *
request);
271static err_t snmp_process_getnext_request(
struct snmp_request *
request);
272static err_t snmp_process_getbulk_request(
struct snmp_request *
request);
273static err_t snmp_process_set_request(
struct snmp_request *
request);
275static err_t snmp_parse_inbound_frame(
struct snmp_request *
request);
276static err_t snmp_prepare_outbound_frame(
struct snmp_request *
request);
277static err_t snmp_complete_outbound_frame(
struct snmp_request *
request);
278static void snmp_execute_write_callbacks(
struct snmp_request *
request);
301 if (
request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_RESP) {
302 if (
request.error_status == SNMP_ERR_NOERROR) {
304 if (snmp_inform_callback !=
NULL) {
305 snmp_inform_callback(&
request, snmp_inform_callback_arg);
314 if (
request.error_status == SNMP_ERR_NOERROR) {
316 if (
request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_REQ) {
318 }
else if (
request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ) {
320 }
else if (
request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
322 }
else if (
request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
328 struct snmp_varbind vb;
332 vb.type = SNMP_ASN1_TYPE_COUNTER32;
333 vb.value_len =
sizeof(
u32_t);
335 switch (
request.error_status) {
336 case SNMP_ERR_AUTHORIZATIONERROR: {
337 static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5, 0 };
339 vb.value = &snmp_stats.wrongdigests;
342 case SNMP_ERR_UNKNOWN_ENGINEID: {
343 static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0 };
345 vb.value = &snmp_stats.unknownengineids;
348 case SNMP_ERR_UNKNOWN_SECURITYNAME: {
349 static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3, 0 };
351 vb.value = &snmp_stats.unknownusernames;
354 case SNMP_ERR_UNSUPPORTED_SECLEVEL: {
355 static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1, 0 };
357 vb.value = &snmp_stats.unsupportedseclevels;
360 case SNMP_ERR_NOTINTIMEWINDOW: {
361 static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0 };
363 vb.value = &snmp_stats.notintimewindows;
366 case SNMP_ERR_DECRYIPTION_ERROR: {
367 static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6, 0 };
369 vb.value = &snmp_stats.decryptionerrors;
378 snmp_append_outbound_varbind(&(
request.outbound_pbuf_stream), &vb);
379 request.error_status = SNMP_ERR_NOERROR;
382 request.request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_REPORT);
393 if ((
request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)
394 && (
request.error_status == SNMP_ERR_NOERROR)
395 && (snmp_write_callback !=
NULL)) {
397 snmp_execute_write_callbacks(&
request);
410snmp_msg_getnext_validate_node_inst(
struct snmp_node_instance *node_instance,
void *validate_arg)
412 if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_READ) != SNMP_NODE_INSTANCE_ACCESS_READ) || (node_instance->get_value ==
NULL)) {
413 return SNMP_ERR_NOSUCHINSTANCE;
417 if ((node_instance->asn1_type == SNMP_ASN1_TYPE_COUNTER64) && (((
struct snmp_request *)validate_arg)->version == SNMP_VERSION_1)) {
419 return SNMP_ERR_NOSUCHINSTANCE;
423 return SNMP_ERR_NOERROR;
427snmp_process_varbind(
struct snmp_request *
request,
struct snmp_varbind *vb,
u8_t get_next)
430 struct snmp_node_instance node_instance;
431 memset(&node_instance, 0,
sizeof(node_instance));
434 struct snmp_obj_id result_oid;
435 request->error_status = snmp_get_next_node_instance_from_oid(vb->oid.id, vb->oid.len, snmp_msg_getnext_validate_node_inst,
request, &result_oid, &node_instance);
437 if (
request->error_status == SNMP_ERR_NOERROR) {
438 snmp_oid_assign(&vb->oid, result_oid.id, result_oid.len);
441 request->error_status = snmp_get_node_instance_from_oid(vb->oid.id, vb->oid.len, &node_instance);
443 if (
request->error_status == SNMP_ERR_NOERROR) {
445 request->error_status = snmp_msg_getnext_validate_node_inst(&node_instance,
request);
447 if (
request->error_status != SNMP_ERR_NOERROR) {
448 if (node_instance.release_instance !=
NULL) {
449 node_instance.release_instance(&node_instance);
455 if (
request->error_status != SNMP_ERR_NOERROR) {
456 if (
request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {
459 vb->type = (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | (
request->error_status & SNMP_VARBIND_EXCEPTION_MASK));
462 err = snmp_append_outbound_varbind(&(
request->outbound_pbuf_stream), vb);
465 request->error_status = SNMP_ERR_NOERROR;
467 request->error_status = SNMP_ERR_TOOBIG;
469 request->error_status = SNMP_ERR_GENERROR;
474 request->error_status = SNMP_ERR_GENERROR;
477 s16_t len = node_instance.get_value(&node_instance, vb->value);
481 vb->type = node_instance.asn1_type;
484 err = snmp_append_outbound_varbind(&
request->outbound_pbuf_stream, vb);
487 request->error_status = SNMP_ERR_TOOBIG;
489 request->error_status = SNMP_ERR_GENERROR;
492 request->error_status = SNMP_ERR_GENERROR;
495 if (node_instance.release_instance !=
NULL) {
496 node_instance.release_instance(&node_instance);
508snmp_process_get_request(
struct snmp_request *
request)
510 snmp_vb_enumerator_err_t
err;
511 struct snmp_varbind vb;
516 while (
request->error_status == SNMP_ERR_NOERROR) {
517 err = snmp_vb_enumerator_get_next(&
request->inbound_varbind_enumerator, &vb);
518 if (
err == SNMP_VB_ENUMERATOR_ERR_OK) {
519 if ((vb.type == SNMP_ASN1_TYPE_NULL) && (vb.value_len == 0)) {
520 snmp_process_varbind(
request, &vb, 0);
522 request->error_status = SNMP_ERR_GENERROR;
524 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_EOVB) {
527 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {
531 request->error_status = SNMP_ERR_GENERROR;
544snmp_process_getnext_request(
struct snmp_request *
request)
546 snmp_vb_enumerator_err_t
err;
547 struct snmp_varbind vb;
552 while (
request->error_status == SNMP_ERR_NOERROR) {
553 err = snmp_vb_enumerator_get_next(&
request->inbound_varbind_enumerator, &vb);
554 if (
err == SNMP_VB_ENUMERATOR_ERR_OK) {
555 if ((vb.type == SNMP_ASN1_TYPE_NULL) && (vb.value_len == 0)) {
556 snmp_process_varbind(
request, &vb, 1);
558 request->error_status = SNMP_ERR_GENERROR;
560 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_EOVB) {
563 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {
567 request->error_status = SNMP_ERR_GENERROR;
580snmp_process_getbulk_request(
struct snmp_request *
request)
582 snmp_vb_enumerator_err_t
err;
585 u16_t repetition_offset = 0;
586 struct snmp_varbind_enumerator repetition_varbind_enumerator;
587 struct snmp_varbind vb;
588 vb.value =
request->value_buffer;
593 repetitions =
request->max_repetitions;
599 while (
request->error_status == SNMP_ERR_NOERROR) {
600 if (non_repeaters == 0) {
601 repetition_offset =
request->outbound_pbuf_stream.offset;
603 if (repetitions == 0) {
610 err = snmp_vb_enumerator_get_next(&
request->inbound_varbind_enumerator, &vb);
611 if (
err == SNMP_VB_ENUMERATOR_ERR_EOVB) {
614 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {
617 }
else if ((
err != SNMP_VB_ENUMERATOR_ERR_OK) || (vb.type != SNMP_ASN1_TYPE_NULL) || (vb.value_len != 0)) {
618 request->error_status = SNMP_ERR_GENERROR;
620 snmp_process_varbind(
request, &vb, 1);
626 while ((
request->error_status == SNMP_ERR_NOERROR) && (repetitions > 0) && (
request->outbound_pbuf_stream.offset != repetition_offset)) {
628 u8_t all_endofmibview = 1;
630 snmp_vb_enumerator_init(&repetition_varbind_enumerator,
request->outbound_pbuf, repetition_offset,
request->outbound_pbuf_stream.offset - repetition_offset);
631 repetition_offset =
request->outbound_pbuf_stream.offset;
633 while (
request->error_status == SNMP_ERR_NOERROR) {
635 err = snmp_vb_enumerator_get_next(&repetition_varbind_enumerator, &vb);
636 if (
err == SNMP_VB_ENUMERATOR_ERR_OK) {
637 vb.value =
request->value_buffer;
638 snmp_process_varbind(
request, &vb, 1);
640 if (
request->error_status != SNMP_ERR_NOERROR) {
642 request->error_index =
request->non_repeaters + repetition_varbind_enumerator.varbind_count;
643 }
else if (vb.type != (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW)) {
644 all_endofmibview = 0;
646 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_EOVB) {
650 LWIP_DEBUGF(
SNMP_DEBUG, (
"Very strange, we cannot parse the varbind output that we created just before!\n"));
651 request->error_status = SNMP_ERR_GENERROR;
652 request->error_index =
request->non_repeaters + repetition_varbind_enumerator.varbind_count;
656 if ((
request->error_status == SNMP_ERR_NOERROR) && all_endofmibview) {
664 if (
request->error_status == SNMP_ERR_TOOBIG) {
666 request->error_status = SNMP_ERR_NOERROR;
678snmp_process_set_request(
struct snmp_request *
request)
680 snmp_vb_enumerator_err_t
err;
681 struct snmp_varbind vb;
687 while (
request->error_status == SNMP_ERR_NOERROR) {
688 err = snmp_vb_enumerator_get_next(&
request->inbound_varbind_enumerator, &vb);
689 if (
err == SNMP_VB_ENUMERATOR_ERR_OK) {
690 struct snmp_node_instance node_instance;
691 memset(&node_instance, 0,
sizeof(node_instance));
693 request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
694 if (
request->error_status == SNMP_ERR_NOERROR) {
695 if (node_instance.asn1_type != vb.type) {
696 request->error_status = SNMP_ERR_WRONGTYPE;
697 }
else if (((node_instance.access & SNMP_NODE_INSTANCE_ACCESS_WRITE) != SNMP_NODE_INSTANCE_ACCESS_WRITE) || (node_instance.set_value ==
NULL)) {
698 request->error_status = SNMP_ERR_NOTWRITABLE;
700 if (node_instance.set_test !=
NULL) {
701 request->error_status = node_instance.set_test(&node_instance, vb.value_len, vb.value);
705 if (node_instance.release_instance !=
NULL) {
706 node_instance.release_instance(&node_instance);
709 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_EOVB) {
712 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH) {
713 request->error_status = SNMP_ERR_WRONGLENGTH;
714 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {
718 request->error_status = SNMP_ERR_GENERROR;
723 if (
request->error_status == SNMP_ERR_NOERROR) {
724 snmp_vb_enumerator_init(&
request->inbound_varbind_enumerator,
request->inbound_pbuf,
request->inbound_varbind_offset,
request->inbound_varbind_len);
725 while (
request->error_status == SNMP_ERR_NOERROR) {
726 err = snmp_vb_enumerator_get_next(&
request->inbound_varbind_enumerator, &vb);
727 if (
err == SNMP_VB_ENUMERATOR_ERR_OK) {
728 struct snmp_node_instance node_instance;
729 memset(&node_instance, 0,
sizeof(node_instance));
730 request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
731 if (
request->error_status == SNMP_ERR_NOERROR) {
732 if (node_instance.set_value(&node_instance, vb.value_len, vb.value) != SNMP_ERR_NOERROR) {
733 if (
request->inbound_varbind_enumerator.varbind_count == 1) {
734 request->error_status = SNMP_ERR_COMMITFAILED;
737 request->error_status = SNMP_ERR_UNDOFAILED;
741 if (node_instance.release_instance !=
NULL) {
742 node_instance.release_instance(&node_instance);
745 }
else if (
err == SNMP_VB_ENUMERATOR_ERR_EOVB) {
750 request->error_status = SNMP_ERR_GENERROR;
758#define PARSE_EXEC(code, retValue) \
759 if ((code) != ERR_OK) { \
760 LWIP_DEBUGF(SNMP_DEBUG, ("Malformed ASN.1 detected.\n")); \
761 snmp_stats.inasnparseerrs++; \
765#define PARSE_ASSERT(cond, retValue) \
767 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP parse assertion failed!: " # cond)); \
768 LWIP_DEBUGF(SNMP_DEBUG, ("\n")); \
769 snmp_stats.inasnparseerrs++; \
773#define BUILD_EXEC(code, retValue) \
774 if ((code) != ERR_OK) { \
775 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP error during creation of outbound frame!: " # code)); \
776 LWIP_DEBUGF(SNMP_DEBUG, ("\n")); \
780#define IF_PARSE_EXEC(code) PARSE_EXEC(code, ERR_ARG)
781#define IF_PARSE_ASSERT(code) PARSE_ASSERT(code, ERR_ARG)
792snmp_parse_inbound_frame(
struct snmp_request *
request)
794 struct snmp_pbuf_stream pbuf_stream;
795 struct snmp_asn1_tlv tlv;
796 s32_t parent_tlv_value_len;
800 snmpv3_auth_algo_t auth;
801 snmpv3_priv_algo_t priv;
804 IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream,
request->inbound_pbuf, 0,
request->inbound_pbuf->tot_len));
807 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
808 IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len == pbuf_stream.length));
809 parent_tlv_value_len = tlv.value_len;
812 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
813 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
814 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
815 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
817 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
819 if (((s32_value != SNMP_VERSION_1) &&
820 (s32_value != SNMP_VERSION_2c)
822 && (s32_value != SNMP_VERSION_3)
826 || (!snmp_version_enabled(s32_value))
830 snmp_stats.inbadversions++;
838 u16_t inbound_msgAuthenticationParameters_offset;
847 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
848 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_SEQUENCE);
849 parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);
850 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
853 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
854 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
855 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
856 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
858 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
862 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
863 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
864 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
865 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
867 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
868 request->msg_max_size = s32_value;
871 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
872 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
873 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
874 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
876 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
880 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
881 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
882 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
883 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
885 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
886 request->msg_security_model = s32_value;
895 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
896 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
897 parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);
898 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
901 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
902 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_SEQUENCE);
903 parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);
904 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
907 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
908 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
909 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
910 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
912 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len,
request->msg_authoritative_engine_id,
913 &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
914 request->msg_authoritative_engine_id_len = (
u8_t)u16_value;
917 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
918 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
919 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
920 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
921 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &
request->msg_authoritative_engine_boots));
924 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
925 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
926 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
927 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
928 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &
request->msg_authoritative_engine_time));
931 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
932 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
933 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
934 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
936 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len,
request->msg_user_name,
937 &u16_value, SNMP_V3_MAX_USER_LENGTH));
941 memset(
request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
942 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
943 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
944 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
945 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
947 inbound_msgAuthenticationParameters_offset = pbuf_stream.offset;
951 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len,
request->msg_authentication_parameters,
952 &u16_value, tlv.value_len));
953 request->msg_authentication_parameters_len = (
u8_t)u16_value;
956 memset(
request->msg_privacy_parameters, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);
957 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
958 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
959 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
960 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
962 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len,
request->msg_privacy_parameters,
963 &u16_value, SNMP_V3_MAX_PRIV_PARAM_LENGTH));
964 request->msg_privacy_parameters_len = (
u8_t)u16_value;
976 snmpv3_get_engine_id(&eid, &eid_len);
978 if ((
request->msg_authoritative_engine_id_len == 0) ||
979 (
request->msg_authoritative_engine_id_len != eid_len) ||
980 (
memcmp(eid,
request->msg_authoritative_engine_id, eid_len) != 0)) {
981 snmp_stats.unknownengineids++;
983 request->error_status = SNMP_ERR_UNKNOWN_ENGINEID;
989 if (snmpv3_get_user((
char *)
request->msg_user_name, &auth,
NULL, &priv,
NULL)) {
990 snmp_stats.unknownusernames++;
992 request->error_status = SNMP_ERR_UNKNOWN_SECURITYNAME;
997 switch (
request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)) {
998 case SNMP_V3_NOAUTHNOPRIV:
999 if ((auth != SNMP_V3_AUTH_ALGO_INVAL) || (priv != SNMP_V3_PRIV_ALGO_INVAL)) {
1001 snmp_stats.unsupportedseclevels++;
1002 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1003 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
1007#if LWIP_SNMP_V3_CRYPTO
1008 case SNMP_V3_AUTHNOPRIV:
1009 if ((auth == SNMP_V3_AUTH_ALGO_INVAL) || (priv != SNMP_V3_PRIV_ALGO_INVAL)) {
1011 snmp_stats.unsupportedseclevels++;
1012 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1013 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
1017 case SNMP_V3_AUTHPRIV:
1018 if ((auth == SNMP_V3_AUTH_ALGO_INVAL) || (priv == SNMP_V3_PRIV_ALGO_INVAL)) {
1020 snmp_stats.unsupportedseclevels++;
1021 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1022 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
1028 snmp_stats.unsupportedseclevels++;
1029 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1030 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
1035#if LWIP_SNMP_V3_CRYPTO
1036 if (
request->msg_flags & SNMP_V3_AUTH_FLAG) {
1037 const u8_t zero_arr[SNMP_V3_MAX_AUTH_PARAM_LENGTH] = { 0 };
1040 struct snmp_pbuf_stream auth_stream;
1042 if (
request->msg_authentication_parameters_len > SNMP_V3_MAX_AUTH_PARAM_LENGTH) {
1043 snmp_stats.wrongdigests++;
1044 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1045 request->error_status = SNMP_ERR_AUTHORIZATIONERROR;
1050 IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream,
request->inbound_pbuf, 0,
request->inbound_pbuf->tot_len));
1051 IF_PARSE_EXEC(snmp_pbuf_stream_seek_abs(&auth_stream, inbound_msgAuthenticationParameters_offset));
1053 IF_PARSE_EXEC(snmp_asn1_enc_raw(&auth_stream, zero_arr,
request->msg_authentication_parameters_len));
1056 IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream,
request->inbound_pbuf, 0,
request->inbound_pbuf->tot_len));
1058 IF_PARSE_EXEC(snmpv3_get_user((
char *)
request->msg_user_name, &auth,
key,
NULL,
NULL));
1059 IF_PARSE_EXEC(snmpv3_auth(&auth_stream,
request->inbound_pbuf->tot_len,
key, auth, hmac));
1061 if (
memcmp(
request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)) {
1062 snmp_stats.wrongdigests++;
1063 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1064 request->error_status = SNMP_ERR_AUTHORIZATIONERROR;
1070 s32_t boots = snmpv3_get_engine_boots_internal();
1071 if ((
request->msg_authoritative_engine_boots != boots) || (boots == 2147483647UL)) {
1072 snmp_stats.notintimewindows++;
1073 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1074 request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
1079 s32_t time = snmpv3_get_engine_time_internal();
1080 if (
request->msg_authoritative_engine_time > (
time + 150)) {
1081 snmp_stats.notintimewindows++;
1082 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1083 request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
1085 }
else if (
time > 150) {
1086 if (
request->msg_authoritative_engine_time < (
time - 150)) {
1087 snmp_stats.notintimewindows++;
1088 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1089 request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
1098#if LWIP_SNMP_V3_CRYPTO
1099 if (
request->msg_flags & SNMP_V3_PRIV_FLAG) {
1104 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1105 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
1106 parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);
1107 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1109 IF_PARSE_EXEC(snmpv3_get_user((
char *)
request->msg_user_name,
NULL,
NULL, &priv,
key));
1110 if (snmpv3_crypt(&pbuf_stream, tlv.value_len,
key,
1111 request->msg_privacy_parameters,
request->msg_authoritative_engine_boots,
1112 request->msg_authoritative_engine_time, priv, SNMP_V3_PRIV_MODE_DECRYPT) !=
ERR_OK) {
1113 snmp_stats.decryptionerrors++;
1114 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1115 request->error_status = SNMP_ERR_DECRYIPTION_ERROR;
1129 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1130 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_SEQUENCE);
1131 parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);
1132 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1135 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1136 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
1137 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1138 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1140 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len,
request->context_engine_id,
1141 &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
1146 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1147 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
1148 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1149 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1151 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len,
request->context_name,
1152 &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
1159 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1160 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
1161 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1162 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1167 request->community_strlen = 0;
1168 snmp_pbuf_stream_seek(&pbuf_stream, tlv.value_len);
1177 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1178 IF_PARSE_ASSERT(tlv.value_len <= pbuf_stream.length);
1179 request->inbound_padding_len = pbuf_stream.length - tlv.value_len;
1180 parent_tlv_value_len = tlv.value_len;
1184 case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_REQ):
1186 snmp_stats.ingetrequests++;
1188 case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ):
1190 snmp_stats.ingetnexts++;
1192 case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ):
1199 case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_SET_REQ):
1201 snmp_stats.insetrequests++;
1203 case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP):
1205 snmp_stats.ingetresponses++;
1212 request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK;
1213 request->request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP);
1216 if (
request->community_strlen == 0) {
1218 snmp_stats.inbadcommunitynames++;
1219 snmp_authfail_trap();
1221 }
else if (
request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1222 if (snmp_community_write[0] == 0) {
1224 request->error_status = SNMP_ERR_NOTWRITABLE;
1228 snmp_stats.inbadcommunitynames++;
1229 snmp_authfail_trap();
1235 snmp_stats.inbadcommunitynames++;
1236 snmp_authfail_trap();
1242 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1243 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
1244 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1245 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1247 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &
request->request_id));
1250 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1251 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
1252 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1253 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1255 if (
request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
1256 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &
request->non_repeaters));
1257 if (
request->non_repeaters < 0) {
1263 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
1264 IF_PARSE_ASSERT(s32_value == SNMP_ERR_NOERROR);
1268 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1269 IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
1270 parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1271 IF_PARSE_ASSERT(parent_tlv_value_len > 0);
1273 if (
request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
1274 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &
request->max_repetitions));
1275 if (
request->max_repetitions < 0) {
1280 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &
request->error_index));
1281 IF_PARSE_ASSERT(s32_value == 0);
1285 IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
1286 IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len <= pbuf_stream.length));
1288 request->inbound_varbind_offset = pbuf_stream.offset;
1289 request->inbound_varbind_len = pbuf_stream.length -
request->inbound_padding_len;
1290 snmp_vb_enumerator_init(&(
request->inbound_varbind_enumerator),
request->inbound_pbuf,
request->inbound_varbind_offset,
request->inbound_varbind_len);
1295#define OF_BUILD_EXEC(code) BUILD_EXEC(code, ERR_ARG)
1298snmp_prepare_outbound_frame(
struct snmp_request *
request)
1300 struct snmp_asn1_tlv tlv;
1301 struct snmp_pbuf_stream *pbuf_stream = &(
request->outbound_pbuf_stream);
1309 snmp_pbuf_stream_init(pbuf_stream,
request->outbound_pbuf, 0,
request->outbound_pbuf->tot_len);
1312 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, 0);
1313 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1316 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
1318 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1319 OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->
version) );
1325 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0,
request->community_strlen);
1326 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1327 OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream,
request->community,
request->community_strlen) );
1333 request->outbound_msg_global_data_offset = pbuf_stream->offset;
1334 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, 0);
1335 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1338 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);
1339 snmp_asn1_enc_s32t_cnt(
request->msg_id, &tlv.value_len);
1340 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1341 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->msg_id));
1344 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);
1345 snmp_asn1_enc_s32t_cnt(
request->msg_max_size, &tlv.value_len);
1346 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1347 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->msg_max_size));
1350 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, 1);
1351 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1352 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, &
request->msg_flags, 1));
1355 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);
1356 snmp_asn1_enc_s32t_cnt(
request->msg_security_model, &tlv.value_len);
1357 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1358 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->msg_security_model));
1361 request->outbound_msg_global_data_end = pbuf_stream->offset;
1364 request->outbound_msg_security_parameters_str_offset = pbuf_stream->offset;
1365 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, 0);
1366 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1368 request->outbound_msg_security_parameters_seq_offset = pbuf_stream->offset;
1369 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, 0);
1370 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1373 snmpv3_get_engine_id(&
id, &
request->msg_authoritative_engine_id_len);
1375 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0,
request->msg_authoritative_engine_id_len);
1376 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1377 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream,
request->msg_authoritative_engine_id,
request->msg_authoritative_engine_id_len));
1379 request->msg_authoritative_engine_time = snmpv3_get_engine_time();
1380 request->msg_authoritative_engine_boots = snmpv3_get_engine_boots();
1383 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
1384 snmp_asn1_enc_s32t_cnt(
request->msg_authoritative_engine_boots, &tlv.value_len);
1385 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1386 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->msg_authoritative_engine_boots));
1389 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
1390 snmp_asn1_enc_s32t_cnt(
request->msg_authoritative_engine_time, &tlv.value_len);
1391 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1392 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->msg_authoritative_engine_time));
1395 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0,
request->msg_user_name_len);
1396 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1397 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream,
request->msg_user_name,
request->msg_user_name_len));
1399#if LWIP_SNMP_V3_CRYPTO
1401 if (
request->msg_flags & SNMP_V3_AUTH_FLAG) {
1402 memset(
request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1403 request->outbound_msg_authentication_parameters_offset = pbuf_stream->offset;
1404 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1405 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1406 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream,
request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
1410 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, 0);
1411 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1414#if LWIP_SNMP_V3_CRYPTO
1416 if (
request->msg_flags & SNMP_V3_PRIV_FLAG) {
1417 snmpv3_build_priv_param(
request->msg_privacy_parameters);
1419 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);
1420 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1421 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream,
request->msg_privacy_parameters, SNMP_V3_MAX_PRIV_PARAM_LENGTH));
1425 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, 0);
1426 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1430 request->outbound_msg_security_parameters_end = pbuf_stream->offset;
1432#if LWIP_SNMP_V3_CRYPTO
1434 if (
request->msg_flags & SNMP_V3_PRIV_FLAG) {
1435 request->outbound_scoped_pdu_string_offset = pbuf_stream->offset;
1436 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 3, 0);
1437 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1443 request->outbound_scoped_pdu_seq_offset = pbuf_stream->offset;
1444 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, 0);
1445 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1448 snmpv3_get_engine_id(&
id, &
request->context_engine_id_len);
1450 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0,
request->context_engine_id_len);
1451 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1452 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream,
request->context_engine_id,
request->context_engine_id_len));
1455 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0,
request->context_name_len);
1456 OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1457 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream,
request->context_name,
request->context_name_len));
1462 request->outbound_pdu_offset = pbuf_stream->offset;
1463 SNMP_ASN1_SET_TLV_PARAMS(tlv,
request->request_out_type, 3, 0);
1464 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1467 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
1468 snmp_asn1_enc_s32t_cnt(
request->request_id, &tlv.value_len);
1469 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1470 OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len,
request->request_id) );
1473 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);
1474 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1475 request->outbound_error_status_offset = pbuf_stream->offset;
1476 OF_BUILD_EXEC( snmp_pbuf_stream_write(pbuf_stream, 0) );
1479 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);
1480 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1481 request->outbound_error_index_offset = pbuf_stream->offset;
1482 OF_BUILD_EXEC( snmp_pbuf_stream_write(pbuf_stream, 0) );
1485 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, 0);
1486 OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
1488 request->outbound_varbind_offset = pbuf_stream->offset;
1495snmp_varbind_length(
struct snmp_varbind *varbind,
struct snmp_varbind_len *
len)
1498 snmp_asn1_enc_oid_cnt(varbind->oid.id, varbind->oid.len, &
len->oid_value_len);
1499 snmp_asn1_enc_length_cnt(
len->oid_value_len, &
len->oid_len_len);
1501 if (varbind->value_len == 0) {
1502 len->value_value_len = 0;
1503 }
else if (varbind->value_len & SNMP_GET_VALUE_RAW_DATA) {
1504 len->value_value_len = varbind->value_len & (~SNMP_GET_VALUE_RAW_DATA);
1506 switch (varbind->type) {
1507 case SNMP_ASN1_TYPE_INTEGER:
1511 snmp_asn1_enc_s32t_cnt(*((
s32_t *) varbind->value), &
len->value_value_len);
1513 case SNMP_ASN1_TYPE_COUNTER:
1514 case SNMP_ASN1_TYPE_GAUGE:
1515 case SNMP_ASN1_TYPE_TIMETICKS:
1519 snmp_asn1_enc_u32t_cnt(*((
u32_t *) varbind->value), &
len->value_value_len);
1521 case SNMP_ASN1_TYPE_OCTET_STRING:
1522 case SNMP_ASN1_TYPE_IPADDR:
1523 case SNMP_ASN1_TYPE_OPAQUE:
1524 len->value_value_len = varbind->value_len;
1526 case SNMP_ASN1_TYPE_NULL:
1527 if (varbind->value_len != 0) {
1530 len->value_value_len = 0;
1532 case SNMP_ASN1_TYPE_OBJECT_ID:
1533 if ((varbind->value_len & 0x03) != 0) {
1536 snmp_asn1_enc_oid_cnt((
u32_t *) varbind->value, varbind->value_len >> 2, &
len->value_value_len);
1539 case SNMP_ASN1_TYPE_COUNTER64:
1540 if (varbind->value_len !=
sizeof(u64_t)) {
1543 snmp_asn1_enc_u64t_cnt(*(u64_t *)varbind->value, &
len->value_value_len);
1551 snmp_asn1_enc_length_cnt(
len->value_value_len, &
len->value_len_len);
1553 len->vb_value_len = 1 +
len->oid_len_len +
len->oid_value_len + 1 +
len->value_len_len +
len->value_value_len;
1554 snmp_asn1_enc_length_cnt(
len->vb_value_len, &
len->vb_len_len);
1559#define OVB_BUILD_EXEC(code) BUILD_EXEC(code, ERR_ARG)
1562snmp_append_outbound_varbind(
struct snmp_pbuf_stream *pbuf_stream,
struct snmp_varbind *varbind)
1564 struct snmp_asn1_tlv tlv;
1565 struct snmp_varbind_len
len;
1568 err = snmp_varbind_length(varbind, &
len);
1577 if ((1 +
len.vb_len_len +
len.vb_value_len) > pbuf_stream->length) {
1582 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE,
len.vb_len_len,
len.vb_value_len);
1583 OVB_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1586 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OBJECT_ID,
len.oid_len_len,
len.oid_value_len);
1587 OVB_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1588 OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, varbind->oid.id, varbind->oid.len));
1591 SNMP_ASN1_SET_TLV_PARAMS(tlv, varbind->type,
len.value_len_len,
len.value_value_len);
1592 OVB_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));
1594 if (
len.value_value_len > 0) {
1595 if (varbind->value_len & SNMP_GET_VALUE_RAW_DATA) {
1596 OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (
u8_t *) varbind->value,
len.value_value_len));
1598 switch (varbind->type) {
1599 case SNMP_ASN1_TYPE_INTEGER:
1600 OVB_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream,
len.value_value_len, *((
s32_t *) varbind->value)));
1602 case SNMP_ASN1_TYPE_COUNTER:
1603 case SNMP_ASN1_TYPE_GAUGE:
1604 case SNMP_ASN1_TYPE_TIMETICKS:
1605 OVB_BUILD_EXEC(snmp_asn1_enc_u32t(pbuf_stream,
len.value_value_len, *((
u32_t *) varbind->value)));
1607 case SNMP_ASN1_TYPE_OCTET_STRING:
1608 case SNMP_ASN1_TYPE_IPADDR:
1609 case SNMP_ASN1_TYPE_OPAQUE:
1610 OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (
u8_t *) varbind->value,
len.value_value_len));
1611 len.value_value_len = varbind->value_len;
1613 case SNMP_ASN1_TYPE_OBJECT_ID:
1614 OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, (
u32_t *) varbind->value, varbind->value_len /
sizeof (
u32_t)));
1617 case SNMP_ASN1_TYPE_COUNTER64:
1618 OVB_BUILD_EXEC(snmp_asn1_enc_u64t(pbuf_stream,
len.value_value_len, *(u64_t *) varbind->value));
1632snmp_complete_outbound_frame(
struct snmp_request *
request)
1634 struct snmp_asn1_tlv tlv;
1636 u8_t outbound_padding = 0;
1639 if (
request->error_status != SNMP_ERR_NOERROR) {
1641 switch (
request->error_status) {
1645 case SNMP_ERR_NOSUCHINSTANCE:
1646 case SNMP_ERR_NOSUCHOBJECT:
1647 case SNMP_ERR_ENDOFMIBVIEW:
1648 request->error_status = SNMP_ERR_NOSUCHNAME;
1651 case SNMP_ERR_WRONGVALUE:
1652 case SNMP_ERR_WRONGENCODING:
1653 case SNMP_ERR_WRONGTYPE:
1654 case SNMP_ERR_WRONGLENGTH:
1655 case SNMP_ERR_INCONSISTENTVALUE:
1656 request->error_status = SNMP_ERR_BADVALUE;
1658 case SNMP_ERR_NOACCESS:
1659 case SNMP_ERR_NOTWRITABLE:
1660 case SNMP_ERR_NOCREATION:
1661 case SNMP_ERR_INCONSISTENTNAME:
1662 case SNMP_ERR_AUTHORIZATIONERROR:
1663 request->error_status = SNMP_ERR_NOSUCHNAME;
1665 case SNMP_ERR_RESOURCEUNAVAILABLE:
1666 case SNMP_ERR_COMMITFAILED:
1667 case SNMP_ERR_UNDOFAILED:
1669 request->error_status = SNMP_ERR_GENERROR;
1674 if (
request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1676 switch (
request->error_status) {
1677 case SNMP_ERR_NOSUCHINSTANCE:
1678 case SNMP_ERR_NOSUCHOBJECT:
1679 case SNMP_ERR_ENDOFMIBVIEW:
1680 request->error_status = SNMP_ERR_NOTWRITABLE;
1687 if (
request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {
1689 LWIP_DEBUGF(
SNMP_DEBUG, (
"snmp_complete_outbound_frame() > Found v2 request with varbind exception code stored as error status!\n"));
1694 if ((
request->error_status != SNMP_ERR_NOERROR) || (
request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)) {
1696 struct snmp_pbuf_stream inbound_stream;
1697 OF_BUILD_EXEC( snmp_pbuf_stream_init(&inbound_stream,
request->inbound_pbuf,
request->inbound_varbind_offset,
request->inbound_varbind_len) );
1698 OF_BUILD_EXEC( snmp_pbuf_stream_init(&(
request->outbound_pbuf_stream),
request->outbound_pbuf,
request->outbound_varbind_offset,
request->outbound_pbuf->tot_len -
request->outbound_varbind_offset) );
1699 OF_BUILD_EXEC( snmp_pbuf_stream_writeto(&inbound_stream, &(
request->outbound_pbuf_stream), 0) );
1702 frame_size =
request->outbound_pbuf_stream.offset;
1704#if LWIP_SNMP_V3 && LWIP_SNMP_V3_CRYPTO
1708 outbound_padding = (8 - (
u8_t)((frame_size -
request->outbound_scoped_pdu_seq_offset) & 0x07)) & 0x07;
1709 for (
i = 0;
i < outbound_padding;
i++) {
1710 OF_BUILD_EXEC( snmp_pbuf_stream_write(&
request->outbound_pbuf_stream, 0) );
1716 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size + outbound_padding - 1 - 3);
1717 OF_BUILD_EXEC( snmp_pbuf_stream_init(&(
request->outbound_pbuf_stream),
request->outbound_pbuf, 0,
request->outbound_pbuf->tot_len) );
1718 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv) );
1724 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1,
request->outbound_msg_global_data_end
1725 -
request->outbound_msg_global_data_offset - 1 - 1);
1726 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_msg_global_data_offset));
1727 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv));
1730 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1,
request->outbound_msg_security_parameters_end
1731 -
request->outbound_msg_security_parameters_str_offset - 1 - 1);
1732 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_msg_security_parameters_str_offset));
1733 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv));
1735 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1,
request->outbound_msg_security_parameters_end
1736 -
request->outbound_msg_security_parameters_seq_offset - 1 - 1);
1737 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_msg_security_parameters_seq_offset));
1738 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv));
1741 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size -
request->outbound_scoped_pdu_seq_offset - 1 - 3);
1742 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_scoped_pdu_seq_offset));
1743 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv));
1748 SNMP_ASN1_SET_TLV_PARAMS(tlv,
request->request_out_type, 3,
1749 frame_size -
request->outbound_pdu_offset - 1 - 3);
1750 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_pdu_offset) );
1751 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv) );
1754 if (
request->error_status != 0) {
1756 snmp_asn1_enc_s32t_cnt(
request->error_status, &
len);
1761 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_error_status_offset) );
1762 OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(
request->outbound_pbuf_stream),
len,
request->error_status) );
1765 switch (
request->error_status) {
1766 case SNMP_ERR_TOOBIG:
1767 snmp_stats.outtoobigs++;
1769 case SNMP_ERR_NOSUCHNAME:
1770 snmp_stats.outnosuchnames++;
1772 case SNMP_ERR_BADVALUE:
1773 snmp_stats.outbadvalues++;
1775 case SNMP_ERR_GENERROR:
1777 snmp_stats.outgenerrs++;
1781 if (
request->error_status == SNMP_ERR_TOOBIG) {
1783 }
else if (
request->error_index == 0) {
1785 request->error_index =
request->inbound_varbind_enumerator.varbind_count;
1788 if (
request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1789 snmp_stats.intotalsetvars +=
request->inbound_varbind_enumerator.varbind_count;
1791 snmp_stats.intotalreqvars +=
request->inbound_varbind_enumerator.varbind_count;
1796 if (
request->error_index != 0) {
1798 snmp_asn1_enc_s32t_cnt(
request->error_index, &
len);
1803 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_error_index_offset) );
1804 OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(
request->outbound_pbuf_stream),
len,
request->error_index) );
1808 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size -
request->outbound_varbind_offset);
1809 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_varbind_offset - 1 - 3) );
1810 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv) );
1813#if LWIP_SNMP_V3 && LWIP_SNMP_V3_CRYPTO
1817 snmpv3_priv_algo_t algo;
1820 OF_BUILD_EXEC(snmp_pbuf_stream_init(&
request->outbound_pbuf_stream,
request->outbound_pbuf, 0,
request->outbound_pbuf->tot_len));
1821 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(
request->outbound_pbuf_stream),
request->outbound_scoped_pdu_string_offset));
1822 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 3, frame_size + outbound_padding
1823 -
request->outbound_scoped_pdu_string_offset - 1 - 3);
1824 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(
request->outbound_pbuf_stream), &tlv));
1826 OF_BUILD_EXEC(snmpv3_get_user((
char *)
request->msg_user_name,
NULL,
NULL, &algo,
key));
1828 OF_BUILD_EXEC(snmpv3_crypt(&
request->outbound_pbuf_stream, tlv.value_len,
key,
1829 request->msg_privacy_parameters,
request->msg_authoritative_engine_boots,
1830 request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT));
1835 snmpv3_auth_algo_t algo;
1838 OF_BUILD_EXEC(snmpv3_get_user((
char *)
request->msg_user_name, &algo,
key,
NULL,
NULL));
1839 OF_BUILD_EXEC(snmp_pbuf_stream_init(&(
request->outbound_pbuf_stream),
1841 OF_BUILD_EXEC(snmpv3_auth(&
request->outbound_pbuf_stream, frame_size + outbound_padding,
key, algo, hmac));
1843 MEMCPY(
request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1844 OF_BUILD_EXEC(snmp_pbuf_stream_init(&
request->outbound_pbuf_stream,
1846 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&
request->outbound_pbuf_stream,
1847 request->outbound_msg_authentication_parameters_offset));
1849 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1850 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&
request->outbound_pbuf_stream, &tlv));
1851 OF_BUILD_EXEC(snmp_asn1_enc_raw(&
request->outbound_pbuf_stream,
1852 request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
1858 snmp_stats.outgetresponses++;
1859 snmp_stats.outpkts++;
1865snmp_execute_write_callbacks(
struct snmp_request *
request)
1867 struct snmp_varbind_enumerator inbound_varbind_enumerator;
1868 struct snmp_varbind vb;
1870 snmp_vb_enumerator_init(&inbound_varbind_enumerator,
request->inbound_pbuf,
request->inbound_varbind_offset,
request->inbound_varbind_len);
1873 while (snmp_vb_enumerator_get_next(&inbound_varbind_enumerator, &vb) == SNMP_VB_ENUMERATOR_ERR_OK) {
1874 snmp_write_callback(vb.oid.id, vb.oid.len, snmp_write_callback_arg);
1886 snmp_pbuf_stream_init(&(enumerator->pbuf_stream),
p,
offset,
length);
1887 enumerator->varbind_count = 0;
1890#define VB_PARSE_EXEC(code) PARSE_EXEC(code, SNMP_VB_ENUMERATOR_ERR_ASN1ERROR)
1891#define VB_PARSE_ASSERT(code) PARSE_ASSERT(code, SNMP_VB_ENUMERATOR_ERR_ASN1ERROR)
1893snmp_vb_enumerator_err_t
1894snmp_vb_enumerator_get_next(
struct snmp_varbind_enumerator *enumerator,
struct snmp_varbind *varbind)
1896 struct snmp_asn1_tlv tlv;
1900 if (enumerator->pbuf_stream.length == 0) {
1901 return SNMP_VB_ENUMERATOR_ERR_EOVB;
1903 enumerator->varbind_count++;
1906 VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));
1907 VB_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len <= enumerator->pbuf_stream.length));
1908 varbind_len = tlv.value_len;
1911 VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));
1912 VB_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_OBJECT_ID) && (SNMP_ASN1_TLV_LENGTH(tlv) < varbind_len) && (tlv.value_len < enumerator->pbuf_stream.length));
1914 VB_PARSE_EXEC(snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, varbind->oid.id, &(varbind->oid.len),
SNMP_MAX_OBJ_ID_LEN));
1915 varbind_len -= SNMP_ASN1_TLV_LENGTH(tlv);
1918 VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));
1919 VB_PARSE_ASSERT((SNMP_ASN1_TLV_LENGTH(tlv) == varbind_len) && (tlv.value_len <= enumerator->pbuf_stream.length));
1920 varbind->type = tlv.type;
1923 if (varbind->value !=
NULL) {
1924 switch (varbind->type) {
1925 case SNMP_ASN1_TYPE_INTEGER:
1926 VB_PARSE_EXEC(snmp_asn1_dec_s32t(&(enumerator->pbuf_stream), tlv.value_len, (
s32_t *)varbind->value));
1927 varbind->value_len =
sizeof(
s32_t);
1929 case SNMP_ASN1_TYPE_COUNTER:
1930 case SNMP_ASN1_TYPE_GAUGE:
1931 case SNMP_ASN1_TYPE_TIMETICKS:
1932 VB_PARSE_EXEC(snmp_asn1_dec_u32t(&(enumerator->pbuf_stream), tlv.value_len, (
u32_t *)varbind->value));
1933 varbind->value_len =
sizeof(
u32_t);
1935 case SNMP_ASN1_TYPE_OCTET_STRING:
1936 case SNMP_ASN1_TYPE_OPAQUE:
1937 err = snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (
u8_t *)varbind->value, &varbind->value_len,
SNMP_MAX_VALUE_SIZE);
1939 return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH;
1943 case SNMP_ASN1_TYPE_NULL:
1944 varbind->value_len = 0;
1946 case SNMP_ASN1_TYPE_OBJECT_ID:
1948 err = snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, (
u32_t *)varbind->value, &tlv.length_len,
SNMP_MAX_OBJ_ID_LEN);
1950 return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH;
1953 varbind->value_len = tlv.length_len *
sizeof(
u32_t);
1955 case SNMP_ASN1_TYPE_IPADDR:
1956 if (tlv.value_len == 4) {
1958 VB_PARSE_EXEC(snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (
u8_t *)varbind->value, &varbind->value_len,
SNMP_MAX_VALUE_SIZE));
1964 case SNMP_ASN1_TYPE_COUNTER64:
1965 VB_PARSE_EXEC(snmp_asn1_dec_u64t(&(enumerator->pbuf_stream), tlv.value_len, (u64_t *)varbind->value));
1966 varbind->value_len =
sizeof(u64_t);
1974 snmp_pbuf_stream_seek(&(enumerator->pbuf_stream), tlv.value_len);
1975 varbind->value_len = tlv.value_len;
1978 return SNMP_VB_ENUMERATOR_ERR_OK;
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
ACPI_SIZE strlen(const char *String)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
#define LWIP_ARRAYSIZE(x)
static const WCHAR version[]
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
GLuint GLsizei GLsizei * length
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define LWIP_UNUSED_ARG(x)
void pbuf_realloc(struct pbuf *p, u16_t new_len)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
#define SNMP_MAX_COMMUNITY_STR_LEN
#define SNMP_MAX_OBJ_ID_LEN
#define SNMP_LWIP_GETBULK_MAX_REPETITIONS
#define SNMP_COMMUNITY_TRAP
#define SNMP_MAX_VALUE_SIZE
#define SNMP_COMMUNITY_WRITE
#define MEMCPY(DST, SRC, BYTES)
#define LWIP_SNMP_CONFIGURE_VERSIONS
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList