Zephyr API Documentation 4.2.0-rc3
A Scalable Open Source RTOS
 4.2.0-rc3
dns_resolve.h
Go to the documentation of this file.
1
6
7/*
8 * Copyright (c) 2017 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13#ifndef ZEPHYR_INCLUDE_NET_DNS_RESOLVE_H_
14#define ZEPHYR_INCLUDE_NET_DNS_RESOLVE_H_
15
16#include <zephyr/kernel.h>
17#include <zephyr/net/net_ip.h>
18#include <zephyr/net/net_if.h>
20#include <zephyr/net/net_core.h>
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
34
46
64
66#if defined(CONFIG_DNS_RESOLVER_MAX_NAME_LEN)
67#define DNS_MAX_NAME_SIZE CONFIG_DNS_RESOLVER_MAX_NAME_LEN
68#else
69#define DNS_MAX_NAME_SIZE 20
70#endif /* CONFIG_DNS_RESOLVER_MAX_NAME_LEN */
71
73
74#define DNS_BUF_TIMEOUT K_MSEC(500) /* ms */
75
76/* This value is recommended by RFC 1035 */
77#if defined(CONFIG_DNS_RESOLVER_MAX_ANSWER_SIZE)
78#define DNS_RESOLVER_MAX_BUF_SIZE CONFIG_DNS_RESOLVER_MAX_ANSWER_SIZE
79#else
80#define DNS_RESOLVER_MAX_BUF_SIZE 512
81#endif /* CONFIG_DNS_RESOLVER_MAX_ANSWER_SIZE */
82
83/* Make sure that we can compile things even if CONFIG_DNS_RESOLVER
84 * is not enabled.
85 */
86#if defined(CONFIG_DNS_RESOLVER_MAX_SERVERS)
87#define DNS_RESOLVER_MAX_SERVERS CONFIG_DNS_RESOLVER_MAX_SERVERS
88#else
89#define DNS_RESOLVER_MAX_SERVERS 0
90#endif
91
92#if defined(CONFIG_DNS_NUM_CONCUR_QUERIES)
93#define DNS_NUM_CONCUR_QUERIES CONFIG_DNS_NUM_CONCUR_QUERIES
94#else
95#define DNS_NUM_CONCUR_QUERIES 1
96#endif
97
98#if defined(CONFIG_NET_IF_MAX_IPV6_COUNT)
99#define MAX_IPV6_IFACE_COUNT CONFIG_NET_IF_MAX_IPV6_COUNT
100#else
101#define MAX_IPV6_IFACE_COUNT 1
102#endif
103
104#if defined(CONFIG_NET_IF_MAX_IPV4_COUNT)
105#define MAX_IPV4_IFACE_COUNT CONFIG_NET_IF_MAX_IPV4_COUNT
106#else
107#define MAX_IPV4_IFACE_COUNT 1
108#endif
109
110/* If mDNS is enabled, then add some extra well known multicast servers to the
111 * server list.
112 */
113#if defined(CONFIG_MDNS_RESOLVER)
114#if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_IPV4)
115#define MDNS_SERVER_COUNT 2
116#else
117#define MDNS_SERVER_COUNT 1
118#endif /* CONFIG_NET_IPV6 && CONFIG_NET_IPV4 */
119#else
120#define MDNS_SERVER_COUNT 0
121#endif /* CONFIG_MDNS_RESOLVER */
122
123/* If LLMNR is enabled, then add some extra well known multicast servers to the
124 * server list.
125 */
126#if defined(CONFIG_LLMNR_RESOLVER)
127#if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_IPV4)
128#define LLMNR_SERVER_COUNT 2
129#else
130#define LLMNR_SERVER_COUNT 1
131#endif /* CONFIG_NET_IPV6 && CONFIG_NET_IPV4 */
132#else
133#define LLMNR_SERVER_COUNT 0
134#endif /* CONFIG_MDNS_RESOLVER */
135
136#define DNS_MAX_MCAST_SERVERS (MDNS_SERVER_COUNT + LLMNR_SERVER_COUNT)
137
138#if defined(CONFIG_MDNS_RESPONDER)
139#if defined(CONFIG_NET_IPV6)
140#define MDNS_MAX_IPV6_IFACE_COUNT CONFIG_NET_IF_MAX_IPV6_COUNT
141#else
142#define MDNS_MAX_IPV6_IFACE_COUNT 0
143#endif /* CONFIG_NET_IPV6 */
144
145#if defined(CONFIG_NET_IPV4)
146#define MDNS_MAX_IPV4_IFACE_COUNT CONFIG_NET_IF_MAX_IPV4_COUNT
147#else
148#define MDNS_MAX_IPV4_IFACE_COUNT 0
149#endif /* CONFIG_NET_IPV4 */
150
151#define MDNS_MAX_POLL (MDNS_MAX_IPV4_IFACE_COUNT + MDNS_MAX_IPV6_IFACE_COUNT)
152#else
153#define MDNS_MAX_POLL 0
154#endif /* CONFIG_MDNS_RESPONDER */
155
156#if defined(CONFIG_LLMNR_RESPONDER)
157#if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_IPV4)
158#define LLMNR_MAX_POLL 2
159#else
160#define LLMNR_MAX_POLL 1
161#endif
162#else
163#define LLMNR_MAX_POLL 0
164#endif /* CONFIG_LLMNR_RESPONDER */
165
166#define DNS_RESOLVER_MAX_POLL (DNS_RESOLVER_MAX_SERVERS + DNS_MAX_MCAST_SERVERS)
167
169#define DNS_DISPATCHER_MAX_POLL (DNS_RESOLVER_MAX_POLL + MDNS_MAX_POLL + LLMNR_MAX_POLL)
170
171#if defined(CONFIG_ZVFS_POLL_MAX)
172BUILD_ASSERT(CONFIG_ZVFS_POLL_MAX >= DNS_DISPATCHER_MAX_POLL,
173 "CONFIG_ZVFS_POLL_MAX must be larger than " STRINGIFY(DNS_DISPATCHER_MAX_POLL));
174#endif
175
179enum dns_socket_type {
180 DNS_SOCKET_RESOLVER = 1,
181 DNS_SOCKET_RESPONDER = 2
182};
183
185struct mdns_responder_context;
186struct dns_socket_dispatcher;
187
202typedef int (*dns_socket_dispatcher_cb)(struct dns_socket_dispatcher *ctx, int sock,
203 struct sockaddr *addr, size_t addrlen,
204 struct net_buf *buf, size_t data_len);
205
207struct dns_socket_dispatcher {
209 sys_snode_t node;
211 const struct net_socket_service_desc *svc;
215 union {
216 void *ctx;
217 struct dns_resolve_context *resolve_ctx;
218 struct mdns_responder_context *mdns_ctx;
219 };
220
222 enum dns_socket_type type;
224 struct sockaddr local_addr;
226 dns_socket_dispatcher_cb cb;
228 struct zsock_pollfd *fds;
230 int fds_len;
232 int sock;
234 int ifindex;
238 struct dns_socket_dispatcher *pair;
240 struct k_mutex lock;
242 k_timeout_t buf_timeout;
243};
244
254int dns_dispatcher_register(struct dns_socket_dispatcher *ctx);
255
265int dns_dispatcher_unregister(struct dns_socket_dispatcher *ctx);
266
268
282
322
342typedef void (*dns_resolve_cb_t)(enum dns_resolve_status status,
343 struct dns_addrinfo *info,
344 void *user_data);
345
347
348enum dns_resolve_context_state {
349 DNS_RESOLVE_CONTEXT_UNINITIALIZED = 0,
350 DNS_RESOLVE_CONTEXT_ACTIVE,
351 DNS_RESOLVE_CONTEXT_DEACTIVATING,
352 DNS_RESOLVE_CONTEXT_INACTIVE,
353};
354
356
362 struct dns_server {
365
367 int sock;
368
373
376
379
382
385 struct dns_socket_dispatcher dispatcher;
387 } servers[DNS_RESOLVER_MAX_POLL];
388
391 struct zsock_pollfd fds[DNS_RESOLVER_MAX_POLL];
393
395 struct k_mutex lock;
396
401
454
456 enum dns_resolve_context_state state;
457};
458
460
461struct mdns_probe_user_data {
462 struct mdns_responder_context *ctx;
463 char query[DNS_MAX_NAME_SIZE + 1];
464 uint16_t dns_id;
465};
466
467struct mdns_responder_context {
468 struct sockaddr server_addr;
469 struct dns_socket_dispatcher dispatcher;
470 struct zsock_pollfd fds[1];
471 int sock;
472 struct net_if *iface;
473#if defined(CONFIG_MDNS_RESPONDER_PROBE)
474 struct k_work_delayable probe_timer;
475 struct dns_resolve_context probe_ctx;
476 struct mdns_probe_user_data probe_data;
477#endif
478};
479
481
510 const char *dns_servers_str[],
511 const struct sockaddr *dns_servers_sa[]);
512
521
533
555 const char *servers_str[],
556 const struct sockaddr *servers_sa[],
557 enum dns_server_source source);
558
582 const char *servers_str[],
583 const struct sockaddr *servers_sa[],
584 int interfaces[],
585 enum dns_server_source source);
586
595int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index);
596
607int dns_resolve_remove_source(struct dns_resolve_context *ctx, int if_index,
608 enum dns_server_source source);
609
621 uint16_t dns_id);
622
636 uint16_t dns_id,
637 const char *query_name,
638 enum dns_query_type query_type);
639
668 const char *query,
669 enum dns_query_type type,
670 uint16_t *dns_id,
672 void *user_data,
673 int32_t timeout);
674
702static inline int dns_resolve_service(struct dns_resolve_context *ctx,
703 const char *query,
704 uint16_t *dns_id,
706 void *user_data,
707 int32_t timeout)
708{
709 return dns_resolve_name(ctx, query, DNS_QUERY_TYPE_PTR,
710 dns_id, cb, user_data, timeout);
711}
712
724
752static inline int dns_get_addr_info(const char *query,
753 enum dns_query_type type,
754 uint16_t *dns_id,
756 void *user_data,
757 int32_t timeout)
758{
760 query,
761 type,
762 dns_id,
763 cb,
764 user_data,
765 timeout);
766}
767
777static inline int dns_cancel_addr_info(uint16_t dns_id)
778{
780}
781
785
787
795const char *dns_get_source_str(enum dns_server_source source);
796
800#if defined(CONFIG_DNS_RESOLVER_AUTO_INIT)
801void dns_init_resolver(void);
802
803#else
804#define dns_init_resolver(...)
805#endif /* CONFIG_DNS_RESOLVER_AUTO_INIT */
806
808
809#ifdef __cplusplus
810}
811#endif
812
813#endif /* ZEPHYR_INCLUDE_NET_DNS_RESOLVE_H_ */
int dns_resolve_reconfigure_with_interfaces(struct dns_resolve_context *ctx, const char *servers_str[], const struct sockaddr *servers_sa[], int interfaces[], enum dns_server_source source)
Reconfigure DNS resolving context with new server list and allowing servers to be specified to a spec...
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:777
int dns_resolve_remove(struct dns_resolve_context *ctx, int if_index)
Remove servers from the DNS resolving context.
int dns_resolve_reconfigure(struct dns_resolve_context *ctx, const char *servers_str[], const struct sockaddr *servers_sa[], enum dns_server_source source)
Reconfigure DNS resolving context.
dns_resolve_status
Status values for the callback.
Definition dns_resolve.h:286
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.
int dns_resolve_close(struct dns_resolve_context *ctx)
Close DNS resolving context.
#define DNS_MAX_NAME_SIZE
Max size of the resolved name.
Definition dns_resolve.h:69
int dns_resolve_remove_source(struct dns_resolve_context *ctx, int if_index, enum dns_server_source source)
Remove servers from the DNS resolving context that were added by a specific source.
struct dns_resolve_context * dns_resolve_get_default(void)
Get default DNS context.
dns_server_source
Entity that added the DNS server.
Definition dns_resolve.h:50
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:702
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:752
void(* dns_resolve_cb_t)(enum dns_resolve_status status, struct dns_addrinfo *info, void *user_data)
DNS resolve callback.
Definition dns_resolve.h:342
@ DNS_EAI_MEMORY
Memory allocation failure.
Definition dns_resolve.h:306
@ DNS_EAI_NOTCANCELED
Request not canceled.
Definition dns_resolve.h:316
@ DNS_EAI_IDN_ENCODE
IDN encoding failed.
Definition dns_resolve.h:320
@ DNS_EAI_ADDRFAMILY
Address family for NAME not supported.
Definition dns_resolve.h:304
@ DNS_EAI_INPROGRESS
Processing request in progress.
Definition dns_resolve.h:312
@ DNS_EAI_FAIL
Non-recoverable failure in name res.
Definition dns_resolve.h:294
@ DNS_EAI_AGAIN
Temporary failure in name resolution.
Definition dns_resolve.h:292
@ DNS_EAI_NODATA
No address associated with NAME.
Definition dns_resolve.h:296
@ DNS_EAI_NONAME
NAME or SERVICE is unknown.
Definition dns_resolve.h:290
@ DNS_EAI_FAMILY
‘ai_family’ not supported
Definition dns_resolve.h:298
@ DNS_EAI_OVERFLOW
Argument buffer overflow.
Definition dns_resolve.h:310
@ DNS_EAI_CANCELED
Request canceled.
Definition dns_resolve.h:314
@ DNS_EAI_BADFLAGS
Invalid value for ‘ai_flags’ field.
Definition dns_resolve.h:288
@ DNS_EAI_SOCKTYPE
‘ai_socktype’ not supported
Definition dns_resolve.h:300
@ DNS_EAI_ALLDONE
All requests done.
Definition dns_resolve.h:318
@ DNS_EAI_SYSTEM
System error returned in ‘errno’.
Definition dns_resolve.h:308
@ DNS_EAI_SERVICE
SRV not supported for ‘ai_socktype’.
Definition dns_resolve.h:302
@ 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
@ DNS_SOURCE_MANUAL
Server information is added manually, for example by an application.
Definition dns_resolve.h:54
@ DNS_SOURCE_IPV6_RA
Server information is from IPv6 SLAAC (router advertisement)
Definition dns_resolve.h:60
@ DNS_SOURCE_DHCPV4
Server information is from DHCPv4 server.
Definition dns_resolve.h:56
@ DNS_SOURCE_UNKNOWN
Source is unknown.
Definition dns_resolve.h:52
@ DNS_SOURCE_PPP
Server information is from PPP.
Definition dns_resolve.h:62
@ DNS_SOURCE_DHCPV6
Server information is from DHCPv6 server.
Definition dns_resolve.h:58
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
#define STRINGIFY(s)
Definition common.h:165
Public kernel APIs.
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:272
char ai_canonname[20+1]
Canonical name of the address.
Definition dns_resolve.h:280
struct sockaddr ai_addr
IP address information.
Definition dns_resolve.h:274
socklen_t ai_addrlen
Length of the ai_addr field.
Definition dns_resolve.h:276
uint8_t ai_family
Address family of the address information.
Definition dns_resolve.h:278
Result callbacks.
Definition dns_resolve.h:408
const char * query
String containing the thing to resolve like www.example.com.
Definition dns_resolve.h:438
uint16_t query_hash
Hash of the DNS name + query type we are querying.
Definition dns_resolve.h:452
struct dns_resolve_context * ctx
Back pointer to ctx, needed in timeout handler.
Definition dns_resolve.h:413
void * user_data
User data.
Definition dns_resolve.h:422
struct k_work_delayable timer
Timeout timer.
Definition dns_resolve.h:410
uint16_t id
DNS id of this query.
Definition dns_resolve.h:444
k_timeout_t timeout
TX timeout.
Definition dns_resolve.h:425
dns_resolve_cb_t cb
Result callback.
Definition dns_resolve.h:419
enum dns_query_type query_type
Query type.
Definition dns_resolve.h:441
struct sockaddr dns_server
DNS server information.
Definition dns_resolve.h:364
enum dns_server_source source
Source of the DNS server, e.g., manual, DHCPv4/6, etc.
Definition dns_resolve.h:375
int if_index
Network interface index if the DNS resolving should be done via this interface.
Definition dns_resolve.h:372
int sock
Connection to the DNS server.
Definition dns_resolve.h:367
uint8_t is_mdns
Is this server mDNS one.
Definition dns_resolve.h:378
uint8_t is_llmnr
Is this server LLMNR one.
Definition dns_resolve.h:381
DNS resolve context structure.
Definition dns_resolve.h:360
k_timeout_t buf_timeout
This timeout is also used when a buffer is required from the buffer pools.
Definition dns_resolve.h:400
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:456
struct k_mutex lock
Prevent concurrent access.
Definition dns_resolve.h:395
Mutex Structure.
Definition kernel.h:3070
Kernel timeout type.
Definition clock.h:65
A structure used to submit work after a delay.
Definition kernel.h:4101
Network buffer representation.
Definition net_buf.h:1006
Generic sockaddr struct.
Definition net_ip.h:410
Definition of the monitored socket/file descriptor.
Definition socket_poll.h:31