From ea072341d5c254ac3997986823a205a3b9d0781f Mon Sep 17 00:00:00 2001 From: Kiril Petrov Date: Sun, 23 Feb 2020 20:04:10 +0200 Subject: [PATCH] net: lwm2m: init pendings and replies on lwm2m_engine_start On OT network with poor coverage, very often request/observe packets doesn't get it's ACK and consumes from pendings/replies/message stacks. In such cases when LWM2M engine tries to recover by resetting its state, it fails because of lack of free messages. Signed-off-by: Kiril Petrov --- subsys/net/lib/lwm2m/lwm2m_engine.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index b7fc8012a21..ed216f71ec8 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -4005,6 +4005,8 @@ int lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx) struct observe_node *obs, *tmp; sys_snode_t *prev_node = NULL; int sock_fd = client_ctx->sock_fd; + struct lwm2m_message *msg; + size_t i; /* Cancel pending retransmit work */ k_delayed_work_cancel(&client_ctx->retransmit_work); @@ -4021,6 +4023,16 @@ int lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx) } } + for (i = 0, msg = messages; i < CONFIG_LWM2M_ENGINE_MAX_MESSAGES; + i++, msg++) { + memset(msg, 0, sizeof(struct lwm2m_message)); + } + + coap_pendings_clear(client_ctx->pendings, + CONFIG_LWM2M_ENGINE_MAX_PENDING); + coap_replies_clear(client_ctx->replies, + CONFIG_LWM2M_ENGINE_MAX_REPLIES); + lwm2m_socket_del(client_ctx); client_ctx->sock_fd = -1; if (sock_fd >= 0) {