Skip to content

Commit 2160e0f

Browse files
rlubosgalak
authored andcommitted
net: lwm2m: Fix Registration failue reporting
In case LwM2M server or bootstrap server rejected Registration/Registration Update/Deregsitration attempt, there were no reasonable notification to the application. Fix this by reporting LWM2M_RD_CLIENT_EVENT_*_FAILURE in such case. Addtitionaly, remove pointless ENGINE_DEREGISTER_FAILED event, which have no use in the state machine. Finally, simplify the response code logging to prevent code duplication. Signed-off-by: Robert Lubos <[email protected]>
1 parent 5601805 commit 2160e0f

File tree

1 file changed

+74
-49
lines changed

1 file changed

+74
-49
lines changed

subsys/net/lib/lwm2m/lwm2m_rd_client.c

Lines changed: 74 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ enum sm_engine_state {
9292
ENGINE_UPDATE_SENT,
9393
ENGINE_DEREGISTER,
9494
ENGINE_DEREGISTER_SENT,
95-
ENGINE_DEREGISTER_FAILED,
9695
ENGINE_DEREGISTERED,
9796
ENGINE_NETWORK_ERROR,
9897
};
@@ -176,7 +175,7 @@ static void set_sm_state(uint8_t sm_state)
176175
static bool sm_is_registered(void)
177176
{
178177
return (client.engine_state >= ENGINE_REGISTRATION_DONE &&
179-
client.engine_state <= ENGINE_DEREGISTER_FAILED);
178+
client.engine_state <= ENGINE_DEREGISTER_SENT);
180179
}
181180

182181
static uint8_t get_sm_state(void)
@@ -190,6 +189,34 @@ static void sm_handle_timeout_state(struct lwm2m_message *msg,
190189
{
191190
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
192191

192+
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
193+
if (client.engine_state == ENGINE_BOOTSTRAP_REG_SENT) {
194+
event = LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE;
195+
} else
196+
#endif
197+
{
198+
if (client.engine_state == ENGINE_REGISTRATION_SENT) {
199+
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE;
200+
} else if (client.engine_state == ENGINE_UPDATE_SENT) {
201+
event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE;
202+
} else if (client.engine_state == ENGINE_DEREGISTER_SENT) {
203+
event = LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE;
204+
} else {
205+
/* TODO: unknown timeout state */
206+
}
207+
}
208+
209+
set_sm_state(sm_state);
210+
211+
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client.event_cb) {
212+
client.event_cb(client.ctx, event);
213+
}
214+
}
215+
216+
static void sm_handle_failure_state(enum sm_engine_state sm_state)
217+
{
218+
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
219+
193220
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
194221
if (client.engine_state == ENGINE_BOOTSTRAP_REG_SENT) {
195222
event = LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE;
@@ -201,8 +228,6 @@ static void sm_handle_timeout_state(struct lwm2m_message *msg,
201228
event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE;
202229
} else if (client.engine_state == ENGINE_DEREGISTER_SENT) {
203230
event = LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE;
204-
} else {
205-
/* TODO: unknown timeout state */
206231
}
207232

208233
set_sm_state(sm_state);
@@ -244,6 +269,24 @@ void engine_trigger_update(bool update_objects)
244269
}
245270
}
246271

272+
static inline const char *code2str(uint8_t code)
273+
{
274+
switch (code) {
275+
case COAP_RESPONSE_CODE_BAD_REQUEST:
276+
return "Bad Request";
277+
case COAP_RESPONSE_CODE_FORBIDDEN:
278+
return "Forbidden";
279+
case COAP_RESPONSE_CODE_NOT_FOUND:
280+
return "Not Found";
281+
case COAP_RESPONSE_CODE_PRECONDITION_FAILED:
282+
return "Precondition Failed";
283+
default:
284+
break;
285+
}
286+
287+
return "Unknown";
288+
}
289+
247290
/* state machine reply callbacks */
248291

249292
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
@@ -261,22 +304,16 @@ static int do_bootstrap_reply_cb(const struct coap_packet *response,
261304
if (code == COAP_RESPONSE_CODE_CHANGED) {
262305
LOG_INF("Bootstrap registration done!");
263306
set_sm_state(ENGINE_BOOTSTRAP_REG_DONE);
264-
} else if (code == COAP_RESPONSE_CODE_NOT_FOUND) {
265-
/* TODO: try and find another bootstrap server entry? */
266-
LOG_ERR("Failed: NOT_FOUND. Not Retrying.");
267-
set_sm_state(ENGINE_DO_REGISTRATION);
268-
} else if (code == COAP_RESPONSE_CODE_FORBIDDEN) {
269-
/* TODO: try and find another bootstrap server entry? */
270-
LOG_ERR("Failed: 4.03 - Forbidden. Not Retrying.");
271-
set_sm_state(ENGINE_DO_REGISTRATION);
272-
} else {
273-
/* TODO: Read payload for error message? */
274-
LOG_ERR("Failed with code %u.%u. Retrying ...",
275-
COAP_RESPONSE_CODE_CLASS(code),
276-
COAP_RESPONSE_CODE_DETAIL(code));
277-
set_sm_state(ENGINE_INIT);
307+
return 0;
278308
}
279309

310+
LOG_ERR("Failed with code %u.%u (%s). Not Retrying.",
311+
COAP_RESPONSE_CODE_CLASS(code), COAP_RESPONSE_CODE_DETAIL(code),
312+
code2str(code));
313+
314+
lwm2m_engine_context_close(client.ctx);
315+
sm_handle_failure_state(ENGINE_IDLE);
316+
280317
return 0;
281318
}
282319

