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:
Michael Scott 2017-10-11 11:29:54 -07:00 committed by Jukka Rissanen
commit 1bca60d732
4 changed files with 24 additions and 15 deletions

View file

@ -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);
}
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;
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}