1*09a3aaf3SDag-Erling Smørgrav /* 2*09a3aaf3SDag-Erling Smørgrav * pkthdr.h - packet header from wire conversion routines 3*09a3aaf3SDag-Erling Smørgrav * 4*09a3aaf3SDag-Erling Smørgrav * a Net::DNS like library for C 5*09a3aaf3SDag-Erling Smørgrav * 6*09a3aaf3SDag-Erling Smørgrav * (c) NLnet Labs, 2005-2006 7*09a3aaf3SDag-Erling Smørgrav * 8*09a3aaf3SDag-Erling Smørgrav * See the file LICENSE for the license 9*09a3aaf3SDag-Erling Smørgrav */ 10*09a3aaf3SDag-Erling Smørgrav 11*09a3aaf3SDag-Erling Smørgrav /** 12*09a3aaf3SDag-Erling Smørgrav * \file 13*09a3aaf3SDag-Erling Smørgrav * 14*09a3aaf3SDag-Erling Smørgrav * Contains functions that translate dns data from the wire format (as sent 15*09a3aaf3SDag-Erling Smørgrav * by servers and clients) to the internal structures for the packet header. 16*09a3aaf3SDag-Erling Smørgrav */ 17*09a3aaf3SDag-Erling Smørgrav 18*09a3aaf3SDag-Erling Smørgrav #ifndef LDNS_PKTHDR_H 19*09a3aaf3SDag-Erling Smørgrav #define LDNS_PKTHDR_H 20*09a3aaf3SDag-Erling Smørgrav 21*09a3aaf3SDag-Erling Smørgrav #ifdef __cplusplus 22*09a3aaf3SDag-Erling Smørgrav extern "C" { 23*09a3aaf3SDag-Erling Smørgrav #endif 24*09a3aaf3SDag-Erling Smørgrav 25*09a3aaf3SDag-Erling Smørgrav /* The length of the header */ 26*09a3aaf3SDag-Erling Smørgrav #define LDNS_HEADER_SIZE 12 27*09a3aaf3SDag-Erling Smørgrav 28*09a3aaf3SDag-Erling Smørgrav /* First octet of flags */ 29*09a3aaf3SDag-Erling Smørgrav #define LDNS_RD_MASK 0x01U 30*09a3aaf3SDag-Erling Smørgrav #define LDNS_RD_SHIFT 0 31*09a3aaf3SDag-Erling Smørgrav #define LDNS_RD_WIRE(wirebuf) (*(wirebuf+2) & LDNS_RD_MASK) 32*09a3aaf3SDag-Erling Smørgrav #define LDNS_RD_SET(wirebuf) (*(wirebuf+2) |= LDNS_RD_MASK) 33*09a3aaf3SDag-Erling Smørgrav #define LDNS_RD_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_RD_MASK) 34*09a3aaf3SDag-Erling Smørgrav 35*09a3aaf3SDag-Erling Smørgrav #define LDNS_TC_MASK 0x02U 36*09a3aaf3SDag-Erling Smørgrav #define LDNS_TC_SHIFT 1 37*09a3aaf3SDag-Erling Smørgrav #define LDNS_TC_WIRE(wirebuf) (*(wirebuf+2) & LDNS_TC_MASK) 38*09a3aaf3SDag-Erling Smørgrav #define LDNS_TC_SET(wirebuf) (*(wirebuf+2) |= LDNS_TC_MASK) 39*09a3aaf3SDag-Erling Smørgrav #define LDNS_TC_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_TC_MASK) 40*09a3aaf3SDag-Erling Smørgrav 41*09a3aaf3SDag-Erling Smørgrav #define LDNS_AA_MASK 0x04U 42*09a3aaf3SDag-Erling Smørgrav #define LDNS_AA_SHIFT 2 43*09a3aaf3SDag-Erling Smørgrav #define LDNS_AA_WIRE(wirebuf) (*(wirebuf+2) & LDNS_AA_MASK) 44*09a3aaf3SDag-Erling Smørgrav #define LDNS_AA_SET(wirebuf) (*(wirebuf+2) |= LDNS_AA_MASK) 45*09a3aaf3SDag-Erling Smørgrav #define LDNS_AA_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_AA_MASK) 46*09a3aaf3SDag-Erling Smørgrav 47*09a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_MASK 0x78U 48*09a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_SHIFT 3 49*09a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_WIRE(wirebuf) ((*(wirebuf+2) & LDNS_OPCODE_MASK) >> LDNS_OPCODE_SHIFT) 50*09a3aaf3SDag-Erling Smørgrav #define LDNS_OPCODE_SET(wirebuf, opcode) \ 51*09a3aaf3SDag-Erling Smørgrav (*(wirebuf+2) = ((*(wirebuf+2)) & ~LDNS_OPCODE_MASK) | ((opcode) << LDNS_OPCODE_SHIFT)) 52*09a3aaf3SDag-Erling Smørgrav 53*09a3aaf3SDag-Erling Smørgrav #define LDNS_QR_MASK 0x80U 54*09a3aaf3SDag-Erling Smørgrav #define LDNS_QR_SHIFT 7 55*09a3aaf3SDag-Erling Smørgrav #define LDNS_QR_WIRE(wirebuf) (*(wirebuf+2) & LDNS_QR_MASK) 56*09a3aaf3SDag-Erling Smørgrav #define LDNS_QR_SET(wirebuf) (*(wirebuf+2) |= LDNS_QR_MASK) 57*09a3aaf3SDag-Erling Smørgrav #define LDNS_QR_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_QR_MASK) 58*09a3aaf3SDag-Erling Smørgrav 59*09a3aaf3SDag-Erling Smørgrav /* Second octet of flags */ 60*09a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_MASK 0x0fU 61*09a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_SHIFT 0 62*09a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RCODE_MASK) 63*09a3aaf3SDag-Erling Smørgrav #define LDNS_RCODE_SET(wirebuf, rcode) \ 64*09a3aaf3SDag-Erling Smørgrav (*(wirebuf+3) = ((*(wirebuf+3)) & ~LDNS_RCODE_MASK) | (rcode)) 65*09a3aaf3SDag-Erling Smørgrav 66*09a3aaf3SDag-Erling Smørgrav #define LDNS_CD_MASK 0x10U 67*09a3aaf3SDag-Erling Smørgrav #define LDNS_CD_SHIFT 4 68*09a3aaf3SDag-Erling Smørgrav #define LDNS_CD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_CD_MASK) 69*09a3aaf3SDag-Erling Smørgrav #define LDNS_CD_SET(wirebuf) (*(wirebuf+3) |= LDNS_CD_MASK) 70*09a3aaf3SDag-Erling Smørgrav #define LDNS_CD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_CD_MASK) 71*09a3aaf3SDag-Erling Smørgrav 72*09a3aaf3SDag-Erling Smørgrav #define LDNS_AD_MASK 0x20U 73*09a3aaf3SDag-Erling Smørgrav #define LDNS_AD_SHIFT 5 74*09a3aaf3SDag-Erling Smørgrav #define LDNS_AD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_AD_MASK) 75*09a3aaf3SDag-Erling Smørgrav #define LDNS_AD_SET(wirebuf) (*(wirebuf+3) |= LDNS_AD_MASK) 76*09a3aaf3SDag-Erling Smørgrav #define LDNS_AD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_AD_MASK) 77*09a3aaf3SDag-Erling Smørgrav 78*09a3aaf3SDag-Erling Smørgrav #define LDNS_Z_MASK 0x40U 79*09a3aaf3SDag-Erling Smørgrav #define LDNS_Z_SHIFT 6 80*09a3aaf3SDag-Erling Smørgrav #define LDNS_Z_WIRE(wirebuf) (*(wirebuf+3) & LDNS_Z_MASK) 81*09a3aaf3SDag-Erling Smørgrav #define LDNS_Z_SET(wirebuf) (*(wirebuf+3) |= LDNS_Z_MASK) 82*09a3aaf3SDag-Erling Smørgrav #define LDNS_Z_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_Z_MASK) 83*09a3aaf3SDag-Erling Smørgrav 84*09a3aaf3SDag-Erling Smørgrav #define LDNS_RA_MASK 0x80U 85*09a3aaf3SDag-Erling Smørgrav #define LDNS_RA_SHIFT 7 86*09a3aaf3SDag-Erling Smørgrav #define LDNS_RA_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RA_MASK) 87*09a3aaf3SDag-Erling Smørgrav #define LDNS_RA_SET(wirebuf) (*(wirebuf+3) |= LDNS_RA_MASK) 88*09a3aaf3SDag-Erling Smørgrav #define LDNS_RA_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_RA_MASK) 89*09a3aaf3SDag-Erling Smørgrav 90*09a3aaf3SDag-Erling Smørgrav /* Query ID */ 91*09a3aaf3SDag-Erling Smørgrav #define LDNS_ID_WIRE(wirebuf) (sldns_read_uint16(wirebuf)) 92*09a3aaf3SDag-Erling Smørgrav #define LDNS_ID_SET(wirebuf, id) (sldns_write_uint16(wirebuf, id)) 93*09a3aaf3SDag-Erling Smørgrav 94*09a3aaf3SDag-Erling Smørgrav /* Counter of the question section */ 95*09a3aaf3SDag-Erling Smørgrav #define LDNS_QDCOUNT_OFF 4 96*09a3aaf3SDag-Erling Smørgrav /* 97*09a3aaf3SDag-Erling Smørgrav #define QDCOUNT(wirebuf) (ntohs(*(uint16_t *)(wirebuf+QDCOUNT_OFF))) 98*09a3aaf3SDag-Erling Smørgrav */ 99*09a3aaf3SDag-Erling Smørgrav #define LDNS_QDCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_QDCOUNT_OFF)) 100*09a3aaf3SDag-Erling Smørgrav 101*09a3aaf3SDag-Erling Smørgrav /* Counter of the answer section */ 102*09a3aaf3SDag-Erling Smørgrav #define LDNS_ANCOUNT_OFF 6 103*09a3aaf3SDag-Erling Smørgrav #define LDNS_ANCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_ANCOUNT_OFF)) 104*09a3aaf3SDag-Erling Smørgrav 105*09a3aaf3SDag-Erling Smørgrav /* Counter of the authority section */ 106*09a3aaf3SDag-Erling Smørgrav #define LDNS_NSCOUNT_OFF 8 107*09a3aaf3SDag-Erling Smørgrav #define LDNS_NSCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_NSCOUNT_OFF)) 108*09a3aaf3SDag-Erling Smørgrav 109*09a3aaf3SDag-Erling Smørgrav /* Counter of the additional section */ 110*09a3aaf3SDag-Erling Smørgrav #define LDNS_ARCOUNT_OFF 10 111*09a3aaf3SDag-Erling Smørgrav #define LDNS_ARCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_ARCOUNT_OFF)) 112*09a3aaf3SDag-Erling Smørgrav 113*09a3aaf3SDag-Erling Smørgrav /** 114*09a3aaf3SDag-Erling Smørgrav * The sections of a packet 115*09a3aaf3SDag-Erling Smørgrav */ 116*09a3aaf3SDag-Erling Smørgrav enum sldns_enum_pkt_section { 117*09a3aaf3SDag-Erling Smørgrav LDNS_SECTION_QUESTION = 0, 118*09a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ANSWER = 1, 119*09a3aaf3SDag-Erling Smørgrav LDNS_SECTION_AUTHORITY = 2, 120*09a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ADDITIONAL = 3, 121*09a3aaf3SDag-Erling Smørgrav /** bogus section, if not interested */ 122*09a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ANY = 4, 123*09a3aaf3SDag-Erling Smørgrav /** used to get all non-question rrs from a packet */ 124*09a3aaf3SDag-Erling Smørgrav LDNS_SECTION_ANY_NOQUESTION = 5 125*09a3aaf3SDag-Erling Smørgrav }; 126*09a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_pkt_section sldns_pkt_section; 127*09a3aaf3SDag-Erling Smørgrav 128*09a3aaf3SDag-Erling Smørgrav /* opcodes for pkt's */ 129*09a3aaf3SDag-Erling Smørgrav enum sldns_enum_pkt_opcode { 130*09a3aaf3SDag-Erling Smørgrav LDNS_PACKET_QUERY = 0, 131*09a3aaf3SDag-Erling Smørgrav LDNS_PACKET_IQUERY = 1, 132*09a3aaf3SDag-Erling Smørgrav LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */ 133*09a3aaf3SDag-Erling Smørgrav LDNS_PACKET_NOTIFY = 4, 134*09a3aaf3SDag-Erling Smørgrav LDNS_PACKET_UPDATE = 5 135*09a3aaf3SDag-Erling Smørgrav }; 136*09a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_pkt_opcode sldns_pkt_opcode; 137*09a3aaf3SDag-Erling Smørgrav 138*09a3aaf3SDag-Erling Smørgrav /* rcodes for pkts */ 139*09a3aaf3SDag-Erling Smørgrav enum sldns_enum_pkt_rcode { 140*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOERROR = 0, 141*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_FORMERR = 1, 142*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_SERVFAIL = 2, 143*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NXDOMAIN = 3, 144*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOTIMPL = 4, 145*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_REFUSED = 5, 146*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_YXDOMAIN = 6, 147*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_YXRRSET = 7, 148*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NXRRSET = 8, 149*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOTAUTH = 9, 150*09a3aaf3SDag-Erling Smørgrav LDNS_RCODE_NOTZONE = 10 151*09a3aaf3SDag-Erling Smørgrav }; 152*09a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_pkt_rcode sldns_pkt_rcode; 153*09a3aaf3SDag-Erling Smørgrav 154*09a3aaf3SDag-Erling Smørgrav #ifdef __cplusplus 155*09a3aaf3SDag-Erling Smørgrav } 156*09a3aaf3SDag-Erling Smørgrav #endif 157*09a3aaf3SDag-Erling Smørgrav 158*09a3aaf3SDag-Erling Smørgrav #endif /* LDNS_PKTHDR_H */ 159