@@ -333,23 +370,15 @@ static int do_registration_reply_cb(const struct coap_packet *response,
333370
log_strdup(client.server_ep));
334371

335372
return 0;
336-
} else if (code == COAP_RESPONSE_CODE_NOT_FOUND) {
337-
LOG_ERR("Failed: NOT_FOUND. Not Retrying.");
338-
set_sm_state(ENGINE_REGISTRATION_DONE);
339-
return 0;
340-
} else if (code == COAP_RESPONSE_CODE_FORBIDDEN) {
341-
LOG_ERR("Failed: 4.03 - Forbidden. Not Retrying.");
342-
set_sm_state(ENGINE_REGISTRATION_DONE);
343-
return 0;
344373
}
345374

346-
/* TODO: Read payload for error message? */
347-
/* Possible error response codes: 4.00 Bad request */
348-
LOG_ERR("failed with code %u.%u. Re-init network",
349-
COAP_RESPONSE_CODE_CLASS(code),
350-
COAP_RESPONSE_CODE_DETAIL(code));
375+
LOG_ERR("Failed with code %u.%u (%s). Not Retrying.",
376+
COAP_RESPONSE_CODE_CLASS(code), COAP_RESPONSE_CODE_DETAIL(code),
377+
code2str(code));
378+
379+
lwm2m_engine_context_close(client.ctx);
380+
sm_handle_failure_state(ENGINE_IDLE);
351381

352-
set_sm_state(ENGINE_INIT);
353382
return 0;
354383
}
355384

@@ -380,12 +409,11 @@ static int do_update_reply_cb(const struct coap_packet *response,
380409
return 0;
381410
}
382411

383-
/* TODO: Read payload for error message? */
384-
/* Possible error response codes: 4.00 Bad request & 4.04 Not Found */
385-
LOG_ERR("Failed with code %u.%u. Retrying registration",
386-
COAP_RESPONSE_CODE_CLASS(code),
387-
COAP_RESPONSE_CODE_DETAIL(code));
388-
set_sm_state(ENGINE_DO_REGISTRATION);
412+
LOG_ERR("Failed with code %u.%u (%s). Retrying registration.",
413+
COAP_RESPONSE_CODE_CLASS(code), COAP_RESPONSE_CODE_DETAIL(code),
414+
code2str(code));
415+
416+
sm_handle_failure_state(ENGINE_DO_REGISTRATION);
389417

390418
return 0;
391419
}
@@ -413,15 +441,16 @@ static int do_deregister_reply_cb(const struct coap_packet *response,
413441
LOG_INF("Deregistration success");
414442
lwm2m_engine_context_close(client.ctx);
415443
set_sm_state(ENGINE_DEREGISTERED);
416-
} else {
417-
LOG_ERR("failed with code %u.%u",
418-
COAP_RESPONSE_CODE_CLASS(code),
419-
COAP_RESPONSE_CODE_DETAIL(code));
420-
if (get_sm_state() == ENGINE_DEREGISTER_SENT) {
421-
set_sm_state(ENGINE_DEREGISTER_FAILED);
422-
}
444+
return 0;
423445
}
424446

447+
LOG_ERR("Failed with code %u.%u (%s). Not Retrying",
448+
COAP_RESPONSE_CODE_CLASS(code), COAP_RESPONSE_CODE_DETAIL(code),
449+
code2str(code));
450+
451+
lwm2m_engine_context_close(client.ctx);
452+
sm_handle_failure_state(ENGINE_IDLE);
453+
425454
return 0;
426455
}
427456

@@ -1005,10 +1034,6 @@ static void lwm2m_rd_client_service(struct k_work *work)
10051034
/* wait for deregister to be done or reset */
10061035
break;
10071036

1008-
case ENGINE_DEREGISTER_FAILED:
1009-
set_sm_state(ENGINE_IDLE);
1010-
break;
1011-
10121037
case ENGINE_DEREGISTERED:
10131038
set_sm_state(ENGINE_IDLE);
10141039
break;

0 commit comments

Comments
 (0)