xref: /freebsd/contrib/unbound/sldns/pkthdr.h (revision a39a5a6905612447def27b66ffe73b9d11efd80c)
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