static err_t snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds) { struct snmp_asn1_tlv tlv; struct snmp_varbind *varbind; varbind = varbinds; SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->vbseqlen); BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); while (varbind != NULL) { BUILD_EXEC( snmp_append_outbound_varbind(pbuf_stream, varbind) ); varbind = varbind->next; } return ERR_OK; }
static void snmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t get_next) { err_t err; struct snmp_node_instance node_instance; memset(&node_instance, 0, sizeof(node_instance)); if (get_next) { struct snmp_obj_id result_oid; 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); if (request->error_status == SNMP_ERR_NOERROR) { snmp_oid_assign(&vb->oid, result_oid.id, result_oid.len); } } else { request->error_status = snmp_get_node_instance_from_oid(vb->oid.id, vb->oid.len, &node_instance); if (request->error_status == SNMP_ERR_NOERROR) { /* use 'getnext_validate' method for validation to avoid code duplication (some checks have to be executed here) */ request->error_status = snmp_msg_getnext_validate_node_inst(&node_instance, request); if (request->error_status != SNMP_ERR_NOERROR) { if (node_instance.release_instance != NULL) { node_instance.release_instance(&node_instance); } } } } if (request->error_status != SNMP_ERR_NOERROR) { if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) { if (request->version == SNMP_VERSION_2c) { /* in SNMP v2c a varbind related exception is stored in varbind and not in frame header */ vb->type = (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | (request->error_status & SNMP_VARBIND_EXCEPTION_MASK)); vb->value_len = 0; err = snmp_append_outbound_varbind(request, vb); if (err == ERR_OK) { /* we stored the exception in varbind -> go on */ request->error_status = SNMP_ERR_NOERROR; } else if (err == ERR_BUF) { request->error_status = SNMP_ERR_TOOBIG; } else { request->error_status = SNMP_ERR_GENERROR; } } } else { /* according to RFC 1157/1905, all other errors only return genError */ request->error_status = SNMP_ERR_GENERROR; } } else { vb->type = node_instance.asn1_type; vb->value_len = node_instance.get_value(&node_instance, vb->value); LWIP_ASSERT("SNMP_MAX_VALUE_SIZE is configured too low", (vb->value_len & ~SNMP_GET_VALUE_RAW_DATA) <= SNMP_MAX_VALUE_SIZE); err = snmp_append_outbound_varbind(request, vb); if (err == ERR_BUF) { request->error_status = SNMP_ERR_TOOBIG; } else if (err != ERR_OK) { request->error_status = SNMP_ERR_GENERROR; } if (node_instance.release_instance != NULL) { node_instance.release_instance(&node_instance); } } }