55 static const char* buffer_str =
"buffer";
58 { LDNS_RCODE_NOERROR,
"NOERROR" },
59 { LDNS_RCODE_FORMERR,
"FORMERR" },
60 { LDNS_RCODE_SERVFAIL,
"SERVFAIL" },
61 { LDNS_RCODE_NXDOMAIN,
"NXDOMAIN" },
62 { LDNS_RCODE_NOTIMPL,
"NOTIMPL" },
63 { LDNS_RCODE_REFUSED,
"REFUSED" },
64 { LDNS_RCODE_YXDOMAIN,
"YXDOMAIN" },
65 { LDNS_RCODE_YXRRSET,
"YXRRSET" },
66 { LDNS_RCODE_NXRRSET,
"NXRRSET" },
67 { LDNS_RCODE_NOTAUTH,
"NOTAUTH" },
68 { LDNS_RCODE_NOTZONE,
"NOTZONE" },
85 buffer->
data = (uint8_t*) calloc(capacity,
sizeof(uint8_t));
87 buffer->
limit = capacity;
101 ods_log_assert(buffer);
114 ods_log_assert(buffer);
127 ods_log_assert(buffer);
139 ods_log_assert(buffer);
140 ods_log_assert(pos <= buffer->limit);
152 ods_log_assert(buffer);
153 ods_log_assert(buffer->
position + count <= buffer->limit);
163 get_bit(uint8_t bits[],
size_t index)
165 return bits[index / 8] & (1 << (7 - index % 8));
174 set_bit(uint8_t bits[],
size_t index)
176 bits[index / 8] |= (1 << (7 - index % 8));
185 label_is_pointer(
const uint8_t* label)
187 ods_log_assert(label);
188 return (label[0] & 0xc0) == 0xc0;
197 label_pointer_location(
const uint8_t* label)
199 ods_log_assert(label);
200 ods_log_assert(label_is_pointer(label));
201 return ((uint16_t) (label[0] & ~0xc0) << 8) | (uint16_t) label[1];
210 label_is_normal(
const uint8_t* label)
212 ods_log_assert(label);
213 return (label[0] & 0xc0) == 0;
221 label_is_root(
const uint8_t* label)
223 ods_log_assert(label);
224 return label[0] == 0;
233 label_length(
const uint8_t* label)
235 ods_log_assert(label);
236 ods_log_assert(label_is_normal(label));
250 size_t dname_length = 0;
251 const uint8_t *label = NULL;
253 ods_log_assert(buffer);
261 ods_log_error(
"[%s] dname loop!", buffer_str);
266 if (label_is_pointer(label)) {
268 if (!allow_pointers) {
274 pointer = label_pointer_location(label);
283 }
else if (label_is_normal(label)) {
284 size_t length = label_length(label) + 1;
285 done = label_is_root(label);
293 dname_length += length;
312 ods_log_assert(buffer);
314 uint8_t label_size = 0;
319 if (label_size == 0) {
321 }
else if ((label_size & 0xc0) != 0) {
375 ods_log_assert(buffer);
376 return buffer->
limit;
387 ods_log_assert(buffer);
388 ods_log_assert(limit <= buffer->capacity);
389 buffer->
limit = limit;
403 ods_log_assert(buffer);
415 ods_log_assert(buffer);
416 ods_log_assert(at <= buffer->limit);
417 return buffer->
data + at;
428 ods_log_assert(buffer);
440 ods_log_assert(buffer);
450 buffer_remaining_at(
buffer_type* buffer,
size_t at)
452 ods_log_assert(buffer);
453 ods_log_assert(at <= buffer->limit);
454 return buffer->
limit - at;
465 ods_log_assert(buffer);
466 return buffer_remaining_at(buffer, buffer->
position);
475 buffer_available_at(
buffer_type *buffer,
size_t at,
size_t count)
477 ods_log_assert(buffer);
478 return count <= buffer_remaining_at(buffer, at);
489 ods_log_assert(buffer);
490 return buffer_available_at(buffer, buffer->
position, count);
499 buffer_write_u8_at(
buffer_type* buffer,
size_t at, uint8_t data)
501 ods_log_assert(buffer);
502 ods_log_assert(buffer_available_at(buffer, at,
sizeof(data)));
503 buffer->
data[at] = data;
514 ods_log_assert(buffer);
515 ods_log_assert(buffer_available_at(buffer, at,
sizeof(data)));
516 write_uint16(buffer->
data + at, data);
525 buffer_write_u32_at(
buffer_type* buffer,
size_t at, uint32_t data)
527 ods_log_assert(buffer);
528 ods_log_assert(buffer_available_at(buffer, at,
sizeof(data)));
529 write_uint32(buffer->
data + at, data);
540 ods_log_assert(buffer);
554 ods_log_assert(buffer);
555 buffer_write_u8_at(buffer, buffer->
position, data);
567 ods_log_assert(buffer);
580 ods_log_assert(buffer);
581 buffer_write_u32_at(buffer, buffer->
position, data);
593 ods_log_assert(buffer);
595 buffer_write(buffer, ldns_rdf_data(rdf), ldns_rdf_size(rdf));
609 size_t rdlength_pos = 0;
610 uint16_t rdlength = 0;
611 ods_log_assert(buffer);
621 sizeof(uint32_t) +
sizeof(rdlength))) {
631 for (i=0; i < ldns_rr_rd_count(rr); i++) {
656 ods_log_assert(buffer);
657 ods_log_assert(at < buffer->capacity);
658 return buffer->
data[at];
670 ods_log_assert(buffer);
671 return read_uint16(buffer->
data + at);
682 ods_log_assert(buffer);
683 return read_uint32(buffer->
data + at);
694 ods_log_assert(buffer);
709 ods_log_assert(buffer);
710 result = buffer_read_u8_at(buffer, buffer->
position);
711 buffer->
position +=
sizeof(uint8_t);
724 ods_log_assert(buffer);
725 result = buffer_read_u16_at(buffer, buffer->
position);
726 buffer->
position +=
sizeof(uint16_t);
739 ods_log_assert(buffer);
740 result = buffer_read_u32_at(buffer, buffer->
position);
741 buffer->
position +=
sizeof(uint32_t);
753 ods_log_assert(buffer);
754 return buffer_read_u16_at(buffer, 0);
764 return ldns_get_random();
775 ods_log_assert(buffer);
788 ods_log_assert(buffer);
789 return (uint16_t) buffer_read_u16_at(buffer, 2);
800 ods_log_assert(buffer);
812 ods_log_assert(buffer);
813 return (
int)
QR(buffer);
824 ods_log_assert(buffer);
836 ods_log_assert(buffer);
848 ods_log_assert(buffer);
849 return (ldns_pkt_opcode)
OPCODE(buffer);
860 ods_log_assert(buffer);
872 ods_log_assert(buffer);
873 return (
int)
AA(buffer);
884 ods_log_assert(buffer);
896 ods_log_assert(buffer);
897 return (
int)
TC(buffer);
908 ods_log_assert(buffer);
909 return (
int)
RD(buffer);
920 ods_log_assert(buffer);
921 return (
int)
RA(buffer);
932 ods_log_assert(buffer);
933 return (
int)
AD(buffer);
944 ods_log_assert(buffer);
945 return (
int)
CD(buffer);
956 ods_log_assert(buffer);
957 return (ldns_pkt_rcode)
RCODE(buffer);
968 ods_log_assert(buffer);
980 ods_lookup_table *lt;
996 ods_log_assert(buffer);
997 return buffer_read_u16_at(buffer, 4);
1008 ods_log_assert(buffer);
1020 ods_log_assert(buffer);
1021 return buffer_read_u16_at(buffer, 6);
1032 ods_log_assert(buffer);
1044 ods_log_assert(buffer);
1045 return buffer_read_u16_at(buffer, 8);
1056 ods_log_assert(buffer);
1068 ods_log_assert(buffer);
1069 return buffer_read_u16_at(buffer, 10);
1080 ods_log_assert(buffer);
1090 buffer_pkt_new(
buffer_type* buffer, ldns_rdf* qname, ldns_rr_type qtype,
1091 ldns_rr_class qclass, ldns_pkt_opcode opcode)
1093 ods_log_assert(buffer);
1094 ods_log_assert(qname);
1095 ods_log_assert(qtype);
1096 ods_log_assert(qclass);
1121 ldns_rr_class qclass)
1123 buffer_pkt_new(buffer, qname, qtype, qclass, LDNS_PACKET_QUERY);
1135 buffer_pkt_new(buffer, qname, LDNS_RR_TYPE_SOA, qclass,
1136 LDNS_PACKET_NOTIFY);