diff options
| author | Michael Brown | 2007-01-15 18:31:35 +0100 |
|---|---|---|
| committer | Michael Brown | 2007-01-15 18:31:35 +0100 |
| commit | 9af12d5fba1483ec5e95ac302b3f5c5aeb3662c1 (patch) | |
| tree | 3e97aec4cb3500383fdfda5e6027be5411c972a1 /src/include/gpxe | |
| parent | Update TFTP and FTP to take the same temporary URI scheme as HTTP (diff) | |
| download | ipxe-9af12d5fba1483ec5e95ac302b3f5c5aeb3662c1.tar.gz ipxe-9af12d5fba1483ec5e95ac302b3f5c5aeb3662c1.tar.xz ipxe-9af12d5fba1483ec5e95ac302b3f5c5aeb3662c1.zip | |
A working DNS resolver (not yet tied in to anything)
Diffstat (limited to 'src/include/gpxe')
| -rw-r--r-- | src/include/gpxe/dns.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/include/gpxe/dns.h b/src/include/gpxe/dns.h new file mode 100644 index 000000000..49292d588 --- /dev/null +++ b/src/include/gpxe/dns.h @@ -0,0 +1,109 @@ +#ifndef _GPXE_DNS_H +#define _GPXE_DNS_H + +/** @file + * + * DNS protocol + * + */ + +#include <stdint.h> +#include <gpxe/in.h> +#include <gpxe/async.h> +#include <gpxe/retry.h> + +/* + * Constants + * + */ + +#define DNS_TYPE_A 1 +#define DNS_TYPE_CNAME 5 +#define DNS_TYPE_ANY 255 + +#define DNS_CLASS_IN 1 +#define DNS_CLASS_CS 2 +#define DNS_CLASS_CH 3 +#define DNS_CLASS_HS 4 + +#define DNS_FLAG_QUERY ( 0x00 << 15 ) +#define DNS_FLAG_RESPONSE ( 0x01 << 15 ) +#define DNS_FLAG_QR(flags) ( (flags) & ( 0x01 << 15 ) ) +#define DNS_FLAG_OPCODE_QUERY ( 0x00 << 11 ) +#define DNS_FLAG_OPCODE_IQUERY ( 0x01 << 11 ) +#define DNS_FLAG_OPCODE_STATUS ( 0x02 << 11 ) +#define DNS_FLAG_OPCODE(flags) ( (flags) & ( 0x0f << 11 ) ) +#define DNS_FLAG_RD ( 0x01 << 8 ) +#define DNS_FLAG_RA ( 0x01 << 7 ) +#define DNS_FLAG_RCODE_OK ( 0x00 << 0 ) +#define DNS_FLAG_RCODE_NX ( 0x03 << 0 ) +#define DNS_FLAG_RCODE(flags) ( (flags) & ( 0x0f << 0 ) ) + +#define DNS_PORT 53 +#define DNS_MAX_RETRIES 3 +#define DNS_MAX_CNAME_RECURSION 0x30 + +/* + * DNS protocol structures + * + */ +struct dns_header { + uint16_t id; + uint16_t flags; + uint16_t qdcount; + uint16_t ancount; + uint16_t nscount; + uint16_t arcount; +} __attribute__ (( packed )); + +struct dns_query_info { + uint16_t qtype; + uint16_t qclass; +} __attribute__ (( packed )); + +struct dns_query { + struct dns_header dns; + char payload[ 256 + sizeof ( struct dns_query_info ) ]; +} __attribute__ (( packed )); + +struct dns_rr_info_common { + uint16_t type; + uint16_t class; + uint32_t ttl; + uint16_t rdlength; +} __attribute__ (( packed )); + +struct dns_rr_info_a { + struct dns_rr_info_common common; + struct in_addr in_addr; +} __attribute__ (( packed )); + +struct dns_rr_info_cname { + struct dns_rr_info_common common; + char cname[0]; +} __attribute__ (( packed )); + +union dns_rr_info { + struct dns_rr_info_common common; + struct dns_rr_info_a a; + struct dns_rr_info_cname cname; +}; + +struct dns_request { + + struct sockaddr_tcpip *st; + + struct async async; + struct dns_query query; + struct dns_query_info *qinfo; + + unsigned int recursion; + + struct udp_connection udp; + struct retry_timer timer; +}; + +extern int dns_resolv ( const char *name, struct sockaddr_tcpip *st, + struct async *parent ); + +#endif /* _GPXE_DNS_H */ |
