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:
parent
a13af44c7a
commit
01dab8690a
3 changed files with 31 additions and 12 deletions
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME=y
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue