Skip to content

Commit 518bbc1

Browse files
SeppoTakalocarlescufi
authored andcommitted
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 <[email protected]>
1 parent 2da8844 commit 518bbc1

File tree

4 files changed

+75
-47
lines changed

4 files changed

+75
-47
lines changed

subsys/net/lib/lwm2m/lwm2m_rd_client.c

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,16 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
6464
#include "lwm2m_util.h"
6565

6666
#define LWM2M_RD_CLIENT_URI "rd"
67-
6867
#define SECONDS_TO_UPDATE_EARLY CONFIG_LWM2M_SECONDS_TO_UPDATE_EARLY
69-
#define STATE_MACHINE_UPDATE_INTERVAL_MS 500
70-
7168
#define CLIENT_EP_LEN CONFIG_LWM2M_RD_CLIENT_ENDPOINT_NAME_MAX_LENGTH
72-
7369
#define CLIENT_BINDING_LEN sizeof("UQ")
7470
#define CLIENT_QUEUE_LEN sizeof("Q")
7571

7672
static void sm_handle_registration_update_failure(void);
7773
static int sm_send_registration_msg(void);
7874
static bool sm_is_suspended(void);
75+
static void lwm2m_rd_client_service(struct k_work *work);
76+
static int64_t calc_next_event(void);
7977

8078
/* The states for the RD client state machine */
8179
/*
@@ -117,6 +115,7 @@ struct lwm2m_rd_client_info {
117115

118116
int64_t last_update;
119117
int64_t last_tx;
118+
int64_t next_event;
120119

121120
char ep_name[CLIENT_EP_LEN];
122121
char server_ep[CLIENT_EP_LEN];
@@ -167,6 +166,11 @@ void engine_update_tx_time(void)
167166
client.last_tx = k_uptime_get();
168167
}
169168

169+
static void next_event_at(int64_t timestamp)
170+
{
171+
(void)lwm2m_engine_call_at(lwm2m_rd_client_service, timestamp);
172+
}
173+
170174
static void set_sm_state(uint8_t sm_state)
171175
{
172176
k_mutex_lock(&client.mutex, K_FOREVER);
@@ -228,6 +232,7 @@ static void set_sm_state(uint8_t sm_state)
228232
lwm2m_close_socket(client.ctx);
229233
}
230234
}
235+
next_event_at(0);
231236
k_mutex_unlock(&client.mutex);
232237
}
233238

@@ -453,6 +458,7 @@ int engine_trigger_bootstrap(void)
453458
client.use_bootstrap = true;
454459
client.trigger_update = false;
455460
client.engine_state = ENGINE_INIT;
461+
next_event_at(0);
456462
k_mutex_unlock(&client.mutex);
457463
return 0;
458464
#else
@@ -1000,6 +1006,7 @@ static void sm_handle_registration_update_failure(void)
10001006
client.engine_state = ENGINE_SEND_REGISTRATION;
10011007
lwm2m_engine_context_close(client.ctx);
10021008
k_mutex_unlock(&client.mutex);
1009+
next_event_at(0);
10031010
}
10041011

10051012
static int sm_send_registration_msg(void)
@@ -1079,28 +1086,49 @@ static int sm_do_registration(void)
10791086
return ret;
10801087
}
10811088

1082-
static int sm_registration_done(void)
1089+
static int64_t next_update(void)
10831090
{
1084-
k_mutex_lock(&client.mutex, K_FOREVER);
1085-
int ret = 0;
1086-
10871091
/*
10881092
* check for lifetime seconds - SECONDS_TO_UPDATE_EARLY
10891093
* so that we can update early and avoid lifetime timeout
10901094
*/
1095+
return client.last_update + (client.lifetime - SECONDS_TO_UPDATE_EARLY) * 1000;
1096+
}
1097+
1098+
static int64_t next_rx_off(void)
1099+
{
1100+
if (IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_ENABLED)) {
1101+
return client.last_tx + CONFIG_LWM2M_QUEUE_MODE_UPTIME * 1000;
1102+
} else {
1103+
return next_update();
1104+
}
1105+
}
1106+
1107+
/** Return timestamp to next even whether it is RX_OFF or update event */
1108+
static int64_t calc_next_event(void)
1109+
{
1110+
return Z_MIN(next_update(), next_rx_off());
1111+
}
1112+
1113+
static void sm_registration_done(void)
1114+
{
1115+
k_mutex_lock(&client.mutex, K_FOREVER);
1116+
1117+
int64_t now = k_uptime_get();
1118+
10911119
if (sm_is_registered() &&
10921120
(client.trigger_update ||
1093-
((client.lifetime - SECONDS_TO_UPDATE_EARLY) <=
1094-
(k_uptime_get() - client.last_update) / 1000))) {
1121+
now >= next_update())) {
10951122
set_sm_state(ENGINE_UPDATE_REGISTRATION);
10961123
} else if (IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_ENABLED) &&
10971124
(client.engine_state != ENGINE_REGISTRATION_DONE_RX_OFF) &&
1098-
(((k_uptime_get() - client.last_tx) / 1000) >=
1099-
CONFIG_LWM2M_QUEUE_MODE_UPTIME)) {
1125+
(now >= next_rx_off())) {
11001126
set_sm_state(ENGINE_REGISTRATION_DONE_RX_OFF);
1127+
next_event_at(next_update());
1128+
} else {
1129+
next_event_at(calc_next_event());
11011130
}
11021131
k_mutex_unlock(&client.mutex);
1103-
return ret;
11041132
}
11051133

11061134
static int update_registration(void)
@@ -1214,7 +1242,9 @@ static void sm_do_network_error(void)
12141242
{
12151243
int err;
12161244

1217-
if (--client.retry_delay > 0) {
1245+
if (client.retry_delay) {
1246+
client.retry_delay = 0;
1247+
next_event_at(k_uptime_get() + client.retry_delay * 1000);
12181248
return;
12191249
}
12201250

@@ -1252,6 +1282,7 @@ static void lwm2m_rd_client_service(struct k_work *work)
12521282
k_mutex_lock(&client.mutex, K_FOREVER);
12531283

12541284
if (client.ctx) {
1285+
LOG_DBG("State: %d", get_sm_state());
12551286
switch (get_sm_state()) {
12561287
case ENGINE_IDLE:
12571288
if (client.ctx->sock_fd > -1) {
@@ -1374,7 +1405,10 @@ int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx, const char *ep_name,
13741405
client.ep_name[CLIENT_EP_LEN - 1] = '\0';
13751406
LOG_INF("Start LWM2M Client: %s", client.ep_name);
13761407

1408+
next_event_at(0);
1409+
13771410
k_mutex_unlock(&client.mutex);
1411+
13781412
return 0;
13791413
}
13801414

@@ -1402,12 +1436,14 @@ int lwm2m_rd_client_stop(struct lwm2m_ctx *client_ctx,
14021436

14031437
k_mutex_unlock(&client.mutex);
14041438

1439+
14051440
return 0;
14061441
}
14071442

14081443
int lwm2m_rd_client_pause(void)
14091444
{
14101445
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_ENGINE_SUSPENDED;
1446+
LOG_DBG("lwm2m_rd_client_pause()");
14111447

14121448
k_mutex_lock(&client.mutex, K_FOREVER);
14131449

@@ -1482,6 +1518,7 @@ int lwm2m_rd_client_resume(void)
14821518
}
14831519
}
14841520

1521+
next_event_at(0);
14851522
k_mutex_unlock(&client.mutex);
14861523

14871524
return 0;
@@ -1490,6 +1527,7 @@ int lwm2m_rd_client_resume(void)
14901527
void lwm2m_rd_client_update(void)
14911528
{
14921529
engine_trigger_update(false);
1530+
next_event_at(0);
14931531
}
14941532

14951533
struct lwm2m_ctx *lwm2m_rd_client_ctx(void)
@@ -1520,6 +1558,7 @@ int lwm2m_rd_client_connection_resume(struct lwm2m_ctx *client_ctx)
15201558
client.engine_state = ENGINE_DO_REGISTRATION;
15211559
}
15221560
}
1561+
next_event_at(0);
15231562

15241563
return 0;
15251564
}
@@ -1536,6 +1575,7 @@ int lwm2m_rd_client_timeout(struct lwm2m_ctx *client_ctx)
15361575
k_mutex_lock(&client.mutex, K_FOREVER);
15371576
LOG_WRN("Confirmable Timeout -> Re-connect and register");
15381577
client.engine_state = ENGINE_DO_REGISTRATION;
1578+
next_event_at(0);
15391579
k_mutex_unlock(&client.mutex);
15401580
return 0;
15411581
}
@@ -1565,9 +1605,7 @@ int lwm2m_rd_client_init(void)
15651605
client.engine_state = ENGINE_IDLE;
15661606
k_mutex_init(&client.mutex);
15671607

1568-
return lwm2m_engine_add_service(lwm2m_rd_client_service,
1569-
STATE_MACHINE_UPDATE_INTERVAL_MS);
1570-
1608+
return 0;
15711609
}
15721610

15731611
static int sys_lwm2m_rd_client_init(void)

tests/net/lib/lwm2m/lwm2m_rd_client/src/main.c

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_ok)
167167

168168
test_prepare_pending_message_cb(&message_reply_cb_default);
169169

170-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
171170
lwm2m_rd_client_init();
172171
test_lwm2m_engine_start_service();
173172
wait_for_service(1);
@@ -198,10 +197,8 @@ ZTEST(lwm2m_rd_client, test_timeout_resume_registration)
198197

199198
test_prepare_pending_message_cb(&message_reply_cb_default);
200199

201-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
202200
lwm2m_rd_client_init();
203201
test_lwm2m_engine_start_service();
204-
wait_for_service(1);
205202

206203
lwm2m_get_bool_fake.custom_fake = lwm2m_get_bool_fake_default;
207204
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)
228225

229226
test_prepare_pending_message_cb(&message_reply_timeout_cb_default);
230227

231-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
232228
lwm2m_rd_client_init();
233229
test_lwm2m_engine_start_service();
234230
wait_for_service(1);
@@ -250,7 +246,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_fail)
250246

251247
test_prepare_pending_message_cb(&message_reply_cb_default);
252248

253-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
254249
lwm2m_rd_client_init();
255250
test_lwm2m_engine_start_service();
256251
wait_for_service(1);
@@ -272,7 +267,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_update)
272267

273268
test_prepare_pending_message_cb(&message_reply_cb_default);
274269

275-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
276270
lwm2m_rd_client_init();
277271
test_lwm2m_engine_start_service();
278272
wait_for_service(1);
@@ -300,7 +294,6 @@ ZTEST(lwm2m_rd_client, test_rx_off)
300294

301295
test_prepare_pending_message_cb(&message_reply_cb_default);
302296

303-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
304297
lwm2m_rd_client_init();
305298
test_lwm2m_engine_start_service();
306299
wait_for_service(1);
@@ -329,7 +322,6 @@ ZTEST(lwm2m_rd_client, test_start_registration_update_fail)
329322

330323
test_prepare_pending_message_cb(&message_reply_cb_default);
331324

332-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
333325
lwm2m_rd_client_init();
334326
test_lwm2m_engine_start_service();
335327
wait_for_service(1);
@@ -359,7 +351,6 @@ ZTEST(lwm2m_rd_client, test_registration_update_timeout)
359351

360352
test_prepare_pending_message_cb(&message_reply_cb_default);
361353

362-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
363354
lwm2m_rd_client_init();
364355
test_lwm2m_engine_start_service();
365356
wait_for_service(1);
@@ -376,12 +367,12 @@ ZTEST(lwm2m_rd_client, test_registration_update_timeout)
376367

377368
test_prepare_pending_message_cb(&message_reply_timeout_cb_default);
378369
lwm2m_rd_client_update();
379-
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE, 2));
380-
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_TIMEOUT, 3),
370+
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE, 1));
371+
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_TIMEOUT, 2),
381372
NULL);
382373

383374
test_prepare_pending_message_cb(&message_reply_cb_default);
384-
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE, 4),
375+
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE, 3),
385376
NULL);
386377
}
387378

@@ -393,7 +384,6 @@ ZTEST(lwm2m_rd_client, test_deregistration_timeout)
393384

394385
test_prepare_pending_message_cb(&message_reply_cb_default);
395386

396-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
397387
lwm2m_rd_client_init();
398388
test_lwm2m_engine_start_service();
399389
wait_for_service(1);
@@ -421,7 +411,6 @@ ZTEST(lwm2m_rd_client, test_error_on_registration_update)
421411

422412
test_prepare_pending_message_cb(&message_reply_cb_default);
423413

424-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
425414
lwm2m_rd_client_init();
426415
test_lwm2m_engine_start_service();
427416
wait_for_service(1);
@@ -448,7 +437,6 @@ ZTEST(lwm2m_rd_client, test_network_error_on_registration)
448437

449438
(void)memset(&ctx, 0x0, sizeof(ctx));
450439

451-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
452440
lwm2m_rd_client_init();
453441
test_lwm2m_engine_start_service();
454442
wait_for_service(1);
@@ -461,6 +449,8 @@ ZTEST(lwm2m_rd_client, test_network_error_on_registration)
461449
coap_packet_append_option_fake.custom_fake = coap_packet_append_option_fake_err;
462450
zassert_true(lwm2m_rd_client_start(&ctx, "Test", 0, lwm2m_event_cb, lwm2m_observe_cb) == 0,
463451
NULL);
452+
wait_for_service(100);
453+
464454
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_NETWORK_ERROR, 0), NULL);
465455
}
466456

@@ -472,7 +462,6 @@ ZTEST(lwm2m_rd_client, test_suspend_resume_registration)
472462

473463
test_prepare_pending_message_cb(&message_reply_cb_default);
474464

475-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
476465
lwm2m_rd_client_init();
477466
test_lwm2m_engine_start_service();
478467
wait_for_service(1);
@@ -506,7 +495,6 @@ ZTEST(lwm2m_rd_client, test_socket_error)
506495

507496
test_prepare_pending_message_cb(&message_reply_cb_default);
508497

509-
lwm2m_engine_add_service_fake.custom_fake = lwm2m_engine_add_service_fake_default;
510498
lwm2m_rd_client_init();
511499
test_lwm2m_engine_start_service();
512500
wait_for_service(1);

0 commit comments

Comments
 (0)