1 /*
2  * Copyright (c) 2018 Linaro Limited.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief Socket Offload Redirect API
10  */
11 
12 #ifndef ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_H_
13 #define ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_H_
14 
15 #include <zephyr/net/net_ip.h>
16 #include <zephyr/net/socket.h>
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /**
23  * @brief An offloaded Socket DNS API interface
24  *
25  * It is assumed that these offload functions follow the
26  * POSIX socket API standard for arguments, return values and setting of errno.
27  */
28 struct socket_dns_offload {
29 	/** DNS getaddrinfo offloaded implementation API */
30 	int (*getaddrinfo)(const char *node, const char *service,
31 			   const struct zsock_addrinfo *hints,
32 			   struct zsock_addrinfo **res);
33 	/** DNS freeaddrinfo offloaded implementation API */
34 	void (*freeaddrinfo)(struct zsock_addrinfo *res);
35 };
36 
37 /**
38  * @brief Register an offloaded socket DNS API interface.
39  *
40  * @param ops A pointer to the offloaded socket DNS API interface.
41  */
42 void socket_offload_dns_register(const struct socket_dns_offload *ops);
43 
44 /**
45  * @brief Deregister an offloaded socket DNS API interface.
46  *
47  * @param ops A pointer to the offloaded socket DNS API interface.
48  *
49  * @retval 0 On success
50  * @retval -EINVAL Offloaded DNS API was not regsitered.
51  */
52 int socket_offload_dns_deregister(const struct socket_dns_offload *ops);
53 
54 /**
55  * @brief Enable/disable DNS offloading at runtime.
56  *
57  * @param enable Whether to enable or disable the DNS offloading.
58  */
59 void socket_offload_dns_enable(bool enable);
60 
61 /**
62  * @brief Check if DNS offloading is enabled.
63  *
64  * @retval true DNS offloaded API is registered and enabled.
65  * @retval false DNS offloading is disabled.
66  */
67 #if defined(CONFIG_NET_SOCKETS_OFFLOAD)
68 bool socket_offload_dns_is_enabled(void);
69 #else
70 #define socket_offload_dns_is_enabled() false
71 #endif /* defined(CONFIG_NET_SOCKETS_OFFLOAD) */
72 
73 
74 /** @cond INTERNAL_HIDDEN */
75 
76 int socket_offload_getaddrinfo(const char *node, const char *service,
77 			       const struct zsock_addrinfo *hints,
78 			       struct zsock_addrinfo **res);
79 
80 void socket_offload_freeaddrinfo(struct zsock_addrinfo *res);
81 
82 /** @endcond */
83 
84 #ifdef __cplusplus
85 }
86 #endif
87 
88 #endif /* ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_H_ */
89