Skip to content

Commit 00aa80b

Browse files
Ola Tangen Kulsengcarlescufi
authored andcommitted
net: lwm2m: thread safety in the rd client
Used the mutex in the client to protect the state transitions of client.state. Signed-off-by: Ola Tangen Kulseng <[email protected]>
1 parent 0a87c2d commit 00aa80b

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

subsys/net/lib/lwm2m/lwm2m_rd_client.c

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ void engine_update_tx_time(void)
159159

160160
static void set_sm_state(uint8_t sm_state)
161161
{
162+
k_mutex_lock(&client.mutex, K_FOREVER);
162163
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
163164

164165
/* Determine if a callback to the app is needed */
@@ -195,7 +196,6 @@ static void set_sm_state(uint8_t sm_state)
195196
}
196197
}
197198

198-
/* TODO: add locking? */
199199
client.engine_state = sm_state;
200200

201201
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client.ctx->event_cb) {
@@ -210,33 +210,45 @@ static void set_sm_state(uint8_t sm_state)
210210
lwm2m_close_socket(client.ctx);
211211
}
212212
}
213+
k_mutex_unlock(&client.mutex);
213214
}
214215

215216
static bool sm_is_bootstrap(void)
216217
{
217218
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
218-
return (client.engine_state >= ENGINE_DO_BOOTSTRAP_REG &&
219+
k_mutex_lock(&client.mutex, K_FOREVER);
220+
bool is_bootstrap = (client.engine_state >= ENGINE_DO_BOOTSTRAP_REG &&
219221
client.engine_state <= ENGINE_BOOTSTRAP_TRANS_DONE);
222+
k_mutex_unlock(&client.mutex);
223+
return is_bootstrap;
220224
#else
221225
return false;
222226
#endif
223227
}
224228

225229
static bool sm_is_registered(void)
226230
{
227-
return (client.engine_state >= ENGINE_REGISTRATION_DONE &&
228-
client.engine_state <= ENGINE_DEREGISTER_SENT);
231+
k_mutex_lock(&client.mutex, K_FOREVER);
232+
bool registered = (client.engine_state >= ENGINE_REGISTRATION_DONE &&
233+
client.engine_state <= ENGINE_DEREGISTER_SENT);
234+
235+
k_mutex_unlock(&client.mutex);
236+
return registered;
229237
}
230238

231239
static uint8_t get_sm_state(void)
232240
{
233-
/* TODO: add locking? */
234-
return client.engine_state;
241+
k_mutex_lock(&client.mutex, K_FOREVER);
242+
uint8_t state = client.engine_state;
243+
244+
k_mutex_unlock(&client.mutex);
245+
return state;
235246
}
236247

237248
static void sm_handle_timeout_state(struct lwm2m_message *msg,
238249
enum sm_engine_state sm_state)
239250
{
251+
k_mutex_lock(&client.mutex, K_FOREVER);
240252
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
241253

242254
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
@@ -261,10 +273,12 @@ static void sm_handle_timeout_state(struct lwm2m_message *msg,
261273
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client.ctx->event_cb) {
262274
client.ctx->event_cb(client.ctx, event);
263275
}
276+
k_mutex_unlock(&client.mutex);
264277
}
265278

266279
static void sm_handle_failure_state(enum sm_engine_state sm_state)
267280
{
281+
k_mutex_lock(&client.mutex, K_FOREVER);
268282
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
269283

270284
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
@@ -276,6 +290,7 @@ static void sm_handle_failure_state(enum sm_engine_state sm_state)
276290
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE;
277291
} else if (client.engine_state == ENGINE_UPDATE_SENT) {
278292
sm_handle_registration_update_failure();
293+
k_mutex_unlock(&client.mutex);
279294
return;
280295
} else if (client.engine_state == ENGINE_DEREGISTER_SENT) {
281296
event = LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE;
@@ -287,6 +302,7 @@ static void sm_handle_failure_state(enum sm_engine_state sm_state)
287302
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client.ctx->event_cb) {
288303
client.ctx->event_cb(client.ctx, event);
289304
}
305+
k_mutex_unlock(&client.mutex);
290306
}
291307

