diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 509440fd1f9..1441dad3fa6 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -758,7 +758,7 @@ struct lwm2m_message *lwm2m_get_message(struct lwm2m_ctx *client_ctx) return NULL; } -void lwm2m_release_message(struct lwm2m_message *msg) +void lwm2m_reset_message(struct lwm2m_message *msg, bool release) { if (!msg) { return; @@ -773,7 +773,16 @@ void lwm2m_release_message(struct lwm2m_message *msg) coap_reply_clear(msg->reply); } - memset(msg, 0, sizeof(*msg)); + if (release) { + memset(msg, 0, sizeof(*msg)); + } else { + if (msg->cpkt.pkt) { + net_pkt_unref(msg->cpkt.pkt); + } + + msg->message_timeout_cb = NULL; + memset(&msg->cpkt, 0, sizeof(msg->cpkt)); + } } int lwm2m_init_message(struct lwm2m_message *msg) @@ -865,7 +874,7 @@ int lwm2m_init_message(struct lwm2m_message *msg) return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); if (pkt) { net_pkt_unref(pkt); } @@ -900,7 +909,7 @@ int lwm2m_send_message(struct lwm2m_message *msg) msg->pending->timeout); } else { /* if we're not expecting an ACK, free up the msg data */ - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); } return 0; @@ -2676,7 +2685,7 @@ void lwm2m_udp_receive(struct lwm2m_ctx *client_ctx, struct net_pkt *pkt, CONFIG_LWM2M_ENGINE_MAX_PENDING); /* * Clear pending pointer because coap_pending_received() calls - * coap_pending_clear, and later when we call lwm2m_release_message() + * coap_pending_clear, and later when we call lwm2m_reset_message() * it will try and call coap_pending_clear() again if msg->pending * is != NULL. */ @@ -2717,7 +2726,7 @@ void lwm2m_udp_receive(struct lwm2m_ctx *client_ctx, struct net_pkt *pkt, if (reply || pending) { /* free up msg resources */ if (msg) { - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); } SYS_LOG_DBG("reply %p handled and removed", reply); @@ -2754,7 +2763,7 @@ void lwm2m_udp_receive(struct lwm2m_ctx *client_ctx, struct net_pkt *pkt, if (r < 0) { SYS_LOG_ERR("Err sending response: %d", r); - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); } } else { SYS_LOG_ERR("No handler for response"); @@ -2804,7 +2813,7 @@ static void retransmit_request(struct k_work *work) /* final unref to release pkt */ net_pkt_unref(pending->pkt); - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); return; } @@ -2954,7 +2963,7 @@ static int generate_notify_message(struct observe_node *obs, return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); return ret; } diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.h b/subsys/net/lib/lwm2m/lwm2m_engine.h index cd72d832e80..b73e609bcc3 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.h +++ b/subsys/net/lib/lwm2m/lwm2m_engine.h @@ -90,7 +90,7 @@ void lwm2m_engine_context_init(struct lwm2m_ctx *client_ctx); /* LwM2M message functions */ struct lwm2m_message *lwm2m_get_message(struct lwm2m_ctx *client_ctx); -void lwm2m_release_message(struct lwm2m_message *msg); +void lwm2m_reset_message(struct lwm2m_message *msg, bool release); int lwm2m_init_message(struct lwm2m_message *msg); int lwm2m_send_message(struct lwm2m_message *msg); diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c b/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c index 73ca1a0c2e6..ba7665dc657 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c @@ -166,7 +166,7 @@ static int transfer_request(struct coap_block_context *ctx, return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); if (ret == -ENOMEM) { lwm2m_firmware_set_update_result(RESULT_OUT_OF_MEM); @@ -207,7 +207,7 @@ static int transfer_empty_ack(u16_t mid) return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); return ret; } diff --git a/subsys/net/lib/lwm2m/lwm2m_rd_client.c b/subsys/net/lib/lwm2m/lwm2m_rd_client.c index 48ff3a4bb18..6f2cead25cb 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rd_client.c +++ b/subsys/net/lib/lwm2m/lwm2m_rd_client.c @@ -556,7 +556,7 @@ static int sm_do_bootstrap(int index) return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); return ret; } @@ -701,7 +701,7 @@ static int sm_send_registration(int index, bool send_obj_support_data, return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); return ret; } @@ -792,7 +792,7 @@ static int sm_do_deregister(int index) return 0; cleanup: - lwm2m_release_message(msg); + lwm2m_reset_message(msg, true); return ret; }