| /** |
| * @file |
| * @brief BSD Sockets compatible API definitions |
| * |
| * An API for applications to use BSD Sockets like API. |
| */ |
| |
| /* |
| * Copyright (c) 2017-2018 Linaro Limited |
| * Copyright (c) 2021 Nordic Semiconductor |
| * |
| * 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 <zephyr/net/net_ip.h> |
| #include <zephyr/net/dns_resolve.h> |
| #include <zephyr/net/socket_select.h> |
| #include <zephyr/sys/iterable_sections.h> |
| #include <zephyr/sys/fdtable.h> |
| #include <stdlib.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @brief Definition of the monitored socket/file descriptor. |
| * |
| * An array of these descriptors is passed as an argument to poll(). |
| */ |
| struct zsock_pollfd { |
| int fd; /**< Socket descriptor */ |
| short events; /**< Requested events */ |
| short revents; /**< Returned events */ |
| }; |
| |
| /** |
| * @name Options for poll() |
| * @{ |
| */ |
| /* ZSOCK_POLL* values are compatible with Linux */ |
| /** zsock_poll: Poll for readability */ |
| #define ZSOCK_POLLIN 1 |
| /** zsock_poll: Poll for exceptional condition */ |
| #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 |
| /** @} */ |
| |
| /** |
| * @name Options for sending and receiving data |
| * @{ |
| */ |
| /** zsock_recv: Read data without removing it from socket input queue */ |
| #define ZSOCK_MSG_PEEK 0x02 |
| /** zsock_recvmsg: Control data buffer too small. |
| */ |
| #define ZSOCK_MSG_CTRUNC 0x08 |
| /** zsock_recv: return the real length of the datagram, even when it was longer |
| * than the passed buffer |
| */ |
| #define ZSOCK_MSG_TRUNC 0x20 |
| /** zsock_recv/zsock_send: Override operation to non-blocking */ |
| #define ZSOCK_MSG_DONTWAIT 0x40 |
| /** zsock_recv: block until the full amount of data can be returned */ |
| #define ZSOCK_MSG_WAITALL 0x100 |
| /** @} */ |
| |
| /** |
| * @name Options for shutdown() function |
| * @{ |
| */ |
| /* 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 |
| /** @} */ |
| |
| /** |
| * @defgroup secure_sockets_options Socket options for TLS |
| * @{ |
| */ |
| /** |
| * @name Socket options for TLS |
| * @{ |
| */ |
| |
| /** Protocol level for TLS. |
| * Here, the same socket protocol level for TLS as in Linux was used. |
| */ |
| #define SOL_TLS 282 |
| |
| /** 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 |
| * (mbedTLS 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 |
| /** Socket option for setting the supported Application Layer Protocols. |
| * It accepts and returns a const char array of NULL terminated strings |
| * representing the supported application layer protocols listed during |
| * the TLS handshake. |
| */ |
| #define TLS_ALPN_LIST 7 |
| /** Socket option to set DTLS min handshake timeout. The timeout starts at min, |
| * and upon retransmission the timeout is doubled util max is reached. |
| * Min and max arguments are separate options. The time unit is ms. |
| */ |
| #define TLS_DTLS_HANDSHAKE_TIMEOUT_MIN 8 |
| |
| /** Socket option to set DTLS max handshake timeout. The timeout starts at min, |
| * and upon retransmission the timeout is doubled util max is reached. |
| * Min and max arguments are separate options. The time unit is ms. |
| */ |
| #define TLS_DTLS_HANDSHAKE_TIMEOUT_MAX 9 |
| |
| /** Socket option for preventing certificates from being copied to the mbedTLS |
| * heap if possible. The option is only effective for DER certificates and is |
| * ignored for PEM certificates. |
| */ |
| #define TLS_CERT_NOCOPY 10 |
| /** TLS socket option to use with offloading. The option instructs the network |
| * stack only to offload underlying TCP/UDP communication. The TLS/DTLS |
| * operation is handled by a native TLS/DTLS socket implementation from Zephyr. |
| * |
| * Note, that this option is only applicable if socket dispatcher is used |
| * (CONFIG_NET_SOCKETS_OFFLOAD_DISPATCHER is enabled). |
| * In such case, it should be the first socket option set on a newly created |
| * socket. After that, the application may use SO_BINDTODEVICE to choose the |
| * dedicated network interface for the underlying TCP/UDP socket. |
| */ |
| #define TLS_NATIVE 11 |
| /** Socket option to control TLS session caching on a socket. Accepted values: |
| * - 0 - Disabled. |
| * - 1 - Enabled. |
| */ |
| #define TLS_SESSION_CACHE 12 |
| /** Write-only socket option to purge session cache immediately. |
| * This option accepts any value. |
| */ |
| #define TLS_SESSION_CACHE_PURGE 13 |
| /** Write-only socket option to control DTLS CID. |
| * The option accepts an integer, indicating the setting. |
| * Accepted vaules for the option are: 0, 1 and 2. |
| * Effective when set before connecting to the socket. |
| * - 0 - DTLS CID will be disabled. |
| * - 1 - DTLS CID will be enabled, and a 0 length CID value to be sent to the |
| * peer. |
| * - 2 - DTLS CID will be enabled, and the most recent value set with |
| * TLS_DTLS_CID_VALUE will be sent to the peer. Otherwise, a random value |
| * will be used. |
| */ |
| #define TLS_DTLS_CID 14 |
| /** Read-only socket option to get DTLS CID status. |
| * The option accepts a pointer to an integer, indicating the setting upon |
| * return. |
| * Returned vaules for the option are: |
| * - 0 - DTLS CID is disabled. |
| * - 1 - DTLS CID is received on the downlink. |
| * - 2 - DTLS CID is sent to the uplink. |
| * - 3 - DTLS CID is used in both directions. |
| */ |
| #define TLS_DTLS_CID_STATUS 15 |
| /** Socket option to set or get the value of the DTLS connection ID to be |
| * used for the DTLS session. |
| * The option accepts a byte array, holding the CID value. |
| */ |
| #define TLS_DTLS_CID_VALUE 16 |
| /** Read-only socket option to get the value of the DTLS connection ID |
| * received from the peer. |
| * The option accepts a pointer to a byte array, holding the CID value upon |
| * return. The optlen returned will be 0 if the peer did not provide a |
| * connection ID, otherwise will contain the length of the CID value. |
| */ |
| #define TLS_DTLS_PEER_CID_VALUE 17 |
| /** Socket option to configure DTLS socket behavior on connect(). |
| * If set, DTLS connect() will execute the handshake with the configured peer. |
| * This is the default behavior. |
| * Otherwise, DTLS connect() will only configure peer address (as with regular |
| * UDP socket) and will not attempt to execute DTLS handshake. The handshake |
| * will take place in consecutive send()/recv() call. |
| */ |
| #define TLS_DTLS_HANDSHAKE_ON_CONNECT 18 |
| |
| /* Valid values for @ref TLS_PEER_VERIFY option */ |
| #define TLS_PEER_VERIFY_NONE 0 /**< Peer verification disabled. */ |
| #define TLS_PEER_VERIFY_OPTIONAL 1 /**< Peer verification optional. */ |
| #define TLS_PEER_VERIFY_REQUIRED 2 /**< Peer verification required. */ |
| |
| /* Valid values for @ref TLS_DTLS_ROLE option */ |
| #define TLS_DTLS_ROLE_CLIENT 0 /**< Client role in a DTLS session. */ |
| #define TLS_DTLS_ROLE_SERVER 1 /**< Server role in a DTLS session. */ |
| |
| /* Valid values for @ref TLS_CERT_NOCOPY option */ |
| #define TLS_CERT_NOCOPY_NONE 0 /**< Cert duplicated in heap */ |
| #define TLS_CERT_NOCOPY_OPTIONAL 1 /**< Cert not copied in heap if DER */ |
| |
| /* Valid values for @ref TLS_SESSION_CACHE option */ |
| #define TLS_SESSION_CACHE_DISABLED 0 /**< Disable TLS session caching. */ |
| #define TLS_SESSION_CACHE_ENABLED 1 /**< Enable TLS session caching. */ |
| |
| /* Valid values for @ref TLS_DTLS_CID (Connection ID) option */ |
| #define TLS_DTLS_CID_DISABLED 0 /**< CID is disabled */ |
| #define TLS_DTLS_CID_SUPPORTED 1 /**< CID is supported */ |
| #define TLS_DTLS_CID_ENABLED 2 /**< CID is enabled */ |
| |
| /* Valid values for @ref TLS_DTLS_CID_STATUS option */ |
| #define TLS_DTLS_CID_STATUS_DISABLED 0 /**< CID is disabled */ |
| #define TLS_DTLS_CID_STATUS_DOWNLINK 1 /**< CID is in use by us */ |
| #define TLS_DTLS_CID_STATUS_UPLINK 2 /**< CID is in use by peer */ |
| #define TLS_DTLS_CID_STATUS_BIDIRECTIONAL 3 /**< CID is in use by us and peer */ |
| /** @} */ /* for @name */ |
| /** @} */ /* for @defgroup */ |
| |
| /** |
| * @brief Definition used when querying address information. |
| * |
| * A linked list of these descriptors is returned by getaddrinfo(). The struct |
| * is also passed as hints when calling the getaddrinfo() function. |
| */ |
| struct zsock_addrinfo { |
| struct zsock_addrinfo *ai_next; /**< Pointer to next address entry */ |
| int ai_flags; /**< Additional options */ |
| int ai_family; /**< Address family of the returned addresses */ |
| int ai_socktype; /**< Socket type, for example SOCK_STREAM or SOCK_DGRAM */ |
| int ai_protocol; /**< Protocol for addresses, 0 means any protocol */ |
| socklen_t ai_addrlen; /**< Length of the socket address */ |
| struct sockaddr *ai_addr; /**< Pointer to the address */ |
| char *ai_canonname; /**< Optional official name of the host */ |
| |
| /** @cond INTERNAL_HIDDEN */ |
| struct sockaddr _ai_addr; |
| char _ai_canonname[DNS_MAX_NAME_SIZE + 1]; |
| /** @endcond */ |
| }; |
| |
| /** |
| * @brief Obtain a file descriptor's associated net context |
| * |
| * With CONFIG_USERSPACE enabled, the kernel's object permission system |
| * must apply to socket file descriptors. When a socket is opened, by default |
| * only the caller has permission, access by other threads will fail unless |
| * they have been specifically granted permission. |
| * |
| * This is achieved by tagging data structure definitions that implement the |
| * underlying object associated with a network socket file descriptor with |
| * '__net_socket`. All pointers to instances of these will be known to the |
| * kernel as kernel objects with type K_OBJ_NET_SOCKET. |
| * |
| * This API is intended for threads that need to grant access to the object |
| * associated with a particular file descriptor to another thread. The |
| * returned pointer represents the underlying K_OBJ_NET_SOCKET and |
| * may be passed to APIs like k_object_access_grant(). |
| * |
| * In a system like Linux which has the notion of threads running in processes |
| * in a shared virtual address space, this sort of management is unnecessary as |
| * the scope of file descriptors is implemented at the process level. |
| * |
| * However in Zephyr the file descriptor scope is global, and MPU-based systems |
| * are not able to implement a process-like model due to the lack of memory |
| * virtualization hardware. They use discrete object permissions and memory |
| * domains instead to define thread access scope. |
| * |
| * User threads will have no direct access to the returned object |
| * and will fault if they try to access its memory; the pointer can only be |
| * used to make permission assignment calls, which follow exactly the rules |
| * for other kernel objects like device drivers and IPC. |
| * |
| * @param sock file descriptor |
| * @return pointer to associated network socket object, or NULL if the |
| * file descriptor wasn't valid or the caller had no access permission |
| */ |
| __syscall void *zsock_get_context_object(int sock); |
| |
| /** |
| * @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 :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| * |
| * If CONFIG_USERSPACE is enabled, the caller will be granted access to the |
| * context object associated with the returned file descriptor. |
| * @see zsock_get_context_object() |
| * |
| */ |
| __syscall int zsock_socket(int family, int type, int proto); |
| |
| /** |
| * @brief Create an unnamed pair of connected sockets |
| * |
| * @details |
| * @rst |
| * See `POSIX.1-2017 article |
| * <https://pubs.opengroup.org/onlinepubs/009695399/functions/socketpair.html>`__ |
| * for normative description. |
| * This function is also exposed as ``socketpair()`` |
| * if :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| */ |
| __syscall int zsock_socketpair(int family, int type, int proto, int *sv); |
| |
| /** |
| * @brief Close a network socket |
| * |
| * @details |
| * @rst |
| * Close a network socket. |
| * This function is also exposed as ``close()`` |
| * if :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 a message from an arbitrary network address |
| * |
| * @details |
| * @rst |
| * See `POSIX.1-2017 article |
| * <http://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html>`__ |
| * for normative description. |
| * This function is also exposed as ``recvmsg()`` |
| * if :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| */ |
| __syscall ssize_t zsock_recvmsg(int sock, struct msghdr *msg, int flags); |
| |
| /** |
| * @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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` is defined (in which case |
| * it may conflict with generic POSIX ``fcntl()`` function). |
| * @endrst |
| */ |
| __syscall int zsock_fcntl_impl(int sock, int cmd, int flags); |
| |
| /* |
| * Need this wrapper because newer GCC versions got too smart and "typecheck" |
| * even macros. |
| */ |
| static inline int zsock_fcntl_wrapper(int sock, int cmd, ...) |
| { |
| va_list args; |
| int flags; |
| |
| va_start(args, cmd); |
| flags = va_arg(args, int); |
| va_end(args); |
| return zsock_fcntl_impl(sock, cmd, flags); |
| } |
| |
| #define zsock_fcntl zsock_fcntl_wrapper |
| |
| /** |
| * @brief Control underlying socket parameters |
| * |
| * @details |
| * @rst |
| * See `POSIX.1-2017 article |
| * <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ioctl.html>`__ |
| * for normative description. |
| * This function enables querying or manipulating underlying socket parameters. |
| * Currently supported @p request values include ``ZFD_IOCTL_FIONBIO``, and |
| * ``ZFD_IOCTL_FIONREAD``, to set non-blocking mode, and query the number of |
| * bytes available to read, respectively. |
| * This function is also exposed as ``ioctl()`` |
| * if :kconfig:option:`CONFIG_POSIX_API` is defined (in which case |
| * it may conflict with generic POSIX ``ioctl()`` function). |
| * @endrst |
| */ |
| __syscall int zsock_ioctl_impl(int sock, unsigned long request, va_list ap); |
| |
| static inline int zsock_ioctl_wrapper(int sock, unsigned long request, ...) |
| { |
| int ret; |
| va_list args; |
| |
| va_start(args, request); |
| ret = zsock_ioctl_impl(sock, request, args); |
| va_end(args); |
| |
| return ret; |
| } |
| |
| #define zsock_ioctl zsock_ioctl_wrapper |
| |
| /** |
| * @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. |
| * This function is also exposed as ``poll()`` |
| * if :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| */ |
| __syscall int zsock_setsockopt(int sock, int level, int optname, |
| const void *optval, socklen_t optlen); |
| |
| /** |
| * @brief Get peer name |
| * |
| * @details |
| * @rst |
| * See `POSIX.1-2017 article |
| * <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getpeername.html>`__ |
| * for normative description. |
| * This function is also exposed as ``getpeername()`` |
| * if :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| */ |
| __syscall int zsock_getpeername(int sock, struct sockaddr *addr, |
| socklen_t *addrlen); |
| |
| /** |
| * @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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` 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. */ |
| |
| /** |
| * @name 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 :kconfig:option:`CONFIG_POSIX_API` 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 :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| */ |
| void zsock_freeaddrinfo(struct zsock_addrinfo *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 :kconfig:option:`CONFIG_POSIX_API` is defined. |
| * @endrst |
| */ |
| const char *zsock_gai_strerror(int errcode); |
| |
| /** |
| * @name Flags for getnameinfo() |
| * @{ |
| */ |
| /** 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 :kconfig:option:`CONFIG_POSIX_API` 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) |
| |
| /** |
| * @name Socket APIs available if CONFIG_NET_SOCKETS_POSIX_NAMES is enabled |
| * @{ |
| */ |
| |
| /** POSIX wrapper for @ref zsock_pollfd */ |
| #define pollfd zsock_pollfd |
| |
| /** POSIX wrapper for @ref zsock_socket */ |
| static inline int socket(int family, int type, int proto) |
| { |
| return zsock_socket(family, type, proto); |
| } |
| |
| /** POSIX wrapper for @ref zsock_socketpair */ |
| static inline int socketpair(int family, int type, int proto, int sv[2]) |
| { |
| return zsock_socketpair(family, type, proto, sv); |
| } |
| |
| /** POSIX wrapper for @ref zsock_close */ |
| static inline int close(int sock) |
| { |
| return zsock_close(sock); |
| } |
| |
| /** POSIX wrapper for @ref zsock_shutdown */ |
| static inline int shutdown(int sock, int how) |
| { |
| return zsock_shutdown(sock, how); |
| } |
| |
| /** POSIX wrapper for @ref zsock_bind */ |
| static inline int bind(int sock, const struct sockaddr *addr, socklen_t addrlen) |
| { |
| return zsock_bind(sock, addr, addrlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_connect */ |
| static inline int connect(int sock, const struct sockaddr *addr, |
| socklen_t addrlen) |
| { |
| return zsock_connect(sock, addr, addrlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_listen */ |
| static inline int listen(int sock, int backlog) |
| { |
| return zsock_listen(sock, backlog); |
| } |
| |
| /** POSIX wrapper for @ref zsock_accept */ |
| static inline int accept(int sock, struct sockaddr *addr, socklen_t *addrlen) |
| { |
| return zsock_accept(sock, addr, addrlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_send */ |
| static inline ssize_t send(int sock, const void *buf, size_t len, int flags) |
| { |
| return zsock_send(sock, buf, len, flags); |
| } |
| |
| /** POSIX wrapper for @ref zsock_recv */ |
| static inline ssize_t recv(int sock, void *buf, size_t max_len, int flags) |
| { |
| return zsock_recv(sock, buf, max_len, flags); |
| } |
| |
| /** POSIX wrapper for @ref zsock_sendto */ |
| 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); |
| } |
| |
| /** POSIX wrapper for @ref zsock_sendmsg */ |
| static inline ssize_t sendmsg(int sock, const struct msghdr *message, |
| int flags) |
| { |
| return zsock_sendmsg(sock, message, flags); |
| } |
| |
| /** POSIX wrapper for @ref zsock_recvfrom */ |
| 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); |
| } |
| |
| /** POSIX wrapper for @ref zsock_recvmsg */ |
| static inline ssize_t recvmsg(int sock, struct msghdr *msg, int flags) |
| { |
| return zsock_recvmsg(sock, msg, flags); |
| } |
| |
| /** POSIX wrapper for @ref zsock_poll */ |
| static inline int poll(struct zsock_pollfd *fds, int nfds, int timeout) |
| { |
| return zsock_poll(fds, nfds, timeout); |
| } |
| |
| /** POSIX wrapper for @ref zsock_getsockopt */ |
| static inline int getsockopt(int sock, int level, int optname, |
| void *optval, socklen_t *optlen) |
| { |
| return zsock_getsockopt(sock, level, optname, optval, optlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_setsockopt */ |
| static inline int setsockopt(int sock, int level, int optname, |
| const void *optval, socklen_t optlen) |
| { |
| return zsock_setsockopt(sock, level, optname, optval, optlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_getpeername */ |
| static inline int getpeername(int sock, struct sockaddr *addr, |
| socklen_t *addrlen) |
| { |
| return zsock_getpeername(sock, addr, addrlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_getsockname */ |
| static inline int getsockname(int sock, struct sockaddr *addr, |
| socklen_t *addrlen) |
| { |
| return zsock_getsockname(sock, addr, addrlen); |
| } |
| |
| /** POSIX wrapper for @ref zsock_getaddrinfo */ |
| 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); |
| } |
| |
| /** POSIX wrapper for @ref zsock_freeaddrinfo */ |
| static inline void freeaddrinfo(struct zsock_addrinfo *ai) |
| { |
| zsock_freeaddrinfo(ai); |
| } |
| |
| /** POSIX wrapper for @ref zsock_gai_strerror */ |
| static inline const char *gai_strerror(int errcode) |
| { |
| return zsock_gai_strerror(errcode); |
| } |
| |
| /** POSIX wrapper for @ref zsock_getnameinfo */ |
| 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); |
| } |
| |
| /** POSIX wrapper for @ref zsock_addrinfo */ |
| #define addrinfo zsock_addrinfo |
| |
| /** POSIX wrapper for @ref zsock_gethostname */ |
| static inline int gethostname(char *buf, size_t len) |
| { |
| return zsock_gethostname(buf, len); |
| } |
| |
| /** POSIX wrapper for @ref zsock_inet_pton */ |
| static inline int inet_pton(sa_family_t family, const char *src, void *dst) |
| { |
| return zsock_inet_pton(family, src, dst); |
| } |
| |
| /** POSIX wrapper for @ref zsock_inet_ntop */ |
| 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); |
| } |
| |
| /** POSIX wrapper for @ref ZSOCK_POLLIN */ |
| #define POLLIN ZSOCK_POLLIN |
| /** POSIX wrapper for @ref ZSOCK_POLLOUT */ |
| #define POLLOUT ZSOCK_POLLOUT |
| /** POSIX wrapper for @ref ZSOCK_POLLERR */ |
| #define POLLERR ZSOCK_POLLERR |
| /** POSIX wrapper for @ref ZSOCK_POLLHUP */ |
| #define POLLHUP ZSOCK_POLLHUP |
| /** POSIX wrapper for @ref ZSOCK_POLLNVAL */ |
| #define POLLNVAL ZSOCK_POLLNVAL |
| |
| /** POSIX wrapper for @ref ZSOCK_MSG_PEEK */ |
| #define MSG_PEEK ZSOCK_MSG_PEEK |
| /** POSIX wrapper for @ref ZSOCK_MSG_CTRUNC */ |
| #define MSG_CTRUNC ZSOCK_MSG_CTRUNC |
| /** POSIX wrapper for @ref ZSOCK_MSG_TRUNC */ |
| #define MSG_TRUNC ZSOCK_MSG_TRUNC |
| /** POSIX wrapper for @ref ZSOCK_MSG_DONTWAIT */ |
| #define MSG_DONTWAIT ZSOCK_MSG_DONTWAIT |
| /** POSIX wrapper for @ref ZSOCK_MSG_WAITALL */ |
| #define MSG_WAITALL ZSOCK_MSG_WAITALL |
| |
| /** POSIX wrapper for @ref ZSOCK_SHUT_RD */ |
| #define SHUT_RD ZSOCK_SHUT_RD |
| /** POSIX wrapper for @ref ZSOCK_SHUT_WR */ |
| #define SHUT_WR ZSOCK_SHUT_WR |
| /** POSIX wrapper for @ref ZSOCK_SHUT_RDWR */ |
| #define SHUT_RDWR ZSOCK_SHUT_RDWR |
| |
| /** POSIX wrapper for @ref DNS_EAI_BADFLAGS */ |
| #define EAI_BADFLAGS DNS_EAI_BADFLAGS |
| /** POSIX wrapper for @ref DNS_EAI_NONAME */ |
| #define EAI_NONAME DNS_EAI_NONAME |
| /** POSIX wrapper for @ref DNS_EAI_AGAIN */ |
| #define EAI_AGAIN DNS_EAI_AGAIN |
| /** POSIX wrapper for @ref DNS_EAI_FAIL */ |
| #define EAI_FAIL DNS_EAI_FAIL |
| /** POSIX wrapper for @ref DNS_EAI_NODATA */ |
| #define EAI_NODATA DNS_EAI_NODATA |
| /** POSIX wrapper for @ref DNS_EAI_MEMORY */ |
| #define EAI_MEMORY DNS_EAI_MEMORY |
| /** POSIX wrapper for @ref DNS_EAI_SYSTEM */ |
| #define EAI_SYSTEM DNS_EAI_SYSTEM |
| /** POSIX wrapper for @ref DNS_EAI_SERVICE */ |
| #define EAI_SERVICE DNS_EAI_SERVICE |
| /** POSIX wrapper for @ref DNS_EAI_SOCKTYPE */ |
| #define EAI_SOCKTYPE DNS_EAI_SOCKTYPE |
| /** POSIX wrapper for @ref DNS_EAI_FAMILY */ |
| #define EAI_FAMILY DNS_EAI_FAMILY |
| /** @} */ |
| #endif /* defined(CONFIG_NET_SOCKETS_POSIX_NAMES) */ |
| |
| /** |
| * @name Network interface name description |
| * @{ |
| */ |
| /** Network interface name length */ |
| #if defined(CONFIG_NET_INTERFACE_NAME) |
| #define IFNAMSIZ CONFIG_NET_INTERFACE_NAME_LEN |
| #else |
| #define IFNAMSIZ Z_DEVICE_MAX_NAME_LEN |
| #endif |
| |
| /** Interface description structure */ |
| struct ifreq { |
| char ifr_name[IFNAMSIZ]; /**< Network interface name */ |
| }; |
| /** @} */ |
| |
| /** |
| * @name Socket level options (SOL_SOCKET) |
| * @{ |
| */ |
| /** Socket-level option */ |
| #define SOL_SOCKET 1 |
| |
| /* Socket options for SOL_SOCKET level */ |
| |
| /** Recording debugging information (ignored, for compatibility) */ |
| #define SO_DEBUG 1 |
| /** address reuse */ |
| #define SO_REUSEADDR 2 |
| /** Type of the socket */ |
| #define SO_TYPE 3 |
| /** Async error */ |
| #define SO_ERROR 4 |
| /** Bypass normal routing and send directly to host (ignored, for compatibility) */ |
| #define SO_DONTROUTE 5 |
| /** Transmission of broadcast messages is supported (ignored, for compatibility) */ |
| #define SO_BROADCAST 6 |
| |
| /** Size of socket send buffer */ |
| #define SO_SNDBUF 7 |
| /** Size of socket recv buffer */ |
| #define SO_RCVBUF 8 |
| |
| /** Enable sending keep-alive messages on connections */ |
| #define SO_KEEPALIVE 9 |
| /** Place out-of-band data into receive stream (ignored, for compatibility) */ |
| #define SO_OOBINLINE 10 |
| /** Socket priority */ |
| #define SO_PRIORITY 12 |
| /** Socket lingers on close (ignored, for compatibility) */ |
| #define SO_LINGER 13 |
| /** Allow multiple sockets to reuse a single port */ |
| #define SO_REUSEPORT 15 |
| |
| /** Receive low watermark (ignored, for compatibility) */ |
| #define SO_RCVLOWAT 18 |
| /** Send low watermark (ignored, for compatibility) */ |
| #define SO_SNDLOWAT 19 |
| |
| /** |
| * Receive timeout |
| * Applies to receive functions like recv(), but not to connect() |
| */ |
| #define SO_RCVTIMEO 20 |
| /** Send timeout */ |
| #define SO_SNDTIMEO 21 |
| |
| /** Bind a socket to an interface */ |
| #define SO_BINDTODEVICE 25 |
| |
| /** Socket accepts incoming connections (ignored, for compatibility) */ |
| #define SO_ACCEPTCONN 30 |
| |
| /** Timestamp TX packets */ |
| #define SO_TIMESTAMPING 37 |
| /** Protocol used with the socket */ |
| #define SO_PROTOCOL 38 |
| |
| /** Domain used with SOCKET */ |
| #define SO_DOMAIN 39 |
| |
| /** Enable SOCKS5 for Socket */ |
| #define SO_SOCKS5 60 |
| |
| /** Socket TX time (when the data should be sent) */ |
| #define SO_TXTIME 61 |
| /** Socket TX time (same as SO_TXTIME) */ |
| #define SCM_TXTIME SO_TXTIME |
| |
| /** @} */ |
| |
| /** |
| * @name TCP level options (IPPROTO_TCP) |
| * @{ |
| */ |
| /* Socket options for IPPROTO_TCP level */ |
| /** Disable TCP buffering (ignored, for compatibility) */ |
| #define TCP_NODELAY 1 |
| /** Start keepalives after this period (seconds) */ |
| #define TCP_KEEPIDLE 2 |
| /** Interval between keepalives (seconds) */ |
| #define TCP_KEEPINTVL 3 |
| /** Number of keepalives before dropping connection */ |
| #define TCP_KEEPCNT 4 |
| |
| /** @} */ |
| |
| /** |
| * @name IPv4 level options (IPPROTO_IP) |
| * @{ |
| */ |
| /* Socket options for IPPROTO_IP level */ |
| /** Set or receive the Type-Of-Service value for an outgoing packet. */ |
| #define IP_TOS 1 |
| |
| /** Set or receive the Time-To-Live value for an outgoing packet. */ |
| #define IP_TTL 2 |
| |
| /** Pass an IP_PKTINFO ancillary message that contains a |
| * pktinfo structure that supplies some information about the |
| * incoming packet. |
| */ |
| #define IP_PKTINFO 8 |
| |
| /** |
| * @brief Incoming IPv4 packet information. |
| * |
| * Used as ancillary data when calling recvmsg() and IP_PKTINFO socket |
| * option is set. |
| */ |
| struct in_pktinfo { |
| unsigned int ipi_ifindex; /**< Network interface index */ |
| struct in_addr ipi_spec_dst; /**< Local address */ |
| struct in_addr ipi_addr; /**< Header Destination address */ |
| }; |
| |
| /** Set IPv4 multicast TTL value. */ |
| #define IP_MULTICAST_TTL 33 |
| /** Join IPv4 multicast group. */ |
| #define IP_ADD_MEMBERSHIP 35 |
| /** Leave IPv4 multicast group. */ |
| #define IP_DROP_MEMBERSHIP 36 |
| |
| /** |
| * @brief Struct used when joining or leaving a IPv4 multicast group. |
| */ |
| struct ip_mreqn { |
| struct in_addr imr_multiaddr; /**< IP multicast group address */ |
| struct in_addr imr_address; /**< IP address of local interface */ |
| int imr_ifindex; /**< Network interface index */ |
| }; |
| |
| /** @} */ |
| |
| /** |
| * @name IPv6 level options (IPPROTO_IPV6) |
| * @{ |
| */ |
| /* Socket options for IPPROTO_IPV6 level */ |
| /** Set the unicast hop limit for the socket. */ |
| #define IPV6_UNICAST_HOPS 16 |
| |
| /** Set the multicast hop limit for the socket. */ |
| #define IPV6_MULTICAST_HOPS 18 |
| |
| /** Join IPv6 multicast group. */ |
| #define IPV6_ADD_MEMBERSHIP 20 |
| |
| /** Leave IPv6 multicast group. */ |
| #define IPV6_DROP_MEMBERSHIP 21 |
| |
| /** |
| * @brief Struct used when joining or leaving a IPv6 multicast group. |
| */ |
| struct ipv6_mreq { |
| /** IPv6 multicast address of group */ |
| struct in6_addr ipv6mr_multiaddr; |
| |
| /** Network interface index of the local IPv6 address */ |
| int ipv6mr_ifindex; |
| }; |
| |
| /** Don't support IPv4 access */ |
| #define IPV6_V6ONLY 26 |
| |
| /** Pass an IPV6_RECVPKTINFO ancillary message that contains a |
| * in6_pktinfo structure that supplies some information about the |
| * incoming packet. See RFC 3542. |
| */ |
| #define IPV6_RECVPKTINFO 49 |
| |
| /** |
| * @brief Incoming IPv6 packet information. |
| * |
| * Used as ancillary data when calling recvmsg() and IPV6_RECVPKTINFO socket |
| * option is set. |
| */ |
| struct in6_pktinfo { |
| struct in6_addr ipi6_addr; /**< Destination IPv6 address */ |
| unsigned int ipi6_ifindex; /**< Receive interface index */ |
| }; |
| |
| /** Set or receive the traffic class value for an outgoing packet. */ |
| #define IPV6_TCLASS 67 |
| /** @} */ |
| |
| /** |
| * @name Backlog size for listen() |
| * @{ |
| */ |
| /** listen: The maximum backlog queue length */ |
| #define SOMAXCONN 128 |
| /** @} */ |
| |
| /** @cond INTERNAL_HIDDEN */ |
| /** |
| * @brief Registration information for a given BSD socket family. |
| */ |
| struct net_socket_register { |
| int family; |
| bool is_offloaded; |
| bool (*is_supported)(int family, int type, int proto); |
| int (*handler)(int family, int type, int proto); |
| #if defined(CONFIG_NET_SOCKETS_OBJ_CORE) |
| /* Store also the name of the socket type in order to be able to |
| * print it later. |
| */ |
| const char * const name; |
| #endif |
| }; |
| |
| #define NET_SOCKET_DEFAULT_PRIO CONFIG_NET_SOCKETS_PRIORITY_DEFAULT |
| |
| #define NET_SOCKET_GET_NAME(socket_name, prio) \ |
| __net_socket_register_##prio##_##socket_name |
| |
| #if defined(CONFIG_NET_SOCKETS_OBJ_CORE) |
| #define K_OBJ_TYPE_SOCK K_OBJ_TYPE_ID_GEN("SOCK") |
| |
| #define NET_SOCKET_REGISTER_NAME(_name) \ |
| .name = STRINGIFY(_name), |
| #else |
| #define NET_SOCKET_REGISTER_NAME(_name) |
| #endif |
| |
| #define _NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler, _is_offloaded) \ |
| static const STRUCT_SECTION_ITERABLE(net_socket_register, \ |
| NET_SOCKET_GET_NAME(socket_name, prio)) = { \ |
| .family = _family, \ |
| .is_offloaded = _is_offloaded, \ |
| .is_supported = _is_supported, \ |
| .handler = _handler, \ |
| NET_SOCKET_REGISTER_NAME(socket_name) \ |
| } |
| |
| #define NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler) \ |
| _NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler, false) |
| |
| #define NET_SOCKET_OFFLOAD_REGISTER(socket_name, prio, _family, _is_supported, _handler) \ |
| _NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler, true) |
| |
| /** @endcond */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #include <syscalls/socket.h> |
| |
| /** |
| * @} |
| */ |
| |
| /* Avoid circular loops with POSIX socket headers. |
| * We have these includes here so that we do not need |
| * to change the applications that were only including |
| * zephyr/net/socket.h header file. |
| */ |
| #if defined(CONFIG_POSIX_API) |
| #if !defined(ZEPHYR_INCLUDE_POSIX_ARPA_INET_H_) |
| #include <zephyr/posix/arpa/inet.h> |
| #endif |
| #if !defined(ZEPHYR_INCLUDE_POSIX_NETDB_H_) |
| #include <zephyr/posix/netdb.h> |
| #endif |
| #if !defined(ZEPHYR_INCLUDE_POSIX_UNISTD_H_) |
| #include <zephyr/posix/unistd.h> |
| #endif |
| #if !defined(ZEPHYR_INCLUDE_POSIX_POLL_H_) |
| #include <zephyr/posix/poll.h> |
| #endif |
| #if !defined(ZEPHYR_INCLUDE_POSIX_SYS_SOCKET_H_) |
| #include <zephyr/posix/sys/socket.h> |
| #endif |
| #endif /* CONFIG_POSIX_API */ |
| |
| #endif /* ZEPHYR_INCLUDE_NET_SOCKET_H_ */ |