13#ifndef ZEPHYR_INCLUDE_NET_DNS_RESOLVE_H_
14#define ZEPHYR_INCLUDE_NET_DNS_RESOLVE_H_
48#if defined(CONFIG_DNS_RESOLVER_MAX_NAME_LEN)
49#define DNS_MAX_NAME_SIZE CONFIG_DNS_RESOLVER_MAX_NAME_LEN
51#define DNS_MAX_NAME_SIZE 20
56#define DNS_BUF_TIMEOUT K_MSEC(500)
59#if defined(CONFIG_DNS_RESOLVER_MAX_ANSWER_SIZE)
60#define DNS_RESOLVER_MAX_BUF_SIZE CONFIG_DNS_RESOLVER_MAX_ANSWER_SIZE
62#define DNS_RESOLVER_MAX_BUF_SIZE 512
68#if defined(CONFIG_DNS_RESOLVER_MAX_SERVERS)
69#define DNS_RESOLVER_MAX_SERVERS CONFIG_DNS_RESOLVER_MAX_SERVERS
71#define DNS_RESOLVER_MAX_SERVERS 0
74#if defined(CONFIG_DNS_NUM_CONCUR_QUERIES)
75#define DNS_NUM_CONCUR_QUERIES CONFIG_DNS_NUM_CONCUR_QUERIES
77#define DNS_NUM_CONCUR_QUERIES 1
80#if defined(CONFIG_NET_IF_MAX_IPV6_COUNT)
81#define MAX_IPV6_IFACE_COUNT CONFIG_NET_IF_MAX_IPV6_COUNT
83#define MAX_IPV6_IFACE_COUNT 1
86#if defined(CONFIG_NET_IF_MAX_IPV4_COUNT)
87#define MAX_IPV4_IFACE_COUNT CONFIG_NET_IF_MAX_IPV4_COUNT
89#define MAX_IPV4_IFACE_COUNT 1
95#if defined(CONFIG_MDNS_RESOLVER)
96#if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_IPV4)
97#define MDNS_SERVER_COUNT 2
99#define MDNS_SERVER_COUNT 1
102#define MDNS_SERVER_COUNT 0
108#if defined(CONFIG_LLMNR_RESOLVER)
109#if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_IPV4)
110#define LLMNR_SERVER_COUNT 2
112#define LLMNR_SERVER_COUNT 1
115#define LLMNR_SERVER_COUNT 0
118#define DNS_MAX_MCAST_SERVERS (MDNS_SERVER_COUNT + LLMNR_SERVER_COUNT)
120#if defined(CONFIG_MDNS_RESPONDER)
121#if defined(CONFIG_NET_IPV6)
122#define MDNS_MAX_IPV6_IFACE_COUNT CONFIG_NET_IF_MAX_IPV6_COUNT
124#define MDNS_MAX_IPV6_IFACE_COUNT 0
127#if defined(CONFIG_NET_IPV4)
128#define MDNS_MAX_IPV4_IFACE_COUNT CONFIG_NET_IF_MAX_IPV4_COUNT
130#define MDNS_MAX_IPV4_IFACE_COUNT 0
133#define MDNS_MAX_POLL (MDNS_MAX_IPV4_IFACE_COUNT + MDNS_MAX_IPV6_IFACE_COUNT)
135#define MDNS_MAX_POLL 0
138#if defined(CONFIG_LLMNR_RESPONDER)
139#if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_IPV4)
140#define LLMNR_MAX_POLL 2
142#define LLMNR_MAX_POLL 1
145#define LLMNR_MAX_POLL 0
148#define DNS_RESOLVER_MAX_POLL (DNS_RESOLVER_MAX_SERVERS + DNS_MAX_MCAST_SERVERS)
151#define DNS_DISPATCHER_MAX_POLL (DNS_RESOLVER_MAX_POLL + MDNS_MAX_POLL + LLMNR_MAX_POLL)
153#if defined(CONFIG_ZVFS_POLL_MAX)
154BUILD_ASSERT(CONFIG_ZVFS_POLL_MAX >= DNS_DISPATCHER_MAX_POLL,
155 "CONFIG_ZVFS_POLL_MAX must be larger than " STRINGIFY(DNS_DISPATCHER_MAX_POLL));
161enum dns_socket_type {
162 DNS_SOCKET_RESOLVER = 1,
163 DNS_SOCKET_RESPONDER = 2
167struct mdns_responder_context;
168struct dns_socket_dispatcher;
184typedef int (*dns_socket_dispatcher_cb)(
struct dns_socket_dispatcher *ctx,
int sock,
185 struct sockaddr *addr,
size_t addrlen,
186 struct net_buf *buf,
size_t data_len);
189struct dns_socket_dispatcher {
200 struct mdns_responder_context *mdns_ctx;
204 enum dns_socket_type type;
208 dns_socket_dispatcher_cb cb;
220 struct dns_socket_dispatcher *pair;
236int dns_dispatcher_register(
struct dns_socket_dispatcher *ctx);
247int dns_dispatcher_unregister(
struct dns_socket_dispatcher *ctx);
330enum dns_resolve_context_state {
331 DNS_RESOLVE_CONTEXT_UNINITIALIZED = 0,
332 DNS_RESOLVE_CONTEXT_ACTIVE,
333 DNS_RESOLVE_CONTEXT_DEACTIVATING,
334 DNS_RESOLVE_CONTEXT_INACTIVE,
364 struct dns_socket_dispatcher dispatcher;
435 enum dns_resolve_context_state
state;
440struct mdns_probe_user_data {
441 struct mdns_responder_context *ctx;
446struct mdns_responder_context {
448 struct dns_socket_dispatcher dispatcher;
452#if defined(CONFIG_MDNS_RESPONDER_PROBE)
455 struct mdns_probe_user_data probe_data;
489 const char *dns_servers_str[],
490 const struct sockaddr *dns_servers_sa[]);
533 const char *servers_str[],
534 const struct sockaddr *servers_sa[]);
558 const char *servers_str[],
559 const struct sockaddr *servers_sa[],
599 const char *query_name,
672 dns_id, cb, user_data, timeout);
753#if defined(CONFIG_DNS_RESOLVER_AUTO_INIT)
754void dns_init_resolver(
void);
757#define dns_init_resolver(...)
int dns_resolve_name(struct dns_resolve_context *ctx, const char *query, enum dns_query_type type, uint16_t *dns_id, dns_resolve_cb_t cb, void *user_data, int32_t timeout)
Resolve DNS name.
static int dns_cancel_addr_info(uint16_t dns_id)
Cancel a pending DNS query.
Definition dns_resolve.h:739
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
Remove servers from the DNS resolving context.
dns_resolve_status
Status values for the callback.
Definition dns_resolve.h:268
dns_query_type
DNS query type enum.
Definition dns_resolve.h:38
int dns_resolve_init_default(struct dns_resolve_context *ctx)
Init DNS resolving context with default Kconfig options.
int dns_resolve_init(struct dns_resolve_context *ctx, const char *dns_servers_str[], const struct sockaddr *dns_servers_sa[])
Init DNS resolving context.
int dns_resolve_cancel(struct dns_resolve_context *ctx, uint16_t dns_id)
Cancel a pending DNS query.
void(* dns_resolve_cb_t)(enum dns_resolve_status status, struct dns_addrinfo *info, void *user_data)
DNS resolve callback.
Definition dns_resolve.h:324
int dns_resolve_reconfigure(struct dns_resolve_context *ctx, const char *servers_str[], const struct sockaddr *servers_sa[])
Reconfigure DNS resolving context.
int dns_resolve_close(struct dns_resolve_context *ctx)
Close DNS resolving context.
int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx, const char *servers_str[], const struct sockaddr *servers_sa[], int interfaces[])
Reconfigure DNS resolving context with new server list and allowing servers to be specified to a spec...
#define DNS_MAX_NAME_SIZE
Max size of the resolved name.
Definition dns_resolve.h:51
struct dns_resolve_context * dns_resolve_get_default(void)
Get default DNS context.
int dns_resolve_cancel_with_name(struct dns_resolve_context *ctx, uint16_t dns_id, const char *query_name, enum dns_query_type query_type)
Cancel a pending DNS query using id, name and type.
static int dns_resolve_service(struct dns_resolve_context *ctx, const char *query, uint16_t *dns_id, dns_resolve_cb_t cb, void *user_data, int32_t timeout)
Resolve DNS service.
Definition dns_resolve.h:664
static int dns_get_addr_info(const char *query, enum dns_query_type type, uint16_t *dns_id, dns_resolve_cb_t cb, void *user_data, int32_t timeout)
Get IP address info from DNS.
Definition dns_resolve.h:714
@ DNS_EAI_MEMORY
Memory allocation failure.
Definition dns_resolve.h:288
@ DNS_EAI_NOTCANCELED
Request not canceled.
Definition dns_resolve.h:298
@ DNS_EAI_IDN_ENCODE
IDN encoding failed.
Definition dns_resolve.h:302
@ DNS_EAI_ADDRFAMILY
Address family for NAME not supported.
Definition dns_resolve.h:286
@ DNS_EAI_INPROGRESS
Processing request in progress.
Definition dns_resolve.h:294
@ DNS_EAI_FAIL
Non-recoverable failure in name res.
Definition dns_resolve.h:276
@ DNS_EAI_AGAIN
Temporary failure in name resolution.
Definition dns_resolve.h:274
@ DNS_EAI_NODATA
No address associated with NAME.
Definition dns_resolve.h:278
@ DNS_EAI_NONAME
NAME or SERVICE is unknown.
Definition dns_resolve.h:272
@ DNS_EAI_FAMILY
‘ai_family’ not supported
Definition dns_resolve.h:280
@ DNS_EAI_OVERFLOW
Argument buffer overflow.
Definition dns_resolve.h:292
@ DNS_EAI_CANCELED
Request canceled.
Definition dns_resolve.h:296
@ DNS_EAI_BADFLAGS
Invalid value for ‘ai_flags’ field.
Definition dns_resolve.h:270
@ DNS_EAI_SOCKTYPE
‘ai_socktype’ not supported
Definition dns_resolve.h:282
@ DNS_EAI_ALLDONE
All requests done.
Definition dns_resolve.h:300
@ DNS_EAI_SYSTEM
System error returned in ‘errno’.
Definition dns_resolve.h:290
@ DNS_EAI_SERVICE
SRV not supported for ‘ai_socktype’.
Definition dns_resolve.h:284
@ DNS_QUERY_TYPE_PTR
PTR query.
Definition dns_resolve.h:42
@ DNS_QUERY_TYPE_A
IPv4 query.
Definition dns_resolve.h:40
@ DNS_QUERY_TYPE_AAAA
IPv6 query.
Definition dns_resolve.h:44
size_t socklen_t
Length of a socket address.
Definition net_ip.h:172
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
Network core definitions.
Public API for network interface.
IPv6 and IPv4 definitions.
__INT32_TYPE__ int32_t
Definition stdint.h:74
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Address info struct is passed to callback that gets all the results.
Definition dns_resolve.h:254
char ai_canonname[20+1]
Canonical name of the address.
Definition dns_resolve.h:262
struct sockaddr ai_addr
IP address information.
Definition dns_resolve.h:256
socklen_t ai_addrlen
Length of the ai_addr field.
Definition dns_resolve.h:258
uint8_t ai_family
Address family of the address information.
Definition dns_resolve.h:260
Result callbacks.
Definition dns_resolve.h:387
const char * query
String containing the thing to resolve like www.example.com.
Definition dns_resolve.h:417
uint16_t query_hash
Hash of the DNS name + query type we are querying.
Definition dns_resolve.h:431
struct dns_resolve_context * ctx
Back pointer to ctx, needed in timeout handler.
Definition dns_resolve.h:392
void * user_data
User data.
Definition dns_resolve.h:401
struct k_work_delayable timer
Timeout timer.
Definition dns_resolve.h:389
uint16_t id
DNS id of this query.
Definition dns_resolve.h:423
k_timeout_t timeout
TX timeout.
Definition dns_resolve.h:404
dns_resolve_cb_t cb
Result callback.
Definition dns_resolve.h:398
enum dns_query_type query_type
Query type.
Definition dns_resolve.h:420
List of configured DNS servers.
Definition dns_resolve.h:344
int if_index
Network interface index if the DNS resolving should be done via this interface.
Definition dns_resolve.h:354
int sock
Connection to the DNS server.
Definition dns_resolve.h:349
uint8_t is_mdns
Is this server mDNS one.
Definition dns_resolve.h:357
uint8_t is_llmnr
Is this server LLMNR one.
Definition dns_resolve.h:360
DNS resolve context structure.
Definition dns_resolve.h:342
k_timeout_t buf_timeout
This timeout is also used when a buffer is required from the buffer pools.
Definition dns_resolve.h:379
struct dns_resolve_context::dns_pending_query queries[DNS_NUM_CONCUR_QUERIES]
struct dns_resolve_context::dns_server servers[DNS_RESOLVER_MAX_POLL]
enum dns_resolve_context_state state
Is this context in use.
Definition dns_resolve.h:435
struct k_mutex lock
Prevent concurrent access.
Definition dns_resolve.h:374
Mutex Structure.
Definition kernel.h:3070
Kernel timeout type.
Definition sys_clock.h:65
A structure used to submit work after a delay.
Definition kernel.h:4101
Network buffer representation.
Definition net_buf.h:1006
Network Interface structure.
Definition net_if.h:726
Main structure holding socket service configuration information.
Definition socket_service.h:70
Generic sockaddr struct.
Definition net_ip.h:408
Definition of the monitored socket/file descriptor.
Definition socket_poll.h:31