• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GPXE_DNS_H
2 #define _GPXE_DNS_H
3 
4 /** @file
5  *
6  * DNS protocol
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER );
11 
12 #include <stdint.h>
13 #include <gpxe/in.h>
14 
15 /*
16  * Constants
17  *
18  */
19 
20 #define DNS_TYPE_A		1
21 #define DNS_TYPE_CNAME		5
22 #define DNS_TYPE_ANY		255
23 
24 #define DNS_CLASS_IN		1
25 #define DNS_CLASS_CS		2
26 #define DNS_CLASS_CH		3
27 #define DNS_CLASS_HS		4
28 
29 #define DNS_FLAG_QUERY		( 0x00 << 15 )
30 #define DNS_FLAG_RESPONSE	( 0x01 << 15 )
31 #define DNS_FLAG_QR(flags)	( (flags) & ( 0x01 << 15 ) )
32 #define DNS_FLAG_OPCODE_QUERY	( 0x00 << 11 )
33 #define DNS_FLAG_OPCODE_IQUERY	( 0x01 << 11 )
34 #define DNS_FLAG_OPCODE_STATUS	( 0x02 << 11 )
35 #define DNS_FLAG_OPCODE(flags)	( (flags) & ( 0x0f << 11 ) )
36 #define DNS_FLAG_RD		( 0x01 << 8 )
37 #define DNS_FLAG_RA		( 0x01 << 7 )
38 #define DNS_FLAG_RCODE_OK	( 0x00 << 0 )
39 #define DNS_FLAG_RCODE_NX	( 0x03 << 0 )
40 #define DNS_FLAG_RCODE(flags)	( (flags) & ( 0x0f << 0 ) )
41 
42 #define	DNS_PORT		53
43 #define	DNS_MAX_RETRIES		3
44 #define	DNS_MAX_CNAME_RECURSION	0x30
45 
46 /*
47  * DNS protocol structures
48  *
49  */
50 struct dns_header {
51 	uint16_t	id;
52 	uint16_t	flags;
53 	uint16_t	qdcount;
54 	uint16_t	ancount;
55 	uint16_t	nscount;
56 	uint16_t	arcount;
57 } __attribute__ (( packed ));
58 
59 struct dns_query_info {
60 	uint16_t	qtype;
61 	uint16_t	qclass;
62 } __attribute__ (( packed ));
63 
64 struct dns_query {
65 	struct dns_header dns;
66 	char		payload[ 256 + sizeof ( struct dns_query_info ) ];
67 } __attribute__ (( packed ));
68 
69 struct dns_rr_info_common {
70 	uint16_t	type;
71 	uint16_t	class;
72 	uint32_t	ttl;
73 	uint16_t	rdlength;
74 } __attribute__ (( packed ));
75 
76 struct dns_rr_info_a {
77 	struct dns_rr_info_common common;
78 	struct in_addr in_addr;
79 } __attribute__ (( packed ));
80 
81 struct dns_rr_info_cname {
82 	struct dns_rr_info_common common;
83 	char cname[0];
84 } __attribute__ (( packed ));
85 
86 union dns_rr_info {
87 	struct dns_rr_info_common common;
88 	struct dns_rr_info_a a;
89 	struct dns_rr_info_cname cname;
90 };
91 
92 #endif /* _GPXE_DNS_H */
93