From 9af12d5fba1483ec5e95ac302b3f5c5aeb3662c1 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 15 Jan 2007 17:31:35 +0000 Subject: A working DNS resolver (not yet tied in to anything) --- src/include/dns.h | 92 ----------------------------------------- src/include/errno.h | 1 + src/include/gpxe/dns.h | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ src/include/nmb.h | 2 +- 4 files changed, 111 insertions(+), 93 deletions(-) delete mode 100644 src/include/dns.h create mode 100644 src/include/gpxe/dns.h (limited to 'src/include') diff --git a/src/include/dns.h b/src/include/dns.h deleted file mode 100644 index c72c6909b..000000000 --- a/src/include/dns.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef DNS_RESOLVER_H -#define DNS_RESOLVER_H - -#include "stdint.h" -#include -#include "ip.h" -#include "udp.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_UDP_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 iphdr ip; - struct udphdr udp; - struct dns_header dns; - char payload[ 256 + sizeof ( struct dns_query_info ) ]; -} __attribute__ (( packed )); - -struct dns_rr_info { - uint16_t type; - uint16_t class; - uint32_t ttl; - uint16_t rdlength; -} __attribute__ (( packed )); - -struct dns_rr_info_a { - struct dns_rr_info info; - struct in_addr in_addr; -} __attribute__ (( packed )); - -struct dns_rr_info_cname { - struct dns_rr_info info; - char cname[0]; -} __attribute__ (( packed )); - -/* - * Functions in dns.c (used by nmb.c) - * - */ -extern struct dns_header * dns_query ( struct dns_query *query, - unsigned int query_len, - struct sockaddr_in *nameserver ); -extern struct dns_rr_info * dns_find_rr ( struct dns_query *query, - struct dns_header *reply ); - -#endif /* DNS_RESOLVER_H */ diff --git a/src/include/errno.h b/src/include/errno.h index 3025fa965..541d9cbdb 100644 --- a/src/include/errno.h +++ b/src/include/errno.h @@ -137,6 +137,7 @@ #define EINVAL 0xdd /**< Invalid argument */ #define EIO 0xde /**< Input/output error */ #define EISCONN 0xdf /**< Transport endpoint is already connected */ +#define ELOOP 0xf8 /**< Too many symbolic links */ #define EMFILE 0xe0 /**< Too many open files */ #define EMSGSIZE 0xe1 /**< Message too long */ #define ENAMETOOLONG 0xe2 /**< File name too long */ 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 +#include +#include +#include + +/* + * 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 */ diff --git a/src/include/nmb.h b/src/include/nmb.h index 7948d9e48..3e551ffd5 100644 --- a/src/include/nmb.h +++ b/src/include/nmb.h @@ -1,7 +1,7 @@ #ifndef NMB_H #define NMB_H -#include "dns.h" +#include /* * NetBIOS name query packets are basically the same as DNS packets, -- cgit v1.2.3-55-g7522