Skip to content

Commit ad647fa

Browse files
[Zephyr] Add implementation of POSIX API wrappers if necessary
`CONFIG_NET_SOCKETS_POSIX_NAMES` has been deprecated in Zephyr in favor of `CONFIG_POSIX_API`. `CONFIG_POSIX_API` enables additional functionalities other than sockets, resulting in increased footprint. This commit reuses `ZephyrSocket.h` to include Zephyr socket header and allow building with both configs disabled, adding neccessary wrappers.
1 parent 3d2fe85 commit ad647fa

10 files changed

+269
-36
lines changed

config/zephyr/Kconfig

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ menuconfig CHIP
3030
imply NET_IPV6
3131
imply NET_CONFIG_NEED_IPV6
3232
imply NET_SOCKETS
33-
imply NET_SOCKETS_POSIX_NAMES if !ARCH_POSIX && CHIP_NRF_PLATFORM
3433
imply NETWORKING
3534
imply HWINFO
3635
imply FLASH

src/include/platform/internal/GenericPlatformManagerImpl_Zephyr.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#endif
3232

3333
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
34-
#include <zephyr/net/socket.h>
34+
#include <inet/ZephyrSocket.h> // nogncheck
3535
#endif
3636

3737
#include <zephyr/kernel.h>

src/inet/BUILD.gn

+9-5
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ source_set("impl_header") {
7878
public_deps = [ "${chip_root}/src/system:system_config_header" ]
7979
}
8080

81+
source_set("inet_zephyr_socket") {
82+
sources = [ "ZephyrSocket.h" ]
83+
public_configs = [ "${chip_root}/src:includes" ]
84+
public_deps = [ "${chip_root}/src/system:system_config_header" ]
85+
}
86+
8187
static_library("inet") {
8288
output_name = "libInetLayer"
8389

@@ -167,12 +173,10 @@ static_library("inet") {
167173
} else {
168174
sources += [ "UDPEndPointImpl${chip_system_config_inet}.cpp" ]
169175
}
176+
}
170177

171-
if (chip_system_config_inet == "Sockets") {
172-
# TODO: dependency on this one is not clear as it is only ever
173-
# enabled through CMakeLists.txt. Added here for completeness
174-
sources += [ "ZephyrSocket.h" ]
175-
}
178+
if (current_os == "zephyr") {
179+
public_deps += [ ":inet_zephyr_socket" ]
176180
}
177181