292308
/* force state machine restart */
@@ -308,17 +324,19 @@ static void socket_fault_cb(int error)
308324
/* force re-update with remote peer */
309325
void engine_trigger_update(bool update_objects)
310326
{
327+
k_mutex_lock(&client.mutex, K_FOREVER);
311328
if (client.engine_state < ENGINE_REGISTRATION_SENT ||
312329
client.engine_state > ENGINE_UPDATE_SENT) {
330+
k_mutex_unlock(&client.mutex);
313331
return;
314332
}
315333

316-
/* TODO: add locking? */
317334
client.trigger_update = true;
318335

319336
if (update_objects) {
320337
client.update_objects = true;
321338
}
339+
k_mutex_unlock(&client.mutex);
322340
}
323341

324342
static inline const char *code2str(uint8_t code)
@@ -384,15 +402,18 @@ static void do_bootstrap_reg_timeout_cb(struct lwm2m_message *msg)
384402
int engine_trigger_bootstrap(void)
385403
{
386404
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
405+
k_mutex_lock(&client.mutex, K_FOREVER);
387406
if (!sm_is_registered()) {
388407
/* Bootstrap is not possible to trig */
389408
LOG_WRN("Cannot trigger bootstrap from state %u", client.engine_state);
409+
k_mutex_unlock(&client.mutex);
390410
return -EPERM;
391411
}
392412

393413
LOG_INF("Server Initiated Bootstrap");
394414
client.use_bootstrap = true;
395415
client.engine_state = ENGINE_INIT;
416+
k_mutex_unlock(&client.mutex);
396417

397418
return 0;
398419
#else
@@ -924,8 +945,10 @@ static int sm_send_registration(bool send_obj_support_data,
924945

925946
static void sm_handle_registration_update_failure(void)
926947
{
948+
k_mutex_lock(&client.mutex, K_FOREVER);
927949
LOG_WRN("Registration Update fail -> trigger full registration");
928950
client.engine_state = ENGINE_SEND_REGISTRATION;
951+
k_mutex_unlock(&client.mutex);
929952
}
930953

931954
static int sm_send_registration_msg(void)
@@ -999,6 +1022,7 @@ static int sm_do_registration(void)
9991022

10001023
static int sm_registration_done(void)
10011024
{
1025+
k_mutex_lock(&client.mutex, K_FOREVER);
10021026
int ret = 0;
10031027

10041028
/*
@@ -1016,7 +1040,7 @@ static int sm_registration_done(void)
10161040
CONFIG_LWM2M_QUEUE_MODE_UPTIME)) {
10171041
set_sm_state(ENGINE_REGISTRATION_DONE_RX_OFF);
10181042
}
1019-
1043+
k_mutex_unlock(&client.mutex);
10201044
return ret;
10211045
}
10221046

@@ -1306,11 +1330,11 @@ int lwm2m_rd_client_stop(struct lwm2m_ctx *client_ctx,
13061330

13071331
LOG_INF("Stop LWM2M Client: %s", client.ep_name);
13081332

1309-
k_mutex_unlock(&client.mutex);
13101333

13111334
while (get_sm_state() != ENGINE_IDLE) {
13121335
k_sleep(K_MSEC(STATE_MACHINE_UPDATE_INTERVAL_MS / 2));
13131336
}
1337+
k_mutex_unlock(&client.mutex);
13141338
return 0;
13151339
}
13161340

@@ -1432,9 +1456,10 @@ int lwm2m_rd_client_timeout(struct lwm2m_ctx *client_ctx)
14321456
if (!sm_is_registered()) {
14331457
return 0;
14341458
}
1435-
1459+
k_mutex_lock(&client.mutex, K_FOREVER);
14361460
LOG_WRN("Confirmable Timeout -> Re-connect and register");
14371461
client.engine_state = ENGINE_DO_REGISTRATION;
1462+
k_mutex_unlock(&client.mutex);
14381463
return 0;
14391464
}
14401465

0 commit comments

Comments
 (0)