From 1bca60d732727ad2ea8655a492509e5884ae2066 Mon Sep 17 00:00:00 2001 From: Michael Scott Date: Wed, 11 Oct 2017 11:29:54 -0700 Subject: [PATCH] net: lwm2m: make release in lwm2m_release_message() optional Let's rename lwm2m_release_message() to lwm2m_reset_message() and add a parameter to let the function know whether or not to release the lwm2m_message resource back to the pool. By adding the optional release parameter, we can keep the lwm2m_message but reset the underlying net_pkt / net_buf resources. This allows us to regenerate the net_pkt after determining an error has occured. In this case, we don't want the previously added net_pkt contents but we do want to maintain the message id, token, etc. Signed-off-by: Michael Scott --- subsys/net/lib/lwm2m/lwm2m_engine.c | 27 ++++++++++++------- subsys/net/lib/lwm2m/lwm2m_engine.h | 2 +- .../net/lib/lwm2m/lwm2m_obj_firmware_pull.c | 4 +-- subsys/net/lib/lwm2m/lwm2m_rd_client.c | 6 ++--- 4 files changed, 24 insertions(+), 15 deletions(-) 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; }