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