44#define PBUF_OP_EXEC(code) \
45 if ((code) != ERR_OK) { \
57snmp_ans1_enc_tlv(
struct snmp_pbuf_stream *pbuf_stream,
struct snmp_asn1_tlv *tlv)
60 u8_t length_bytes_required;
63 if ((tlv->type & SNMP_ASN1_DATATYPE_MASK) == SNMP_ASN1_DATATYPE_EXTENDED) {
67 if (tlv->type_len != 0) {
72 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, tlv->type));
76 if (tlv->value_len <= 127) {
77 length_bytes_required = 1;
78 }
else if (tlv->value_len <= 255) {
79 length_bytes_required = 2;
81 length_bytes_required = 3;
85 if (tlv->length_len > 0) {
86 if (tlv->length_len < length_bytes_required) {
91 length_bytes_required = tlv->length_len;
93 tlv->length_len = length_bytes_required;
96 if (length_bytes_required > 1) {
98 length_bytes_required--;
99 data = 0x80 | length_bytes_required;
101 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream,
data));
103 while (length_bytes_required > 1) {
104 if (length_bytes_required == 2) {
112 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream,
data));
113 length_bytes_required--;
118 data = (
u8_t)(tlv->value_len & 0xFF);
119 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream,
data));
133snmp_asn1_enc_raw(
struct snmp_pbuf_stream *pbuf_stream,
const u8_t *raw,
u16_t raw_len)
135 PBUF_OP_EXEC(snmp_pbuf_stream_writebuf(pbuf_stream, raw, raw_len));
151snmp_asn1_enc_u32t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t octets_needed,
u32_t value)
153 if (octets_needed > 5) {
156 if (octets_needed == 5) {
158 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));
162 while (octets_needed > 1) {
164 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(
value >> (octets_needed << 3))));
168 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)
value));
183snmp_asn1_enc_s32t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t octets_needed,
s32_t value)
185 while (octets_needed > 1) {
188 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(
value >> (octets_needed << 3))));
192 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)
value));
206snmp_asn1_enc_oid(
struct snmp_pbuf_stream *pbuf_stream,
const u32_t *oid,
u16_t oid_len)
210 u32_t compressed_byte = ((oid[0] * 40) + oid[1]);
211 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)compressed_byte));
220 while (oid_len > 0) {
234 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream,
code | 0x80));
238 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)sub_id & 0x7F));
257 }
else if (
length < 0x100U) {
277 if (
value < 0x80UL) {
279 }
else if (
value < 0x8000UL) {
281 }
else if (
value < 0x800000UL) {
283 }
else if (
value < 0x80000000UL) {
306 }
else if (
value < 0x8000L) {
308 }
else if (
value < 0x800000L) {
323snmp_asn1_enc_oid_cnt(
const u32_t *oid,
u16_t oid_len,
u16_t *octets_needed)
334 while (oid_len > 0) {
356snmp_asn1_dec_tlv(
struct snmp_pbuf_stream *pbuf_stream,
struct snmp_asn1_tlv *tlv)
361 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
364 if ((tlv->type & SNMP_ASN1_DATATYPE_MASK) == SNMP_ASN1_DATATYPE_EXTENDED) {
371 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
375 tlv->value_len =
data;
376 }
else if (
data > 0x80) {
378 if (length_bytes > pbuf_stream->length) {
381 tlv->length_len = length_bytes + 1;
384 while (length_bytes > 0) {
386 if (tlv->value_len > 0xFF) {
389 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
390 tlv->value_len <<= 8;
391 tlv->value_len |=
data;
394 if (tlv->value_len == 0xFFFF) {
425 if ((
len > 0) && (
len <= 5)) {
426 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
429 if (((
len == 5) && (
data == 0x00)) || ((
len < 5) && ((
data & 0x80) == 0))) {
434 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
463 if ((
len > 0) && (
len < 5)) {
464 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
477 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
498snmp_asn1_dec_oid(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len,
u32_t *oid,
u8_t *oid_len,
u8_t oid_max_len)
506 if (oid_max_len < 2) {
510 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
520 }
else if (
data < 40) {
525 }
else if (
data < 80) {
528 *oid_ptr =
data - 40;
533 *oid_ptr =
data - 80;
542 while ((
len > 0) && (*oid_len < oid_max_len)) {
543 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
546 if ((
data & 0x80) == 0x00) {
552 while ((
len > 0) && ((
data & 0x80) != 0)) {
553 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
556 sub_id = (sub_id << 7) + (
data & ~0x80);
559 if ((
data & 0x80) != 0) {
591 if (
len > buf_max_len) {
598 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream,
buf));
618snmp_asn1_enc_u64t_cnt(u64_t
value,
u16_t *octets_needed)
621 if ((
value >> 32) == 0) {
623 snmp_asn1_enc_u32t_cnt((
u32_t)
value, octets_needed);
626 snmp_asn1_enc_u32t_cnt((
u32_t)(
value >> 32), octets_needed);
627 *octets_needed = *octets_needed + 4;
644snmp_asn1_dec_u64t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t len, u64_t *
value)
648 if ((
len > 0) && (
len <= 9)) {
649 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
652 if (((
len == 9) && (
data == 0x00)) || ((
len < 9) && ((
data & 0x80) == 0))) {
657 PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &
data));
681snmp_asn1_enc_u64t(
struct snmp_pbuf_stream *pbuf_stream,
u16_t octets_needed, u64_t
value)
683 if (octets_needed > 9) {
686 if (octets_needed == 9) {
688 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));
692 while (octets_needed > 1) {
694 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(
value >> (octets_needed << 3))));
698 PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (
u8_t)(
value)));
struct outqueuenode * tail
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLsizei GLsizei * length