Lines Matching refs:request
256 static err_t snmp_process_get_request(struct snmp_request *request);
257 static err_t snmp_process_getnext_request(struct snmp_request *request);
258 static err_t snmp_process_getbulk_request(struct snmp_request *request);
259 static err_t snmp_process_set_request(struct snmp_request *request);
261 static err_t snmp_parse_inbound_frame(struct snmp_request *request);
262 static err_t snmp_prepare_outbound_frame(struct snmp_request *request);
263 static err_t snmp_complete_outbound_frame(struct snmp_request *request);
264 static void snmp_execute_write_callbacks(struct snmp_request *request);
275 struct snmp_request request;
277 memset(&request, 0, sizeof(request));
278 request.handle = handle;
279 request.source_ip = source_ip;
280 request.source_port = port;
281 request.inbound_pbuf = p;
285 err = snmp_parse_inbound_frame(&request);
287 err = snmp_prepare_outbound_frame(&request);
290 if (request.error_status == SNMP_ERR_NOERROR) {
292 if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_REQ) {
293 err = snmp_process_get_request(&request);
294 } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ) {
295 err = snmp_process_getnext_request(&request);
296 } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
297 err = snmp_process_getbulk_request(&request);
298 } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
299 err = snmp_process_set_request(&request);
311 switch (request.error_status) {
354 snmp_append_outbound_varbind(&(request.outbound_pbuf_stream), &vb);
355 request.error_status = SNMP_ERR_NOERROR;
358 request.request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_REPORT);
359 request.request_id = request.msg_id;
364 err = snmp_complete_outbound_frame(&request);
367 err = snmp_sendto(request.handle, request.outbound_pbuf, request.source_ip, request.source_port);
369 if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)
370 && (request.error_status == SNMP_ERR_NOERROR)
373 snmp_execute_write_callbacks(&request);
379 if (request.outbound_pbuf != NULL) {
380 pbuf_free(request.outbound_pbuf);
403 snmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t get_next)
411 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);
413 if (request->error_status == SNMP_ERR_NOERROR) {
417 request->error_status = snmp_get_node_instance_from_oid(vb->oid.id, vb->oid.len, &node_instance);
419 if (request->error_status == SNMP_ERR_NOERROR) {
421 request->error_status = snmp_msg_getnext_validate_node_inst(&node_instance, request);
423 if (request->error_status != SNMP_ERR_NOERROR) {
431 if (request->error_status != SNMP_ERR_NOERROR) {
432 if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {
433 if ((request->version == SNMP_VERSION_2c) || request->version == SNMP_VERSION_3) {
435 vb->type = (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | (request->error_status & SNMP_VARBIND_EXCEPTION_MASK));
438 err = snmp_append_outbound_varbind(&(request->outbound_pbuf_stream), vb);
441 request->error_status = SNMP_ERR_NOERROR;
443 request->error_status = SNMP_ERR_TOOBIG;
445 request->error_status = SNMP_ERR_GENERROR;
450 request->error_status = SNMP_ERR_GENERROR;
460 err = snmp_append_outbound_varbind(&request->outbound_pbuf_stream, vb);
463 request->error_status = SNMP_ERR_TOOBIG;
465 request->error_status = SNMP_ERR_GENERROR;
468 request->error_status = SNMP_ERR_GENERROR;
481 * @param request points to the associated message process state
484 snmp_process_get_request(struct snmp_request *request)
488 vb.value = request->value_buffer;
490 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP get request\n"));
492 while (request->error_status == SNMP_ERR_NOERROR) {
493 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
496 snmp_process_varbind(request, &vb, 0);
498 request->error_status = SNMP_ERR_GENERROR;
501 /* no more varbinds in request */
507 request->error_status = SNMP_ERR_GENERROR;
517 * @param request points to the associated message process state
520 snmp_process_getnext_request(struct snmp_request *request)
524 vb.value = request->value_buffer;
526 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP get-next request\n"));
528 while (request->error_status == SNMP_ERR_NOERROR) {
529 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
532 snmp_process_varbind(request, &vb, 1);
534 request->error_status = SNMP_ERR_GENERROR;
537 /* no more varbinds in request */
543 request->error_status = SNMP_ERR_GENERROR;
553 * @param request points to the associated message process state
556 snmp_process_getbulk_request(struct snmp_request *request)
559 s32_t non_repeaters = request->non_repeaters;
564 vb.value = request->value_buffer;
567 repetitions = LWIP_MIN(request->max_repetitions, SNMP_LWIP_GETBULK_MAX_REPETITIONS);
569 repetitions = request->max_repetitions;
572 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP get-bulk request\n"));
575 while (request->error_status == SNMP_ERR_NOERROR) {
577 repetition_offset = request->outbound_pbuf_stream.offset;
586 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
588 /* no more varbinds in request */
594 request->error_status = SNMP_ERR_GENERROR;
596 snmp_process_varbind(request, &vb, 1);
602 while ((request->error_status == SNMP_ERR_NOERROR) && (repetitions > 0) && (request->outbound_pbuf_stream.offset != repetition_offset)) {
606 snmp_vb_enumerator_init(&repetition_varbind_enumerator, request->outbound_pbuf, repetition_offset, request->outbound_pbuf_stream.offset - repetition_offset);
607 repetition_offset = request->outbound_pbuf_stream.offset; /* for next loop */
609 while (request->error_status == SNMP_ERR_NOERROR) {
613 vb.value = request->value_buffer;
614 snmp_process_varbind(request, &vb, 1);
616 if (request->error_status != SNMP_ERR_NOERROR) {
618 request->error_index = request->non_repeaters + repetition_varbind_enumerator.varbind_count;
623 /* no more varbinds in request */
627 request->error_status = SNMP_ERR_GENERROR;
628 request->error_index = request->non_repeaters + repetition_varbind_enumerator.varbind_count;
632 if ((request->error_status == SNMP_ERR_NOERROR) && all_endofmibview) {
640 if (request->error_status == SNMP_ERR_TOOBIG) {
642 request->error_status = SNMP_ERR_NOERROR;
651 * @param request points to the associated message process state
654 snmp_process_set_request(struct snmp_request *request)
658 vb.value = request->value_buffer;
660 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP set request\n"));
663 while (request->error_status == SNMP_ERR_NOERROR) {
664 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
669 request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
670 if (request->error_status == SNMP_ERR_NOERROR) {
672 request->error_status = SNMP_ERR_WRONGTYPE;
674 request->error_status = SNMP_ERR_NOTWRITABLE;
677 request->error_status = node_instance.set_test(&node_instance, vb.value_len, vb.value);
686 /* no more varbinds in request */
689 request->error_status = SNMP_ERR_WRONGLENGTH;
694 request->error_status = SNMP_ERR_GENERROR;
699 if (request->error_status == SNMP_ERR_NOERROR) {
700 snmp_vb_enumerator_init(&request->inbound_varbind_enumerator, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);
701 while (request->error_status == SNMP_ERR_NOERROR) {
702 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
706 request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
707 if (request->error_status == SNMP_ERR_NOERROR) {
709 if (request->inbound_varbind_enumerator.varbind_count == 1) {
710 request->error_status = SNMP_ERR_COMMITFAILED;
713 request->error_status = SNMP_ERR_UNDOFAILED;
722 /* no more varbinds in request */
726 request->error_status = SNMP_ERR_GENERROR;
760 * @param request points to the current message request state return
766 snmp_parse_inbound_frame(struct snmp_request *request)
778 IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
807 request->version = (u8_t)s32_value;
810 if (request->version == SNMP_VERSION_3) {
816 strncpy((char *)request->community, snmp_community, SNMP_MAX_COMMUNITY_STR_LEN);
817 request->community[SNMP_MAX_COMMUNITY_STR_LEN] = 0; /* ensure NULL termination (strncpy does NOT guarantee it!) */
818 request->community_strlen = (u16_t)strnlen((char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN);
833 request->msg_id = s32_value;
842 request->msg_max_size = s32_value;
851 request->msg_flags = (u8_t)s32_value;
860 request->msg_security_model = s32_value;
886 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authoritative_engine_id,
888 request->msg_authoritative_engine_id_len = (u8_t)u16_value;
895 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_boots));
902 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_time));
910 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_user_name,
912 request->msg_user_name_len = (u8_t)u16_value;
915 memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
925 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authentication_parameters,
927 request->msg_authentication_parameters_len = (u8_t)u16_value;
930 memset(request->msg_privacy_parameters, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);
936 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_privacy_parameters,
938 request->msg_privacy_parameters_len = (u8_t)u16_value;
952 if ((request->msg_authoritative_engine_id_len == 0) ||
953 (request->msg_authoritative_engine_id_len != eid_len) ||
954 (memcmp(eid, request->msg_authoritative_engine_id, eid_len) != 0)) {
956 request->msg_flags = 0; /* noauthnopriv */
957 request->error_status = SNMP_ERR_UNKNOWN_ENGINEID;
963 if (snmpv3_get_user((char *)request->msg_user_name, &auth, NULL, &priv, NULL)) {
965 request->msg_flags = 0; /* noauthnopriv */
966 request->error_status = SNMP_ERR_UNKNOWN_SECURITYNAME;
971 switch (request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)) {
976 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
977 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
986 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
987 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
995 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
996 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
1003 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1004 request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
1010 if (request->msg_flags & SNMP_V3_AUTH_FLAG) {
1016 if (request->msg_authentication_parameters_len > SNMP_V3_MAX_AUTH_PARAM_LENGTH) {
1018 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1019 request->error_status = SNMP_ERR_AUTHORIZATIONERROR;
1024 IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
1027 IF_PARSE_EXEC(snmp_asn1_enc_raw(&auth_stream, zero_arr, request->msg_authentication_parameters_len));
1030 IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
1032 IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, &auth, key, NULL, NULL));
1033 IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, auth, hmac));
1035 if (memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)) {
1037 request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
1038 request->error_status = SNMP_ERR_AUTHORIZATIONERROR;
1045 if ((request->msg_authoritative_engine_boots != boots) || (boots == 2147483647UL)) {
1047 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1048 request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
1054 if (request->msg_authoritative_engine_time > (time + 150)) {
1056 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1057 request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
1060 if (request->msg_authoritative_engine_time < (time - 150)) {
1062 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1063 request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
1073 if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
1083 IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, NULL, NULL, &priv, key));
1085 request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
1086 request->msg_authoritative_engine_time, priv, SNMP_V3_PRIV_MODE_DECRYPT) != ERR_OK) {
1088 request->msg_flags = SNMP_V3_AUTHNOPRIV;
1089 request->error_status = SNMP_ERR_DECRYIPTION_ERROR;
1114 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_engine_id,
1116 request->context_engine_id_len = (u8_t)u16_value;
1125 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_name,
1127 request->context_name_len = (u8_t)u16_value;
1138 err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN);
1141 request->community_strlen = 0;
1147 request->community[request->community_strlen] = 0;
1153 request->inbound_padding_len = pbuf_stream.length - tlv.value_len;
1168 if (request->version < SNMP_VERSION_2c) {
1182 request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK;
1183 request->request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP);
1186 if (request->community_strlen == 0) {
1191 } else if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1194 request->error_status = SNMP_ERR_NOTWRITABLE;
1195 request->error_index = 1;
1196 } else if (strncmp(snmp_community_write, (const char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
1203 if (strncmp(snmp_community, (const char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
1211 /* decode request ID */
1217 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->request_id));
1225 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
1226 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->non_repeaters));
1227 if (request->non_repeaters < 0) {
1229 request->non_repeaters = 0;
1232 /* only check valid value, don't touch 'request->error_status', maybe a response error status was already set to above; */
1243 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
1244 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->max_repetitions));
1245 if (request->max_repetitions < 0) {
1247 request->max_repetitions = 0;
1250 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->error_index));
1258 request->inbound_varbind_offset = pbuf_stream.offset;
1259 request->inbound_varbind_len = pbuf_stream.length - request->inbound_padding_len;
1260 snmp_vb_enumerator_init(&(request->inbound_varbind_enumerator), request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);
1268 snmp_prepare_outbound_frame(struct snmp_request *request)
1271 struct snmp_pbuf_stream *pbuf_stream = &(request->outbound_pbuf_stream);
1274 request->outbound_pbuf = pbuf_alloc(PBUF_TRANSPORT, 1472, PBUF_RAM);
1275 if (request->outbound_pbuf == NULL) {
1279 snmp_pbuf_stream_init(pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len);
1287 snmp_asn1_enc_s32t_cnt(request->version, &tlv.value_len);
1289 OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->version) );
1292 if (request->version < SNMP_VERSION_3) {
1295 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen);
1297 OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) );
1303 request->outbound_msg_global_data_offset = pbuf_stream->offset;
1309 snmp_asn1_enc_s32t_cnt(request->msg_id, &tlv.value_len);
1311 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_id));
1315 snmp_asn1_enc_s32t_cnt(request->msg_max_size, &tlv.value_len);
1317 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_max_size));
1322 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, &request->msg_flags, 1));
1326 snmp_asn1_enc_s32t_cnt(request->msg_security_model, &tlv.value_len);
1328 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_security_model));
1331 request->outbound_msg_global_data_end = pbuf_stream->offset;
1334 request->outbound_msg_security_parameters_str_offset = pbuf_stream->offset;
1338 request->outbound_msg_security_parameters_seq_offset = pbuf_stream->offset;
1343 snmpv3_get_engine_id(&id, &request->msg_authoritative_engine_id_len);
1344 MEMCPY(request->msg_authoritative_engine_id, id, request->msg_authoritative_engine_id_len);
1345 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->msg_authoritative_engine_id_len);
1347 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_authoritative_engine_id, request->msg_authoritative_engine_id_len));
1349 request->msg_authoritative_engine_time = snmpv3_get_engine_time();
1350 request->msg_authoritative_engine_boots = snmpv3_get_engine_boots();
1354 snmp_asn1_enc_s32t_cnt(request->msg_authoritative_engine_boots, &tlv.value_len);
1356 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_authoritative_engine_boots));
1360 snmp_asn1_enc_s32t_cnt(request->msg_authoritative_engine_time, &tlv.value_len);
1362 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_authoritative_engine_time));
1365 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->msg_user_name_len);
1367 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_user_name, request->msg_user_name_len));
1371 if (request->msg_flags & SNMP_V3_AUTH_FLAG) {
1372 memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1373 request->outbound_msg_authentication_parameters_offset = pbuf_stream->offset;
1376 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
1386 if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
1387 snmpv3_build_priv_param(request->msg_privacy_parameters);
1391 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_privacy_parameters, SNMP_V3_MAX_PRIV_PARAM_LENGTH));
1400 request->outbound_msg_security_parameters_end = pbuf_stream->offset;
1404 if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
1405 request->outbound_scoped_pdu_string_offset = pbuf_stream->offset;
1413 request->outbound_scoped_pdu_seq_offset = pbuf_stream->offset;
1418 snmpv3_get_engine_id(&id, &request->context_engine_id_len);
1419 MEMCPY(request->context_engine_id, id, request->context_engine_id_len);
1420 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->context_engine_id_len);
1422 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->context_engine_id, request->context_engine_id_len));
1425 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->context_name_len);
1427 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->context_name, request->context_name_len));
1432 request->outbound_pdu_offset = pbuf_stream->offset;
1433 SNMP_ASN1_SET_TLV_PARAMS(tlv, request->request_out_type, 3, 0);
1436 /* request ID */
1438 snmp_asn1_enc_s32t_cnt(request->request_id, &tlv.value_len);
1440 OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->request_id) );
1445 request->outbound_error_status_offset = pbuf_stream->offset;
1451 request->outbound_error_index_offset = pbuf_stream->offset;
1458 request->outbound_varbind_offset = pbuf_stream->offset;
1602 snmp_complete_outbound_frame(struct snmp_request *request)
1608 if (request->version == SNMP_VERSION_1) {
1609 if (request->error_status != SNMP_ERR_NOERROR) {
1611 switch (request->error_status) {
1618 request->error_status = SNMP_ERR_NOSUCHNAME;
1626 request->error_status = SNMP_ERR_BADVALUE;
1633 request->error_status = SNMP_ERR_NOSUCHNAME;
1639 request->error_status = SNMP_ERR_GENERROR;
1644 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1646 switch (request->error_status) {
1650 request->error_status = SNMP_ERR_NOTWRITABLE;
1657 if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {
1659 LWIP_DEBUGF(SNMP_DEBUG, ("snmp_complete_outbound_frame() > Found v2 request with varbind exception code stored as error status!\n"));
1664 if ((request->error_status != SNMP_ERR_NOERROR) || (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)) {
1667 OF_BUILD_EXEC( snmp_pbuf_stream_init(&inbound_stream, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len) );
1668 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) );
1669 OF_BUILD_EXEC( snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0) );
1672 frame_size = request->outbound_pbuf_stream.offset;
1676 if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {
1678 outbound_padding = (8 - (u8_t)((frame_size - request->outbound_scoped_pdu_seq_offset) & 0x07)) & 0x07;
1680 OF_BUILD_EXEC( snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0) );
1687 OF_BUILD_EXEC( snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), request->outbound_pbuf, 0, request->outbound_pbuf->tot_len) );
1688 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
1691 if (request->version == SNMP_VERSION_3) {
1694 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_global_data_end
1695 - request->outbound_msg_global_data_offset - 1 - 1);
1696 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_global_data_offset));
1697 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1700 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, request->outbound_msg_security_parameters_end
1701 - request->outbound_msg_security_parameters_str_offset - 1 - 1);
1702 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_str_offset));
1703 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1705 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_security_parameters_end
1706 - request->outbound_msg_security_parameters_seq_offset - 1 - 1);
1707 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_seq_offset));
1708 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1711 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size - request->outbound_scoped_pdu_seq_offset - 1 - 3);
1712 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_seq_offset));
1713 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1718 SNMP_ASN1_SET_TLV_PARAMS(tlv, request->request_out_type, 3,
1719 frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */
1720 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_pdu_offset) );
1721 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
1724 if (request->error_status != 0) {
1726 snmp_asn1_enc_s32t_cnt(request->error_status, &len);
1731 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_error_status_offset) );
1732 OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(request->outbound_pbuf_stream), len, request->error_status) );
1735 switch (request->error_status) {
1751 if (request->error_status == SNMP_ERR_TOOBIG) {
1752 request->error_index = 0; /* defined by RFC 1157 */
1753 } else if (request->error_index == 0) {
1755 request->error_index = request->inbound_varbind_enumerator.varbind_count;
1758 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1759 snmp_stats.intotalsetvars += request->inbound_varbind_enumerator.varbind_count;
1761 snmp_stats.intotalreqvars += request->inbound_varbind_enumerator.varbind_count;
1766 if (request->error_index != 0) {
1768 snmp_asn1_enc_s32t_cnt(request->error_index, &len);
1773 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_error_index_offset) );
1774 OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(request->outbound_pbuf_stream), len, request->error_index) );
1778 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size - request->outbound_varbind_offset);
1779 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_varbind_offset - 1 - 3) ); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */
1780 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
1785 if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {
1790 OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
1791 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_string_offset));
1793 - request->outbound_scoped_pdu_string_offset - 1 - 3);
1794 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1796 OF_BUILD_EXEC(snmpv3_get_user((char *)request->msg_user_name, NULL, NULL, &algo, key));
1798 OF_BUILD_EXEC(snmpv3_crypt(&request->outbound_pbuf_stream, tlv.value_len, key,
1799 request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
1800 request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT));
1803 if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_AUTH_FLAG)) {
1808 OF_BUILD_EXEC(snmpv3_get_user((char *)request->msg_user_name, &algo, key, NULL, NULL));
1809 OF_BUILD_EXEC(snmp_pbuf_stream_init(&(request->outbound_pbuf_stream),
1810 request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
1811 OF_BUILD_EXEC(snmpv3_auth(&request->outbound_pbuf_stream, frame_size + outbound_padding, key, algo, hmac));
1813 MEMCPY(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1814 OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream,
1815 request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
1816 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&request->outbound_pbuf_stream,
1817 request->outbound_msg_authentication_parameters_offset));
1820 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&request->outbound_pbuf_stream, &tlv));
1821 OF_BUILD_EXEC(snmp_asn1_enc_raw(&request->outbound_pbuf_stream,
1822 request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
1826 pbuf_realloc(request->outbound_pbuf, frame_size + outbound_padding);
1835 snmp_execute_write_callbacks(struct snmp_request *request)
1840 snmp_vb_enumerator_init(&inbound_varbind_enumerator, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);