Moved include/in.h to include/gpxe/in.h, so that it can be included by
[gpxe.git] / src / include / dns.h
1 #ifndef DNS_RESOLVER_H
2 #define DNS_RESOLVER_H
3
4 #include "stdint.h"
5 #include <gpxe/in.h>
6 #include "ip.h"
7 #include "udp.h"
8
9 /*
10  * Constants
11  *
12  */
13
14 #define DNS_TYPE_A              1
15 #define DNS_TYPE_CNAME          5
16 #define DNS_TYPE_ANY            255
17
18 #define DNS_CLASS_IN            1
19 #define DNS_CLASS_CS            2
20 #define DNS_CLASS_CH            3
21 #define DNS_CLASS_HS            4
22
23 #define DNS_FLAG_QUERY          ( 0x00 << 15 )
24 #define DNS_FLAG_RESPONSE       ( 0x01 << 15 )
25 #define DNS_FLAG_QR(flags)      ( (flags) & ( 0x01 << 15 ) )
26 #define DNS_FLAG_OPCODE_QUERY   ( 0x00 << 11 )
27 #define DNS_FLAG_OPCODE_IQUERY  ( 0x01 << 11 )
28 #define DNS_FLAG_OPCODE_STATUS  ( 0x02 << 11 )
29 #define DNS_FLAG_OPCODE(flags)  ( (flags) & ( 0x0f << 11 ) )
30 #define DNS_FLAG_RD             ( 0x01 << 8 )
31 #define DNS_FLAG_RA             ( 0x01 << 7 )
32 #define DNS_FLAG_RCODE_OK       ( 0x00 << 0 )
33 #define DNS_FLAG_RCODE_NX       ( 0x03 << 0 )
34 #define DNS_FLAG_RCODE(flags)   ( (flags) & ( 0x0f << 0 ) )
35
36 #define DNS_UDP_PORT            53
37 #define DNS_MAX_RETRIES         3
38 #define DNS_MAX_CNAME_RECURSION 0x30
39
40 /*
41  * DNS protocol structures
42  *
43  */
44 struct dns_header {
45         uint16_t        id;
46         uint16_t        flags;
47         uint16_t        qdcount;
48         uint16_t        ancount;
49         uint16_t        nscount;
50         uint16_t        arcount;
51 } __attribute__ (( packed ));
52
53 struct dns_query_info {
54         uint16_t        qtype;
55         uint16_t        qclass;
56 } __attribute__ (( packed ));
57
58 struct dns_query {
59         struct iphdr    ip;
60         struct udphdr   udp;
61         struct dns_header dns;
62         char            payload[ 256 + sizeof ( struct dns_query_info ) ];
63 } __attribute__ (( packed ));
64
65 struct dns_rr_info {
66         uint16_t        type;
67         uint16_t        class;
68         uint32_t        ttl;
69         uint16_t        rdlength;
70 } __attribute__ (( packed ));
71
72 struct dns_rr_info_a {
73         struct dns_rr_info info;
74         struct in_addr in_addr;
75 } __attribute__ (( packed ));
76
77 struct dns_rr_info_cname {
78         struct dns_rr_info info;
79         char            cname[0];
80 } __attribute__ (( packed ));
81
82 /*
83  * Functions in dns.c (used by nmb.c)
84  *
85  */
86 extern struct dns_header * dns_query ( struct dns_query *query,
87                                        unsigned int query_len, 
88                                        struct sockaddr_in *nameserver );
89 extern struct dns_rr_info * dns_find_rr ( struct dns_query *query,
90                                           struct dns_header *reply );
91
92 #endif /* DNS_RESOLVER_H */