net: lwm2m: Do not immediately close connection at Bootstrap

When BOOTSTRAP FINNISH message was received, it caused
engine to immediately switch to BOOTSTRAP_TRANS_DONE state
which then closed the connection.
Ack packet was still on the send-queue so it never got send before close().

Signed-off-by: Seppo Takalo <seppo.takalo@nordicsemi.no>
This commit is contained in:
Seppo Takalo 2023-08-10 14:33:31 +03:00 committed by Carles Cufí
commit 01dab8690a
3 changed files with 31 additions and 12 deletions

View file

@ -74,6 +74,8 @@ static int sm_send_registration_msg(void);
static bool sm_is_suspended(void);
static void lwm2m_rd_client_service(struct k_work *work);
static int64_t calc_next_event(void);
static void set_sm_state_delayed(uint8_t sm_state, int64_t delay_ms);
static void set_sm_state(uint8_t sm_state);
/* The states for the RD client state machine */
/*
@ -171,7 +173,7 @@ static void next_event_at(int64_t timestamp)
(void)lwm2m_engine_call_at(lwm2m_rd_client_service, timestamp);
}
static void set_sm_state(uint8_t sm_state)
static void set_sm_state_delayed(uint8_t sm_state, int64_t delay_ms)
{
k_mutex_lock(&client.mutex, K_FOREVER);
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
@ -232,10 +234,15 @@ static void set_sm_state(uint8_t sm_state)
lwm2m_close_socket(client.ctx);
}
}
next_event_at(0);
next_event_at(k_uptime_get() + delay_ms);
k_mutex_unlock(&client.mutex);
}
static void set_sm_state(uint8_t sm_state)
{
set_sm_state_delayed(sm_state, 0);
}
static bool sm_is_bootstrap(void)
{
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP)
@ -837,7 +844,10 @@ static int sm_do_bootstrap_reg(void)
void engine_bootstrap_finish(void)
{
LOG_INF("Bootstrap data transfer done!");
set_sm_state(ENGINE_BOOTSTRAP_TRANS_DONE);
/* Delay the state transition, so engine have some time to send ACK
* before we close the socket
*/
set_sm_state_delayed(ENGINE_BOOTSTRAP_TRANS_DONE, 1000);
}
static int sm_bootstrap_trans_done(void)

View file

@ -0,0 +1 @@
CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME=y

View file

@ -9,7 +9,9 @@
#include <zephyr/fff.h>
#include <zephyr/logging/log.h>
#include <zephyr/ztest.h>
#if defined(CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME)
#include "timer_model.h"
#endif
#include <lwm2m_rd_client.h>
LOG_MODULE_REGISTER(lwm2m_rd_client_test);
@ -127,6 +129,12 @@ static void lwm2m_observe_cb(enum lwm2m_observe_event event, struct lwm2m_obj_pa
static void my_suite_before(void *data)
{
#if defined(CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME)
/* It is enough that some slow-down is happening on sleeps, it does not have to be
* real time
*/
hwtimer_set_rt_ratio(100.0);
#endif
/* Register resets */
DO_FOREACH_FAKE(RESET_FAKE);
@ -185,7 +193,7 @@ ZTEST(lwm2m_rd_client, test_start_registration_ok)
coap_header_get_code_fake.custom_fake = coap_header_get_code_fake_deleted;
zassert_true(lwm2m_rd_client_stop(&ctx, lwm2m_event_cb, true) == 0, NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_DISCONNECT, 2), NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_DISCONNECT, 1), NULL);
zassert_true(!lwm2m_rd_client_is_registred(&ctx), NULL);
}
@ -212,7 +220,7 @@ ZTEST(lwm2m_rd_client, test_timeout_resume_registration)
NULL);
zassert(lwm2m_rd_client_timeout(&ctx) == 0, "");
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE, 2),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE, 1),
NULL);
}
@ -282,7 +290,7 @@ ZTEST(lwm2m_rd_client, test_start_registration_update)
NULL);
lwm2m_rd_client_update();
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, 3),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, 2),
NULL);
}
@ -339,7 +347,7 @@ ZTEST(lwm2m_rd_client, test_start_registration_update_fail)
RESET_FAKE(coap_header_get_code);
lwm2m_rd_client_update();
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE, 3),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE, 2),
NULL);
}
@ -478,11 +486,11 @@ ZTEST(lwm2m_rd_client, test_suspend_resume_registration)
zassert_true(!lwm2m_rd_client_is_suspended(&ctx), NULL);
zassert_true(lwm2m_rd_client_pause() == 0, NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_ENGINE_SUSPENDED, 2), NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_ENGINE_SUSPENDED, 1), NULL);
zassert_true(lwm2m_rd_client_is_suspended(&ctx), NULL);
zassert_true(lwm2m_rd_client_resume() == 0, NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, 4),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, 3),
NULL);
zassert_true(!lwm2m_rd_client_is_suspended(&ctx), NULL);
}
@ -510,7 +518,7 @@ ZTEST(lwm2m_rd_client, test_socket_error)
NULL);
ctx.fault_cb(EIO);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE, 2), NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, 3),
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE, 1), NULL);
zassert_true(check_lwm2m_rd_client_event(LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE, 2),
NULL);
}