net: lwm2m: Refactor RD client to be tickless

Call RD client service only when there is state transitioning.
Remove periodic 500 ms timer.

Signed-off-by: Seppo Takalo <seppo.takalo@nordicsemi.no>
This commit is contained in:
Seppo Takalo 2023-07-27 16:35:05 +03:00 committed by Carles Cufí
commit 518bbc1303
4 changed files with 75 additions and 47 deletions

View file

@ -167,7 +167,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_ok)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -198,10 +197,8 @@ ZTEST(lwm2m_rd_client, test_timeout_resume_registration)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
lwm2m_get_bool_fake.custom_fake = lwm2m_get_bool_fake_default;
lwm2m_sprint_ip_addr_fake.custom_fake = lwm2m_sprint_ip_addr_fake_default;
@ -228,7 +225,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_timeout)
test_prepare_pending_message_cb(&message_reply_timeout_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -250,7 +246,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_fail)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -272,7 +267,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_update)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -300,7 +294,6 @@ ZTEST(lwm2m_rd_client, test_rx_off)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -329,7 +322,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_update_fail)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -359,7 +351,6 @@ ZTEST(lwm2m_rd_client, test_registration_update_timeout)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -376,12 +367,12 @@ ZTEST(lwm2m_rd_client, test_registration_update_timeout)
test_prepare_pending_message_cb(&message_reply_timeout_cb_default);
lwm2m_rd_client_update();
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE, 2));
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_TIMEOUT, 3),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE, 1));
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_TIMEOUT, 2),
NULL);
test_prepare_pending_message_cb(&message_reply_cb_default);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE, 4),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE, 3),
NULL);
}
@ -393,7 +384,6 @@ ZTEST(lwm2m_rd_client, test_deregistration_timeout)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -421,7 +411,6 @@ ZTEST(lwm2m_rd_client, test_error_on_registration_update)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -448,7 +437,6 @@ ZTEST(lwm2m_rd_client, test_network_error_on_registration)
(void)memset(&ctx, 0x0, sizeof(ctx));
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -461,6 +449,8 @@ ZTEST(lwm2m_rd_client, test_network_error_on_registration)
coap_packet_append_option_fake.custom_fake = coap_packet_append_option_fake_err;
zassert_true(lwm2m_rd_client_start(&ctx, "Test", 0, lwm2m_event_cb, lwm2m_observe_cb) == 0,
NULL);
wait_for_service(100);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_NETWORK_ERROR, 0), NULL);
}
@ -472,7 +462,6 @@ ZTEST(lwm2m_rd_client, test_suspend_resume_registration)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);
@ -506,7 +495,6 @@ ZTEST(lwm2m_rd_client, test_socket_error)
test_prepare_pending_message_cb(&message_reply_cb_default);
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
lwm2m_rd_client_init();
test_lwm2m_engine_start_service();
wait_for_service(1);

View file

@ -80,14 +80,14 @@ char *lwm2m_sprint_ip_addr_fake_default(const struct sockaddr *addr)
DEFINE_FAKE_VALUE_FUNC(int, lwm2m_server_short_id_to_inst, uint16_t);
DEFINE_FAKE_VALUE_FUNC(int, lwm2m_security_index_to_inst_id, int);
DEFINE_FAKE_VALUE_FUNC(int, lwm2m_engine_add_service, k_work_handler_t, uint32_t);
k_work_handler_t lwm2m_engine_add_service_service;
uint32_t lwm2m_engine_add_service_period_ms = 20;
int lwm2m_engine_add_service_fake_default(k_work_handler_t service, uint32_t period_ms)
k_work_handler_t service;
int64_t next;
int lwm2m_engine_call_at(k_work_handler_t work, int64_t timestamp)
{
lwm2m_engine_add_service_service = service;
lwm2m_engine_add_service_period_ms = period_ms;
service = work;
next = timestamp ? timestamp : 1;
return 0;
}
@ -97,18 +97,23 @@ void *(*pending_message_cb)();
static void service_work_fn(struct k_work *work)
{
while (lwm2m_engine_add_service_service != NULL) {
while (true) {
if (pending_message != NULL && pending_message_cb != NULL) {
pending_message_cb(pending_message);
pending_message = NULL;
}
lwm2m_engine_add_service_service(work);
k_sleep(K_MSEC(lwm2m_engine_add_service_period_ms));
if (next && next < k_uptime_get()) {
printk("Event!\n");
next = 0;
service(NULL);
}
k_sleep(K_MSEC(10));
counter--;
/* avoid endless loop if rd client is stuck somewhere */
if (counter == 0) {
printk("Counter!\n");
break;
}
}
@ -119,7 +124,7 @@ void wait_for_service(uint16_t cycles)
uint16_t end = counter - cycles;
while (counter > end) {
k_sleep(K_MSEC(1));
k_sleep(K_MSEC(10));
}
}

View file

@ -61,8 +61,6 @@ DECLARE_FAKE_VALUE_FUNC(char *, lwm2m_sprint_ip_addr, const struct sockaddr *);
char *lwm2m_sprint_ip_addr_fake_default(const struct sockaddr *addr);
DECLARE_FAKE_VALUE_FUNC(int, lwm2m_server_short_id_to_inst, uint16_t);
DECLARE_FAKE_VALUE_FUNC(int, lwm2m_security_index_to_inst_id, int);
DECLARE_FAKE_VALUE_FUNC(int, lwm2m_engine_add_service, k_work_handler_t, uint32_t);
int lwm2m_engine_add_service_fake_default(k_work_handler_t service, uint32_t period_ms);
void wait_for_service(uint16_t cycles);
void test_lwm2m_engine_start_service(void);
void test_lwm2m_engine_stop_service(void);
@ -107,7 +105,6 @@ DECLARE_FAKE_VALUE_FUNC(int, do_register_op_link_format, struct lwm2m_message *)
FUNC(lwm2m_sprint_ip_addr) \
FUNC(lwm2m_server_short_id_to_inst) \
FUNC(lwm2m_security_index_to_inst_id) \
FUNC(lwm2m_engine_add_service) \
FUNC(lwm2m_init_message) \
FUNC(lwm2m_reset_message) \
FUNC(lwm2m_send_message_async) \