iPXE
dns.h
Go to the documentation of this file.
1 #ifndef _IPXE_DNS_H
2 #define _IPXE_DNS_H
3 
4 /** @file
5  *
6  * DNS protocol
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_SECBOOT ( PERMITTED );
12 
13 #include <stdint.h>
14 #include <ipxe/in.h>
15 
16 /** DNS server port */
17 #define DNS_PORT 53
18 
19 /** An RFC1035-encoded DNS name */
20 struct dns_name {
21  /** Start of data */
22  void *data;
23  /** Offset of name within data */
24  size_t offset;
25  /** Total length of data */
26  size_t len;
27 };
28 
29 /**
30  * Test for a DNS compression pointer
31  *
32  * @v byte Initial byte
33  * @ret is_compressed Is a compression pointer
34  */
35 #define DNS_IS_COMPRESSED( byte ) ( (byte) & 0xc0 )
36 
37 /**
38  * Extract DNS compression pointer
39  *
40  * @v word Initial word
41  * @ret offset Offset
42  */
43 #define DNS_COMPRESSED_OFFSET( word ) ( (word) & ~0xc000 )
44 
45 /**
46  * Extract DNS label length
47  *
48  * @v byte Initial byte
49  * @ret len Label length
50  */
51 #define DNS_LABEL_LEN( byte ) ( (byte) & ~0xc0 )
52 
53 /** Maximum length of a single DNS label */
54 #define DNS_MAX_LABEL_LEN 0x3f
55 
56 /** Maximum length of a DNS name (mandated by RFC1035 section 2.3.4) */
57 #define DNS_MAX_NAME_LEN 255
58 
59 /** Maximum depth of CNAME recursion
60  *
61  * This is a policy decision.
62  */
63 #define DNS_MAX_CNAME_RECURSION 32
64 
65 /** A DNS packet header */
66 struct dns_header {
67  /** Query identifier */
69  /** Flags */
71  /** Number of question records */
73  /** Number of answer records */
75  /** Number of name server records */
77  /** Number of additional records */
79 } __attribute__ (( packed ));
80 
81 /** Recursion desired flag */
82 #define DNS_FLAG_RD 0x0100
83 
84 /** A DNS question */
85 struct dns_question {
86  /** Query type */
88  /** Query class */
90 } __attribute__ (( packed ));
91 
92 /** DNS class "IN" */
93 #define DNS_CLASS_IN 1
94 
95 /** A DNS resource record */
96 struct dns_rr_common {
97  /** Type */
99  /** Class */
100  uint16_t class;
101  /** Time to live */
103  /** Resource data length */
105 } __attribute__ (( packed ));
106 
107 /** Type of a DNS "A" record */
108 #define DNS_TYPE_A 1
109 
110 /** A DNS "A" record */
111 struct dns_rr_a {
112  /** Common fields */
114  /** IPv4 address */
115  struct in_addr in_addr;
116 } __attribute__ (( packed ));
117 
118 /** Type of a DNS "AAAA" record */
119 #define DNS_TYPE_AAAA 28
120 
121 /** A DNS "AAAA" record */
122 struct dns_rr_aaaa {
123  /** Common fields */
125  /** IPv6 address */
127 } __attribute__ (( packed ));
128 
129 /** Type of a DNS "NAME" record */
130 #define DNS_TYPE_CNAME 5
131 
132 /** A DNS "CNAME" record */
133 struct dns_rr_cname {
134  /** Common fields */
136 } __attribute__ (( packed ));
137 
138 /** A DNS resource record */
139 union dns_rr {
140  /** Common fields */
142  /** "A" record */
143  struct dns_rr_a a;
144  /** "AAAA" record */
146  /** "CNAME" record */
148 };
149 
150 extern int dns_encode ( const char *string, struct dns_name *name );
151 extern int dns_decode ( struct dns_name *name, char *data, size_t len );
152 extern int dns_compare ( struct dns_name *first, struct dns_name *second );
153 extern int dns_copy ( struct dns_name *src, struct dns_name *dst );
154 extern int dns_skip ( struct dns_name *name );
155 
156 #endif /* _IPXE_DNS_H */
struct dns_rr_common common
Common fields.
Definition: dns.h:141
#define __attribute__(x)
Definition: compiler.h:10
const char * name
Definition: ath9k_hw.c:1986
unsigned short uint16_t
Definition: stdint.h:11
uint16_t qdcount
Number of question records.
Definition: dns.h:72
struct dns_rr_common common
Common fields.
Definition: dns.h:113
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
A DNS packet header.
Definition: dns.h:66
uint32_t first
First block in range.
Definition: pccrr.h:15
uint16_t type
Type.
Definition: dns.h:98
int dns_encode(const char *string, struct dns_name *name)
Encode a DNS name using RFC1035 encoding.
Definition: dns.c:101
void * data
Start of data.
Definition: dns.h:22
A DNS resource record.
Definition: dns.h:96
uint32_t ttl
Time to live.
Definition: dns.h:102
int dns_copy(struct dns_name *src, struct dns_name *dst)
Copy a DNS name.
Definition: dns.c:322
uint16_t nscount
Number of name server records.
Definition: dns.h:76
struct dns_rr_common common
Common fields.
Definition: dns.h:124
A DNS resource record.
Definition: dns.h:139
int dns_compare(struct dns_name *first, struct dns_name *second)
Compare DNS names for equality.
Definition: dns.c:268
uint16_t qtype
Query type.
Definition: dns.h:87
uint16_t arcount
Number of additional records.
Definition: dns.h:78
An RFC1035-encoded DNS name.
Definition: dns.h:20
static const void * src
Definition: string.h:48
int dns_decode(struct dns_name *name, char *data, size_t len)
Decode RFC1035-encoded DNS name.
Definition: dns.c:217
ring len
Length.
Definition: dwmac.h:231
IP6 address structure.
Definition: in.h:51
size_t offset
Offset of name within data.
Definition: dns.h:24
A DNS "CNAME" record.
Definition: dns.h:133
IP address structure.
Definition: in.h:42
uint16_t flags
Flags.
Definition: dns.h:70
A DNS "A" record.
Definition: dns.h:111
struct dns_rr_a a
"A" record
Definition: dns.h:143
unsigned int uint32_t
Definition: stdint.h:12
uint16_t ancount
Number of answer records.
Definition: dns.h:74
A DNS question.
Definition: dns.h:85
uint16_t qclass
Query class.
Definition: dns.h:89
struct dns_rr_common common
Common fields.
Definition: dns.h:135
struct dns_rr_aaaa aaaa
"AAAA" record
Definition: dns.h:145
uint16_t id
Query identifier.
Definition: dns.h:68
FILE_SECBOOT(PERMITTED)
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int dns_skip(struct dns_name *name)
Skip RFC1035-encoded DNS name.
Definition: dns.c:365
size_t len
Total length of data.
Definition: dns.h:26
uint16_t rdlength
Resource data length.
Definition: dns.h:104
A DNS "AAAA" record.
Definition: dns.h:122
struct dns_rr_cname cname
"CNAME" record
Definition: dns.h:147