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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue