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 <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2020-02-24 16:44:52 +01:00 committed by Jukka Rissanen
commit d2e7a7d0c7
4 changed files with 26 additions and 1 deletions

View file

@ -837,7 +837,8 @@ enum lwm2m_rd_client_event {
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE, LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE, LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
LWM2M_RD_CLIENT_EVENT_DISCONNECT LWM2M_RD_CLIENT_EVENT_DISCONNECT,
LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF,
}; };
/** /**

View file

@ -1048,6 +1048,11 @@ int lwm2m_send_message(struct lwm2m_message *msg)
lwm2m_reset_message(msg, true); 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; return 0;
} }

View file

@ -87,6 +87,7 @@ enum sm_engine_state {
ENGINE_DO_REGISTRATION, ENGINE_DO_REGISTRATION,
ENGINE_REGISTRATION_SENT, ENGINE_REGISTRATION_SENT,
ENGINE_REGISTRATION_DONE, ENGINE_REGISTRATION_DONE,
ENGINE_REGISTRATION_DONE_RX_OFF,
ENGINE_UPDATE_SENT, ENGINE_UPDATE_SENT,
ENGINE_DEREGISTER, ENGINE_DEREGISTER,
ENGINE_DEREGISTER_SENT, ENGINE_DEREGISTER_SENT,
@ -102,6 +103,7 @@ struct lwm2m_rd_client_info {
u8_t trigger_update; u8_t trigger_update;
s64_t last_update; s64_t last_update;
s64_t last_tx;
char ep_name[CLIENT_EP_LEN]; char ep_name[CLIENT_EP_LEN];
char server_ep[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 char query_buffer[64]; /* allocate some data for queries and updates */
static u8_t client_data[256]; /* allocate some data for the RD */ 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) static void set_sm_state(u8_t sm_state)
{ {
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE; 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; event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE;
} else if (sm_state == ENGINE_REGISTRATION_DONE) { } else if (sm_state == ENGINE_REGISTRATION_DONE) {
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE; 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 || } else if ((sm_state == ENGINE_INIT ||
sm_state == ENGINE_DEREGISTERED) && sm_state == ENGINE_DEREGISTERED) &&
(client.engine_state >= ENGINE_DO_REGISTRATION && (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; return ret;
} }
@ -842,6 +858,7 @@ static void lwm2m_rd_client_service(struct k_work *work)
break; break;
case ENGINE_REGISTRATION_DONE: case ENGINE_REGISTRATION_DONE:
case ENGINE_REGISTRATION_DONE_RX_OFF:
sm_registration_done(); sm_registration_done();
break; break;

View file

@ -43,4 +43,6 @@ void engine_trigger_update(void);
void engine_bootstrap_finish(void); void engine_bootstrap_finish(void);
#endif #endif
void engine_update_tx_time(void);
#endif /* LWM2M_RD_CLIENT_H */ #endif /* LWM2M_RD_CLIENT_H */