From d2e7a7d0c75f519c797104d038c00ed7bd77806c Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Mon, 24 Feb 2020 16:44:52 +0100 Subject: [PATCH] net: lwm2m: Notify when it's safe to turn RX off According to LWM2M specification, when Queue Mode is used, the LWM2M client should keep the reciever on for specified time after sending A CoAP message. This commit adds a new LWM2M event, `LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF`, to facilitate the process by notifying the application when it's safe to turn the receiver off. Signed-off-by: Robert Lubos --- include/net/lwm2m.h | 3 ++- subsys/net/lib/lwm2m/lwm2m_engine.c | 5 +++++ subsys/net/lib/lwm2m/lwm2m_rd_client.c | 17 +++++++++++++++++ subsys/net/lib/lwm2m/lwm2m_rd_client.h | 2 ++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/net/lwm2m.h b/include/net/lwm2m.h index 2fcbb95e30c..a0471286edf 100644 --- a/include/net/lwm2m.h +++ b/include/net/lwm2m.h @@ -837,7 +837,8 @@ enum lwm2m_rd_client_event { LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE, LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE, - LWM2M_RD_CLIENT_EVENT_DISCONNECT + LWM2M_RD_CLIENT_EVENT_DISCONNECT, + LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF, }; /** diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 3f9b83f680e..d42fc2e357b 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -1048,6 +1048,11 @@ int lwm2m_send_message(struct lwm2m_message *msg) lwm2m_reset_message(msg, true); } + if (IS_ENABLED(CONFIG_LWM2M_RD_CLIENT_SUPPORT) && + IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_ENABLED)) { + engine_update_tx_time(); + } + return 0; } diff --git a/subsys/net/lib/lwm2m/lwm2m_rd_client.c b/subsys/net/lib/lwm2m/lwm2m_rd_client.c index 0fb2698362e..5c5e1b61c35 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rd_client.c +++ b/subsys/net/lib/lwm2m/lwm2m_rd_client.c @@ -87,6 +87,7 @@ enum sm_engine_state { ENGINE_DO_REGISTRATION, ENGINE_REGISTRATION_SENT, ENGINE_REGISTRATION_DONE, + ENGINE_REGISTRATION_DONE_RX_OFF, ENGINE_UPDATE_SENT, ENGINE_DEREGISTER, ENGINE_DEREGISTER_SENT, @@ -102,6 +103,7 @@ struct lwm2m_rd_client_info { u8_t trigger_update; s64_t last_update; + s64_t last_tx; char ep_name[CLIENT_EP_LEN]; char server_ep[CLIENT_EP_LEN]; @@ -113,6 +115,11 @@ struct lwm2m_rd_client_info { static char query_buffer[64]; /* allocate some data for queries and updates */ static u8_t client_data[256]; /* allocate some data for the RD */ +void engine_update_tx_time(void) +{ + client.last_tx = k_uptime_get(); +} + static void set_sm_state(u8_t sm_state) { enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE; @@ -130,6 +137,8 @@ static void set_sm_state(u8_t sm_state) event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE; } else if (sm_state == ENGINE_REGISTRATION_DONE) { event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE; + } else if (sm_state == ENGINE_REGISTRATION_DONE_RX_OFF) { + event = LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF; } else if ((sm_state == ENGINE_INIT || sm_state == ENGINE_DEREGISTERED) && (client.engine_state >= ENGINE_DO_REGISTRATION && @@ -754,6 +763,13 @@ static int sm_registration_done(void) } } + if (IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_ENABLED) && + (client.engine_state != ENGINE_REGISTRATION_DONE_RX_OFF) && + (((k_uptime_get() - client.last_tx) / 1000) >= + CONFIG_LWM2M_QUEUE_MODE_UPTIME)) { + set_sm_state(ENGINE_REGISTRATION_DONE_RX_OFF); + } + return ret; } @@ -842,6 +858,7 @@ static void lwm2m_rd_client_service(struct k_work *work) break; case ENGINE_REGISTRATION_DONE: + case ENGINE_REGISTRATION_DONE_RX_OFF: sm_registration_done(); break; diff --git a/subsys/net/lib/lwm2m/lwm2m_rd_client.h b/subsys/net/lib/lwm2m/lwm2m_rd_client.h index 344e7d05e89..96bb6f1c416 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rd_client.h +++ b/subsys/net/lib/lwm2m/lwm2m_rd_client.h @@ -43,4 +43,6 @@ void engine_trigger_update(void); void engine_bootstrap_finish(void); #endif +void engine_update_tx_time(void); + #endif /* LWM2M_RD_CLIENT_H */