@@ -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)
176175static 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
182181static 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