Have DHCP set the nameserver, rather than DNS read the DHCP nameserver
[people/xl0/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 #include <stdint.h>
11 #include <gpxe/in.h>
12 #include <gpxe/async.h>
13 #include <gpxe/retry.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 /** A DNS request */
93 struct dns_request {
94         /** Socket address to fill in with resolved address */
95         struct sockaddr *sa;
96
97         /** Current query packet */
98         struct dns_query query;
99         /** Length of current query packet */
100         struct dns_query_info *qinfo;
101         /** Recursion counter */
102         unsigned int recursion;
103
104         /** Asynchronous operation */
105         struct async async;
106         /** UDP connection */
107         struct udp_connection udp;
108         /** Retry timer */
109         struct retry_timer timer;
110 };
111
112 extern struct in_addr nameserver;
113
114 extern int dns_resolv ( const char *name, struct sockaddr *sa,
115                         struct async *parent );
116
117 #endif /* _GPXE_DNS_H */