40 #include <ldns/ldns.h> 43 #define BUFFER_PKT_HEADER_SIZE 12 44 #define MAXDOMAINLEN 255 45 #define MAXLABELLEN 63 46 #define MAX_RDLENGTH 65535 48 (MAXDOMAINLEN + sizeof(uint32_t) + 4*sizeof(uint16_t) + MAX_RDLENGTH) 49 #define MAX_PACKET_SIZE 65535 50 #define PACKET_BUFFER_SIZE (MAX_PACKET_SIZE + MAX_RR_SIZE) 54 #define QR(packet) (*buffer_at((packet), 2) & QR_MASK) 55 #define QR_SET(packet) (*buffer_at((packet), 2) |= QR_MASK) 56 #define QR_CLR(packet) (*buffer_at((packet), 2) &= ~QR_MASK) 58 #define OPCODE_MASK 0x78U 59 #define OPCODE_SHIFT 3 60 #define OPCODE(packet) ((*buffer_at((packet), 2) & OPCODE_MASK) >> OPCODE_SHIFT) 61 #define OPCODE_SET(packet, opcode) \ 62 (*buffer_at((packet), 2) = (*buffer_at((packet), 2) & ~OPCODE_MASK) | ((opcode) << OPCODE_SHIFT)) 66 #define AA(packet) (*buffer_at((packet), 2) & AA_MASK) 67 #define AA_SET(packet) (*buffer_at((packet), 2) |= AA_MASK) 68 #define AA_CLR(packet) (*buffer_at((packet), 2) &= ~AA_MASK) 72 #define TC(packet) (*buffer_at((packet), 2) & TC_MASK) 73 #define TC_SET(packet) (*buffer_at((packet), 2) |= TC_MASK) 74 #define TC_CLR(packet) (*buffer_at((packet), 2) &= ~TC_MASK) 78 #define RD(packet) (*buffer_at((packet), 2) & RD_MASK) 79 #define RD_SET(packet) (*buffer_at((packet), 2) |= RD_MASK) 80 #define RD_CLR(packet) (*buffer_at((packet), 2) &= ~RD_MASK) 84 #define RA(packet) (*buffer_at((packet), 3) & RA_MASK) 85 #define RA_SET(packet) (*buffer_at((packet), 3) |= RA_MASK) 86 #define RA_CLR(packet) (*buffer_at((packet), 3) &= ~RA_MASK) 90 #define AD(packet) (*buffer_at((packet), 3) & AD_MASK) 91 #define AD_SET(packet) (*buffer_at((packet), 3) |= AD_MASK) 92 #define AD_CLR(packet) (*buffer_at((packet), 3) &= ~AD_MASK) 96 #define CD(packet) (*buffer_at((packet), 3) & CD_MASK) 97 #define CD_SET(packet) (*buffer_at((packet), 3) |= CD_MASK) 98 #define CD_CLR(packet) (*buffer_at((packet), 3) &= ~CD_MASK) 100 #define RCODE_MASK 0x0fU 101 #define RCODE_SHIFT 0 102 #define RCODE(packet) (*buffer_at((packet), 3) & RCODE_MASK) 103 #define RCODE_SET(packet, rcode) \ 104 (*buffer_at((packet), 3) = (*buffer_at((packet), 3) & ~RCODE_MASK) | (rcode)) 389 unsigned allow_pointers);
620 ldns_rr_class qclass);
665 static inline uint16_t
666 read_uint16(
const void *src)
668 #ifdef ALLOW_UNALIGNED_ACCESSES 669 return ntohs(* (uint16_t *) src);
671 uint8_t *p = (uint8_t *) src;
672 return (p[0] << 8) | p[1];
676 static inline uint32_t
677 read_uint32(
const void *src)
679 #ifdef ALLOW_UNALIGNED_ACCESSES 680 return ntohl(* (uint32_t *) src);
682 uint8_t *p = (uint8_t *) src;
683 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
688 write_uint16(
void *dst, uint16_t
data)
690 #ifdef ALLOW_UNALIGNED_ACCESSES 691 * (uint16_t *) dst = htons(data);
693 uint8_t *p = (uint8_t *) dst;
694 p[0] = (uint8_t) ((data >> 8) & 0xff);
695 p[1] = (uint8_t) (data & 0xff);
700 write_uint32(
void *dst, uint32_t data)
702 #ifdef ALLOW_UNALIGNED_ACCESSES 703 * (uint32_t *) dst = htonl(data);
705 uint8_t *p = (uint8_t *) dst;
706 p[0] = (uint8_t) ((data >> 24) & 0xff);
707 p[1] = (uint8_t) ((data >> 16) & 0xff);
708 p[2] = (uint8_t) ((data >> 8) & 0xff);
709 p[3] = (uint8_t) (data & 0xff);
uint8_t * buffer_end(buffer_type *buffer)
uint8_t * buffer_at(buffer_type *buffer, size_t at)
int buffer_pkt_cd(buffer_type *buffer)
int buffer_skip_dname(buffer_type *buffer)
uint16_t buffer_pkt_arcount(buffer_type *buffer)
uint16_t buffer_pkt_ancount(buffer_type *buffer)
ldns_pkt_rcode buffer_pkt_rcode(buffer_type *buffer)
int buffer_pkt_rd(buffer_type *buffer)
uint16_t buffer_pkt_qdcount(buffer_type *buffer)
uint8_t * buffer_current(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)
uint8_t buffer_read_u8(buffer_type *buffer)
void buffer_write(buffer_type *buffer, const void *data, size_t count)
uint16_t buffer_pkt_id(buffer_type *buffer)
int buffer_pkt_ad(buffer_type *buffer)
size_t buffer_remaining(buffer_type *buffer)
void buffer_pkt_query(buffer_type *buffer, ldns_rdf *qname, ldns_rr_type qtype, ldns_rr_class qclass)
void buffer_write_rdf(buffer_type *buffer, ldns_rdf *rdf)
void buffer_pkt_print(FILE *fd, buffer_type *buffer)
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
ldns_pkt_opcode buffer_pkt_opcode(buffer_type *buffer)
void buffer_pkt_set_flags(buffer_type *buffer, uint16_t flags)
size_t buffer_position(buffer_type *buffer)
void buffer_set_position(buffer_type *buffer, size_t pos)
void buffer_write_u8(buffer_type *buffer, uint8_t data)
void buffer_pkt_axfr(buffer_type *buffer, ldns_rdf *qname, ldns_rr_class qclass)
void buffer_set_limit(buffer_type *buffer, size_t limit)
void buffer_write_u16(buffer_type *buffer, uint16_t data)
int buffer_pkt_tc(buffer_type *buffer)
ods_lookup_table ods_rcode_str[]
int buffer_pkt_ra(buffer_type *buffer)
void buffer_write_u32(buffer_type *buffer, uint32_t data)
size_t buffer_capacity(buffer_type *buffer)
void buffer_pkt_notify(buffer_type *buffer, ldns_rdf *qname, ldns_rr_class qclass)
int buffer_skip_rr(buffer_type *buffer, unsigned qrr)
void buffer_flip(buffer_type *buffer)
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
size_t buffer_read_dname(buffer_type *buffer, uint8_t *dname, unsigned allow_pointers)
void buffer_pkt_set_aa(buffer_type *buffer)
void buffer_pkt_clear_qr(buffer_type *buffer)
int buffer_pkt_qr(buffer_type *buffer)
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
int buffer_write_rr(buffer_type *buffer, ldns_rr *rr)
void buffer_write_u16_at(buffer_type *buffer, size_t at, uint16_t data)
uint8_t * buffer_begin(buffer_type *buffer)
void buffer_rewind(buffer_type *buffer)
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
void buffer_create_from(buffer_type *buffer, void *data, size_t size)
void buffer_pkt_set_qr(buffer_type *buffer)
void buffer_cleanup(buffer_type *buffer, allocator_type *allocator)
uint16_t buffer_pkt_flags(buffer_type *buffer)
int buffer_available(buffer_type *buffer, size_t count)
void buffer_skip(buffer_type *buffer, ssize_t count)
void buffer_pkt_set_random_id(buffer_type *buffer)
uint16_t buffer_read_u16(buffer_type *buffer)
uint32_t buffer_read_u32(buffer_type *buffer)
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
buffer_type * buffer_create(allocator_type *allocator, size_t capacity)
void buffer_pkt_set_opcode(buffer_type *buffer, ldns_pkt_opcode opcode)
void buffer_clear(buffer_type *buffer)
size_t buffer_limit(buffer_type *buffer)