Skip to content

Commit ebbed24

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 extends `ZephyrSocket.h` to include Zephyr socket header and allow building with both configs disabled, adding neccessary wrappers.
1 parent f25f635 commit ebbed24

10 files changed

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

+250-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,27 @@
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+
32+
#if CHIP_SYSTEM_CONFIG_USE_ZEPHYR_SOCKET_EXTENSIONS
33+
34+
#if CHIP_SYSTEM_CONFIG_USE_POSIX_SOCKETS
35+
#include <sys/select.h>
36+
#endif
37+
3438
static inline ssize_t recvmsg(int sock, struct msghdr * msg, int flags)
3539
{
36-
// Zephyr doesn't implement recvmsg at all, but if the message vector size is > 0 we can simply
40+
// Older Zephyr version doesn't implement recvmsg at all, but if the message vector size is > 0 we can simply
3741
// translate recvmsg to recvfrom which fills only the first of the provided buffers (although
3842
// we don't get control messages in such a case).
3943

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

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