Skip to content

Commit 2a09f8b

Browse files
[Zephyr] Add implementation of POSIX API wrappers if necessary (#37007)
`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 extends `ZephyrSocket.h` to include Zephyr socket header and allow building with both configs disabled, adding neccessary wrappers.
1 parent c6a68c6 commit 2a09f8b

10 files changed

+288
-27
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

+3-7
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939
#include <sys/ioctl.h>
4040
#endif // CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
4141

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

4646
#include <cerrno>
4747
#include <unistd.h>
@@ -57,10 +57,6 @@
5757
#define INADDR_ANY 0
5858
#endif
5959

60-
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_EXTENSIONS
61-
#include "ZephyrSocket.h"
62-
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_EXTENSIONS
63-
6460
/*
6561
* Some systems define both IPV6_{ADD,DROP}_MEMBERSHIP and
6662
* IPV6_{JOIN,LEAVE}_GROUP while others only define

src/inet/ZephyrSocket.h

+249-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#/*
1+
/*
22
*
33
* Copyright (c) 2020 Project CHIP Authors
44
*
@@ -17,23 +17,26 @@
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. It also defines BSD socket API functions which for various
22+
* reasons have not been implemented or exposed in older Zephyr version.
2223
*/
2324

2425
#pragma once
2526

26-
#if CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
27-
#include <sys/select.h>
28-
#endif
29-
3027
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKETS
3128
#include <zephyr/net/socket.h>
3229
#endif
3330

31+
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_EXTENSIONS
32+
33+
#if CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
34+
#include <sys/select.h>
35+
#endif
36+
3437
static inline ssize_t recvmsg(int sock, struct msghdr * msg, int flags)
3538
{
36-
// Zephyr doesn't implement recvmsg at all, but if the message vector size is > 0 we can simply
39+
// Older Zephyr version doesn't implement recvmsg at all, but if the message vector size is > 0 we can simply
3740
// translate recvmsg to recvfrom which fills only the first of the provided buffers (although
3841
// we don't get control messages in such a case).
3942

@@ -51,3 +54,241 @@ static inline ssize_t recvmsg(int sock, struct msghdr * msg, int flags)
5154

5255
return ret;
5356
}
57+
58+
#endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_EXTENSIONS
59+
60+
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_NAMES
61+
extern "C" {
62+
63+
/** POSIX wrapper for @ref zsock_fd_set */
64+
#define fd_set zsock_fd_set
65+
/** POSIX wrapper for @ref ZSOCK_FD_SETSIZE */
66+
#define FD_SETSIZE ZSOCK_FD_SETSIZE
67+
68+
/** POSIX wrapper for @ref ZSOCK_FD_ZERO */
69+
static inline void FD_ZERO(zsock_fd_set * set)
70+
{
71+
ZSOCK_FD_ZERO(set);
72+
}
73+
74+
/** POSIX wrapper for @ref ZSOCK_FD_ISSET */
75+
static inline int FD_ISSET(int fd, zsock_fd_set * set)
76+
{
77+
return ZSOCK_FD_ISSET(fd, set);
78+
}
79+
80+
/** POSIX wrapper for @ref ZSOCK_FD_CLR */
81+
static inline void FD_CLR(int fd, zsock_fd_set * set)
82+
{
83+
ZSOCK_FD_CLR(fd, set);
84+
}
85+
86+
/** POSIX wrapper for @ref ZSOCK_FD_SET */
87+
static inline void FD_SET(int fd, zsock_fd_set * set)
88+
{
89+
ZSOCK_FD_SET(fd, set);
90+
}
91+
92+
/** POSIX wrapper for @ref zsock_select */
93+
static inline int select(int nfds, zsock_fd_set * readfds, zsock_fd_set * writefds, zsock_fd_set * exceptfds,
94+
struct timeval * timeout)
95+
{
96+
return zsock_select(nfds, readfds, writefds, exceptfds, timeout);
97+
}
98+
99+
/** POSIX wrapper for @ref zsock_pollfd */
100+
#define pollfd zsock_pollfd
101+
102+
/** POSIX wrapper for @ref zsock_socket */
103+
static inline int socket(int family, int type, int proto)
104+
{
105+
return zsock_socket(family, type, proto);
106+
}
107+
108+
/** POSIX wrapper for @ref zsock_socketpair */
109+
static inline int socketpair(int family, int type, int proto, int sv[2])
110+
{
111+
return zsock_socketpair(family, type, proto, sv);
112+
}
113+
114+
/** POSIX wrapper for @ref zsock_close */
115+
static inline int close(int sock)
116+
{
117+
return zsock_close(sock);
118+
}
119+
120+
/** POSIX wrapper for @ref zsock_shutdown */
121+
static inline int shutdown(int sock, int how)
122+
{
123+
return zsock_shutdown(sock, how);
124+
}
125+
126+
/** POSIX wrapper for @ref zsock_bind */
127+
static inline int bind(int sock, const struct sockaddr * addr, socklen_t addrlen)
128+
{
129+
return zsock_bind(sock, addr, addrlen);
130+
}
131+
132+
/** POSIX wrapper for @ref zsock_connect */
133+
static inline int connect(int sock, const struct sockaddr * addr, socklen_t addrlen)
134+
{
135+
return zsock_connect(sock, addr, addrlen);
136+
}
137+
138+
/** POSIX wrapper for @ref zsock_listen */
139+
static inline int listen(int sock, int backlog)
140+
{
141+
return zsock_listen(sock, backlog);
142+
}
143+
144+
/** POSIX wrapper for @ref zsock_accept */
145+
static inline int accept(int sock, struct sockaddr * addr, socklen_t * addrlen)
146+
{
147+
return zsock_accept(sock, addr, addrlen);
148+
}
149+
150+
/** POSIX wrapper for @ref zsock_send */
151+
static inline ssize_t send(int sock, const void * buf, size_t len, int flags)
152+
{
153+
return zsock_send(sock, buf, len, flags);
154+
}
155+
156+
/** POSIX wrapper for @ref zsock_recv */
157+
static inline ssize_t recv(int sock, void * buf, size_t max_len, int flags)
158+
{
159+
return zsock_recv(sock, buf, max_len, flags);
160+
}
161+
162+
/** POSIX wrapper for @ref zsock_sendto */
163+
static inline ssize_t sendto(int sock, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr,
164+
socklen_t addrlen)
165+
{
166+
return zsock_sendto(sock, buf, len, flags, dest_addr, addrlen);
167+
}
168+
169+
/** POSIX wrapper for @ref zsock_sendmsg */
170+
static inline ssize_t sendmsg(int sock, const struct msghdr * message, int flags)
171+
{
172+
return zsock_sendmsg(sock, message, flags);
173+
}
174+
175+
/** POSIX wrapper for @ref zsock_recvfrom */
176+
static inline ssize_t recvfrom(int sock, void * buf, size_t max_len, int flags, struct sockaddr * src_addr, socklen_t * addrlen)
177+
{
178+
return zsock_recvfrom(sock, buf, max_len, flags, src_addr, addrlen);
179+
}
180+
181+
/** POSIX wrapper for @ref zsock_recvmsg */
182+
static inline ssize_t recvmsg(int sock, struct msghdr * msg, int flags)
183+
{
184+
return zsock_recvmsg(sock, msg, flags);
185+
}
186+
187+
/** POSIX wrapper for @ref zsock_poll */
188+
static inline int poll(struct zsock_pollfd * fds, int nfds, int timeout)
189+
{
190+
return zsock_poll(fds, nfds, timeout);
191+
}
192+
193+
/** POSIX wrapper for @ref zsock_getsockopt */
194+
static inline int getsockopt(int sock, int level, int optname, void * optval, socklen_t * optlen)
195+
{
196+
return zsock_getsockopt(sock, level, optname, optval, optlen);
197+
}
198+
199+
/** POSIX wrapper for @ref zsock_setsockopt */
200+
static inline int setsockopt(int sock, int level, int optname, const void * optval, socklen_t optlen)
201+
{
202+
return zsock_setsockopt(sock, level, optname, optval, optlen);
203+
}
204+
205+
/** POSIX wrapper for @ref zsock_getpeername */
206+
static inline int getpeername(int sock, struct sockaddr * addr, socklen_t * addrlen)
207+
{
208+
return zsock_getpeername(sock, addr, addrlen);
209+
}
210+
211+
/** POSIX wrapper for @ref zsock_getsockname */
212+
static inline int getsockname(int sock, struct sockaddr * addr, socklen_t * addrlen)
213+
{
214+
return zsock_getsockname(sock, addr, addrlen);
215+
}
216+
217+
/** POSIX wrapper for @ref zsock_getaddrinfo */
218+
static inline int getaddrinfo(const char * host, const char * service, const struct zsock_addrinfo * hints,
219+
struct zsock_addrinfo ** res)
220+
{
221+
return zsock_getaddrinfo(host, service, hints, res);
222+
}
223+
224+
/** POSIX wrapper for @ref zsock_freeaddrinfo */
225+
static inline void freeaddrinfo(struct zsock_addrinfo * ai)
226+
{
227+
zsock_freeaddrinfo(ai);
228+
}
229+
230+
/** POSIX wrapper for @ref zsock_gai_strerror */
231+
static inline const char * gai_strerror(int errcode)
232+
{
233+
return zsock_gai_strerror(errcode);
234+
}
235+
236+
/** POSIX wrapper for @ref zsock_getnameinfo */
237+
static inline int getnameinfo(const struct sockaddr * addr, socklen_t addrlen, char * host, socklen_t hostlen, char * serv,
238+
socklen_t servlen, int flags)
239+
{
240+
return zsock_getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
241+
}
242+
243+
/** POSIX wrapper for @ref zsock_addrinfo */
244+
#define addrinfo zsock_addrinfo
245+
246+
/** POSIX wrapper for @ref zsock_gethostname */
247+
static inline int gethostname(char * buf, size_t len)
248+
{
249+
return zsock_gethostname(buf, len);
250+
}
251+
252+
/** POSIX wrapper for @ref zsock_inet_pton */
253+
static inline int inet_pton(sa_family_t family, const char * src, void * dst)
254+
{
255+
return zsock_inet_pton(family, src, dst);
256+
}
257+
258+
/** POSIX wrapper for @ref zsock_inet_ntop */
259+
static inline char * inet_ntop(sa_family_t family, const void * src, char * dst, size_t size)
260+
{
261+
return zsock_inet_ntop(family, src, dst, size);
262+
}
263+
264+
/** POSIX wrapper for @ref ZSOCK_POLLIN */
265+
#define POLLIN ZSOCK_POLLIN
266+
/** POSIX wrapper for @ref ZSOCK_POLLOUT */
267+
#define POLLOUT ZSOCK_POLLOUT
268+
/** POSIX wrapper for @ref ZSOCK_POLLERR */
269+
#define POLLERR ZSOCK_POLLERR
270+
/** POSIX wrapper for @ref ZSOCK_POLLHUP */
271+
#define POLLHUP ZSOCK_POLLHUP
272+
/** POSIX wrapper for @ref ZSOCK_POLLNVAL */
273+
#define POLLNVAL ZSOCK_POLLNVAL
274+
275+
/** POSIX wrapper for @ref ZSOCK_MSG_PEEK */
276+
#define MSG_PEEK ZSOCK_MSG_PEEK
277+
/** POSIX wrapper for @ref ZSOCK_MSG_CTRUNC */
278+
#define MSG_CTRUNC ZSOCK_MSG_CTRUNC
279+
/** POSIX wrapper for @ref ZSOCK_MSG_TRUNC */
280+
#define MSG_TRUNC ZSOCK_MSG_TRUNC
281+
/** POSIX wrapper for @ref ZSOCK_MSG_DONTWAIT */
282+
#define MSG_DONTWAIT ZSOCK_MSG_DONTWAIT
283+
/** POSIX wrapper for @ref ZSOCK_MSG_WAITALL */
284+
#define MSG_WAITALL ZSOCK_MSG_WAITALL
285+
286+
/** POSIX wrapper for @ref ZSOCK_SHUT_RD */
287+
#define SHUT_RD ZSOCK_SHUT_RD
288+
/** POSIX wrapper for @ref ZSOCK_SHUT_WR */
289+
#define SHUT_WR ZSOCK_SHUT_WR
290+
/** POSIX wrapper for @ref ZSOCK_SHUT_RDWR */
291+
#define SHUT_RDWR ZSOCK_SHUT_RDWR
292+
293+
} // extern "C"
294+
#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>

0 commit comments

Comments
 (0)