[dns] Handle AAAA records
[people/meteger/gpxe.git] / src / include / gpxe / dns.h
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_AAAA           28
23 #define DNS_TYPE_ANY            255
24
25 #define DNS_CLASS_IN            1
26 #define DNS_CLASS_CS            2
27 #define DNS_CLASS_CH            3
28 #define DNS_CLASS_HS            4
29
30 #define DNS_FLAG_QUERY          ( 0x00 << 15 )
31 #define DNS_FLAG_RESPONSE       ( 0x01 << 15 )
32 #define DNS_FLAG_QR(flags)      ( (flags) & ( 0x01 << 15 ) )
33 #define DNS_FLAG_OPCODE_QUERY   ( 0x00 << 11 )
34 #define DNS_FLAG_OPCODE_IQUERY  ( 0x01 << 11 )
35 #define DNS_FLAG_OPCODE_STATUS  ( 0x02 << 11 )
36 #define DNS_FLAG_OPCODE(flags)  ( (flags) & ( 0x0f << 11 ) )
37 #define DNS_FLAG_RD             ( 0x01 << 8 )
38 #define DNS_FLAG_RA             ( 0x01 << 7 )
39 #define DNS_FLAG_RCODE_OK       ( 0x00 << 0 )
40 #define DNS_FLAG_RCODE_NX       ( 0x03 << 0 )
41 #define DNS_FLAG_RCODE(flags)   ( (flags) & ( 0x0f << 0 ) )
42
43 #define DNS_PORT                53
44 #define DNS_MAX_RETRIES         3
45 #define DNS_MAX_CNAME_RECURSION 0x30
46
47 /*
48  * DNS protocol structures
49  *
50  */
51 struct dns_header {
52         uint16_t        id;
53         uint16_t        flags;
54         uint16_t        qdcount;
55         uint16_t        ancount;
56         uint16_t        nscount;
57         uint16_t        arcount;
58 } __attribute__ (( packed ));
59
60 struct dns_query_info {
61         uint16_t        qtype;
62         uint16_t        qclass;
63 } __attribute__ (( packed ));
64
65 struct dns_query {
66         struct dns_header dns;
67         char            payload[ 256 + sizeof ( struct dns_query_info ) ];
68 } __attribute__ (( packed ));
69
70 struct dns_rr_info_common {
71         uint16_t        type;
72         uint16_t        class;
73         uint32_t        ttl;
74         uint16_t        rdlength;
75 } __attribute__ (( packed ));
76
77 struct dns_rr_info_a {
78         struct dns_rr_info_common common;
79         struct in_addr in_addr;
80 } __attribute__ (( packed ));
81
82 struct dns_rr_info_aaaa {
83         struct dns_rr_info_common common;
84         struct in6_addr in6_addr;
85 } __attribute__ (( packed ));
86
87 struct dns_rr_info_cname {
88         struct dns_rr_info_common common;
89         char cname[0];
90 } __attribute__ (( packed ));
91
92 union dns_rr_info {
93         struct dns_rr_info_common common;
94         struct dns_rr_info_a a;
95         struct dns_rr_info_aaaa aaaa;
96         struct dns_rr_info_cname cname;
97 };
98
99 #endif /* _GPXE_DNS_H */