The previous patch left some include directives hidden within the body of the extern "C" block. Lift them out to the top of the file where they're more visible. Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
816 lines
22 KiB
C
816 lines
22 KiB
C
/**
|
|
* @file
|
|
* @brief BSD Sockets compatible API definitions
|
|
*
|
|
* An API for applications to use BSD Sockets like API.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2017-2018 Linaro Limited
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_NET_SOCKET_H_
|
|
#define ZEPHYR_INCLUDE_NET_SOCKET_H_
|
|
|
|
/**
|
|
* @brief BSD Sockets compatible API
|
|
* @defgroup bsd_sockets BSD Sockets compatible API
|
|
* @ingroup networking
|
|
* @{
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <zephyr/types.h>
|
|
#include <net/net_ip.h>
|
|
#include <net/dns_resolve.h>
|
|
#include <net/socket_select.h>
|
|
#include <stdlib.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct zsock_pollfd {
|
|
int fd;
|
|
short events;
|
|
short revents;
|
|
};
|
|
|
|
/* ZSOCK_POLL* values are compatible with Linux */
|
|
/** zsock_poll: Poll for readability */
|
|
#define ZSOCK_POLLIN 1
|
|
/** zsock_poll: Compatibility value, ignored */
|
|
#define ZSOCK_POLLPRI 2
|
|
/** zsock_poll: Poll for writability */
|
|
#define ZSOCK_POLLOUT 4
|
|
/** zsock_poll: Poll results in error condition (output value only) */
|
|
#define ZSOCK_POLLERR 8
|
|
/** zsock_poll: Poll detected closed connection (output value only) */
|
|
#define ZSOCK_POLLHUP 0x10
|
|
/** zsock_poll: Invalid socket (output value only) */
|
|
#define ZSOCK_POLLNVAL 0x20
|
|
|
|
/** zsock_recv: Read data without removing it from socket input queue */
|
|
#define ZSOCK_MSG_PEEK 0x02
|
|
/** zsock_recv/zsock_send: Override operation to non-blocking */
|
|
#define ZSOCK_MSG_DONTWAIT 0x40
|
|
|
|
/* Well-known values, e.g. from Linux man 2 shutdown:
|
|
* "The constants SHUT_RD, SHUT_WR, SHUT_RDWR have the value 0, 1, 2,
|
|
* respectively". Some software uses numeric values.
|
|
*/
|
|
/** zsock_shutdown: Shut down for reading */
|
|
#define ZSOCK_SHUT_RD 0
|
|
/** zsock_shutdown: Shut down for writing */
|
|
#define ZSOCK_SHUT_WR 1
|
|
/** zsock_shutdown: Shut down for both reading and writing */
|
|
#define ZSOCK_SHUT_RDWR 2
|
|
|
|
/** Protocol level for TLS.
|
|
* Here, the same socket protocol level for TLS as in Linux was used.
|
|
*/
|
|
#define SOL_TLS 282
|
|
|
|
/**
|
|
* @defgroup secure_sockets_options Socket options for TLS
|
|
* @{
|
|
*/
|
|
|
|
/** Socket option to select TLS credentials to use. It accepts and returns an
|
|
* array of sec_tag_t that indicate which TLS credentials should be used with
|
|
* specific socket.
|
|
*/
|
|
#define TLS_SEC_TAG_LIST 1
|
|
/** Write-only socket option to set hostname. It accepts a string containing
|
|
* the hostname (may be NULL to disable hostname verification). By default,
|
|
* hostname check is enforced for TLS clients.
|
|
*/
|
|
#define TLS_HOSTNAME 2
|
|
/** Socket option to select ciphersuites to use. It accepts and returns an array
|
|
* of integers with IANA assigned ciphersuite identifiers.
|
|
* If not set, socket will allow all ciphersuites available in the system
|
|
* (mebdTLS default behavior).
|
|
*/
|
|
#define TLS_CIPHERSUITE_LIST 3
|
|
/** Read-only socket option to read a ciphersuite chosen during TLS handshake.
|
|
* It returns an integer containing an IANA assigned ciphersuite identifier
|
|
* of chosen ciphersuite.
|
|
*/
|
|
#define TLS_CIPHERSUITE_USED 4
|
|
/** Write-only socket option to set peer verification level for TLS connection.
|
|
* This option accepts an integer with a peer verification level, compatible
|
|
* with mbedTLS values:
|
|
* - 0 - none
|
|
* - 1 - optional
|
|
* - 2 - required
|
|
*
|
|
* If not set, socket will use mbedTLS defaults (none for servers, required
|
|
* for clients).
|
|
*/
|
|
#define TLS_PEER_VERIFY 5
|
|
/** Write-only socket option to set role for DTLS connection. This option
|
|
* is irrelevant for TLS connections, as for them role is selected based on
|
|
* connect()/listen() usage. By default, DTLS will assume client role.
|
|
* This option accepts an integer with a TLS role, compatible with
|
|
* mbedTLS values:
|
|
* - 0 - client
|
|
* - 1 - server
|
|
*/
|
|
#define TLS_DTLS_ROLE 6
|
|
|
|
/** @} */
|
|
|
|
struct zsock_addrinfo {
|
|
struct zsock_addrinfo *ai_next;
|
|
int ai_flags;
|
|
int ai_family;
|
|
int ai_socktype;
|
|
int ai_protocol;
|
|
socklen_t ai_addrlen;
|
|
struct sockaddr *ai_addr;
|
|
char *ai_canonname;
|
|
|
|
struct sockaddr _ai_addr;
|
|
char _ai_canonname[DNS_MAX_NAME_SIZE + 1];
|
|
};
|
|
|
|
/**
|
|
* @brief Create a network socket
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/socket.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``socket()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_socket(int family, int type, int proto);
|
|
|
|
/**
|
|
* @brief Close a network socket
|
|
*
|
|
* @details
|
|
* @rst
|
|
* Close a network socket.
|
|
* This function is also exposed as ``close()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined (in which case it
|
|
* may conflict with generic POSIX ``close()`` function).
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_close(int sock);
|
|
|
|
/**
|
|
* @brief Shutdown socket send/receive operations
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/shutdown.html>`__
|
|
* for normative description, but currently this function has no effect in
|
|
* Zephyr and provided solely for compatibility with existing code.
|
|
* This function is also exposed as ``shutdown()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_shutdown(int sock, int how);
|
|
|
|
/**
|
|
* @brief Bind a socket to a local network address
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``bind()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_bind(int sock, const struct sockaddr *addr,
|
|
socklen_t addrlen);
|
|
|
|
/**
|
|
* @brief Connect a socket to a peer network address
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``connect()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_connect(int sock, const struct sockaddr *addr,
|
|
socklen_t addrlen);
|
|
|
|
/**
|
|
* @brief Set up a STREAM socket to accept peer connections
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/listen.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``listen()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_listen(int sock, int backlog);
|
|
|
|
/**
|
|
* @brief Accept a connection on listening socket
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``accept()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
|
|
|
|
/**
|
|
* @brief Send data to an arbitrary network address
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``sendto()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall ssize_t zsock_sendto(int sock, const void *buf, size_t len,
|
|
int flags, const struct sockaddr *dest_addr,
|
|
socklen_t addrlen);
|
|
|
|
/**
|
|
* @brief Send data to a connected peer
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``send()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
static inline ssize_t zsock_send(int sock, const void *buf, size_t len,
|
|
int flags)
|
|
{
|
|
return zsock_sendto(sock, buf, len, flags, NULL, 0);
|
|
}
|
|
|
|
/**
|
|
* @brief Send data to an arbitrary network address
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``sendmsg()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall ssize_t zsock_sendmsg(int sock, const struct msghdr *msg,
|
|
int flags);
|
|
|
|
/**
|
|
* @brief Receive data from an arbitrary network address
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``recvfrom()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall ssize_t zsock_recvfrom(int sock, void *buf, size_t max_len,
|
|
int flags, struct sockaddr *src_addr,
|
|
socklen_t *addrlen);
|
|
|
|
/**
|
|
* @brief Receive data from a connected peer
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/recv.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``recv()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
static inline ssize_t zsock_recv(int sock, void *buf, size_t max_len,
|
|
int flags)
|
|
{
|
|
return zsock_recvfrom(sock, buf, max_len, flags, NULL, NULL);
|
|
}
|
|
|
|
/**
|
|
* @brief Control blocking/non-blocking mode of a socket
|
|
*
|
|
* @details
|
|
* @rst
|
|
* This functions allow to (only) configure a socket for blocking or
|
|
* non-blocking operation (O_NONBLOCK).
|
|
* This function is also exposed as ``fcntl()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined (in which case
|
|
* it may conflict with generic POSIX ``fcntl()`` function).
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_fcntl(int sock, int cmd, int flags);
|
|
|
|
/**
|
|
* @brief Efficiently poll multiple sockets for events
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html>`__
|
|
* for normative description. (In Zephyr this function works only with
|
|
* sockets, not arbitrary file descriptors.)
|
|
* This function is also exposed as ``poll()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined (in which case
|
|
* it may conflict with generic POSIX ``poll()`` function).
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_poll(struct zsock_pollfd *fds, int nfds, int timeout);
|
|
|
|
/**
|
|
* @brief Get various socket options
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html>`__
|
|
* for normative description. In Zephyr this function supports a subset of
|
|
* socket options described by POSIX, but also some additional options
|
|
* available in Linux (some options are dummy and provided to ease porting
|
|
* of existing code).
|
|
* This function is also exposed as ``getsockopt()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_getsockopt(int sock, int level, int optname,
|
|
void *optval, socklen_t *optlen);
|
|
|
|
/**
|
|
* @brief Set various socket options
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html>`__
|
|
* for normative description. In Zephyr this function supports a subset of
|
|
* socket options described by POSIX, but also some additional options
|
|
* available in Linux (some options are dummy and provided to ease porting
|
|
* of existing code).
|
|
* This function is also exposed as ``setsockopt()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_setsockopt(int sock, int level, int optname,
|
|
const void *optval, socklen_t optlen);
|
|
|
|
/**
|
|
* @brief Get socket name
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockname.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``getsockname()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_getsockname(int sock, struct sockaddr *addr,
|
|
socklen_t *addrlen);
|
|
|
|
/**
|
|
* @brief Get local host name
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/gethostname.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``gethostname()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_gethostname(char *buf, size_t len);
|
|
|
|
/**
|
|
* @brief Convert network address from internal to numeric ASCII form
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``inet_ntop()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
static inline char *zsock_inet_ntop(sa_family_t family, const void *src,
|
|
char *dst, size_t size)
|
|
{
|
|
return net_addr_ntop(family, src, dst, size);
|
|
}
|
|
|
|
/**
|
|
* @brief Convert network address from numeric ASCII form to internal representation
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_pton.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``inet_pton()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
__syscall int zsock_inet_pton(sa_family_t family, const char *src, void *dst);
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
__syscall int z_zsock_getaddrinfo_internal(const char *host,
|
|
const char *service,
|
|
const struct zsock_addrinfo *hints,
|
|
struct zsock_addrinfo *res);
|
|
/** @endcond */
|
|
|
|
/* Flags for getaddrinfo() hints. */
|
|
|
|
/** Address for bind() (vs for connect()) */
|
|
#define AI_PASSIVE 0x1
|
|
/** Fill in ai_canonname */
|
|
#define AI_CANONNAME 0x2
|
|
/** Assume host address is in numeric notation, don't DNS lookup */
|
|
#define AI_NUMERICHOST 0x4
|
|
/** May return IPv4 mapped address for IPv6 */
|
|
#define AI_V4MAPPED 0x8
|
|
/** May return both native IPv6 and mapped IPv4 address for IPv6 */
|
|
#define AI_ALL 0x10
|
|
/** IPv4/IPv6 support depends on local system config */
|
|
#define AI_ADDRCONFIG 0x20
|
|
/** Assume service (port) is numeric */
|
|
#define AI_NUMERICSERV 0x400
|
|
|
|
/**
|
|
* @brief Resolve a domain name to one or more network addresses
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``getaddrinfo()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
int zsock_getaddrinfo(const char *host, const char *service,
|
|
const struct zsock_addrinfo *hints,
|
|
struct zsock_addrinfo **res);
|
|
|
|
/**
|
|
* @brief Free results returned by zsock_getaddrinfo()
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``freeaddrinfo()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
static inline void zsock_freeaddrinfo(struct zsock_addrinfo *ai)
|
|
{
|
|
free(ai);
|
|
}
|
|
|
|
/**
|
|
* @brief Convert zsock_getaddrinfo() error code to textual message
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/gai_strerror.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``gai_strerror()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
const char *zsock_gai_strerror(int errcode);
|
|
|
|
/** zsock_getnameinfo(): Resolve to numeric address. */
|
|
#define NI_NUMERICHOST 1
|
|
/** zsock_getnameinfo(): Resolve to numeric port number. */
|
|
#define NI_NUMERICSERV 2
|
|
/** zsock_getnameinfo(): Return only hostname instead of FQDN */
|
|
#define NI_NOFQDN 4
|
|
/** zsock_getnameinfo(): Dummy option for compatibility */
|
|
#define NI_NAMEREQD 8
|
|
/** zsock_getnameinfo(): Dummy option for compatibility */
|
|
#define NI_DGRAM 16
|
|
|
|
/* POSIX extensions */
|
|
|
|
/** zsock_getnameinfo(): Max supported hostname length */
|
|
#ifndef NI_MAXHOST
|
|
#define NI_MAXHOST 64
|
|
#endif
|
|
|
|
/**
|
|
* @brief Resolve a network address to a domain name or ASCII address
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``getnameinfo()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
int zsock_getnameinfo(const struct sockaddr *addr, socklen_t addrlen,
|
|
char *host, socklen_t hostlen,
|
|
char *serv, socklen_t servlen, int flags);
|
|
|
|
#if defined(CONFIG_NET_SOCKETS_POSIX_NAMES)
|
|
|
|
#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);
|
|
}
|
|
|
|
static inline int close(int sock)
|
|
{
|
|
return zsock_close(sock);
|
|
}
|
|
|
|
static inline int shutdown(int sock, int how)
|
|
{
|
|
return zsock_shutdown(sock, how);
|
|
}
|
|
|
|
static inline int bind(int sock, const struct sockaddr *addr, socklen_t addrlen)
|
|
{
|
|
return zsock_bind(sock, addr, addrlen);
|
|
}
|
|
|
|
static inline int connect(int sock, const struct sockaddr *addr,
|
|
socklen_t addrlen)
|
|
{
|
|
return zsock_connect(sock, addr, addrlen);
|
|
}
|
|
|
|
static inline int listen(int sock, int backlog)
|
|
{
|
|
return zsock_listen(sock, backlog);
|
|
}
|
|
|
|
static inline int accept(int sock, struct sockaddr *addr, socklen_t *addrlen)
|
|
{
|
|
return zsock_accept(sock, addr, addrlen);
|
|
}
|
|
|
|
static inline ssize_t send(int sock, const void *buf, size_t len, int flags)
|
|
{
|
|
return zsock_send(sock, buf, len, flags);
|
|
}
|
|
|
|
static inline ssize_t recv(int sock, void *buf, size_t max_len, int flags)
|
|
{
|
|
return zsock_recv(sock, buf, max_len, flags);
|
|
}
|
|
|
|
/* This conflicts with fcntl.h, so code must include fcntl.h before socket.h: */
|
|
#define fcntl zsock_fcntl
|
|
|
|
static inline ssize_t sendto(int sock, const void *buf, size_t len, int flags,
|
|
const struct sockaddr *dest_addr,
|
|
socklen_t addrlen)
|
|
{
|
|
return zsock_sendto(sock, buf, len, flags, dest_addr, addrlen);
|
|
}
|
|
|
|
static inline ssize_t sendmsg(int sock, const struct msghdr *message,
|
|
int flags)
|
|
{
|
|
return zsock_sendmsg(sock, message, flags);
|
|
}
|
|
|
|
static inline ssize_t recvfrom(int sock, void *buf, size_t max_len, int flags,
|
|
struct sockaddr *src_addr, socklen_t *addrlen)
|
|
{
|
|
return zsock_recvfrom(sock, buf, max_len, flags, src_addr, addrlen);
|
|
}
|
|
|
|
static inline int poll(struct zsock_pollfd *fds, int nfds, int timeout)
|
|
{
|
|
return zsock_poll(fds, nfds, timeout);
|
|
}
|
|
|
|
static inline int getsockopt(int sock, int level, int optname,
|
|
void *optval, socklen_t *optlen)
|
|
{
|
|
return zsock_getsockopt(sock, level, optname, optval, optlen);
|
|
}
|
|
|
|
static inline int setsockopt(int sock, int level, int optname,
|
|
const void *optval, socklen_t optlen)
|
|
{
|
|
return zsock_setsockopt(sock, level, optname, optval, optlen);
|
|
}
|
|
|
|
static inline int getsockname(int sock, struct sockaddr *addr,
|
|
socklen_t *addrlen)
|
|
{
|
|
return zsock_getsockname(sock, addr, addrlen);
|
|
}
|
|
|
|
static inline int getaddrinfo(const char *host, const char *service,
|
|
const struct zsock_addrinfo *hints,
|
|
struct zsock_addrinfo **res)
|
|
{
|
|
return zsock_getaddrinfo(host, service, hints, res);
|
|
}
|
|
|
|
static inline void freeaddrinfo(struct zsock_addrinfo *ai)
|
|
{
|
|
zsock_freeaddrinfo(ai);
|
|
}
|
|
|
|
static inline const char *gai_strerror(int errcode)
|
|
{
|
|
return zsock_gai_strerror(errcode);
|
|
}
|
|
|
|
static inline int getnameinfo(const struct sockaddr *addr, socklen_t addrlen,
|
|
char *host, socklen_t hostlen,
|
|
char *serv, socklen_t servlen, int flags)
|
|
{
|
|
return zsock_getnameinfo(addr, addrlen, host, hostlen,
|
|
serv, servlen, flags);
|
|
}
|
|
|
|
#define addrinfo zsock_addrinfo
|
|
|
|
static inline int gethostname(char *buf, size_t len)
|
|
{
|
|
return zsock_gethostname(buf, len);
|
|
}
|
|
|
|
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 <net/socket_offload.h>
|
|
|
|
static inline int inet_pton(sa_family_t family, const char *src, void *dst)
|
|
{
|
|
if ((family != AF_INET) && (family != AF_INET6)) {
|
|
errno = EAFNOSUPPORT;
|
|
return -1;
|
|
}
|
|
|
|
if (net_addr_pton(family, src, dst) == 0) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
#endif /* !defined(CONFIG_NET_SOCKETS_OFFLOAD) */
|
|
|
|
#define POLLIN ZSOCK_POLLIN
|
|
#define POLLOUT ZSOCK_POLLOUT
|
|
#define POLLERR ZSOCK_POLLERR
|
|
#define POLLHUP ZSOCK_POLLHUP
|
|
#define POLLNVAL ZSOCK_POLLNVAL
|
|
|
|
#define MSG_PEEK ZSOCK_MSG_PEEK
|
|
#define MSG_DONTWAIT ZSOCK_MSG_DONTWAIT
|
|
|
|
#define SHUT_RD ZSOCK_SHUT_RD
|
|
#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
|
|
#define EAI_FAIL DNS_EAI_FAIL
|
|
#define EAI_NODATA DNS_EAI_NODATA
|
|
#define EAI_MEMORY DNS_EAI_MEMORY
|
|
#define EAI_SYSTEM DNS_EAI_SYSTEM
|
|
#define EAI_SERVICE DNS_EAI_SERVICE
|
|
#endif /* defined(CONFIG_NET_SOCKETS_POSIX_NAMES) */
|
|
|
|
/** sockopt: Socket-level option */
|
|
#define SOL_SOCKET 1
|
|
|
|
/* Socket options for SOL_SOCKET level */
|
|
/** sockopt: Enable server address reuse (ignored, for compatibility) */
|
|
#define SO_REUSEADDR 2
|
|
/** sockopt: Async error (ignored, for compatibility) */
|
|
#define SO_ERROR 4
|
|
|
|
/** sockopt: Timestamp TX packets */
|
|
#define SO_TIMESTAMPING 37
|
|
|
|
/* Socket options for IPPROTO_TCP level */
|
|
/** sockopt: Disable TCP buffering (ignored, for compatibility) */
|
|
#define TCP_NODELAY 1
|
|
|
|
/* Socket options for IPPROTO_IPV6 level */
|
|
/** sockopt: Don't support IPv4 access (ignored, for compatibility) */
|
|
#define IPV6_V6ONLY 26
|
|
|
|
/** sockopt: Socket priority */
|
|
#define SO_PRIORITY 12
|
|
|
|
/** sockopt: Socket TX time (when the data should be sent) */
|
|
#define SO_TXTIME 61
|
|
#define SCM_TXTIME SO_TXTIME
|
|
|
|
/* Socket options for SOCKS5 proxy */
|
|
/** sockopt: Enable SOCKS5 for Socket */
|
|
#define SO_SOCKS5 60
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
/**
|
|
* @brief Registration information for a given BSD socket family.
|
|
*/
|
|
struct net_socket_register {
|
|
int family;
|
|
bool (*is_supported)(int family, int type, int proto);
|
|
int (*handler)(int family, int type, int proto);
|
|
};
|
|
|
|
#define NET_SOCKET_GET_NAME(socket_name) \
|
|
(__net_socket_register_##socket_name)
|
|
|
|
#define NET_SOCKET_REGISTER(socket_name, _family, _is_supported, _handler) \
|
|
static const Z_STRUCT_SECTION_ITERABLE(net_socket_register, \
|
|
NET_SOCKET_GET_NAME(socket_name)) = { \
|
|
.family = _family, \
|
|
.is_supported = _is_supported, \
|
|
.handler = _handler, \
|
|
}
|
|
|
|
/** @endcond */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#include <syscalls/socket.h>
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_NET_SOCKET_H_ */
|