diff --git a/doc/reference/networking/net_offload.rst b/doc/reference/networking/net_offload.rst index 015b3ef6d48..bc69a8d8425 100644 --- a/doc/reference/networking/net_offload.rst +++ b/doc/reference/networking/net_offload.rst @@ -39,9 +39,3 @@ networking devices, can easily integrate it with Zephyr. See :zephyr_file:`drivers/wifi/simplelink/simplelink_sockets.c` for a sample implementation on how to integrate network offloading at socket level. - -API Reference -************* - -.. doxygengroup:: socket_offload - :project: Zephyr diff --git a/include/net/socket.h b/include/net/socket.h index ed852044cf6..6384ed66738 100644 --- a/include/net/socket.h +++ b/include/net/socket.h @@ -507,10 +507,7 @@ int zsock_getaddrinfo(const char *host, const char *service, * if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined. * @endrst */ -static inline void zsock_freeaddrinfo(struct zsock_addrinfo *ai) -{ - free(ai); -} +void zsock_freeaddrinfo(struct zsock_addrinfo *ai); /** * @brief Convert zsock_getaddrinfo() error code to textual message @@ -564,7 +561,6 @@ int zsock_getnameinfo(const struct sockaddr *addr, socklen_t addrlen, #define pollfd zsock_pollfd -#if !defined(CONFIG_NET_SOCKETS_OFFLOAD) static inline int socket(int family, int type, int proto) { return zsock_socket(family, type, proto); @@ -693,42 +689,12 @@ static inline int inet_pton(sa_family_t family, const char *src, void *dst) return zsock_inet_pton(family, src, dst); } -#else - -struct addrinfo { - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - socklen_t ai_addrlen; - struct sockaddr *ai_addr; - char *ai_canonname; - struct addrinfo *ai_next; -}; - -/* Legacy case: retain containing extern "C" with C++ - * - * This header requires aliases defined within this file, and can't - * easily be moved to the top. - */ -#include - -static inline int inet_pton(sa_family_t family, const char *src, void *dst) +static inline char *inet_ntop(sa_family_t family, const void *src, char *dst, + size_t size) { - if ((family != AF_INET) && (family != AF_INET6)) { - errno = EAFNOSUPPORT; - return -1; - } - - if (net_addr_pton(family, src, dst) == 0) { - return 1; - } else { - return 0; - } + return zsock_inet_ntop(family, src, dst, size); } -#endif /* !defined(CONFIG_NET_SOCKETS_OFFLOAD) */ - #define POLLIN ZSOCK_POLLIN #define POLLOUT ZSOCK_POLLOUT #define POLLERR ZSOCK_POLLERR @@ -742,12 +708,6 @@ static inline int inet_pton(sa_family_t family, const char *src, void *dst) #define SHUT_WR ZSOCK_SHUT_WR #define SHUT_RDWR ZSOCK_SHUT_RDWR -static inline char *inet_ntop(sa_family_t family, const void *src, char *dst, - size_t size) -{ - return zsock_inet_ntop(family, src, dst, size); -} - #define EAI_BADFLAGS DNS_EAI_BADFLAGS #define EAI_NONAME DNS_EAI_NONAME #define EAI_AGAIN DNS_EAI_AGAIN diff --git a/include/net/socket_offload.h b/include/net/socket_offload.h index 18f6359f07b..39da2bd71b6 100644 --- a/include/net/socket_offload.h +++ b/include/net/socket_offload.h @@ -12,153 +12,38 @@ #ifndef ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_H_ #define ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_H_ -#include +#include +#include #ifdef __cplusplus extern "C" { #endif -extern const struct socket_offload *socket_ops; +/** + * @brief An offloaded Socket DNS API interface + * + * It is assumed that these offload functions follow the + * POSIX socket API standard for arguments, return values and setting of errno. + */ +struct socket_dns_offload { + int (*getaddrinfo)(const char *node, const char *service, + const struct zsock_addrinfo *hints, + struct zsock_addrinfo **res); + void (*freeaddrinfo)(struct zsock_addrinfo *res); +}; -static inline int socket(int family, int type, int proto) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->socket); +/** + * @brief Register an offloaded socket DNS API interface. + * + * @param ops A pointer to the offloaded socket DNS API interface. + */ +void socket_offload_dns_register(const struct socket_dns_offload *ops); - return socket_ops->socket(family, type, proto); -} +int socket_offload_getaddrinfo(const char *node, const char *service, + const struct zsock_addrinfo *hints, + struct zsock_addrinfo **res); -static inline int close(int sock) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->close); - - return socket_ops->close(sock); -} - -static inline int accept(int sock, struct sockaddr *addr, - socklen_t *addrlen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->accept); - - return socket_ops->accept(sock, addr, addrlen); -} - - -static inline int bind(int sock, const struct sockaddr *addr, - socklen_t addrlen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->bind); - - return socket_ops->bind(sock, addr, addrlen); -} - -static inline int listen(int sock, int backlog) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->listen); - - return socket_ops->listen(sock, backlog); -} - -static inline int connect(int sock, const struct sockaddr *addr, - socklen_t addrlen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->connect); - - return socket_ops->connect(sock, addr, addrlen); -} - -static inline int poll(struct pollfd *fds, int nfds, int timeout) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->poll); - - return socket_ops->poll(fds, nfds, timeout); -} - -static inline int setsockopt(int sock, int level, int optname, - const void *optval, - socklen_t optlen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->setsockopt); - - return socket_ops->setsockopt(sock, level, optname, optval, optlen); -} - -static inline int getsockopt(int sock, int level, int optname, - void *optval, socklen_t *optlen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->getsockopt); - - return socket_ops->getsockopt(sock, level, optname, optval, optlen); -} - -static inline ssize_t recv(int sock, void *buf, size_t max_len, - int flags) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->recv); - - return socket_ops->recv(sock, buf, max_len, flags); -} - -static inline ssize_t recvfrom(int sock, void *buf, - short int len, - short int flags, - struct sockaddr *from, - socklen_t *fromlen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->recvfrom); - - return socket_ops->recvfrom(sock, buf, len, flags, from, fromlen); -} - -static inline ssize_t send(int sock, const void *buf, size_t len, - int flags) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->send); - - return socket_ops->send(sock, buf, len, flags); -} - -static inline ssize_t sendto(int sock, const void *buf, - size_t len, int flags, - const struct sockaddr *to, - socklen_t tolen) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->sendto); - - return socket_ops->sendto(sock, buf, len, flags, to, tolen); -} - -static inline int getaddrinfo(const char *node, const char *service, - const struct addrinfo *hints, - struct addrinfo **res) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->getaddrinfo); - - return socket_ops->getaddrinfo(node, service, hints, res); -} - -static inline void freeaddrinfo(struct addrinfo *res) -{ - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->freeaddrinfo); - - return socket_ops->freeaddrinfo(res); -} - -int fcntl(int fd, int cmd, ...); +void socket_offload_freeaddrinfo(struct zsock_addrinfo *res); #ifdef __cplusplus } diff --git a/include/net/socket_offload_ops.h b/include/net/socket_offload_ops.h deleted file mode 100644 index aff12c9a1d1..00000000000 --- a/include/net/socket_offload_ops.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2018 Linaro Limited. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @file - * @brief Socket Offload Redirect API - */ - -#ifndef ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_OPS_H_ -#define ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_OPS_H_ - -#include -#include -#include /* needed for struct pollfd */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Socket Offload Redirect API - * @defgroup socket_offload Socket offloading interface - * @ingroup networking - * @{ - */ - -/** - * @brief An offloaded Socket API interface - * - * It is assumed that these offload functions follow the - * POSIX socket API standard for arguments, return values and setting of errno. - */ -struct socket_offload { - /* POSIX Socket Functions: */ - int (*socket)(int family, int type, int proto); - int (*close)(int sock); - int (*accept)(int sock, struct sockaddr *addr, socklen_t *addrlen); - int (*bind)(int sock, const struct sockaddr *addr, socklen_t addrlen); - int (*listen)(int sock, int backlog); - int (*connect)(int sock, const struct sockaddr *addr, - socklen_t addrlen); - int (*poll)(struct pollfd *fds, int nfds, int timeout); - int (*setsockopt)(int sock, int level, int optname, - const void *optval, socklen_t optlen); - int (*getsockopt)(int sock, int level, int optname, void *optval, - socklen_t *optlen); - ssize_t (*recv)(int sock, void *buf, size_t max_len, int flags); - ssize_t (*recvfrom)(int sock, void *buf, short int len, - short int flags, struct sockaddr *from, - socklen_t *fromlen); - ssize_t (*send)(int sock, const void *buf, size_t len, int flags); - ssize_t (*sendto)(int sock, const void *buf, size_t len, int flags, - const struct sockaddr *to, socklen_t tolen); - int (*getaddrinfo)(const char *node, const char *service, - const struct addrinfo *hints, - struct addrinfo **res); - void (*freeaddrinfo)(struct addrinfo *res); - int (*fcntl)(int fd, int cmd, va_list args); -}; - -/** - * @brief Register an offloaded socket API interface. - * - * @param ops A pointer to the offloaded socket API interface. - */ -extern void socket_offload_register(const struct socket_offload *ops); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_OPS_H_ */ diff --git a/subsys/net/lib/sockets/CMakeLists.txt b/subsys/net/lib/sockets/CMakeLists.txt index bb33a41d044..c61620e496f 100644 --- a/subsys/net/lib/sockets/CMakeLists.txt +++ b/subsys/net/lib/sockets/CMakeLists.txt @@ -2,12 +2,15 @@ zephyr_include_directories(.) -if(NOT CONFIG_NET_SOCKETS_OFFLOAD) zephyr_sources( getaddrinfo.c - getnameinfo.c sockets.c +) + +if(NOT CONFIG_NET_SOCKETS_OFFLOAD) +zephyr_sources( sockets_select.c + getnameinfo.c sockets_misc.c ) zephyr_sources_ifdef(CONFIG_NET_SOCKETS_SOCKOPT_TLS sockets_tls.c) diff --git a/subsys/net/lib/sockets/getaddrinfo.c b/subsys/net/lib/sockets/getaddrinfo.c index 6adc638cece..0b3e2cfb043 100644 --- a/subsys/net/lib/sockets/getaddrinfo.c +++ b/subsys/net/lib/sockets/getaddrinfo.c @@ -14,6 +14,7 @@ LOG_MODULE_REGISTER(net_sock_addr, CONFIG_NET_SOCKETS_LOG_LEVEL); #include #include +#include #include #define AI_ARR_MAX 2 @@ -320,10 +321,17 @@ out: #include #endif /* CONFIG_USERSPACE */ +#endif /* defined(CONFIG_DNS_RESOLVER) */ + int zsock_getaddrinfo(const char *host, const char *service, const struct zsock_addrinfo *hints, struct zsock_addrinfo **res) { + if (IS_ENABLED(CONFIG_NET_SOCKETS_OFFLOAD)) { + return socket_offload_getaddrinfo(host, service, hints, res); + } + +#if defined(CONFIG_DNS_RESOLVER) int ret; *res = calloc(AI_ARR_MAX, sizeof(struct zsock_addrinfo)); @@ -336,6 +344,18 @@ int zsock_getaddrinfo(const char *host, const char *service, *res = NULL; } return ret; +#endif + + return DNS_EAI_FAIL; +} + +void zsock_freeaddrinfo(struct zsock_addrinfo *ai) +{ + if (IS_ENABLED(CONFIG_NET_SOCKETS_OFFLOAD)) { + return socket_offload_freeaddrinfo(ai); + } + + free(ai); } #define ERR(e) case DNS_ ## e: return #e @@ -356,5 +376,3 @@ const char *zsock_gai_strerror(int errcode) } } #undef ERR - -#endif diff --git a/subsys/net/lib/sockets/socket_offload.c b/subsys/net/lib/sockets/socket_offload.c index ed12c0433a8..843f8c0f922 100644 --- a/subsys/net/lib/sockets/socket_offload.c +++ b/subsys/net/lib/sockets/socket_offload.c @@ -8,29 +8,34 @@ LOG_MODULE_REGISTER(net_socket_offload, CONFIG_NET_SOCKETS_LOG_LEVEL); #include +#include -/* Only one provider may register socket operations upon boot. */ -const struct socket_offload *socket_ops; +#include "sockets_internal.h" -void socket_offload_register(const struct socket_offload *ops) +const struct socket_dns_offload *dns_offload; + +void socket_offload_dns_register(const struct socket_dns_offload *ops) { __ASSERT_NO_MSG(ops); - __ASSERT_NO_MSG(socket_ops == NULL); + __ASSERT_NO_MSG(dns_offload == NULL); - socket_ops = ops; + dns_offload = ops; } -int fcntl(int fd, int cmd, ...) +int socket_offload_getaddrinfo(const char *node, const char *service, + const struct zsock_addrinfo *hints, + struct zsock_addrinfo **res) { - __ASSERT_NO_MSG(socket_ops); - __ASSERT_NO_MSG(socket_ops->fcntl); + __ASSERT_NO_MSG(dns_offload); + __ASSERT_NO_MSG(dns_offload->getaddrinfo); - va_list args; - int res; - - va_start(args, cmd); - res = socket_ops->fcntl(fd, cmd, args); - va_end(args); - - return res; + return dns_offload->getaddrinfo(node, service, hints, res); +} + +void socket_offload_freeaddrinfo(struct zsock_addrinfo *res) +{ + __ASSERT_NO_MSG(dns_offload); + __ASSERT_NO_MSG(dns_offload->freeaddrinfo); + + return dns_offload->freeaddrinfo(res); } diff --git a/subsys/net/lib/sockets/sockets.c b/subsys/net/lib/sockets/sockets.c index 14beb9f6fa1..50d6f0ef318 100644 --- a/subsys/net/lib/sockets/sockets.c +++ b/subsys/net/lib/sockets/sockets.c @@ -164,7 +164,12 @@ int z_impl_zsock_socket(int family, int type, int proto) return sock_family->handler(family, type, proto); } - return zsock_socket_internal(family, type, proto); + if (IS_ENABLED(CONFIG_NET_NATIVE)) { + return zsock_socket_internal(family, type, proto); + } + + errno = EAFNOSUPPORT; + return -1; } #ifdef CONFIG_USERSPACE