diff --git a/samples/net/lwm2m_client/overlay-tickless.conf b/samples/net/lwm2m_client/overlay-tickless.conf index 132515f6380..0dbeb04b11a 100644 --- a/samples/net/lwm2m_client/overlay-tickless.conf +++ b/samples/net/lwm2m_client/overlay-tickless.conf @@ -1,2 +1,3 @@ -CONFIG_NET_SOCKETPAIR=y +CONFIG_ZVFS_EVENTFD=y +CONFIG_ZVFS_EVENTFD_MAX=2 CONFIG_LWM2M_TICKLESS=y diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index ebf58c26f8a..70ca2f52f74 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -33,6 +33,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include #include #include +#include #if defined(CONFIG_LWM2M_DTLS_SUPPORT) #include @@ -105,7 +106,6 @@ static struct zsock_pollfd sock_fds[MAX_POLL_FD]; static struct lwm2m_ctx *sock_ctx[MAX_POLL_FD]; static int sock_nfds; -static int control_sock; /* Resource wrappers */ #if defined(CONFIG_LWM2M_COAP_BLOCK_TRANSFER) @@ -128,7 +128,7 @@ static int lwm2m_socket_update(struct lwm2m_ctx *ctx); void lwm2m_engine_wake_up(void) { if (IS_ENABLED(CONFIG_LWM2M_TICKLESS)) { - zsock_send(control_sock, &(char){0}, 1, 0); + zvfs_eventfd_write(sock_fds[MAX_POLL_FD - 1].fd, 1); } } @@ -870,12 +870,12 @@ static void socket_loop(void *p1, void *p2, void *p3) for (i = 0; i < MAX_POLL_FD; i++) { short revents = sock_fds[i].revents; - if ((revents & ZSOCK_POLLIN) && sock_fds[i].fd != -1 && - sock_ctx[i] == NULL) { + if (IS_ENABLED(CONFIG_LWM2M_TICKLESS) && (revents & ZSOCK_POLLIN) && + i == (MAX_POLL_FD - 1)) { /* This is the control socket, just read and ignore the data */ - char tmp; + zvfs_eventfd_t tmp; - zsock_recv(sock_fds[i].fd, &tmp, 1, 0); + zvfs_eventfd_read(sock_fds[i].fd, &tmp); continue; } if (sock_ctx[i] != NULL && sock_ctx[i]->sock_fd < 0) { @@ -1348,31 +1348,17 @@ static int lwm2m_engine_init(void) } if (IS_ENABLED(CONFIG_LWM2M_TICKLESS)) { - /* Create socketpair that is used to wake zsock_poll() in the main loop */ - int s[2]; - int ret = zsock_socketpair(AF_UNIX, SOCK_STREAM, 0, s); + /* Create eventfd that is used to wake zsock_poll() in the main loop */ + int efd = zvfs_eventfd(0, ZVFS_EFD_NONBLOCK); - if (ret) { - LOG_ERR("Error; socketpair() returned %d", ret); - return ret; - } - /* Last poll-handle is reserved for control socket */ - sock_fds[MAX_POLL_FD - 1].fd = s[0]; - control_sock = s[1]; - ret = zsock_fcntl(s[0], F_SETFL, O_NONBLOCK); - if (ret) { - LOG_ERR("zsock_fcntl() %d", ret); - zsock_close(s[0]); - zsock_close(s[1]); - return ret; - } - ret = zsock_fcntl(s[1], F_SETFL, O_NONBLOCK); - if (ret) { - LOG_ERR("zsock_fcntl() %d", ret); - zsock_close(s[0]); - zsock_close(s[1]); - return ret; + if (efd == -1) { + int err = errno; + + LOG_ERR("Error; eventfd() returned %d", err); + return -err; } + /* Last poll-handle is reserved for control eventfd */ + sock_fds[MAX_POLL_FD - 1].fd = efd; } lwm2m_clear_block_contexts(); diff --git a/tests/net/lib/lwm2m/interop/prj.conf b/tests/net/lib/lwm2m/interop/prj.conf index ac69c45dfbe..2a8ad090074 100644 --- a/tests/net/lib/lwm2m/interop/prj.conf +++ b/tests/net/lib/lwm2m/interop/prj.conf @@ -19,7 +19,8 @@ CONFIG_LWM2M_IPSO_SUPPORT=y CONFIG_LWM2M_SHELL=y CONFIG_LWM2M_TICKLESS=y -CONFIG_NET_SOCKETPAIR=y +CONFIG_ZVFS_EVENTFD=y +CONFIG_ZVFS_EVENTFD_MAX=2 #Enable test objects CONFIG_LWM2M_PORTFOLIO_OBJ_SUPPORT=y