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