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
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_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 */
20struct 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 */
66struct 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 */
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 */
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 */
111struct dns_rr_a {
112 /** Common fields */
114 /** IPv4 address */
116} __attribute__ (( packed ));
117
118/** Type of a DNS "AAAA" record */
119#define DNS_TYPE_AAAA 28
120
121/** A DNS "AAAA" record */
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 */
134 /** Common fields */
136} __attribute__ (( packed ));
137
138/** A DNS resource record */
139union dns_rr {
140 /** Common fields */
142 /** "A" record */
143 struct dns_rr_a a;
144 /** "AAAA" record */
146 /** "CNAME" record */
148};
149
150extern int dns_encode ( const char *string, struct dns_name *name );
151extern int dns_decode ( struct dns_name *name, char *data, size_t len );
152extern int dns_compare ( struct dns_name *first, struct dns_name *second );
153extern int dns_copy ( struct dns_name *src, struct dns_name *dst );
154extern int dns_skip ( struct dns_name *name );
155
156#endif /* _IPXE_DNS_H */
unsigned short uint16_t
Definition stdint.h:11
unsigned int uint32_t
Definition stdint.h:12
static const void * src
Definition string.h:48
const char * name
Definition ath9k_hw.c:1986
int dns_encode(const char *string, struct dns_name *name)
Encode a DNS name using RFC1035 encoding.
Definition dns.c:101
int dns_skip(struct dns_name *name)
Skip RFC1035-encoded DNS name.
Definition dns.c:365
int dns_copy(struct dns_name *src, struct dns_name *dst)
Copy a DNS name.
Definition dns.c:322
int dns_compare(struct dns_name *first, struct dns_name *second)
Compare DNS names for equality.
Definition dns.c:268
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:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
uint32_t first
First block in range.
Definition pccrr.h:1
A DNS packet header.
Definition dns.h:66
uint16_t id
Query identifier.
Definition dns.h:68
uint16_t qdcount
Number of question records.
Definition dns.h:72
uint16_t arcount
Number of additional records.
Definition dns.h:78
uint16_t nscount
Number of name server records.
Definition dns.h:76
uint16_t ancount
Number of answer records.
Definition dns.h:74
uint16_t flags
Flags.
Definition dns.h:70
An RFC1035-encoded DNS name.
Definition dns.h:20
size_t offset
Offset of name within data.
Definition dns.h:24
void * data
Start of data.
Definition dns.h:22
size_t len
Total length of data.
Definition dns.h:26
A DNS question.
Definition dns.h:85
uint16_t qtype
Query type.
Definition dns.h:87
uint16_t qclass
Query class.
Definition dns.h:89
A DNS "A" record.
Definition dns.h:111
struct dns_rr_common common
Common fields.
Definition dns.h:113
struct in_addr in_addr
IPv4 address.
Definition dns.h:115
A DNS "AAAA" record.
Definition dns.h:122
struct dns_rr_common common
Common fields.
Definition dns.h:124
struct in6_addr in6_addr
IPv6 address.
Definition dns.h:126
A DNS "CNAME" record.
Definition dns.h:133
struct dns_rr_common common
Common fields.
Definition dns.h:135
A DNS resource record.
Definition dns.h:96
uint16_t type
Type.
Definition dns.h:98
uint32_t ttl
Time to live.
Definition dns.h:102
uint16_t rdlength
Resource data length.
Definition dns.h:104
A DNS resource record.
Definition dns.h:139
struct dns_rr_aaaa aaaa
"AAAA" record
Definition dns.h:145
struct dns_rr_cname cname
"CNAME" record
Definition dns.h:147
struct dns_rr_common common
Common fields.
Definition dns.h:141
struct dns_rr_a a
"A" record
Definition dns.h:143