net: socket: syscall for socketpair(2)

Working:

* non-blocking reads / writes
* blocking reads / writes
* send(2) / recv(2) / sendto(2) / recvfrom(2) / sendmsg(2)
* select(2)
* poll(2)

Fixes #24366

Signed-off-by: Christopher Friedt <chrisfriedt@gmail.com>
This commit is contained in:
Christopher Friedt 2020-05-08 23:04:23 -04:00 committed by Carles Cufí
parent effac5b021
commit 09f957c47a
7 changed files with 1174 additions and 0 deletions

View file

@ -457,6 +457,7 @@
/subsys/net/lib/config/ @jukkar @tbursztyka @pfalcon /subsys/net/lib/config/ @jukkar @tbursztyka @pfalcon
/subsys/net/lib/mqtt/ @jukkar @tbursztyka @rlubos /subsys/net/lib/mqtt/ @jukkar @tbursztyka @rlubos
/subsys/net/lib/coap/ @rveerama1 /subsys/net/lib/coap/ @rveerama1
/subsys/net/lib/sockets/socketpair.c @cfriedt
/subsys/net/lib/sockets/ @jukkar @tbursztyka @pfalcon /subsys/net/lib/sockets/ @jukkar @tbursztyka @pfalcon
/subsys/net/lib/tls_credentials/ @rlubos /subsys/net/lib/tls_credentials/ @rlubos
/subsys/net/l2/ @jukkar @tbursztyka /subsys/net/l2/ @jukkar @tbursztyka

View file

@ -45,6 +45,8 @@ extern "C" {
#define PF_PACKET 3 /**< Packet family. */ #define PF_PACKET 3 /**< Packet family. */
#define PF_CAN 4 /**< Controller Area Network. */ #define PF_CAN 4 /**< Controller Area Network. */
#define PF_NET_MGMT 5 /**< Network management info. */ #define PF_NET_MGMT 5 /**< Network management info. */
#define PF_LOCAL 6 /**< Inter-process communication */
#define PF_UNIX PF_LOCAL /**< Inter-process communication */
/* Address families. */ /* Address families. */
#define AF_UNSPEC PF_UNSPEC /**< Unspecified address family. */ #define AF_UNSPEC PF_UNSPEC /**< Unspecified address family. */
@ -53,6 +55,8 @@ extern "C" {
#define AF_PACKET PF_PACKET /**< Packet family. */ #define AF_PACKET PF_PACKET /**< Packet family. */
#define AF_CAN PF_CAN /**< Controller Area Network. */ #define AF_CAN PF_CAN /**< Controller Area Network. */
#define AF_NET_MGMT PF_NET_MGMT /**< Network management info. */ #define AF_NET_MGMT PF_NET_MGMT /**< Network management info. */
#define AF_LOCAL PF_LOCAL /**< Inter-process communication */
#define AF_UNIX PF_UNIX /**< Inter-process communication */
/** Protocol numbers from IANA/BSD */ /** Protocol numbers from IANA/BSD */
enum net_ip_protocol { enum net_ip_protocol {
@ -341,6 +345,12 @@ struct sockaddr_storage {
char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)]; char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
}; };
/* Socket address struct for UNIX domain sockets */
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
};
struct net_addr { struct net_addr {
sa_family_t family; sa_family_t family;
union { union {

View file

@ -159,6 +159,20 @@ struct zsock_addrinfo {
*/ */
__syscall int zsock_socket(int family, int type, int proto); __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 :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
* @endrst
*/
__syscall int zsock_socketpair(int family, int type, int proto, int *sv);
/** /**
* @brief Close a network socket * @brief Close a network socket
* *
@ -566,6 +580,11 @@ static inline int socket(int family, int type, int proto)
return zsock_socket(family, type, proto); return zsock_socket(family, type, proto);
} }
static inline int socketpair(int family, int type, int proto, int sv[2])
{
return zsock_socketpair(family, type, proto, sv);
}
static inline int close(int sock) static inline int close(int sock)
{ {
return zsock_close(sock); return zsock_close(sock);

View file

@ -18,6 +18,11 @@ static inline int socket(int family, int type, int proto)
return zsock_socket(family, type, proto); return zsock_socket(family, type, proto);
} }
static inline int socketpair(int family, int type, int proto, int sv[2])
{
return zsock_socketpair(family, type, proto, sv);
}
#define SHUT_RD ZSOCK_SHUT_RD #define SHUT_RD ZSOCK_SHUT_RD
#define SHUT_WR ZSOCK_SHUT_WR #define SHUT_WR ZSOCK_SHUT_WR
#define SHUT_RDWR ZSOCK_SHUT_RDWR #define SHUT_RDWR ZSOCK_SHUT_RDWR

View file

@ -28,4 +28,6 @@ if(CONFIG_SOCKS)
zephyr_include_directories(${ZEPHYR_BASE}/subsys/net/lib/socks) zephyr_include_directories(${ZEPHYR_BASE}/subsys/net/lib/socks)
endif() endif()
zephyr_sources_ifdef(CONFIG_NET_SOCKETPAIR socketpair.c)
zephyr_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS) zephyr_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS)

View file

@ -139,6 +139,21 @@ config NET_SOCKETS_CAN_RECEIVERS
The value tells how many sockets can receive data from same The value tells how many sockets can receive data from same
Socket-CAN interface. Socket-CAN interface.
config NET_SOCKETPAIR
bool "Support for the socketpair syscall [EXPERIMENTAL]"
depends on HEAP_MEM_POOL_SIZE != 0
help
Choose y here if you would like to use the socketpair(2)
system call.
config NET_SOCKETPAIR_BUFFER_SIZE
int "Size of the intermediate buffer, in bytes"
default 64
range 1 4096
depends on NET_SOCKETPAIR
help
Buffer size for socketpair(2)
config NET_SOCKETS_NET_MGMT config NET_SOCKETS_NET_MGMT
bool "Enable network management socket support [EXPERIMENTAL]" bool "Enable network management socket support [EXPERIMENTAL]"
depends on NET_MGMT_EVENT depends on NET_MGMT_EVENT

File diff suppressed because it is too large Load diff