1825eb42bSJan Lentfer /* 2825eb42bSJan Lentfer * wire2host.h - from wire conversion routines 3825eb42bSJan Lentfer * 4825eb42bSJan Lentfer * a Net::DNS like library for C 5825eb42bSJan Lentfer * 6825eb42bSJan Lentfer * (c) NLnet Labs, 2005-2006 7825eb42bSJan Lentfer * 8825eb42bSJan Lentfer * See the file LICENSE for the license 9825eb42bSJan Lentfer */ 10825eb42bSJan Lentfer 11825eb42bSJan Lentfer /** 12825eb42bSJan Lentfer * \file 13825eb42bSJan Lentfer * 14825eb42bSJan Lentfer * Contains functions that translate dns data from the wire format (as sent 15825eb42bSJan Lentfer * by servers and clients) to the internal structures. 16825eb42bSJan Lentfer */ 17825eb42bSJan Lentfer 18825eb42bSJan Lentfer #ifndef LDNS_WIRE2HOST_H 19825eb42bSJan Lentfer #define LDNS_WIRE2HOST_H 20825eb42bSJan Lentfer 21825eb42bSJan Lentfer #include <ldns/rdata.h> 22825eb42bSJan Lentfer #include <ldns/common.h> 23825eb42bSJan Lentfer #include <ldns/error.h> 24825eb42bSJan Lentfer #include <ldns/rr.h> 25825eb42bSJan Lentfer #include <ldns/packet.h> 26825eb42bSJan Lentfer 27ac996e71SJan Lentfer #ifdef __cplusplus 28ac996e71SJan Lentfer extern "C" { 29ac996e71SJan Lentfer #endif 30ac996e71SJan Lentfer 31825eb42bSJan Lentfer /* The length of the header */ 32825eb42bSJan Lentfer #define LDNS_HEADER_SIZE 12 33825eb42bSJan Lentfer 34825eb42bSJan Lentfer /* First octet of flags */ 35825eb42bSJan Lentfer #define LDNS_RD_MASK 0x01U 36825eb42bSJan Lentfer #define LDNS_RD_SHIFT 0 37825eb42bSJan Lentfer #define LDNS_RD_WIRE(wirebuf) (*(wirebuf+2) & LDNS_RD_MASK) 38825eb42bSJan Lentfer #define LDNS_RD_SET(wirebuf) (*(wirebuf+2) |= LDNS_RD_MASK) 39825eb42bSJan Lentfer #define LDNS_RD_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_RD_MASK) 40825eb42bSJan Lentfer 41825eb42bSJan Lentfer #define LDNS_TC_MASK 0x02U 42825eb42bSJan Lentfer #define LDNS_TC_SHIFT 1 43825eb42bSJan Lentfer #define LDNS_TC_WIRE(wirebuf) (*(wirebuf+2) & LDNS_TC_MASK) 44825eb42bSJan Lentfer #define LDNS_TC_SET(wirebuf) (*(wirebuf+2) |= LDNS_TC_MASK) 45825eb42bSJan Lentfer #define LDNS_TC_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_TC_MASK) 46825eb42bSJan Lentfer 47825eb42bSJan Lentfer #define LDNS_AA_MASK 0x04U 48825eb42bSJan Lentfer #define LDNS_AA_SHIFT 2 49825eb42bSJan Lentfer #define LDNS_AA_WIRE(wirebuf) (*(wirebuf+2) & LDNS_AA_MASK) 50825eb42bSJan Lentfer #define LDNS_AA_SET(wirebuf) (*(wirebuf+2) |= LDNS_AA_MASK) 51825eb42bSJan Lentfer #define LDNS_AA_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_AA_MASK) 52825eb42bSJan Lentfer 53825eb42bSJan Lentfer #define LDNS_OPCODE_MASK 0x78U 54825eb42bSJan Lentfer #define LDNS_OPCODE_SHIFT 3 55825eb42bSJan Lentfer #define LDNS_OPCODE_WIRE(wirebuf) ((*(wirebuf+2) & LDNS_OPCODE_MASK) >> LDNS_OPCODE_SHIFT) 56825eb42bSJan Lentfer #define LDNS_OPCODE_SET(wirebuf, opcode) \ 57825eb42bSJan Lentfer (*(wirebuf+2) = ((*(wirebuf+2)) & ~LDNS_OPCODE_MASK) | ((opcode) << LDNS_OPCODE_SHIFT)) 58825eb42bSJan Lentfer 59825eb42bSJan Lentfer #define LDNS_QR_MASK 0x80U 60825eb42bSJan Lentfer #define LDNS_QR_SHIFT 7 61825eb42bSJan Lentfer #define LDNS_QR_WIRE(wirebuf) (*(wirebuf+2) & LDNS_QR_MASK) 62825eb42bSJan Lentfer #define LDNS_QR_SET(wirebuf) (*(wirebuf+2) |= LDNS_QR_MASK) 63825eb42bSJan Lentfer #define LDNS_QR_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_QR_MASK) 64825eb42bSJan Lentfer 65825eb42bSJan Lentfer /* Second octet of flags */ 66825eb42bSJan Lentfer #define LDNS_RCODE_MASK 0x0fU 67825eb42bSJan Lentfer #define LDNS_RCODE_SHIFT 0 68825eb42bSJan Lentfer #define LDNS_RCODE_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RCODE_MASK) 69825eb42bSJan Lentfer #define LDNS_RCODE_SET(wirebuf, rcode) \ 70825eb42bSJan Lentfer (*(wirebuf+3) = ((*(wirebuf+3)) & ~LDNS_RCODE_MASK) | (rcode)) 71825eb42bSJan Lentfer 72825eb42bSJan Lentfer #define LDNS_CD_MASK 0x10U 73825eb42bSJan Lentfer #define LDNS_CD_SHIFT 4 74825eb42bSJan Lentfer #define LDNS_CD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_CD_MASK) 75825eb42bSJan Lentfer #define LDNS_CD_SET(wirebuf) (*(wirebuf+3) |= LDNS_CD_MASK) 76825eb42bSJan Lentfer #define LDNS_CD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_CD_MASK) 77825eb42bSJan Lentfer 78825eb42bSJan Lentfer #define LDNS_AD_MASK 0x20U 79825eb42bSJan Lentfer #define LDNS_AD_SHIFT 5 80825eb42bSJan Lentfer #define LDNS_AD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_AD_MASK) 81825eb42bSJan Lentfer #define LDNS_AD_SET(wirebuf) (*(wirebuf+3) |= LDNS_AD_MASK) 82825eb42bSJan Lentfer #define LDNS_AD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_AD_MASK) 83825eb42bSJan Lentfer 84825eb42bSJan Lentfer #define LDNS_Z_MASK 0x40U 85825eb42bSJan Lentfer #define LDNS_Z_SHIFT 6 86825eb42bSJan Lentfer #define LDNS_Z_WIRE(wirebuf) (*(wirebuf+3) & LDNS_Z_MASK) 87825eb42bSJan Lentfer #define LDNS_Z_SET(wirebuf) (*(wirebuf+3) |= LDNS_Z_MASK) 88825eb42bSJan Lentfer #define LDNS_Z_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_Z_MASK) 89825eb42bSJan Lentfer 90825eb42bSJan Lentfer #define LDNS_RA_MASK 0x80U 91825eb42bSJan Lentfer #define LDNS_RA_SHIFT 7 92825eb42bSJan Lentfer #define LDNS_RA_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RA_MASK) 93825eb42bSJan Lentfer #define LDNS_RA_SET(wirebuf) (*(wirebuf+3) |= LDNS_RA_MASK) 94825eb42bSJan Lentfer #define LDNS_RA_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_RA_MASK) 95825eb42bSJan Lentfer 96825eb42bSJan Lentfer /* Query ID */ 97825eb42bSJan Lentfer #define LDNS_ID_WIRE(wirebuf) (ldns_read_uint16(wirebuf)) 98825eb42bSJan Lentfer #define LDNS_ID_SET(wirebuf, id) (ldns_write_uint16(wirebuf, id)) 99825eb42bSJan Lentfer 100825eb42bSJan Lentfer /* Counter of the question section */ 101825eb42bSJan Lentfer #define LDNS_QDCOUNT_OFF 4 102825eb42bSJan Lentfer #define LDNS_QDCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_QDCOUNT_OFF)) 103825eb42bSJan Lentfer 104825eb42bSJan Lentfer /* Counter of the answer section */ 105825eb42bSJan Lentfer #define LDNS_ANCOUNT_OFF 6 106825eb42bSJan Lentfer #define LDNS_ANCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_ANCOUNT_OFF)) 107825eb42bSJan Lentfer 108825eb42bSJan Lentfer /* Counter of the authority section */ 109825eb42bSJan Lentfer #define LDNS_NSCOUNT_OFF 8 110825eb42bSJan Lentfer #define LDNS_NSCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_NSCOUNT_OFF)) 111825eb42bSJan Lentfer 112825eb42bSJan Lentfer /* Counter of the additional section */ 113825eb42bSJan Lentfer #define LDNS_ARCOUNT_OFF 10 114825eb42bSJan Lentfer #define LDNS_ARCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_ARCOUNT_OFF)) 115825eb42bSJan Lentfer 116825eb42bSJan Lentfer /** 117825eb42bSJan Lentfer * converts the data on the uint8_t bytearray (in wire format) to a DNS packet. 118825eb42bSJan Lentfer * This function will initialize and allocate memory space for the packet 119825eb42bSJan Lentfer * structure. 120825eb42bSJan Lentfer * 121*ee791febSAntonio Huete Jimenez * \param[out] packet pointer to the structure to hold the packet 122825eb42bSJan Lentfer * \param[in] data pointer to the buffer with the data 123825eb42bSJan Lentfer * \param[in] len the length of the data buffer (in bytes) 124825eb42bSJan Lentfer * \return LDNS_STATUS_OK if everything succeeds, error otherwise 125825eb42bSJan Lentfer */ 126825eb42bSJan Lentfer ldns_status ldns_wire2pkt(ldns_pkt **packet, const uint8_t *data, size_t len); 127825eb42bSJan Lentfer 128825eb42bSJan Lentfer /** 1295340022aSzrj * converts the data in the ldns_buffer (in wire format) to a DNS packet. 130825eb42bSJan Lentfer * This function will initialize and allocate memory space for the packet 131825eb42bSJan Lentfer * structure. 132825eb42bSJan Lentfer * 133*ee791febSAntonio Huete Jimenez * \param[out] packet pointer to the structure to hold the packet 134825eb42bSJan Lentfer * \param[in] buffer the buffer with the data 135825eb42bSJan Lentfer * \return LDNS_STATUS_OK if everything succeeds, error otherwise 136825eb42bSJan Lentfer */ 1375340022aSzrj ldns_status ldns_buffer2pkt_wire(ldns_pkt **packet, const ldns_buffer *buffer); 138825eb42bSJan Lentfer 139825eb42bSJan Lentfer /** 140825eb42bSJan Lentfer * converts the data on the uint8_t bytearray (in wire format) to a DNS 141825eb42bSJan Lentfer * dname rdata field. This function will initialize and allocate memory 142825eb42bSJan Lentfer * space for the dname structure. The length of the wiredata of this rdf 143825eb42bSJan Lentfer * is added to the *pos value. 144825eb42bSJan Lentfer * 145*ee791febSAntonio Huete Jimenez * \param[out] dname pointer to the structure to hold the rdata value 146825eb42bSJan Lentfer * \param[in] wire pointer to the buffer with the data 147825eb42bSJan Lentfer * \param[in] max the length of the data buffer (in bytes) 148825eb42bSJan Lentfer * \param[in] pos the position of the rdf in the buffer (ie. the number of bytes 149825eb42bSJan Lentfer * from the start of the buffer) 150825eb42bSJan Lentfer * \return LDNS_STATUS_OK if everything succeeds, error otherwise 151825eb42bSJan Lentfer */ 152825eb42bSJan Lentfer ldns_status ldns_wire2dname(ldns_rdf **dname, const uint8_t *wire, size_t max, size_t *pos); 153825eb42bSJan Lentfer 154825eb42bSJan Lentfer /** 155825eb42bSJan Lentfer * converts the data on the uint8_t bytearray (in wire format) to DNS 156825eb42bSJan Lentfer * rdata fields, and adds them to the list of rdfs of the given rr. 157825eb42bSJan Lentfer * This function will initialize and allocate memory space for the dname 158825eb42bSJan Lentfer * structures. 159825eb42bSJan Lentfer * The length of the wiredata of these rdfs is added to the *pos value. 160825eb42bSJan Lentfer * 161825eb42bSJan Lentfer * All rdfs belonging to the RR are read; the rr should have no rdfs 162825eb42bSJan Lentfer * yet. An error is returned if the format cannot be parsed. 163825eb42bSJan Lentfer * 164825eb42bSJan Lentfer * \param[in] rr pointer to the ldns_rr structure to hold the rdata value 165825eb42bSJan Lentfer * \param[in] wire pointer to the buffer with the data 166825eb42bSJan Lentfer * \param[in] max the length of the data buffer (in bytes) 167825eb42bSJan Lentfer * \param[in] pos the position of the rdf in the buffer (ie. the number of bytes 168825eb42bSJan Lentfer * from the start of the buffer) 169825eb42bSJan Lentfer * \return LDNS_STATUS_OK if everything succeeds, error otherwise 170825eb42bSJan Lentfer */ 171825eb42bSJan Lentfer ldns_status ldns_wire2rdf(ldns_rr *rr, const uint8_t *wire, size_t max, size_t *pos); 172825eb42bSJan Lentfer 173825eb42bSJan Lentfer /** 174825eb42bSJan Lentfer * converts the data on the uint8_t bytearray (in wire format) to a DNS 175825eb42bSJan Lentfer * resource record. 176825eb42bSJan Lentfer * This function will initialize and allocate memory space for the rr 177825eb42bSJan Lentfer * structure. 178825eb42bSJan Lentfer * The length of the wiredata of this rr is added to the *pos value. 179825eb42bSJan Lentfer * 180*ee791febSAntonio Huete Jimenez * \param[out] rr pointer to the structure to hold the rdata value 181825eb42bSJan Lentfer * \param[in] wire pointer to the buffer with the data 182825eb42bSJan Lentfer * \param[in] max the length of the data buffer (in bytes) 183825eb42bSJan Lentfer * \param[in] pos the position of the rr in the buffer (ie. the number of bytes 184825eb42bSJan Lentfer * from the start of the buffer) 185825eb42bSJan Lentfer * \param[in] section the section in the packet the rr is meant for 186825eb42bSJan Lentfer * \return LDNS_STATUS_OK if everything succeeds, error otherwise 187825eb42bSJan Lentfer */ 188825eb42bSJan Lentfer ldns_status ldns_wire2rr(ldns_rr **rr, const uint8_t *wire, size_t max, size_t *pos, ldns_pkt_section section); 189825eb42bSJan Lentfer 190ac996e71SJan Lentfer #ifdef __cplusplus 191ac996e71SJan Lentfer } 192ac996e71SJan Lentfer #endif 193ac996e71SJan Lentfer 194825eb42bSJan Lentfer #endif /* LDNS_WIRE2HOST_H */ 195