xref: /dragonfly/contrib/ldns/ldns/wire2host.h (revision ee791feb)
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