|
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 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_name::data, dns_label(), EINVAL, ENOENT, first, len, dns_name::offset, 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, dns_name::len, 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, dns_name::len, 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, dns_name::len, 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.
1.8.15