Lines Matching refs:request

163 static err_t snmp_process_get_request(struct snmp_request *request);
164 static err_t snmp_process_getnext_request(struct snmp_request *request);
165 static err_t snmp_process_getbulk_request(struct snmp_request *request);
166 static err_t snmp_process_set_request(struct snmp_request *request);
168 static err_t snmp_parse_inbound_frame(struct snmp_request *request);
169 static err_t snmp_prepare_outbound_frame(struct snmp_request *request);
170 static err_t snmp_complete_outbound_frame(struct snmp_request *request);
171 static void snmp_execute_write_callbacks(struct snmp_request *request);
182 struct snmp_request request;
184 memset(&request, 0, sizeof(request));
185 request.handle = handle;
186 request.source_ip = source_ip;
187 request.source_port = port;
188 request.inbound_pbuf = p;
192 err = snmp_parse_inbound_frame(&request);
194 err = snmp_prepare_outbound_frame(&request);
197 if (request.error_status == SNMP_ERR_NOERROR) {
199 if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_REQ) {
200 err = snmp_process_get_request(&request);
201 } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ) {
202 err = snmp_process_getnext_request(&request);
203 } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
204 err = snmp_process_getbulk_request(&request);
205 } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
206 err = snmp_process_set_request(&request);
211 err = snmp_complete_outbound_frame(&request);
214 err = snmp_sendto(request.handle, request.outbound_pbuf, request.source_ip, request.source_port);
216 if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)
217 && (request.error_status == SNMP_ERR_NOERROR)
220 snmp_execute_write_callbacks(&request);
226 if (request.outbound_pbuf != NULL) {
227 pbuf_free(request.outbound_pbuf);
248 snmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t get_next)
256 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);
258 if (request->error_status == SNMP_ERR_NOERROR) {
262 request->error_status = snmp_get_node_instance_from_oid(vb->oid.id, vb->oid.len, &node_instance);
264 if (request->error_status == SNMP_ERR_NOERROR) {
266 request->error_status = snmp_msg_getnext_validate_node_inst(&node_instance, request);
268 if (request->error_status != SNMP_ERR_NOERROR) {
276 if (request->error_status != SNMP_ERR_NOERROR) {
277 if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {
278 if ((request->version == SNMP_VERSION_2c) || request->version == SNMP_VERSION_3) {
280 vb->type = (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | (request->error_status & SNMP_VARBIND_EXCEPTION_MASK));
283 err = snmp_append_outbound_varbind(&(request->outbound_pbuf_stream), vb);
286 request->error_status = SNMP_ERR_NOERROR;
288 request->error_status = SNMP_ERR_TOOBIG;
290 request->error_status = SNMP_ERR_GENERROR;
295 request->error_status = SNMP_ERR_GENERROR;
305 err = snmp_append_outbound_varbind(&request->outbound_pbuf_stream, vb);
308 request->error_status = SNMP_ERR_TOOBIG;
310 request->error_status = SNMP_ERR_GENERROR;
313 request->error_status = SNMP_ERR_GENERROR;
326 * @param request points to the associated message process state
329 snmp_process_get_request(struct snmp_request *request)
333 vb.value = request->value_buffer;
335 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP get request\n"));
337 while (request->error_status == SNMP_ERR_NOERROR) {
338 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
341 snmp_process_varbind(request, &vb, 0);
343 request->error_status = SNMP_ERR_GENERROR;
346 /* no more varbinds in request */
352 request->error_status = SNMP_ERR_GENERROR;
362 * @param request points to the associated message process state
365 snmp_process_getnext_request(struct snmp_request *request)
369 vb.value = request->value_buffer;
371 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP get-next request\n"));
373 while (request->error_status == SNMP_ERR_NOERROR) {
374 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
377 snmp_process_varbind(request, &vb, 1);
379 request->error_status = SNMP_ERR_GENERROR;
382 /* no more varbinds in request */
388 request->error_status = SNMP_ERR_GENERROR;
398 * @param request points to the associated message process state
401 snmp_process_getbulk_request(struct snmp_request *request)
404 s32_t non_repeaters = request->non_repeaters;
409 vb.value = request->value_buffer;
412 repetitions = LWIP_MIN(request->max_repetitions, SNMP_LWIP_GETBULK_MAX_REPETITIONS);
414 repetitions = request->max_repetitions;
417 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP get-bulk request\n"));
420 while (request->error_status == SNMP_ERR_NOERROR) {
422 repetition_offset = request->outbound_pbuf_stream.offset;
431 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
433 /* no more varbinds in request */
439 request->error_status = SNMP_ERR_GENERROR;
441 snmp_process_varbind(request, &vb, 1);
447 while ((request->error_status == SNMP_ERR_NOERROR) && (repetitions > 0) && (request->outbound_pbuf_stream.offset != repetition_offset)) {
451 snmp_vb_enumerator_init(&repetition_varbind_enumerator, request->outbound_pbuf, repetition_offset, request->outbound_pbuf_stream.offset - repetition_offset);
452 repetition_offset = request->outbound_pbuf_stream.offset; /* for next loop */
454 while (request->error_status == SNMP_ERR_NOERROR) {
458 vb.value = request->value_buffer;
459 snmp_process_varbind(request, &vb, 1);
461 if (request->error_status != SNMP_ERR_NOERROR) {
463 request->error_index = request->non_repeaters + repetition_varbind_enumerator.varbind_count;
468 /* no more varbinds in request */
472 request->error_status = SNMP_ERR_GENERROR;
473 request->error_index = request->non_repeaters + repetition_varbind_enumerator.varbind_count;
477 if ((request->error_status == SNMP_ERR_NOERROR) && all_endofmibview) {
485 if (request->error_status == SNMP_ERR_TOOBIG) {
487 request->error_status = SNMP_ERR_NOERROR;
496 * @param request points to the associated message process state
499 snmp_process_set_request(struct snmp_request *request)
503 vb.value = request->value_buffer;
505 LWIP_DEBUGF(SNMP_DEBUG, ("SNMP set request\n"));
508 while (request->error_status == SNMP_ERR_NOERROR) {
509 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
514 request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
515 if (request->error_status == SNMP_ERR_NOERROR) {
517 request->error_status = SNMP_ERR_WRONGTYPE;
519 request->error_status = SNMP_ERR_NOTWRITABLE;
522 request->error_status = node_instance.set_test(&node_instance, vb.value_len, vb.value);
531 /* no more varbinds in request */
534 request->error_status = SNMP_ERR_WRONGLENGTH;
539 request->error_status = SNMP_ERR_GENERROR;
544 if (request->error_status == SNMP_ERR_NOERROR) {
545 snmp_vb_enumerator_init(&request->inbound_varbind_enumerator, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);
546 while (request->error_status == SNMP_ERR_NOERROR) {
547 err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);
551 request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
552 if (request->error_status == SNMP_ERR_NOERROR) {
554 if (request->inbound_varbind_enumerator.varbind_count == 1) {
555 request->error_status = SNMP_ERR_COMMITFAILED;
558 request->error_status = SNMP_ERR_UNDOFAILED;
567 /* no more varbinds in request */
571 request->error_status = SNMP_ERR_GENERROR;
605 * @param request points to the current message request state return
611 snmp_parse_inbound_frame(struct snmp_request *request)
619 IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
644 request->version = (u8_t)s32_value;
647 if (request->version == SNMP_VERSION_3) {
653 strcpy((char*)request->community, snmp_community);
654 request->community_strlen = (u16_t)strlen(snmp_community);
669 request->msg_id = s32_value;
678 request->msg_max_size = s32_value;
687 request->msg_flags = (u8_t)s32_value;
696 request->msg_security_model = s32_value;
722 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authoritative_engine_id,
724 request->msg_authoritative_engine_id_len = (u8_t)u16_value;
731 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_boots));
738 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_time));
747 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_user_name,
749 request->msg_user_name_len = (u8_t)u16_value;
751 IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, NULL, NULL));
754 memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
764 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authentication_parameters,
768 if (request->msg_flags & SNMP_V3_AUTH_FLAG) {
776 IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
782 IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
784 IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL));
785 IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, algo, hmac));
787 IF_PARSE_EXEC(memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
793 IF_PARSE_ASSERT(!(request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)));
797 memset(request->msg_privacy_parameters, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);
803 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_privacy_parameters,
808 if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
817 IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key));
819 request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
820 request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_DECRYPT));
838 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_engine_id,
840 request->context_engine_id_len = (u8_t)u16_value;
848 IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_name,
850 request->context_name_len = (u8_t)u16_value;
860 err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN);
863 request->community_strlen = 0;
869 request->community[request->community_strlen] = 0;
875 request->inbound_padding_len = pbuf_stream.length - tlv.value_len;
890 if (request->version < SNMP_VERSION_2c) {
905 request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK;
908 if (request->community_strlen == 0) {
913 } else if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
916 request->error_status = SNMP_ERR_NOTWRITABLE;
917 request->error_index = 1;
918 } else if (strncmp(snmp_community_write, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
925 if (strncmp(snmp_community, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
933 /* decode request ID */
939 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->request_id));
947 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
948 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->non_repeaters));
949 if (request->non_repeaters < 0) {
951 request->non_repeaters = 0;
954 /* only check valid value, don't touch 'request->error_status', maybe a response error status was already set to above; */
965 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {
966 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->max_repetitions));
967 if (request->max_repetitions < 0) {
969 request->max_repetitions = 0;
972 IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->error_index));
980 request->inbound_varbind_offset = pbuf_stream.offset;
981 request->inbound_varbind_len = pbuf_stream.length - request->inbound_padding_len;
982 snmp_vb_enumerator_init(&(request->inbound_varbind_enumerator), request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);
990 snmp_prepare_outbound_frame(struct snmp_request *request)
993 struct snmp_pbuf_stream* pbuf_stream = &(request->outbound_pbuf_stream);
996 request->outbound_pbuf = pbuf_alloc(PBUF_TRANSPORT, 1472, PBUF_RAM);
997 if (request->outbound_pbuf == NULL) {
1001 snmp_pbuf_stream_init(pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len);
1009 snmp_asn1_enc_s32t_cnt(request->version, &tlv.value_len);
1011 OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->version) );
1014 if (request->version < SNMP_VERSION_3) {
1017 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen);
1019 OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) );
1025 request->outbound_msg_global_data_offset = pbuf_stream->offset;
1031 snmp_asn1_enc_s32t_cnt(request->msg_id, &tlv.value_len);
1033 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_id));
1037 snmp_asn1_enc_s32t_cnt(request->msg_max_size, &tlv.value_len);
1039 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_max_size));
1044 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, &request->msg_flags, 1));
1048 snmp_asn1_enc_s32t_cnt(request->msg_security_model, &tlv.value_len);
1050 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_security_model));
1053 request->outbound_msg_global_data_end = pbuf_stream->offset;
1056 request->outbound_msg_security_parameters_str_offset = pbuf_stream->offset;
1060 request->outbound_msg_security_parameters_seq_offset = pbuf_stream->offset;
1065 snmpv3_get_engine_id(&id, &request->msg_authoritative_engine_id_len);
1066 MEMCPY(request->msg_authoritative_engine_id, id, request->msg_authoritative_engine_id_len);
1067 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->msg_authoritative_engine_id_len);
1069 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_authoritative_engine_id, request->msg_authoritative_engine_id_len));
1071 request->msg_authoritative_engine_time = snmpv3_get_engine_time();
1072 request->msg_authoritative_engine_boots = snmpv3_get_engine_boots();
1076 snmp_asn1_enc_s32t_cnt(request->msg_authoritative_engine_boots, &tlv.value_len);
1078 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_authoritative_engine_boots));
1082 snmp_asn1_enc_s32t_cnt(request->msg_authoritative_engine_time, &tlv.value_len);
1084 OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_authoritative_engine_time));
1087 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->msg_user_name_len);
1089 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_user_name, request->msg_user_name_len));
1093 if (request->msg_flags & SNMP_V3_AUTH_FLAG) {
1094 memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1095 request->outbound_msg_authentication_parameters_offset = pbuf_stream->offset;
1098 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
1108 if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
1109 snmpv3_build_priv_param(request->msg_privacy_parameters);
1113 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_privacy_parameters, SNMP_V3_MAX_PRIV_PARAM_LENGTH));
1122 request->outbound_msg_security_parameters_end = pbuf_stream->offset;
1126 if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
1127 request->outbound_scoped_pdu_string_offset = pbuf_stream->offset;
1135 request->outbound_scoped_pdu_seq_offset = pbuf_stream->offset;
1140 snmpv3_get_engine_id(&id, &request->context_engine_id_len);
1141 MEMCPY(request->context_engine_id, id, request->context_engine_id_len);
1142 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->context_engine_id_len);
1144 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->context_engine_id, request->context_engine_id_len));
1147 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->context_name_len);
1149 OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->context_name, request->context_name_len));
1154 request->outbound_pdu_offset = pbuf_stream->offset;
1158 /* request ID */
1160 snmp_asn1_enc_s32t_cnt(request->request_id, &tlv.value_len);
1162 OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->request_id) );
1167 request->outbound_error_status_offset = pbuf_stream->offset;
1173 request->outbound_error_index_offset = pbuf_stream->offset;
1180 request->outbound_varbind_offset = pbuf_stream->offset;
1320 snmp_complete_outbound_frame(struct snmp_request *request)
1326 if (request->version == SNMP_VERSION_1) {
1327 if (request->error_status != SNMP_ERR_NOERROR) {
1329 switch (request->error_status) {
1336 request->error_status = SNMP_ERR_NOSUCHNAME;
1344 request->error_status = SNMP_ERR_BADVALUE;
1351 request->error_status = SNMP_ERR_NOSUCHNAME;
1357 request->error_status = SNMP_ERR_GENERROR;
1362 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1364 switch (request->error_status) {
1368 request->error_status = SNMP_ERR_NOTWRITABLE;
1375 if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {
1377 LWIP_DEBUGF(SNMP_DEBUG, ("snmp_complete_outbound_frame() > Found v2 request with varbind exception code stored as error status!\n"));
1382 if ((request->error_status != SNMP_ERR_NOERROR) || (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)) {
1385 OF_BUILD_EXEC( snmp_pbuf_stream_init(&inbound_stream, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len) );
1386 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) );
1387 snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0);
1390 frame_size = request->outbound_pbuf_stream.offset;
1394 if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {
1396 outbound_padding = (8 - (u8_t)((frame_size - request->outbound_scoped_pdu_seq_offset) & 0x07)) & 0x07;
1398 snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0);
1405 OF_BUILD_EXEC( snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), request->outbound_pbuf, 0, request->outbound_pbuf->tot_len) );
1406 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
1409 if (request->version == SNMP_VERSION_3) {
1412 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_global_data_end
1413 - request->outbound_msg_global_data_offset - 1 - 1);
1414 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_global_data_offset));
1415 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1418 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, request->outbound_msg_security_parameters_end
1419 - request->outbound_msg_security_parameters_str_offset - 1 - 1);
1420 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_str_offset));
1421 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1423 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_security_parameters_end
1424 - request->outbound_msg_security_parameters_seq_offset - 1 - 1);
1425 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_seq_offset));
1426 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1429 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size - request->outbound_scoped_pdu_seq_offset - 1 - 3);
1430 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_seq_offset));
1431 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1437 frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */
1438 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_pdu_offset) );
1439 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
1442 if (request->error_status != 0) {
1444 snmp_asn1_enc_s32t_cnt(request->error_status, &len);
1449 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_error_status_offset) );
1450 OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(request->outbound_pbuf_stream), len, request->error_status) );
1453 switch (request->error_status) {
1469 if (request->error_status == SNMP_ERR_TOOBIG) {
1470 request->error_index = 0; /* defined by RFC 1157 */
1471 } else if (request->error_index == 0) {
1473 request->error_index = request->inbound_varbind_enumerator.varbind_count;
1476 if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
1477 snmp_stats.intotalsetvars += request->inbound_varbind_enumerator.varbind_count;
1479 snmp_stats.intotalreqvars += request->inbound_varbind_enumerator.varbind_count;
1484 if (request->error_index != 0) {
1486 snmp_asn1_enc_s32t_cnt(request->error_index, &len);
1491 OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_error_index_offset) );
1492 OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(request->outbound_pbuf_stream), len, request->error_index) );
1496 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size - request->outbound_varbind_offset);
1497 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()) */
1498 OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
1503 if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {
1508 OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
1509 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_string_offset));
1511 - request->outbound_scoped_pdu_string_offset - 1 - 3);
1512 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
1514 OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key));
1516 OF_BUILD_EXEC(snmpv3_crypt(&request->outbound_pbuf_stream, tlv.value_len, key,
1517 request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
1518 request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT));
1521 if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_AUTH_FLAG)) {
1526 OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL));
1527 OF_BUILD_EXEC(snmp_pbuf_stream_init(&(request->outbound_pbuf_stream),
1528 request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
1529 OF_BUILD_EXEC(snmpv3_auth(&request->outbound_pbuf_stream, frame_size + outbound_padding, key, algo, hmac));
1531 MEMCPY(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
1532 OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream,
1533 request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
1534 OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&request->outbound_pbuf_stream,
1535 request->outbound_msg_authentication_parameters_offset));
1538 OF_BUILD_EXEC(snmp_ans1_enc_tlv(&request->outbound_pbuf_stream, &tlv));
1539 OF_BUILD_EXEC(snmp_asn1_enc_raw(&request->outbound_pbuf_stream,
1540 request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
1544 pbuf_realloc(request->outbound_pbuf, frame_size + outbound_padding);
1553 snmp_execute_write_callbacks(struct snmp_request *request)
1558 snmp_vb_enumerator_init(&inbound_varbind_enumerator, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);