178182
if (chip_with_nlfaultinjection) {

src/inet/IPAddress.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@
6363
#endif // CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
6464

6565
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
66-
#include <zephyr/net/socket.h>
67-
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
66+
#include "ZephyrSocket.h" // nogncheck
67+
#endif
6868

6969
#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT && INET_CONFIG_ENABLE_IPV4
7070
#error Forbidden : native Open Thread implementation with IPV4 enabled

src/inet/UDPEndPointImplSockets.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
#endif // CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
4141

4242
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
43-
#include <zephyr/net/socket.h>
44-
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
43+
#include "ZephyrSocket.h" // nogncheck
44+
#endif
4545

4646
#include <cerrno>
4747
#include <unistd.h>

src/inet/ZephyrSocket.h

+231-22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#/*
1+
/*
22
*
33
* Copyright (c) 2020 Project CHIP Authors
44
*
@@ -17,37 +17,246 @@
1717

1818
/**
1919
* @file
20-
* This header file defines BSD socket API functions which for various
21-
* reasons have not (yet) been implemented or exposed in Zephyr.
20+
* This header file includes Zephyr socket header and implements POSIX wrappers for APIs with
21+
* `zsock_` prefix if necessary.
2222
*/
2323

2424
#pragma once
2525

26-
#if CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
27-
#include <sys/select.h>
28-
#endif
29-
30-
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
3126
#include <zephyr/net/socket.h>
32-
#endif
3327

28+
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES
29+
extern "C" {
30+
31+
/** POSIX wrapper for @ref zsock_fd_set */
32+
#define fd_set zsock_fd_set
33+
/** POSIX wrapper for @ref ZSOCK_FD_SETSIZE */
34+
#define FD_SETSIZE ZSOCK_FD_SETSIZE
35+
36+
/** POSIX wrapper for @ref ZSOCK_FD_ZERO */
37+
static inline void FD_ZERO(zsock_fd_set * set)
38+
{
39+
ZSOCK_FD_ZERO(set);
40+
}
41+
42+
/** POSIX wrapper for @ref ZSOCK_FD_ISSET */
43+
static inline int FD_ISSET(int fd, zsock_fd_set * set)
44+
{
45+
return ZSOCK_FD_ISSET(fd, set);
46+
}
47+
48+
/** POSIX wrapper for @ref ZSOCK_FD_CLR */
49+
static inline void FD_CLR(int fd, zsock_fd_set * set)
50+
{
51+
ZSOCK_FD_CLR(fd, set);
52+
}
53+
54+
/** POSIX wrapper for @ref ZSOCK_FD_SET */
55+
static inline void FD_SET(int fd, zsock_fd_set * set)
56+
{
57+
ZSOCK_FD_SET(fd, set);
58+
}
59+
60+
/** POSIX wrapper for @ref zsock_select */
61+
static inline int select(int nfds, zsock_fd_set * readfds, zsock_fd_set * writefds, zsock_fd_set * exceptfds,
62+
struct timeval * timeout)
63+
{
64+
return zsock_select(nfds, readfds, writefds, exceptfds, timeout);
65+
}
66+
67+
/** POSIX wrapper for @ref zsock_pollfd */
68+
#define pollfd zsock_pollfd
69+
70+
/** POSIX wrapper for @ref zsock_socket */
71+
static inline int socket(int family, int type, int proto)
72+
{
73+
return zsock_socket(family, type, proto);
74+
}
75+
76+
/** POSIX wrapper for @ref zsock_socketpair */
77+
static inline int socketpair(int family, int type, int proto, int sv[2])
78+
{
79+
return zsock_socketpair(family, type, proto, sv);
80+
}
81+
82+
/** POSIX wrapper for @ref zsock_close */
83+
static inline int close(int sock)
84+
{
85+
return zsock_close(sock);
86+
}
87+
88+
/** POSIX wrapper for @ref zsock_shutdown */
89+
static inline int shutdown(int sock, int how)
90+
{
91+
return zsock_shutdown(sock, how);
92+
}
93+
94+
/** POSIX wrapper for @ref zsock_bind */
95+
static inline int bind(int sock, const struct sockaddr * addr, socklen_t addrlen)
96+
{
97+
return zsock_bind(sock, addr, addrlen);
98+
}
99+
100+
/** POSIX wrapper for @ref zsock_connect */
101+
static inline int connect(int sock, const struct sockaddr * addr, socklen_t addrlen)
102+
{
103+
return zsock_connect(sock, addr, addrlen);
104+
}
105+
106+
/** POSIX wrapper for @ref zsock_listen */
107+
static inline int listen(int sock, int backlog)
108+
{
109+
return zsock_listen(sock, backlog);
110+
}
111+
112+
/** POSIX wrapper for @ref zsock_accept */
113+
static inline int accept(int sock, struct sockaddr * addr, socklen_t * addrlen)
114+
{
115+
return zsock_accept(sock, addr, addrlen);
116+
}
117+
118+
/** POSIX wrapper for @ref zsock_send */
119+
static inline ssize_t send(int sock, const void * buf, size_t len, int flags)
120+
{
121+
return zsock_send(sock, buf, len, flags);
122+
}
123+
124+
/** POSIX wrapper for @ref zsock_recv */
125+
static inline ssize_t recv(int sock, void * buf, size_t max_len, int flags)
126+
{
127+
return zsock_recv(sock, buf, max_len, flags);
128+
}
129+
130+
/** POSIX wrapper for @ref zsock_sendto */
131+
static inline ssize_t sendto(int sock, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr,
132+
socklen_t addrlen)
133+
{
134+
return zsock_sendto(sock, buf, len, flags, dest_addr, addrlen);
135+
}
136+
137+
/** POSIX wrapper for @ref zsock_sendmsg */
138+
static inline ssize_t sendmsg(int sock, const struct msghdr * message, int flags)
139+
{
140+
return zsock_sendmsg(sock, message, flags);
141+
}
142+
143+
/** POSIX wrapper for @ref zsock_recvfrom */
144+
static inline ssize_t recvfrom(int sock, void * buf, size_t max_len, int flags, struct sockaddr * src_addr, socklen_t * addrlen)
145+
{
146+
return zsock_recvfrom(sock, buf, max_len, flags, src_addr, addrlen);
147+
}
148+
149+
/** POSIX wrapper for @ref zsock_recvmsg */
34150
static inline ssize_t recvmsg(int sock, struct msghdr * msg, int flags)
35151
{
36-
// Zephyr doesn't implement recvmsg at all, but if the message vector size is > 0 we can simply
37-
// translate recvmsg to recvfrom which fills only the first of the provided buffers (although
38-
// we don't get control messages in such a case).
152+
return zsock_recvmsg(sock, msg, flags);
153+
}
154+
155+
/** POSIX wrapper for @ref zsock_poll */
156+
static inline int poll(struct zsock_pollfd * fds, int nfds, int timeout)
157+
{
158+
return zsock_poll(fds, nfds, timeout);
159+
}
160+
161+
/** POSIX wrapper for @ref zsock_getsockopt */
162+
static inline int getsockopt(int sock, int level, int optname, void * optval, socklen_t * optlen)
163+
{
164+
return zsock_getsockopt(sock, level, optname, optval, optlen);
165+
}
39166

40-
if (msg->msg_iovlen < 1)
41-
{
42-
errno = EMSGSIZE;
43-
return -1;
44-
}
167+
/** POSIX wrapper for @ref zsock_setsockopt */
168+
static inline int setsockopt(int sock, int level, int optname, const void * optval, socklen_t optlen)
169+
{
170+
return zsock_setsockopt(sock, level, optname, optval, optlen);
171+
}
45172

46-
ssize_t ret = recvfrom(sock, msg->msg_iov[0].iov_base, msg->msg_iov[0].iov_len, flags, static_cast<sockaddr *>(msg->msg_name),
47-
&msg->msg_namelen);
173+
/** POSIX wrapper for @ref zsock_getpeername */
174+
static inline int getpeername(int sock, struct sockaddr * addr, socklen_t * addrlen)
175+
{
176+
return zsock_getpeername(sock, addr, addrlen);
177+
}
48178

49-
if (ret >= 0)
50-
msg->msg_controllen = 0;
179+
/** POSIX wrapper for @ref zsock_getsockname */
180+
static inline int getsockname(int sock, struct sockaddr * addr, socklen_t * addrlen)
181+
{
182+
return zsock_getsockname(sock, addr, addrlen);
183+
}
51184

52-
return ret;
185+
/** POSIX wrapper for @ref zsock_getaddrinfo */
186+
static inline int getaddrinfo(const char * host, const char * service, const struct zsock_addrinfo * hints,
187+
struct zsock_addrinfo ** res)
188+
{
189+
return zsock_getaddrinfo(host, service, hints, res);
53190
}
191+
192+
/** POSIX wrapper for @ref zsock_freeaddrinfo */
193+
static inline void freeaddrinfo(struct zsock_addrinfo * ai)
194+
{
195+
zsock_freeaddrinfo(ai);
196+
}
197+
198+
/** POSIX wrapper for @ref zsock_gai_strerror */
199+
static inline const char * gai_strerror(int errcode)
200+
{
201+
return zsock_gai_strerror(errcode);
202+
}
203+
204+
/** POSIX wrapper for @ref zsock_getnameinfo */
205+
static inline int getnameinfo(const struct sockaddr * addr, socklen_t addrlen, char * host, socklen_t hostlen, char * serv,
206+
socklen_t servlen, int flags)
207+
{
208+
return zsock_getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
209+
}
210+
211+
/** POSIX wrapper for @ref zsock_addrinfo */
212+
#define addrinfo zsock_addrinfo
213+
214+
/** POSIX wrapper for @ref zsock_gethostname */
215+
static inline int gethostname(char * buf, size_t len)
216+
{
217+
return zsock_gethostname(buf, len);
218+
}
219+
220+
/** POSIX wrapper for @ref zsock_inet_pton */
221+
static inline int inet_pton(sa_family_t family, const char * src, void * dst)
222+
{
223+
return zsock_inet_pton(family, src, dst);
224+
}
225+
226+
/** POSIX wrapper for @ref zsock_inet_ntop */
227+
static inline char * inet_ntop(sa_family_t family, const void * src, char * dst, size_t size)
228+
{
229+
return zsock_inet_ntop(family, src, dst, size);
230+
}
231+
232+
/** POSIX wrapper for @ref ZSOCK_POLLIN */
233+
#define POLLIN ZSOCK_POLLIN
234+
/** POSIX wrapper for @ref ZSOCK_POLLOUT */
235+
#define POLLOUT ZSOCK_POLLOUT
236+
/** POSIX wrapper for @ref ZSOCK_POLLERR */
237+
#define POLLERR ZSOCK_POLLERR
238+
/** POSIX wrapper for @ref ZSOCK_POLLHUP */
239+
#define POLLHUP ZSOCK_POLLHUP
240+
/** POSIX wrapper for @ref ZSOCK_POLLNVAL */
241+
#define POLLNVAL ZSOCK_POLLNVAL
242+
243+
/** POSIX wrapper for @ref ZSOCK_MSG_PEEK */
244+
#define MSG_PEEK ZSOCK_MSG_PEEK
245+
/** POSIX wrapper for @ref ZSOCK_MSG_CTRUNC */
246+
#define MSG_CTRUNC ZSOCK_MSG_CTRUNC
247+
/** POSIX wrapper for @ref ZSOCK_MSG_TRUNC */
248+
#define MSG_TRUNC ZSOCK_MSG_TRUNC
249+
/** POSIX wrapper for @ref ZSOCK_MSG_DONTWAIT */
250+
#define MSG_DONTWAIT ZSOCK_MSG_DONTWAIT
251+
/** POSIX wrapper for @ref ZSOCK_MSG_WAITALL */
252+
#define MSG_WAITALL ZSOCK_MSG_WAITALL
253+
254+
/** POSIX wrapper for @ref ZSOCK_SHUT_RD */
255+
#define SHUT_RD ZSOCK_SHUT_RD
256+
/** POSIX wrapper for @ref ZSOCK_SHUT_WR */
257+
#define SHUT_WR ZSOCK_SHUT_WR
258+
/** POSIX wrapper for @ref ZSOCK_SHUT_RDWR */
259+
#define SHUT_RDWR ZSOCK_SHUT_RDWR
260+
261+
} // extern "C"
262+
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES

src/system/BUILD.gn

+4
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,10 @@ static_library("system") {
272272
sources += [ "SocketEvents.h" ]
273273
}
274274

275+
if (current_os == "zephyr") {
276+
public_deps += [ "${chip_root}/src/inet:inet_zephyr_socket" ]
277+
}
278+
275279
if (chip_with_nlfaultinjection) {
276280
sources += [
277281
"SystemFaultInjection.cpp",

src/system/SystemClock.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#endif // CHIP_SYSTEM_CONFIG_USE_POSIX_TIME_FUNCTS || CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
3838

3939
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
40-
#include <zephyr/net/socket.h>
40+
#include <inet/ZephyrSocket.h> // nogncheck
4141
#endif
4242

4343
#include <chrono>

src/system/SystemConfig.h

+18-1
Original file line numberDiff line numberDiff line change
@@ -733,13 +733,30 @@ struct LwIPEvent;
733733
* Defaults to enabled on Zephyr platforms that do not enable Zephyr POSIX layer.
734734
*/
735735
#ifndef CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
736-
#if CHIP_SYSTEM_CONFIG_USE_SOCKETS && defined(__ZEPHYR__) && defined(CONFIG_NET_SOCKETS_POSIX_NAMES)
736+
#if CHIP_SYSTEM_CONFIG_USE_SOCKETS && defined(__ZEPHYR__) && !defined(CONFIG_POSIX_API)
737737
#define CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS 1
738738
#else
739739
#define CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS 0
740740
#endif
741741
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
742742

743+
/**
744+
* @def CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES
745+
*
746+
* @brief
747+
* Use Zephyr socket API with `zsock_` prefix.
748+
*
749+
* Defaults to enabled if `CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS` is enabled,
750+
* but `CONFIG_NET_SOCKETS_POSIX_NAMES` is disabled.
751+
*/
752+
#ifndef CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES
753+
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS && !defined(CONFIG_NET_SOCKETS_POSIX_NAMES)
754+
#define CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES 1
755+
#else
756+
#define CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES 0
757+
#endif
758+
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES
759+
743760
/**
744761
* @def CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
745762
*

0 commit comments

Comments
 (0)