From d8c7a4a405fcc0bef1cf5b8244b713232782a2d9 Mon Sep 17 00:00:00 2001 From: Juha Ylinen Date: Wed, 17 Jan 2024 14:02:34 +0200 Subject: [PATCH 1/4] [nrf fromtree] net: lwm2m: Allow send operations when sleeping Add new kconfig CONFIG_LWM2M_QUEUE_MODE_NO_MSG_BUFFERING. When enabled and device is sleeping, Reqistration Update message is skipped and messages from send operation and notifications are sent right away. Reqistration update message is also skipped when lwm2m_engine resumes from pause state. Signed-off-by: Juha Ylinen (cherry picked from commit 9eee8d2be594a23eca102e21790e2d6db65ec2de) --- subsys/net/lib/lwm2m/Kconfig | 7 +++++++ subsys/net/lib/lwm2m/lwm2m_engine.c | 1 + subsys/net/lib/lwm2m/lwm2m_message_handling.c | 7 +++++++ subsys/net/lib/lwm2m/lwm2m_rd_client.c | 7 ++++++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/subsys/net/lib/lwm2m/Kconfig b/subsys/net/lib/lwm2m/Kconfig index 1e5a7ac8f6a..33a093308df 100644 --- a/subsys/net/lib/lwm2m/Kconfig +++ b/subsys/net/lib/lwm2m/Kconfig @@ -110,6 +110,13 @@ config LWM2M_QUEUE_MODE_UPTIME defaults to 93 seconds, see RFC 7252), it does not forbid other values though. +config LWM2M_QUEUE_MODE_NO_MSG_BUFFERING + bool "Disable buffering notifications and messages on queue mode" + select EXPERIMENTAL + help + Messages are sent right away instead of waiting for next registration update. + This might not be supported on all servers. + config LWM2M_TLS_SESSION_CACHING bool "TLS session caching" help diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index e08bb4ca17e..60ea1bdb794 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -244,6 +244,7 @@ int lwm2m_push_queued_buffers(struct lwm2m_ctx *client_ctx) break; } msg = SYS_SLIST_CONTAINER(msg_node, msg, node); + msg->pending->t0 = k_uptime_get(); sys_slist_append(&msg->ctx->pending_sends, &msg->node); } #endif diff --git a/subsys/net/lib/lwm2m/lwm2m_message_handling.c b/subsys/net/lib/lwm2m/lwm2m_message_handling.c index 480c64372e8..19a2e1ccdd0 100644 --- a/subsys/net/lib/lwm2m/lwm2m_message_handling.c +++ b/subsys/net/lib/lwm2m/lwm2m_message_handling.c @@ -726,6 +726,13 @@ int lwm2m_information_interface_send(struct lwm2m_message *msg) return ret; } + if (IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_NO_MSG_BUFFERING)) { + sys_slist_append(&msg->ctx->pending_sends, &msg->node); + lwm2m_engine_wake_up(); + lwm2m_engine_connection_resume(msg->ctx); + return 0; + } + if (msg->ctx->buffer_client_messages) { sys_slist_append(&msg->ctx->queued_messages, &msg->node); lwm2m_engine_wake_up(); diff --git a/subsys/net/lib/lwm2m/lwm2m_rd_client.c b/subsys/net/lib/lwm2m/lwm2m_rd_client.c index 95b576cb1c6..22ce51e5248 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rd_client.c +++ b/subsys/net/lib/lwm2m/lwm2m_rd_client.c @@ -1726,7 +1726,12 @@ int lwm2m_rd_client_connection_resume(struct lwm2m_ctx *client_ctx) IS_ENABLED(CONFIG_LWM2M_RD_CLIENT_LISTEN_AT_IDLE)) || !IS_ENABLED(CONFIG_LWM2M_DTLS_SUPPORT)) { client.engine_state = ENGINE_REGISTRATION_DONE; - client.trigger_update = true; + if (IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_NO_MSG_BUFFERING)) { + /* Force online for a short period */ + engine_update_tx_time(); + } else { + client.trigger_update = true; + } } else { client.engine_state = ENGINE_DO_REGISTRATION; } From ed40749aaad0554da3f0ecacb9001dcef36f1c8a Mon Sep 17 00:00:00 2001 From: Seppo Takalo Date: Mon, 22 Jan 2024 14:35:45 +0200 Subject: [PATCH 2/4] [nrf fromtree] net: lwm2m: Fix segfault on failed bootstrap If bootstrap fails, RD client will call lwm2m_engine_stop() which will close the context. The socket loop, however still contains a call to hint_socket_state(context, NULL) which has a null pointer now. Fix the segfault by allowing nullpointer on hint_socket_state(). Signed-off-by: Seppo Takalo (cherry picked from commit bf872870eab5177e2eb2700e5ebfde8e41a0a6d1) --- subsys/net/lib/lwm2m/lwm2m_engine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 60ea1bdb794..bad54c521d7 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -645,7 +645,7 @@ static int64_t check_notifications(struct lwm2m_ctx *ctx, const int64_t timestam */ static void hint_socket_state(struct lwm2m_ctx *ctx, struct lwm2m_message *ongoing_tx) { - if (!ctx->set_socket_state) { + if (!ctx || !ctx->set_socket_state) { return; } From abfd94834e07661194b3662790f35729777fa0ee Mon Sep 17 00:00:00 2001 From: Seppo Takalo Date: Thu, 25 Jan 2024 16:35:29 +0200 Subject: [PATCH 3/4] [nrf fromtree] net: lwm2m: Use CID_SUPPORTED instead of CID_ENABLED When ENABLED flag is used, we generate 32 byte DTLS Connection Identifier and include that in our DTLS Client HELO. This has no benefit as client only has one connection toward the server, it does not need any identification. When SUPPORTED flag is used, we just include zero length Connection Identifier in the handshake, which tell server that we support Connection Identifier and server can generate one for it. We then use the CID in the packets that we send towards server, but response packets don't contain any CID. This gives all the benefit of CID as server is able to identify us even when NAT mapping have changed. Signed-off-by: Seppo Takalo (cherry picked from commit 992936300bf684806ca02022399224a2030ad4e9) --- subsys/net/lib/lwm2m/lwm2m_engine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index bad54c521d7..55f23f77692 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -1060,7 +1060,7 @@ int lwm2m_set_default_sockopt(struct lwm2m_ctx *ctx) } if (IS_ENABLED(CONFIG_LWM2M_DTLS_CID)) { /* Enable CID */ - int cid = TLS_DTLS_CID_ENABLED; + int cid = TLS_DTLS_CID_SUPPORTED; ret = zsock_setsockopt(ctx->sock_fd, SOL_TLS, TLS_DTLS_CID, &cid, sizeof(cid)); From 3db21f73b96b4d41f00ff8990058271cba25a372 Mon Sep 17 00:00:00 2001 From: Juha Ylinen Date: Thu, 18 Jan 2024 09:55:02 +0200 Subject: [PATCH 4/4] [nrf fromtree] tests: lwm2m: Update lwm2m_engine tests Fix lwm2m_message initialization. Pending struct was NULL. Signed-off-by: Juha Ylinen (cherry picked from commit c84dc7ee2ed6211eae7ec33abdbe5472fd5bf621) --- tests/net/lib/lwm2m/lwm2m_engine/src/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/net/lib/lwm2m/lwm2m_engine/src/main.c b/tests/net/lib/lwm2m/lwm2m_engine/src/main.c index 5d80f5d1049..7078fbebe6d 100644 --- a/tests/net/lib/lwm2m/lwm2m_engine/src/main.c +++ b/tests/net/lib/lwm2m/lwm2m_engine/src/main.c @@ -260,11 +260,13 @@ ZTEST(lwm2m_engine, test_push_queued_buffers) int ret; struct lwm2m_ctx ctx; struct lwm2m_message msg; + struct coap_pending pending; (void)memset(&ctx, 0x0, sizeof(ctx)); sys_slist_init(&ctx.queued_messages); msg.ctx = &ctx; + msg.pending = &pending; sys_slist_append(&ctx.queued_messages, &msg.node); ret = lwm2m_push_queued_buffers(&ctx); zassert_equal(ret, 0); @@ -391,6 +393,7 @@ ZTEST(lwm2m_engine, test_socket_send) int ret; struct lwm2m_ctx ctx; struct lwm2m_message msg; + struct coap_pending pending; (void)memset(&ctx, 0x0, sizeof(ctx)); @@ -398,6 +401,7 @@ ZTEST(lwm2m_engine, test_socket_send) ctx.sock_fd = -1; sys_slist_init(&ctx.queued_messages); msg.ctx = &ctx; + msg.pending = &pending; msg.type = COAP_TYPE_CON; sys_slist_append(&ctx.queued_messages, &msg.node);