57 static const char* buffer_str =
"buffer";
60 { LDNS_RCODE_NOERROR,
"NOERROR" },
61 { LDNS_RCODE_FORMERR,
"FORMERR" },
62 { LDNS_RCODE_SERVFAIL,
"SERVFAIL" },
63 { LDNS_RCODE_NXDOMAIN,
"NXDOMAIN" },
64 { LDNS_RCODE_NOTIMPL,
"NOTIMPL" },
65 { LDNS_RCODE_REFUSED,
"REFUSED" },
66 { LDNS_RCODE_YXDOMAIN,
"YXDOMAIN" },
67 { LDNS_RCODE_YXRRSET,
"YXRRSET" },
68 { LDNS_RCODE_NXRRSET,
"NXRRSET" },
69 { LDNS_RCODE_NOTAUTH,
"NOTAUTH" },
70 { LDNS_RCODE_NOTZONE,
"NOTZONE" },
83 if (!allocator || !capacity) {
90 buffer->
data = (uint8_t*) calloc(capacity,
sizeof(uint8_t));
92 buffer->
limit = capacity;
107 buffer->
data = (uint8_t*) data;
109 buffer->
limit = size;
202 get_bit(uint8_t bits[],
size_t index)
204 return bits[index / 8] & (1 << (7 - index % 8));
213 set_bit(uint8_t bits[],
size_t index)
215 bits[index / 8] |= (1 << (7 - index % 8));
225 label_is_pointer(
const uint8_t* label)
228 return (label[0] & 0xc0) == 0xc0;
237 label_pointer_location(
const uint8_t* label)
241 return ((uint16_t) (label[0] & ~0xc0) << 8) | (uint16_t) label[1];
250 label_is_normal(
const uint8_t* label)
253 return (label[0] & 0xc0) == 0;
261 label_is_root(
const uint8_t* label)
264 return label[0] == 0;
273 label_length(
const uint8_t* label)
290 size_t dname_length = 0;
291 const uint8_t *label = NULL;
306 if (label_is_pointer(label)) {
308 if (!allow_pointers) {
314 pointer = label_pointer_location(label);
323 }
else if (label_is_normal(label)) {
324 size_t length = label_length(label) + 1;
325 done = label_is_root(label);
333 dname_length += length;
354 uint8_t label_size = 0;
359 if (label_size == 0) {
361 }
else if ((label_size & 0xc0) != 0) {
416 return buffer->
limit;
429 buffer->
limit = limit;
458 return buffer->
data + at;
503 buffer_remaining_at(
buffer_type* buffer,
size_t at)
507 return buffer->
limit - at;
519 return buffer_remaining_at(buffer, buffer->
position);
528 buffer_available_at(
buffer_type *buffer,
size_t at,
size_t count)
531 return count <= buffer_remaining_at(buffer, at);
543 return buffer_available_at(buffer, buffer->
position, count);
552 buffer_write_u8_at(
buffer_type* buffer,
size_t at, uint8_t data)
556 buffer->
data[at] = data;
570 write_uint16(buffer->
data + at, data);
580 buffer_write_u32_at(
buffer_type* buffer,
size_t at, uint32_t data)
584 write_uint32(buffer->
data + at, data);
612 buffer_write_u8_at(buffer, buffer->
position, data);
640 buffer_write_u32_at(buffer, buffer->
position, data);
655 buffer_write(buffer, ldns_rdf_data(rdf), ldns_rdf_size(rdf));
670 size_t rdlength_pos = 0;
671 uint16_t rdlength = 0;
682 sizeof(uint32_t) +
sizeof(rdlength))) {
692 for (i=0; i < ldns_rr_rd_count(rr); i++) {
719 return buffer->
data[at];
732 return read_uint16(buffer->
data + at);
744 return read_uint32(buffer->
data + at);
772 result = buffer_read_u8_at(buffer, buffer->
position);
773 buffer->
position +=
sizeof(uint8_t);
787 result = buffer_read_u16_at(buffer, buffer->
position);
788 buffer->
position +=
sizeof(uint16_t);
802 result = buffer_read_u32_at(buffer, buffer->
position);
803 buffer->
position +=
sizeof(uint32_t);
816 return buffer_read_u16_at(buffer, 0);
826 return ldns_get_random();
852 return (uint16_t) buffer_read_u16_at(buffer, 2);
877 return (
int)
QR(buffer);
915 return (ldns_pkt_opcode)
OPCODE(buffer);
940 return (
int)
AA(buffer);
965 return (
int)
TC(buffer);
977 return (
int)
RD(buffer);
989 return (
int)
RA(buffer);
1001 return (
int)
AD(buffer);
1013 return (
int)
CD(buffer);
1025 return (ldns_pkt_rcode)
RCODE(buffer);
1066 return buffer_read_u16_at(buffer, 4);
1091 return buffer_read_u16_at(buffer, 6);
1116 return buffer_read_u16_at(buffer, 8);
1141 return buffer_read_u16_at(buffer, 10);
1163 buffer_pkt_new(
buffer_type* buffer, ldns_rdf* qname, ldns_rr_type qtype,
1164 ldns_rr_class qclass, ldns_pkt_opcode opcode)
1195 ldns_rr_class qclass)
1197 buffer_pkt_new(buffer, qname, qtype, qclass, LDNS_PACKET_QUERY);
1210 buffer_pkt_new(buffer, qname, LDNS_RR_TYPE_SOA, qclass,
1211 LDNS_PACKET_NOTIFY);
1223 buffer_pkt_new(buffer, qname, LDNS_RR_TYPE_AXFR, qclass,
1237 ldns_status status = LDNS_STATUS_OK;
1238 ldns_pkt* pkt = NULL;
1243 if (status == LDNS_STATUS_OK) {
1245 ldns_pkt_print(fd, pkt);
1248 fprintf(fd,
";;\n");
1249 fprintf(fd,
";; Bogus packet: %s\n", ldns_get_errorstr_by_id(status));
1250 fprintf(fd,
";;\n");
1251 fprintf(fd,
";;\n");
1265 if (!buffer || !allocator) {
1268 free((
void*)buffer->
data);
ldns_pkt_opcode buffer_pkt_opcode(buffer_type *buffer)
int buffer_pkt_rd(buffer_type *buffer)
void buffer_pkt_set_random_id(buffer_type *buffer)
uint8_t * buffer_at(buffer_type *buffer, size_t at)
uint16_t buffer_pkt_arcount(buffer_type *buffer)
#define BUFFER_PKT_HEADER_SIZE
void * allocator_alloc(allocator_type *allocator, size_t size)
uint16_t buffer_pkt_qdcount(buffer_type *buffer)
void buffer_skip(buffer_type *buffer, ssize_t count)
void buffer_pkt_set_flags(buffer_type *buffer, uint16_t flags)
uint16_t buffer_read_u16(buffer_type *buffer)
int buffer_skip_rr(buffer_type *buffer, unsigned qrr)
void buffer_flip(buffer_type *buffer)
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
void buffer_clear(buffer_type *buffer)
#define OPCODE_SET(packet, opcode)
uint8_t buffer_read_u8(buffer_type *buffer)
void buffer_write_u8(buffer_type *buffer, uint8_t data)
void ods_log_error(const char *format,...)
ods_lookup_table * ods_lookup_by_id(ods_lookup_table *table, int id)
int buffer_pkt_qr(buffer_type *buffer)
void buffer_pkt_print(FILE *fd, buffer_type *buffer)
void buffer_write(buffer_type *buffer, const void *data, size_t count)
uint16_t buffer_pkt_id(buffer_type *buffer)
uint8_t * buffer_current(buffer_type *buffer)
buffer_type * buffer_create(allocator_type *allocator, size_t capacity)
uint16_t buffer_pkt_ancount(buffer_type *buffer)
size_t buffer_limit(buffer_type *buffer)
void buffer_rewind(buffer_type *buffer)
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
void buffer_set_limit(buffer_type *buffer, size_t limit)
uint16_t buffer_pkt_flags(buffer_type *buffer)
void buffer_pkt_axfr(buffer_type *buffer, ldns_rdf *qname, ldns_rr_class qclass)
size_t buffer_capacity(buffer_type *buffer)
int buffer_skip_dname(buffer_type *buffer)
uint32_t buffer_read_u32(buffer_type *buffer)
void buffer_pkt_set_opcode(buffer_type *buffer, ldns_pkt_opcode opcode)
void buffer_pkt_query(buffer_type *buffer, ldns_rdf *qname, ldns_rr_type qtype, ldns_rr_class qclass)
void buffer_write_u16(buffer_type *buffer, uint16_t data)
size_t buffer_read_dname(buffer_type *buffer, uint8_t *dname, unsigned allow_pointers)
void buffer_write_u32(buffer_type *buffer, uint32_t data)
void buffer_pkt_set_aa(buffer_type *buffer)
void buffer_read(buffer_type *buffer, void *data, size_t count)
const char * buffer_rcode2str(ldns_pkt_rcode rcode)
int buffer_pkt_aa(buffer_type *buffer)
uint16_t buffer_pkt_nscount(buffer_type *buffer)
ods_lookup_table ods_rcode_str[]
void buffer_write_u16_at(buffer_type *buffer, size_t at, uint16_t data)
void buffer_set_position(buffer_type *buffer, size_t pos)
void buffer_pkt_notify(buffer_type *buffer, ldns_rdf *qname, ldns_rr_class qclass)
int buffer_available(buffer_type *buffer, size_t count)
int buffer_pkt_ad(buffer_type *buffer)
#define RCODE_SET(packet, rcode)
void buffer_pkt_clear_qr(buffer_type *buffer)
size_t buffer_remaining(buffer_type *buffer)
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
void buffer_write_rdf(buffer_type *buffer, ldns_rdf *rdf)
int buffer_write_rr(buffer_type *buffer, ldns_rr *rr)
int buffer_pkt_ra(buffer_type *buffer)
void allocator_deallocate(allocator_type *allocator, void *data)
void buffer_create_from(buffer_type *buffer, void *data, size_t size)
size_t buffer_position(buffer_type *buffer)
void buffer_cleanup(buffer_type *buffer, allocator_type *allocator)
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
#define ods_log_assert(x)
int buffer_pkt_cd(buffer_type *buffer)
void buffer_pkt_set_qr(buffer_type *buffer)
uint8_t * buffer_begin(buffer_type *buffer)
ldns_pkt_rcode buffer_pkt_rcode(buffer_type *buffer)
uint8_t * buffer_end(buffer_type *buffer)
int buffer_pkt_tc(buffer_type *buffer)