44 #define PBUF_OP_EXEC(code) \ 45 if ((code) != ERR_OK) { \ 50 snmp_ans1_enc_tlv(
struct snmp_pbuf_stream* pbuf_stream,
struct snmp_asn1_tlv* tlv)
53 u8_t length_bytes_required;
56 if ((tlv->type & SNMP_ASN1_DATATYPE_MASK) == SNMP_ASN1_DATATYPE_EXTENDED) {
60 if (tlv->type_len != 0) {
65 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, tlv->type));
69 if (tlv->value_len <= 127) {
70 length_bytes_required = 1;
71 }
else if (tlv->value_len <= 255) {
72 length_bytes_required = 2;
74 length_bytes_required = 3;
78 if (tlv->length_len > 0) {
79 if (tlv->length_len < length_bytes_required) {
84 length_bytes_required = tlv->length_len;
86 tlv->length_len = length_bytes_required;
89 if (length_bytes_required > 1) {
91 length_bytes_required--;
92 data = 0x80 | length_bytes_required;
94 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, data));
96 while (length_bytes_required > 1)
98 if (length_bytes_required == 2) {
100 data = (
u8_t)(tlv->value_len >> 8);
106 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, data));
107 length_bytes_required--;
112 data = (
u8_t)(tlv->value_len & 0xFF);
113 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, data));
128 snmp_asn1_enc_raw(
struct snmp_pbuf_stream* pbuf_stream,
const u8_t *raw,
u16_t raw_len)
130 PBUF_OP_EXEC(snmp_pbuf_stream_writebuf(pbuf_stream, raw, raw_len));
147 snmp_asn1_enc_u32t(
struct snmp_pbuf_stream* pbuf_stream,
u16_t octets_needed,
u32_t value)
149 if (octets_needed > 5) {
152 if (octets_needed == 5) {
154 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));
158 while (octets_needed > 1) {
160 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(value >> (octets_needed << 3))));
164 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)value));
181 snmp_asn1_enc_u64t(
struct snmp_pbuf_stream* pbuf_stream,
u16_t octets_needed,
const u32_t* value)
183 if (octets_needed > 9) {
186 if (octets_needed == 9) {
188 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));
192 while (octets_needed > 4) {
194 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(*value >> ((octets_needed-4) << 3))));
200 while (octets_needed > 1) {
202 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(*value >> (octets_needed << 3))));
206 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(*value)));
223 snmp_asn1_enc_s32t(
struct snmp_pbuf_stream* pbuf_stream,
u16_t octets_needed,
s32_t value)
225 while (octets_needed > 1) {
228 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(value >> (octets_needed << 3))));
232 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)value));
247 snmp_asn1_enc_oid(
struct snmp_pbuf_stream* pbuf_stream,
const u32_t *oid,
u16_t oid_len)
251 u32_t compressed_byte = ((oid[0] * 40) + oid[1]);
252 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)compressed_byte));
261 while (oid_len > 0) {
272 code = (
u8_t)(sub_id >> shift);
273 if ((code != 0) || (tail != 0)) {
275 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, code | 0x80));
279 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)sub_id & 0x7F));
294 snmp_asn1_enc_length_cnt(
u16_t length,
u8_t *octets_needed)
296 if (length < 0x80U) {
298 }
else if (length < 0x100U) {
316 snmp_asn1_enc_u32t_cnt(
u32_t value,
u16_t *octets_needed)
318 if (value < 0x80UL) {
320 }
else if (value < 0x8000UL) {
322 }
else if (value < 0x800000UL) {
324 }
else if (value < 0x80000000UL) {
342 snmp_asn1_enc_u64t_cnt(
const u32_t *value,
u16_t *octets_needed)
349 snmp_asn1_enc_u32t_cnt(*value, octets_needed);
352 snmp_asn1_enc_u32t_cnt(*value, octets_needed);
353 *octets_needed = *octets_needed + 4;
366 snmp_asn1_enc_s32t_cnt(
s32_t value,
u16_t *octets_needed)
373 }
else if (value < 0x8000L) {
375 }
else if (value < 0x800000L) {
390 snmp_asn1_enc_oid_cnt(
const u32_t *oid,
u16_t oid_len,
u16_t *octets_needed)
401 while (oid_len > 0) {
416 snmp_asn1_dec_tlv(
struct snmp_pbuf_stream* pbuf_stream,
struct snmp_asn1_tlv* tlv)
421 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
424 if ((tlv->type & SNMP_ASN1_DATATYPE_MASK) == SNMP_ASN1_DATATYPE_EXTENDED) {
431 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
435 tlv->value_len = data;
436 }
else if (data > 0x80) {
437 u8_t length_bytes = data - 0x80;
438 tlv->length_len = length_bytes + 1;
441 while (length_bytes > 0) {
443 if (tlv->value_len > 0xFF) {
446 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
447 tlv->value_len <<= 8;
448 tlv->value_len |= data;
451 if (tlv->value_len == 0xFFFF) {
479 snmp_asn1_dec_u32t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len,
u32_t *value)
483 if ((len > 0) && (len <= 5)) {
484 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
487 if (((len == 5) && (data == 0x00)) || ((len < 5) && ((data & 0x80) == 0))) {
493 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
521 snmp_asn1_dec_u64t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len,
u32_t *value)
532 if ((len > 0) && (len <= 9)) {
533 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
536 if (((len == 9) && (data == 0x00)) || ((len < 9) && ((data & 0x80) == 0))) {
542 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
575 snmp_asn1_dec_s32t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len,
s32_t *value)
577 #if BYTE_ORDER == LITTLE_ENDIAN 580 #if BYTE_ORDER == BIG_ENDIAN 586 if ((len > 0) && (len < 5)) {
587 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
604 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
607 #if BYTE_ORDER == LITTLE_ENDIAN 610 #if BYTE_ORDER == BIG_ENDIAN 638 snmp_asn1_dec_oid(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len,
u32_t* oid,
u8_t* oid_len,
u8_t oid_max_len)
646 if (oid_max_len < 2) {
650 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
660 }
else if (data < 40) {
665 }
else if (data < 80) {
668 *oid_ptr = data - 40;
673 *oid_ptr = data - 80;
682 while ((len > 0) && (*oid_len < oid_max_len)) {
683 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
686 if ((data & 0x80) == 0x00) {
691 u32_t sub_id = (data & ~0x80);
692 while ((len > 0) && ((data & 0x80) != 0)) {
693 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
696 sub_id = (sub_id << 7) + (data & ~0x80);
699 if ((data & 0x80) != 0) {
729 snmp_asn1_dec_raw(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len,
u8_t *buf,
u16_t* buf_len,
u16_t buf_max_len)
731 if (len > buf_max_len) {
738 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, buf));