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 <michael.scott@linaro.org>
This commit is contained in:
parent
fb734acc73
commit
1bca60d732
4 changed files with 24 additions and 15 deletions
|
@ -758,7 +758,7 @@ struct lwm2m_message *lwm2m_get_message(struct lwm2m_ctx *client_ctx)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lwm2m_release_message(struct lwm2m_message *msg)
|
void lwm2m_reset_message(struct lwm2m_message *msg, bool release)
|
||||||
{
|
{
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
return;
|
return;
|
||||||
|
@ -773,7 +773,16 @@ void lwm2m_release_message(struct lwm2m_message *msg)
|
||||||
coap_reply_clear(msg->reply);
|
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)
|
int lwm2m_init_message(struct lwm2m_message *msg)
|
||||||
|
@ -865,7 +874,7 @@ int lwm2m_init_message(struct lwm2m_message *msg)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
if (pkt) {
|
if (pkt) {
|
||||||
net_pkt_unref(pkt);
|
net_pkt_unref(pkt);
|
||||||
}
|
}
|
||||||
|
@ -900,7 +909,7 @@ int lwm2m_send_message(struct lwm2m_message *msg)
|
||||||
msg->pending->timeout);
|
msg->pending->timeout);
|
||||||
} else {
|
} else {
|
||||||
/* if we're not expecting an ACK, free up the msg data */
|
/* if we're not expecting an ACK, free up the msg data */
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2676,7 +2685,7 @@ void lwm2m_udp_receive(struct lwm2m_ctx *client_ctx, struct net_pkt *pkt,
|
||||||
CONFIG_LWM2M_ENGINE_MAX_PENDING);
|
CONFIG_LWM2M_ENGINE_MAX_PENDING);
|
||||||
/*
|
/*
|
||||||
* Clear pending pointer because coap_pending_received() calls
|
* 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
|
* it will try and call coap_pending_clear() again if msg->pending
|
||||||
* is != NULL.
|
* is != NULL.
|
||||||
*/
|
*/
|
||||||
|
@ -2717,7 +2726,7 @@ void lwm2m_udp_receive(struct lwm2m_ctx *client_ctx, struct net_pkt *pkt,
|
||||||
if (reply || pending) {
|
if (reply || pending) {
|
||||||
/* free up msg resources */
|
/* free up msg resources */
|
||||||
if (msg) {
|
if (msg) {
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SYS_LOG_DBG("reply %p handled and removed", reply);
|
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) {
|
if (r < 0) {
|
||||||
SYS_LOG_ERR("Err sending response: %d",
|
SYS_LOG_ERR("Err sending response: %d",
|
||||||
r);
|
r);
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SYS_LOG_ERR("No handler for response");
|
SYS_LOG_ERR("No handler for response");
|
||||||
|
@ -2804,7 +2813,7 @@ static void retransmit_request(struct k_work *work)
|
||||||
|
|
||||||
/* final unref to release pkt */
|
/* final unref to release pkt */
|
||||||
net_pkt_unref(pending->pkt);
|
net_pkt_unref(pending->pkt);
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2954,7 +2963,7 @@ static int generate_notify_message(struct observe_node *obs,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ void lwm2m_engine_context_init(struct lwm2m_ctx *client_ctx);
|
||||||
|
|
||||||
/* LwM2M message functions */
|
/* LwM2M message functions */
|
||||||
struct lwm2m_message *lwm2m_get_message(struct lwm2m_ctx *client_ctx);
|
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_init_message(struct lwm2m_message *msg);
|
||||||
int lwm2m_send_message(struct lwm2m_message *msg);
|
int lwm2m_send_message(struct lwm2m_message *msg);
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ static int transfer_request(struct coap_block_context *ctx,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
|
|
||||||
if (ret == -ENOMEM) {
|
if (ret == -ENOMEM) {
|
||||||
lwm2m_firmware_set_update_result(RESULT_OUT_OF_MEM);
|
lwm2m_firmware_set_update_result(RESULT_OUT_OF_MEM);
|
||||||
|
@ -207,7 +207,7 @@ static int transfer_empty_ack(u16_t mid)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -556,7 +556,7 @@ static int sm_do_bootstrap(int index)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -701,7 +701,7 @@ static int sm_send_registration(int index, bool send_obj_support_data,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -792,7 +792,7 @@ static int sm_do_deregister(int index)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
lwm2m_release_message(msg);
|
lwm2m_reset_message(msg, true);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue