@@ -64,18 +64,16 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
64
64
#include "lwm2m_util.h"
65
65
66
66
#define LWM2M_RD_CLIENT_URI "rd"
67
-
68
67
#define SECONDS_TO_UPDATE_EARLY CONFIG_LWM2M_SECONDS_TO_UPDATE_EARLY
69
- #define STATE_MACHINE_UPDATE_INTERVAL_MS 500
70
-
71
68
#define CLIENT_EP_LEN CONFIG_LWM2M_RD_CLIENT_ENDPOINT_NAME_MAX_LENGTH
72
-
73
69
#define CLIENT_BINDING_LEN sizeof("UQ")
74
70
#define CLIENT_QUEUE_LEN sizeof("Q")
75
71
76
72
static void sm_handle_registration_update_failure (void );
77
73
static int sm_send_registration_msg (void );
78
74
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 );
79
77
80
78
/* The states for the RD client state machine */
81
79
/*
@@ -117,6 +115,7 @@ struct lwm2m_rd_client_info {
117
115
118
116
int64_t last_update ;
119
117
int64_t last_tx ;
118
+ int64_t next_event ;
120
119
121
120
char ep_name [CLIENT_EP_LEN ];
122
121
char server_ep [CLIENT_EP_LEN ];
@@ -167,6 +166,11 @@ void engine_update_tx_time(void)
167
166
client .last_tx = k_uptime_get ();
168
167
}
169
168
169
+ static void next_event_at (int64_t timestamp )
170
+ {
171
+ (void )lwm2m_engine_call_at (lwm2m_rd_client_service , timestamp );
172
+ }
173
+
170
174
static void set_sm_state (uint8_t sm_state )
171
175
{
172
176
k_mutex_lock (& client .mutex , K_FOREVER );
@@ -228,6 +232,7 @@ static void set_sm_state(uint8_t sm_state)
228
232
lwm2m_close_socket (client .ctx );
229
233
}
230
234
}
235
+ next_event_at (0 );
231
236
k_mutex_unlock (& client .mutex );
232
237
}
233
238
@@ -453,6 +458,7 @@ int engine_trigger_bootstrap(void)
453
458
client .use_bootstrap = true;
454
459
client .trigger_update = false;
455
460
client .engine_state = ENGINE_INIT ;
461
+ next_event_at (0 );
456
462
k_mutex_unlock (& client .mutex );
457
463
return 0 ;
458
464
#else
@@ -1000,6 +1006,7 @@ static void sm_handle_registration_update_failure(void)
1000
1006
client .engine_state = ENGINE_SEND_REGISTRATION ;
1001
1007
lwm2m_engine_context_close (client .ctx );
1002
1008
k_mutex_unlock (& client .mutex );
1009
+ next_event_at (0 );
1003
1010
}
1004
1011
1005
1012
static int sm_send_registration_msg (void )
@@ -1079,28 +1086,49 @@ static int sm_do_registration(void)
1079
1086
return ret ;
1080
1087
}
1081
1088
1082
- static int sm_registration_done (void )
1089
+ static int64_t next_update (void )
1083
1090
{
1084
- k_mutex_lock (& client .mutex , K_FOREVER );
1085
- int ret = 0 ;
1086
-
1087
1091
/*
1088
1092
* check for lifetime seconds - SECONDS_TO_UPDATE_EARLY
1089
1093
* so that we can update early and avoid lifetime timeout
1090
1094
*/
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
+
1091
1119
if (sm_is_registered () &&
1092
1120
(client .trigger_update ||
1093
- ((client .lifetime - SECONDS_TO_UPDATE_EARLY ) <=
1094
- (k_uptime_get () - client .last_update ) / 1000 ))) {
1121
+ now >= next_update ())) {
1095
1122
set_sm_state (ENGINE_UPDATE_REGISTRATION );
1096
1123
} else if (IS_ENABLED (CONFIG_LWM2M_QUEUE_MODE_ENABLED ) &&
1097
1124
(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 ())) {
1100
1126
set_sm_state (ENGINE_REGISTRATION_DONE_RX_OFF );
1127
+ next_event_at (next_update ());
1128
+ } else {
1129
+ next_event_at (calc_next_event ());
1101
1130
}
1102
1131
k_mutex_unlock (& client .mutex );
1103
- return ret ;
1104
1132
}
1105
1133
1106
1134
static int update_registration (void )
@@ -1214,7 +1242,9 @@ static void sm_do_network_error(void)
1214
1242
{
1215
1243
int err ;
1216
1244
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 );
1218
1248
return ;
1219
1249
}
1220
1250
@@ -1252,6 +1282,7 @@ static void lwm2m_rd_client_service(struct k_work *work)
1252
1282
k_mutex_lock (& client .mutex , K_FOREVER );
1253
1283
1254
1284
if (client .ctx ) {
1285
+ LOG_DBG ("State: %d" , get_sm_state ());
1255
1286
switch (get_sm_state ()) {
1256
1287
case ENGINE_IDLE :
1257
1288
if (client .ctx -> sock_fd > -1 ) {
@@ -1374,7 +1405,10 @@ int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx, const char *ep_name,
1374
1405
client .ep_name [CLIENT_EP_LEN - 1 ] = '\0' ;
1375
1406
LOG_INF ("Start LWM2M Client: %s" , client .ep_name );
1376
1407
1408
+ next_event_at (0 );
1409
+
1377
1410
k_mutex_unlock (& client .mutex );
1411
+
1378
1412
return 0 ;
1379
1413
}
1380
1414
@@ -1402,12 +1436,14 @@ int lwm2m_rd_client_stop(struct lwm2m_ctx *client_ctx,
1402
1436
1403
1437
k_mutex_unlock (& client .mutex );
1404
1438
1439
+
1405
1440
return 0 ;
1406
1441
}
1407
1442
1408
1443
int lwm2m_rd_client_pause (void )
1409
1444
{
1410
1445
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_ENGINE_SUSPENDED ;
1446
+ LOG_DBG ("lwm2m_rd_client_pause()" );
1411
1447
1412
1448
k_mutex_lock (& client .mutex , K_FOREVER );
1413
1449
@@ -1482,6 +1518,7 @@ int lwm2m_rd_client_resume(void)
1482
1518
}
1483
1519
}
1484
1520
1521
+ next_event_at (0 );
1485
1522
k_mutex_unlock (& client .mutex );
1486
1523
1487
1524
return 0 ;
@@ -1490,6 +1527,7 @@ int lwm2m_rd_client_resume(void)
1490
1527
void lwm2m_rd_client_update (void )
1491
1528
{
1492
1529
engine_trigger_update (false);
1530
+ next_event_at (0 );
1493
1531
}
1494
1532
1495
1533
struct lwm2m_ctx * lwm2m_rd_client_ctx (void )
@@ -1520,6 +1558,7 @@ int lwm2m_rd_client_connection_resume(struct lwm2m_ctx *client_ctx)
1520
1558
client .engine_state = ENGINE_DO_REGISTRATION ;
1521
1559
}
1522
1560
}
1561
+ next_event_at (0 );
1523
1562
1524
1563
return 0 ;
1525
1564
}
@@ -1536,6 +1575,7 @@ int lwm2m_rd_client_timeout(struct lwm2m_ctx *client_ctx)
1536
1575
k_mutex_lock (& client .mutex , K_FOREVER );
1537
1576
LOG_WRN ("Confirmable Timeout -> Re-connect and register" );
1538
1577
client .engine_state = ENGINE_DO_REGISTRATION ;
1578
+ next_event_at (0 );
1539
1579
k_mutex_unlock (& client .mutex );
1540
1580
return 0 ;
1541
1581
}
@@ -1565,9 +1605,7 @@ int lwm2m_rd_client_init(void)
1565
1605
client .engine_state = ENGINE_IDLE ;
1566
1606
k_mutex_init (& client .mutex );
1567
1607
1568
- return lwm2m_engine_add_service (lwm2m_rd_client_service ,
1569
- STATE_MACHINE_UPDATE_INTERVAL_MS );
1570
-
1608
+ return 0 ;
1571
1609
}
1572
1610
1573
1611
static int sys_lwm2m_rd_client_init (void )
0 commit comments