iPXE
|
DNS protocol. More...
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/refcnt.h>
#include <ipxe/iobuf.h>
#include <ipxe/xfer.h>
#include <ipxe/open.h>
#include <ipxe/resolv.h>
#include <ipxe/retry.h>
#include <ipxe/tcpip.h>
#include <ipxe/settings.h>
#include <ipxe/features.h>
#include <ipxe/job.h>
#include <ipxe/dhcp.h>
#include <ipxe/dhcpv6.h>
#include <ipxe/dns.h>
Go to the source code of this file.
Data Structures | |
struct | dns_server |
A DNS server list. More... | |
struct | dns_request |
A DNS request. More... | |
Macros | |
#define | ENXIO_NO_RECORD __einfo_error ( EINFO_ENXIO_NO_RECORD ) |
#define | EINFO_ENXIO_NO_RECORD __einfo_uniqify ( EINFO_ENXIO, 0x01, "DNS name does not exist" ) |
#define | ENXIO_NO_NAMESERVER __einfo_error ( EINFO_ENXIO_NO_NAMESERVER ) |
#define | EINFO_ENXIO_NO_NAMESERVER __einfo_uniqify ( EINFO_ENXIO, 0x02, "No DNS servers available" ) |
Functions | |
FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
FEATURE (FEATURE_PROTOCOL, "DNS", DHCP_EB_FEATURE_DNS, 1) | |
int | dns_encode (const char *string, struct dns_name *name) |
Encode a DNS name using RFC1035 encoding. More... | |
static int | dns_label (struct dns_name *name, size_t offset) |
Find start of valid label within an RFC1035-encoded DNS name. More... | |
int | dns_decode (struct dns_name *name, char *data, size_t len) |
Decode RFC1035-encoded DNS name. More... | |
int | dns_compare (struct dns_name *first, struct dns_name *second) |
Compare DNS names for equality. More... | |
int | dns_copy (struct dns_name *src, struct dns_name *dst) |
Copy a DNS name. More... | |
int | dns_skip (struct dns_name *name) |
Skip RFC1035-encoded DNS name. More... | |
static int | dns_skip_search (struct dns_name *name) |
Skip RFC1035-encoded DNS name in search list. More... | |
static const char * | dns_name (struct dns_name *name) |
Transcribe DNS name (for debugging) More... | |
static const char * | dns_type (uint16_t type) |
Name a DNS query type (for debugging) More... | |
static void | dns_done (struct dns_request *dns, int rc) |
Mark DNS request as complete. More... | |
static void | dns_resolved (struct dns_request *dns) |
Mark DNS request as resolved and complete. More... | |
static int | dns_question (struct dns_request *dns) |
Construct DNS question. More... | |
static int | dns_send_packet (struct dns_request *dns) |
Send DNS query. More... | |
static void | dns_timer_expired (struct retry_timer *timer, int fail) |
Handle DNS (re)transmission timer expiry. More... | |
static int | dns_xfer_deliver (struct dns_request *dns, struct io_buffer *iobuf, struct xfer_metadata *meta __unused) |
Receive new data. More... | |
static void | dns_xfer_close (struct dns_request *dns, int rc) |
Receive new data. More... | |
static int | dns_progress (struct dns_request *dns, struct job_progress *progress) |
Report job progress. More... | |
static int | dns_resolv (struct interface *resolv, const char *name, struct sockaddr *sa) |
Resolve name using DNS. More... | |
struct resolver dns_resolver | __resolver (RESOLV_NORMAL) |
DNS name resolver. More... | |
static int | format_dnssl_setting (const struct setting_type *type __unused, const void *raw, size_t raw_len, char *buf, size_t len) |
Format DNS search list setting. More... | |
const struct setting dns_setting | __setting (SETTING_IP4_EXTRA, dns) |
IPv4 DNS server setting. More... | |
const struct setting dns6_setting | __setting (SETTING_IP6_EXTRA, dns6) |
IPv6 DNS server setting. More... | |
const struct setting dnssl_setting | __setting (SETTING_IP_EXTRA, dnssl) |
DNS search list. More... | |
static void | apply_dns_servers (void) |
Apply DNS server addresses. More... | |
static void | apply_dns_search (void) |
Apply DNS search list. More... | |
static int | apply_dns_settings (void) |
Apply DNS settings. More... | |
Variables | |
static struct dns_server | dns4 |
IPv4 DNS server list. More... | |
static struct dns_server | dns6 |
IPv6 DNS server list. More... | |
static unsigned int | dns_count |
Total number of DNS servers. More... | |
static struct dns_name | dns_search |
The DNS search list. More... | |
static struct interface_operation | dns_socket_operations [] |
DNS socket interface operations. More... | |
static struct interface_descriptor | dns_socket_desc |
DNS socket interface descriptor. More... | |
static struct interface_operation | dns_resolv_op [] |
DNS resolver interface operations. More... | |
static struct interface_descriptor | dns_resolv_desc |
DNS resolver interface descriptor. More... | |
const struct setting_type setting_type_dnssl | __setting_type |
A DNS search list setting type. More... | |
struct settings_applicator dns_applicator | __settings_applicator |
DNS settings applicator. More... | |
DNS protocol.
Definition in file dns.c.
#define ENXIO_NO_RECORD __einfo_error ( EINFO_ENXIO_NO_RECORD ) |
#define EINFO_ENXIO_NO_RECORD __einfo_uniqify ( EINFO_ENXIO, 0x01, "DNS name does not exist" ) |
#define ENXIO_NO_NAMESERVER __einfo_error ( EINFO_ENXIO_NO_NAMESERVER ) |
#define EINFO_ENXIO_NO_NAMESERVER __einfo_uniqify ( EINFO_ENXIO, 0x02, "No DNS servers available" ) |
FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
FEATURE | ( | FEATURE_PROTOCOL | , |
"DNS" | , | ||
DHCP_EB_FEATURE_DNS | , | ||
1 | |||
) |
int dns_encode | ( | const char * | string, |
struct dns_name * | name | ||
) |
Encode a DNS name using RFC1035 encoding.
string | DNS name as a string |
name | DNS name to fill in |
len | Length of DNS name, or negative error |
Definition at line 100 of file dns.c.
References c, DNS_MAX_LABEL_LEN, EINVAL, end, len, name, and start.
Referenced by apply_dns_search(), dns_encode_fail_okx(), dns_encode_okx(), and dns_resolv().
Find start of valid label within an RFC1035-encoded DNS name.
name | DNS name |
offset | Current offset |
offset | Offset of label, or negative error |
Definition at line 162 of file dns.c.
References DNS_COMPRESSED_OFFSET, DNS_IS_COMPRESSED, EINVAL, len, name, ntohs, and offset.
Referenced by dns_compare(), dns_copy(), dns_decode(), and dns_skip().
Decode RFC1035-encoded DNS name.
name | DNS name |
data | Output buffer |
len | Length of output buffer |
len | Length of decoded DNS name, or negative error |
Definition at line 216 of file dns.c.
References data, dns_label(), EINVAL, len, memcpy(), name, and offset.
Referenced by dns_decode_fail_okx(), dns_decode_okx(), dns_list_okx(), dns_name(), dns_progress(), and format_dnssl_setting().
Compare DNS names for equality.
first | First DNS name |
second | Second DNS name |
rc | Return status code |
Definition at line 267 of file dns.c.
References dns_label(), EINVAL, ENOENT, first, len, second, and tolower().
Referenced by dns_compare_fail_okx(), dns_compare_okx(), and dns_xfer_deliver().
Copy a DNS name.
src | Source DNS name |
dst | Destination DNS name |
len | Length of copied DNS name, or negative error |
Definition at line 321 of file dns.c.
References dns_name::data, dns_label(), EINVAL, len, dns_name::len, memcpy(), dns_name::offset, and src.
Referenced by dns_copy_fail_okx(), dns_copy_okx(), dns_question(), and dns_xfer_deliver().
int dns_skip | ( | struct dns_name * | name | ) |
Skip RFC1035-encoded DNS name.
name | DNS name |
offset | Offset to next name, or negative error |
Definition at line 364 of file dns.c.
References dns_label(), EINVAL, name, and offset.
Referenced by dns_list_okx(), dns_skip_search(), and dns_xfer_deliver().
|
static |
Skip RFC1035-encoded DNS name in search list.
name | DNS name |
offset | Offset to next non-empty name, or negative error |
Definition at line 403 of file dns.c.
References dns_skip(), name, and offset.
Referenced by apply_dns_settings(), dns_xfer_deliver(), and format_dnssl_setting().
|
static |
Name a DNS query type (for debugging)
type | Query type (in network byte order) |
name | Type name |
Definition at line 442 of file dns.c.
References DNS_TYPE_A, DNS_TYPE_AAAA, DNS_TYPE_CNAME, htons, and type.
Referenced by dns_question(), dns_send_packet(), and dns_xfer_deliver().
|
static |
Mark DNS request as complete.
dns | DNS request |
rc | Return status code |
Definition at line 501 of file dns.c.
References intf_shutdown(), rc, dns_request::resolv, dns_request::socket, stop_timer(), and dns_request::timer.
Referenced by dns_resolved(), dns_timer_expired(), dns_xfer_close(), and dns_xfer_deliver().
|
static |
Mark DNS request as resolved and complete.
dns | DNS request |
rc | Return status code |
Definition at line 517 of file dns.c.
References dns_request::address, DBGC, dns_done(), dns_request::resolv, resolv_done(), dns_request::sa, and sock_ntoa().
Referenced by dns_xfer_deliver().
|
static |
Construct DNS question.
dns | DNS request |
rc | Return status code |
Definition at line 535 of file dns.c.
References dns_request::buf, dns_name::data, DBGC, DBGC2, DNS_CLASS_IN, dns_copy(), dns_type(), EINVAL, htons, dns_header::id, len, dns_name::len, dns_request::len, dns_request::name, name, offset, dns_name::offset, dns_request::offset, offsetof, dns_question::qclass, dns_question::qtype, dns_request::qtype, dns_request::query, dns_request::question, dns_request::search, and typeof().
|
static |
Send DNS query.
dns | DNS request |
rc | Return status code |
Definition at line 587 of file dns.c.
References AF_INET, AF_INET6, dns_request::buf, dns_server::count, DBGC, dns4, dns6, dns_count, DNS_PORT, dns_type(), EINVAL, htons, dns_header::id, dns_server::in, dns_server::in6, index, dns_request::index, dns_request::len, memcpy(), memset(), meta(), dns_request::name, ntohs, dns_question::qtype, dns_request::query, dns_request::question, random(), sa, sin, sin6, sock_ntoa(), dns_request::socket, st, start_timer(), dns_request::timer, and xfer_deliver_raw_meta().
Referenced by dns_timer_expired(), and dns_xfer_deliver().
|
static |
Handle DNS (re)transmission timer expiry.
timer | Retry timer |
fail | Failure indicator |
Definition at line 641 of file dns.c.
References dns_request::buf, container_of, dns_done(), dns_send_packet(), ETIMEDOUT, dns_header::id, dns_request::index, and dns_request::query.
Referenced by dns_resolv().
|
static |
Receive new data.
dns | DNS request |
iobuf | I/O buffer |
meta | Data transfer metadata |
rc | Return status code |
Definition at line 667 of file dns.c.
References dns_rr::a, dns_rr::aaaa, dns_request::address, AF_INET, AF_INET6, assert(), dns_request::buf, dns_rr::cname, dns_rr::common, dns_name::data, io_buffer::data, DBGC, DBGC2, dns_compare(), dns_copy(), dns_done(), DNS_MAX_CNAME_RECURSION, dns_resolved(), dns_send_packet(), dns_skip(), dns_skip_search(), dns_type(), DNS_TYPE_A, DNS_TYPE_AAAA, DNS_TYPE_CNAME, done, EINVAL, ELOOP, ENXIO_NO_RECORD, free_iob(), htons, dns_header::id, dns_rr_aaaa::in6_addr, dns_rr_a::in_addr, iob_len(), dns_name::len, memcpy(), dns_request::name, name, ntohs, offset, dns_name::offset, dns_request::offset, offsetof, dns_header::qdcount, dns_question::qtype, dns_request::qtype, dns_request::query, dns_request::question, rc, dns_rr_common::rdlength, dns_request::recursion, dns_request::search, dns_request::sin, dns_request::sin6, sockaddr_in6::sin6_addr, sockaddr_in6::sin6_family, sockaddr_in::sin_addr, sockaddr_in::sin_family, stop_timer(), strerror(), dns_request::timer, dns_rr_common::type, and typeof().
|
static |
Receive new data.
dns | DNS request |
rc | Reason for close |
Definition at line 917 of file dns.c.
References dns_done(), ECONNABORTED, and rc.
|
static |
Report job progress.
dns | DNS request |
progress | Progress report to fill in |
ongoing_rc | Ongoing job status code (if known) |
Definition at line 932 of file dns.c.
References dns_decode(), len, job_progress::message, and dns_request::name.
Resolve name using DNS.
resolv | Name resolution interface |
name | Name to resolve |
sa | Socket address to fill in |
rc | Return status code |
Definition at line 975 of file dns.c.
References dns_request::address, dns_request::buf, dns_server::count, dns_name::data, DBG, DBGC, dns6, dns_count, dns_encode(), DNS_FLAG_RD, dns_resolv_desc, dns_search, dns_socket_desc, dns_timer_expired(), DNS_TYPE_A, DNS_TYPE_AAAA, ENOMEM, ENXIO_NO_NAMESERVER, dns_header::flags, htons, intf_init(), intf_plug_plug(), dns_name::len, memcpy(), dns_request::name, name, NULL, dns_request::offset, offsetof, dns_header::qdcount, dns_request::qtype, dns_request::query, rc, ref_init, ref_put, dns_request::refcnt, dns_request::resolv, resolv(), sa, dns_request::sa, dns_request::search, SOCK_DGRAM, dns_request::socket, start_timer_nodelay(), strchr(), strerror(), dns_request::timer, typeof(), xfer_open_socket(), and zalloc().
struct resolver dns_resolver __resolver | ( | RESOLV_NORMAL | ) |
DNS name resolver.
|
static |
Format DNS search list setting.
type | Setting type |
raw | Raw setting value |
raw_len | Length of raw setting value |
buf | Buffer to contain formatted value |
len | Length of buffer |
len | Length of formatted value, or negative error |
Definition at line 1078 of file dns.c.
References dns_decode(), dns_skip_search(), len, name, raw, and raw_len.
const struct setting dns_setting __setting | ( | SETTING_IP4_EXTRA | , |
dns | |||
) |
IPv4 DNS server setting.
const struct setting dns6_setting __setting | ( | SETTING_IP6_EXTRA | , |
dns6 | |||
) |
IPv6 DNS server setting.
const struct setting dnssl_setting __setting | ( | SETTING_IP_EXTRA | , |
dnssl | |||
) |
DNS search list.
|
static |
Apply DNS server addresses.
Definition at line 1147 of file dns.c.
References dns_server::count, dns_server::data, dns4, dns6, dns_count, fetch_raw_setting_copy(), free, dns_server::in, dns_server::in6, len, and NULL.
Referenced by apply_dns_settings().
|
static |
Apply DNS search list.
Definition at line 1172 of file dns.c.
References dns_name::data, dns_encode(), dns_search, fetch_raw_setting_copy(), fetch_string_setting_copy(), free, len, dns_name::len, malloc(), memset(), and NULL.
Referenced by apply_dns_settings().
|
static |
Apply DNS settings.
rc | Return status code |
Definition at line 1208 of file dns.c.
References AF_INET, AF_INET6, apply_dns_search(), apply_dns_servers(), dns_server::count, DBG_EXTRA, DBGC2, dns4, dns6, dns_count, dns_search, dns_skip_search(), dns_server::in, dns_server::in6, dns_name::len, memcpy(), name, offset, sa, sin, sin6, sock_ntoa(), and u.
|
static |
IPv4 DNS server list.
Definition at line 82 of file dns.c.
Referenced by apply_dns_servers(), apply_dns_settings(), and dns_send_packet().
|
static |
IPv6 DNS server list.
Definition at line 85 of file dns.c.
Referenced by apply_dns_servers(), apply_dns_settings(), dns_resolv(), and dns_send_packet().
|
static |
Total number of DNS servers.
Definition at line 88 of file dns.c.
Referenced by apply_dns_servers(), apply_dns_settings(), dns_resolv(), and dns_send_packet().
|
static |
The DNS search list.
Definition at line 91 of file dns.c.
Referenced by apply_dns_search(), apply_dns_settings(), and dns_resolv().
|
static |
DNS socket interface operations.
|
static |
DNS socket interface descriptor.
Definition at line 954 of file dns.c.
Referenced by dns_resolv().
|
static |
DNS resolver interface operations.
|
static |
DNS resolver interface descriptor.
Definition at line 964 of file dns.c.
Referenced by dns_resolv().
const struct setting_type setting_type_dnssl __setting_type |
A DNS search list setting type.
A string setting type.
struct settings_applicator dns_applicator __settings_applicator |
DNS settings applicator.