109a3aaf3SDag-Erling Smørgrav /* 209a3aaf3SDag-Erling Smørgrav * pkthdr.h - packet header from wire conversion routines 309a3aaf3SDag-Erling Smørgrav * 409a3aaf3SDag-Erling Smørgrav * a Net::DNS like library for C 509a3aaf3SDag-Erling Smørgrav * 609a3aaf3SDag-Erling Smørgrav * (c) NLnet Labs, 2005-2006 709a3aaf3SDag-Erling Smørgrav * 809a3aaf3SDag-Erling Smørgrav * See the file LICENSE for the license 909a3aaf3SDag-Erling Smørgrav */ 1009a3aaf3SDag-Erling Smørgrav 1109a3aaf3SDag-Erling Smørgrav /** 1209a3aaf3SDag-Erling Smørgrav * \file 1309a3aaf3SDag-Erling Smørgrav * 1409a3aaf3SDag-Erling Smørgrav * Contains functions that translate dns data from the wire format (as sent 1509a3aaf3SDag-Erling Smørgrav * by servers and clients) to the internal structures for the packet header. 1609a3aaf3SDag-Erling Smørgrav */ 1709a3aaf3SDag-Erling Smørgrav 1809a3aaf3SDag-Erling Smørgrav #ifndef LDNS_PKTHDR_H 1909a3aaf3SDag-Erling Smørgrav #define LDNS_PKTHDR_H 2009a3aaf3SDag-Erling Smørgrav 2109a3aaf3SDag-Erling Smørgrav #ifdef __cplusplus 2209a3aaf3SDag-Erling Smørgrav extern "C" { 2309a3aaf3SDag-Erling Smørgrav #endif 2409a3aaf3SDag-Erling Smørgrav 2509a3aaf3SDag-Erling Smørgrav /* The length of the header */ 2609a3aaf3SDag-Erling Smørgrav #define LDNS_HEADER_SIZE 12 2709a3aaf3SDag-Erling Smørgrav 2809a3aaf3SDag-Erling Smørgrav /* First octet of flags */ 2909a3aaf3SDag-Erling Smørgrav #define LDNS_RD_MASK 0x01U 3009a3aaf3SDag-Erling Smørgrav #define LDNS_RD_SHIFT 0 3109a3aaf3SDag-Erling Smørgrav #define LDNS_RD_WIRE(wirebuf) (*(wirebuf+2) & LDNS_RD_MASK) 3209a3aaf3SDag-Erling Smørgrav #define LDNS_RD_SET(wirebuf) (*(wirebuf+2) |= LDNS_RD_MASK) 3309a3aaf3SDag-Erling Smørgrav #define LDNS_RD_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_RD_MASK) 3409a3aaf3SDag-Erling Smørgrav 3509a3aaf3SDag-Erling Smørgrav #define LDNS_TC_MASK 0x02U 3609a3aaf3SDag-Erling Smørgrav #define LDNS_TC_SHIFT 1 3709a3aaf3SDag-Erling Smørgrav #define LDNS_TC_WIRE(wirebuf) (*(wirebuf+2) & LDNS_TC_MASK) 3809a3aaf3SDag-Erling Smørgrav #define LDNS_TC_SET(wirebuf) (*(wirebuf+2) |= LDNS_TC_MASK) 3909a3aaf3SDag-Erling Smørgrav #define LDNS_TC_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_TC_MASK) 4009a3aaf3SDag-Erling Smørgrav 4109a3aaf3SDag-Erling Smørgrav #define LDNS_AA_MASK 0x04U 4209a3aaf3SDag-Erling Smørgrav #define LDNS_AA_SHIFT 2 4309a3aaf3SDag-Erling Smørgrav #define LDNS_AA_WIRE(wirebuf) (*(wirebuf+2) & LDNS_AA_MASK) 4409a3aaf3SDag-Erling Smørgrav #define LDNS_AA_SET(wirebuf) (*(wirebuf+2) |= LDNS_AA_MASK) 4509a3aaf3SDag-Erling Smørgrav #define LDNS_AA_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_AA_MASK) 4609a3aaf3SDag-Erling Smørgrav 4709a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_MASK 0x78U 4809a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_SHIFT 3 4909a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_WIRE(wirebuf) ((*(wirebuf+2) & LDNS_OPCODE_MASK) >> LDNS_OPCODE_SHIFT) 5009a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_SET(wirebuf, opcode) \ 5109a3aaf3SDag-Erling Smørgrav (*(wirebuf+2) = ((*(wirebuf+2)) & ~LDNS_OPCODE_MASK) | ((opcode) << LDNS_OPCODE_SHIFT)) 5209a3aaf3SDag-Erling Smørgrav 5309a3aaf3SDag-Erling Smørgrav #define LDNS_QR_MASK 0x80U 5409a3aaf3SDag-Erling Smørgrav #define LDNS_QR_SHIFT 7 5509a3aaf3SDag-Erling Smørgrav #define LDNS_QR_WIRE(wirebuf) (*(wirebuf+2) & LDNS_QR_MASK) 5609a3aaf3SDag-Erling Smørgrav #define LDNS_QR_SET(wirebuf) (*(wirebuf+2) |= LDNS_QR_MASK) 5709a3aaf3SDag-Erling Smørgrav #define LDNS_QR_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_QR_MASK) 5809a3aaf3SDag-Erling Smørgrav 5909a3aaf3SDag-Erling Smørgrav /* Second octet of flags */ 6009a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_MASK 0x0fU 6109a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_SHIFT 0 6209a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RCODE_MASK) 6309a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_SET(wirebuf, rcode) \ 6409a3aaf3SDag-Erling Smørgrav (*(wirebuf+3) = ((*(wirebuf+3)) & ~LDNS_RCODE_MASK) | (rcode)) 6509a3aaf3SDag-Erling Smørgrav 6609a3aaf3SDag-Erling Smørgrav #define LDNS_CD_MASK 0x10U 6709a3aaf3SDag-Erling Smørgrav #define LDNS_CD_SHIFT 4 6809a3aaf3SDag-Erling Smørgrav #define LDNS_CD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_CD_MASK) 6909a3aaf3SDag-Erling Smørgrav #define LDNS_CD_SET(wirebuf) (*(wirebuf+3) |= LDNS_CD_MASK) 7009a3aaf3SDag-Erling Smørgrav #define LDNS_CD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_CD_MASK) 7109a3aaf3SDag-Erling Smørgrav 7209a3aaf3SDag-Erling Smørgrav #define LDNS_AD_MASK 0x20U 7309a3aaf3SDag-Erling Smørgrav #define LDNS_AD_SHIFT 5 7409a3aaf3SDag-Erling Smørgrav #define LDNS_AD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_AD_MASK) 7509a3aaf3SDag-Erling Smørgrav #define LDNS_AD_SET(wirebuf) (*(wirebuf+3) |= LDNS_AD_MASK) 7609a3aaf3SDag-Erling Smørgrav #define LDNS_AD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_AD_MASK) 7709a3aaf3SDag-Erling Smørgrav 7809a3aaf3SDag-Erling Smørgrav #define LDNS_Z_MASK 0x40U 7909a3aaf3SDag-Erling Smørgrav #define LDNS_Z_SHIFT 6 8009a3aaf3SDag-Erling Smørgrav #define LDNS_Z_WIRE(wirebuf) (*(wirebuf+3) & LDNS_Z_MASK) 8109a3aaf3SDag-Erling Smørgrav #define LDNS_Z_SET(wirebuf) (*(wirebuf+3) |= LDNS_Z_MASK) 8209a3aaf3SDag-Erling Smørgrav #define LDNS_Z_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_Z_MASK) 8309a3aaf3SDag-Erling Smørgrav 8409a3aaf3SDag-Erling Smørgrav #define LDNS_RA_MASK 0x80U 8509a3aaf3SDag-Erling Smørgrav #define LDNS_RA_SHIFT 7 8609a3aaf3SDag-Erling Smørgrav #define LDNS_RA_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RA_MASK) 8709a3aaf3SDag-Erling Smørgrav #define LDNS_RA_SET(wirebuf) (*(wirebuf+3) |= LDNS_RA_MASK) 8809a3aaf3SDag-Erling Smørgrav #define LDNS_RA_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_RA_MASK) 8909a3aaf3SDag-Erling Smørgrav 9009a3aaf3SDag-Erling Smørgrav /* Query ID */ 9109a3aaf3SDag-Erling Smørgrav #define LDNS_ID_WIRE(wirebuf) (sldns_read_uint16(wirebuf)) 9209a3aaf3SDag-Erling Smørgrav #define LDNS_ID_SET(wirebuf, id) (sldns_write_uint16(wirebuf, id)) 9309a3aaf3SDag-Erling Smørgrav 9409a3aaf3SDag-Erling Smørgrav /* Counter of the question section */ 9509a3aaf3SDag-Erling Smørgrav #define LDNS_QDCOUNT_OFF 4 9609a3aaf3SDag-Erling Smørgrav /* 9709a3aaf3SDag-Erling Smørgrav #define QDCOUNT(wirebuf) (ntohs(*(uint16_t *)(wirebuf+QDCOUNT_OFF))) 9809a3aaf3SDag-Erling Smørgrav */ 9909a3aaf3SDag-Erling Smørgrav #define LDNS_QDCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_QDCOUNT_OFF)) 100*a39a5a69SCy Schubert #define LDNS_QDCOUNT_SET(wirebuf, i) (sldns_write_uint16(wirebuf+LDNS_QDCOUNT_OFF, i)) 10109a3aaf3SDag-Erling Smørgrav 10209a3aaf3SDag-Erling Smørgrav /* Counter of the answer section */ 10309a3aaf3SDag-Erling Smørgrav #define LDNS_ANCOUNT_OFF 6 10409a3aaf3SDag-Erling Smørgrav #define LDNS_ANCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_ANCOUNT_OFF)) 105*a39a5a69SCy Schubert #define LDNS_ANCOUNT_SET(wirebuf, i) (sldns_write_uint16(wirebuf+LDNS_ANCOUNT_OFF, i)) 10609a3aaf3SDag-Erling Smørgrav 10709a3aaf3SDag-Erling Smørgrav /* Counter of the authority section */ 10809a3aaf3SDag-Erling Smørgrav #define LDNS_NSCOUNT_OFF 8 10909a3aaf3SDag-Erling Smørgrav #define LDNS_NSCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_NSCOUNT_OFF)) 110*a39a5a69SCy Schubert #define LDNS_NSCOUNT_SET(wirebuf, i) (sldns_write_uint16(wirebuf+LDNS_NSCOUNT_OFF, i)) 11109a3aaf3SDag-Erling Smørgrav 11209a3aaf3SDag-Erling Smørgrav /* Counter of the additional section */ 11309a3aaf3SDag-Erling Smørgrav #define LDNS_ARCOUNT_OFF 10 11409a3aaf3SDag-Erling Smørgrav #define LDNS_ARCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_ARCOUNT_OFF)) 115*a39a5a69SCy Schubert #define LDNS_ARCOUNT_SET(wirebuf, i) (sldns_write_uint16(wirebuf+LDNS_ARCOUNT_OFF, i)) 11609a3aaf3SDag-Erling Smørgrav 11709a3aaf3SDag-Erling Smørgrav /** 11809a3aaf3SDag-Erling Smørgrav * The sections of a packet 11909a3aaf3SDag-Erling Smørgrav */ 12009a3aaf3SDag-Erling Smørgrav enum sldns_enum_pkt_section { 12109a3aaf3SDag-Erling Smørgrav LDNS_SECTION_QUESTION = 0, 12209a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ANSWER = 1, 12309a3aaf3SDag-Erling Smørgrav LDNS_SECTION_AUTHORITY = 2, 12409a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ADDITIONAL = 3, 12509a3aaf3SDag-Erling Smørgrav /** bogus section, if not interested */ 12609a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ANY = 4, 12709a3aaf3SDag-Erling Smørgrav /** used to get all non-question rrs from a packet */ 12809a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ANY_NOQUESTION = 5 12909a3aaf3SDag-Erling Smørgrav }; 13009a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_pkt_section sldns_pkt_section; 13109a3aaf3SDag-Erling Smørgrav 13209a3aaf3SDag-Erling Smørgrav /* opcodes for pkt's */ 13309a3aaf3SDag-Erling Smørgrav enum sldns_enum_pkt_opcode { 13409a3aaf3SDag-Erling Smørgrav LDNS_PACKET_QUERY = 0, 13509a3aaf3SDag-Erling Smørgrav LDNS_PACKET_IQUERY = 1, 13609a3aaf3SDag-Erling Smørgrav LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */ 13709a3aaf3SDag-Erling Smørgrav LDNS_PACKET_NOTIFY = 4, 13809a3aaf3SDag-Erling Smørgrav LDNS_PACKET_UPDATE = 5 13909a3aaf3SDag-Erling Smørgrav }; 14009a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_pkt_opcode sldns_pkt_opcode; 14109a3aaf3SDag-Erling Smørgrav 14209a3aaf3SDag-Erling Smørgrav /* rcodes for pkts */ 14309a3aaf3SDag-Erling Smørgrav enum sldns_enum_pkt_rcode { 14409a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOERROR = 0, 14509a3aaf3SDag-Erling Smørgrav LDNS_RCODE_FORMERR = 1, 14609a3aaf3SDag-Erling Smørgrav LDNS_RCODE_SERVFAIL = 2, 14709a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NXDOMAIN = 3, 14809a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOTIMPL = 4, 14909a3aaf3SDag-Erling Smørgrav LDNS_RCODE_REFUSED = 5, 15009a3aaf3SDag-Erling Smørgrav LDNS_RCODE_YXDOMAIN = 6, 15109a3aaf3SDag-Erling Smørgrav LDNS_RCODE_YXRRSET = 7, 15209a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NXRRSET = 8, 15309a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOTAUTH = 9, 15409a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOTZONE = 10 15509a3aaf3SDag-Erling Smørgrav }; 15609a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_pkt_rcode sldns_pkt_rcode; 15709a3aaf3SDag-Erling Smørgrav 15809a3aaf3SDag-Erling Smørgrav #ifdef __cplusplus 15909a3aaf3SDag-Erling Smørgrav } 16009a3aaf3SDag-Erling Smørgrav #endif 16109a3aaf3SDag-Erling Smørgrav 16209a3aaf3SDag-Erling Smørgrav #endif /* LDNS_PKTHDR_H */ 163