From eedbbdc61a42273fe7944a256f93bbdb9bb60c73 Mon Sep 17 00:00:00 2001 From: Jarno Lamsa Date: Tue, 14 Dec 2021 09:52:54 +0200 Subject: [PATCH] net: lwm2m: Provide backwards compatibility for single object 5 Previously the object 5 was only single instance object. Provide backwards compatibility, so it can be continued to use with single instance. Signed-off-by: Jarno Lamsa --- subsys/net/lib/lwm2m/lwm2m_engine.h | 6 +- subsys/net/lib/lwm2m/lwm2m_obj_firmware.c | 68 ++++++++++++------- .../net/lib/lwm2m/lwm2m_obj_firmware_pull.c | 4 +- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.h b/subsys/net/lib/lwm2m/lwm2m_engine.h index 0a76e65b946..f01ce3e1ff0 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.h +++ b/subsys/net/lib/lwm2m/lwm2m_engine.h @@ -128,8 +128,10 @@ int32_t lwm2m_server_get_pmax(uint16_t obj_inst_id); int lwm2m_server_short_id_to_inst(uint16_t short_id); #if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_OBJ_SUPPORT) -void lwm2m_firmware_set_update_state(uint16_t obj_inst_id, uint8_t state); -void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result); +void lwm2m_firmware_set_update_state_inst(uint16_t obj_inst_id, uint8_t state); +void lwm2m_firmware_set_update_result_inst(uint16_t obj_inst_id, uint8_t result); +void lwm2m_firmware_set_update_state(uint8_t state); +void lwm2m_firmware_set_update_result(uint8_t result); #endif /* Attribute handling. */ diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c b/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c index a58afd6e1ec..e0861a6752f 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c @@ -84,12 +84,17 @@ static lwm2m_engine_execute_cb_t update_cb; extern int lwm2m_firmware_start_transfer(uint16_t obj_inst_id, char *package_uri); #endif -uint8_t lwm2m_firmware_get_update_state(uint16_t obj_inst_id) +uint8_t lwm2m_firmware_get_update_state_inst(uint16_t obj_inst_id) { return update_state[obj_inst_id]; } -void lwm2m_firmware_set_update_state(uint16_t obj_inst_id, uint8_t state) +uint8_t lwm2m_firmware_get_update_state(void) +{ + return lwm2m_firmware_get_update_state_inst(0); +} + +void lwm2m_firmware_set_update_state_inst(uint16_t obj_inst_id, uint8_t state) { bool error = false; char path[sizeof("5/65535/5")]; @@ -131,12 +136,22 @@ void lwm2m_firmware_set_update_state(uint16_t obj_inst_id, uint8_t state) LOG_DBG("Update state = %d", state); } -uint8_t lwm2m_firmware_get_update_result(uint16_t obj_inst_id) +void lwm2m_firmware_set_update_state(uint8_t state) +{ + lwm2m_firmware_set_update_state_inst(0, state); +} + +uint8_t lwm2m_firmware_get_update_result_inst(uint16_t obj_inst_id) { return update_result[obj_inst_id]; } -void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) +uint8_t lwm2m_firmware_get_update_result(void) +{ + return lwm2m_firmware_get_update_result_inst(0); +} + +void lwm2m_firmware_set_update_result_inst(uint16_t obj_inst_id, uint8_t result) { uint8_t state; bool error = false; @@ -145,7 +160,7 @@ void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) /* Check LWM2M SPEC appendix E.6.1 */ switch (result) { case RESULT_DEFAULT: - lwm2m_firmware_set_update_state(obj_inst_id, STATE_IDLE); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_IDLE); break; case RESULT_SUCCESS: if (update_state[obj_inst_id] != STATE_UPDATING) { @@ -153,7 +168,7 @@ void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) state = update_state[obj_inst_id]; } - lwm2m_firmware_set_update_state(obj_inst_id, STATE_IDLE); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_IDLE); break; case RESULT_NO_STORAGE: case RESULT_OUT_OF_MEM: @@ -166,7 +181,7 @@ void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) state = update_state[obj_inst_id]; } - lwm2m_firmware_set_update_state(obj_inst_id, STATE_IDLE); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_IDLE); break; case RESULT_INTEGRITY_FAILED: if (update_state[obj_inst_id] != STATE_DOWNLOADING && @@ -175,7 +190,7 @@ void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) state = update_state[obj_inst_id]; } - lwm2m_firmware_set_update_state(obj_inst_id, STATE_IDLE); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_IDLE); break; case RESULT_UPDATE_FAILED: if (update_state[obj_inst_id] != STATE_DOWNLOADING && @@ -184,7 +199,7 @@ void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) state = update_state[obj_inst_id]; } - lwm2m_firmware_set_update_state(obj_inst_id, STATE_IDLE); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_IDLE); break; default: LOG_ERR("Unhandled result: %u", result); @@ -203,6 +218,11 @@ void lwm2m_firmware_set_update_result(uint16_t obj_inst_id, uint8_t result) LOG_DBG("Update result = %d", result); } +void lwm2m_firmware_set_update_result(uint8_t result) +{ + lwm2m_firmware_set_update_result_inst(0, result); +} + static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id, uint16_t res_inst_id, uint8_t *data, uint16_t data_len, bool last_block, size_t total_size) @@ -210,16 +230,16 @@ static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id, uint8_t state; int ret; - state = lwm2m_firmware_get_update_state(obj_inst_id); + state = lwm2m_firmware_get_update_state_inst(obj_inst_id); if (state == STATE_IDLE) { /* TODO: setup timer to check download status, * make sure it fail after timeout */ - lwm2m_firmware_set_update_state(obj_inst_id, STATE_DOWNLOADING); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_DOWNLOADING); } else if (state != STATE_DOWNLOADING) { if (data_len == 0U && state == STATE_DOWNLOADED) { /* reset to state idle and result default */ - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_DEFAULT); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_DEFAULT); return 0; } @@ -232,23 +252,23 @@ static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id, last_block, total_size) : 0; if (ret >= 0) { if (last_block) { - lwm2m_firmware_set_update_state(obj_inst_id, STATE_DOWNLOADED); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_DOWNLOADED); } return 0; } else if (ret == -ENOMEM) { - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_OUT_OF_MEM); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_OUT_OF_MEM); } else if (ret == -ENOSPC) { - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_NO_STORAGE); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_NO_STORAGE); /* Response 4.13 (RFC7959, section 2.9.3) */ /* TODO: should include size1 option to indicate max size */ ret = -EFBIG; } else if (ret == -EFAULT) { - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_INTEGRITY_FAILED); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_INTEGRITY_FAILED); } else if (ret == -ENOMSG) { - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_UNSUP_FW); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_UNSUP_FW); } else { - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_UPDATE_FAILED); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_UPDATE_FAILED); } return ret; @@ -261,17 +281,17 @@ static int package_uri_write_cb(uint16_t obj_inst_id, uint16_t res_id, LOG_DBG("PACKAGE_URI WRITE: %s", log_strdup(package_uri[obj_inst_id])); #ifdef CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT - uint8_t state = lwm2m_firmware_get_update_state(obj_inst_id); + uint8_t state = lwm2m_firmware_get_update_state_inst(obj_inst_id); if (state == STATE_IDLE) { - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_DEFAULT); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_DEFAULT); if (data_len > 0) { lwm2m_firmware_start_transfer(obj_inst_id, package_uri[obj_inst_id]); } } else if (state == STATE_DOWNLOADED && data_len == 0U) { /* reset to state idle and result default */ - lwm2m_firmware_set_update_result(obj_inst_id, RESULT_DEFAULT); + lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_DEFAULT); } return 0; @@ -307,20 +327,20 @@ static int firmware_update_cb(uint16_t obj_inst_id, uint8_t state; int ret; - state = lwm2m_firmware_get_update_state(obj_inst_id); + state = lwm2m_firmware_get_update_state_inst(obj_inst_id); if (state != STATE_DOWNLOADED) { LOG_ERR("State other than downloaded: %d", state); return -EPERM; } - lwm2m_firmware_set_update_state(obj_inst_id, STATE_UPDATING); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_UPDATING); callback = lwm2m_firmware_get_update_cb(); if (callback) { ret = callback(obj_inst_id, args, args_len); if (ret < 0) { LOG_ERR("Failed to update firmware: %d", ret); - lwm2m_firmware_set_update_result(obj_inst_id, + lwm2m_firmware_set_update_result_inst(obj_inst_id, ret == -EINVAL ? RESULT_INTEGRITY_FAILED : RESULT_UPDATE_FAILED); return 0; diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c b/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c index f2349fcf6c7..ee685bfb3a7 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c @@ -21,7 +21,7 @@ static void set_update_result(uint16_t obj_inst_id, int error_code) int result; if (!error_code) { - lwm2m_firmware_set_update_state(STATE_DOWNLOADED); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_DOWNLOADED); return; } @@ -78,7 +78,7 @@ int lwm2m_firmware_start_transfer(uint16_t obj_inst_id, char *package_uri) return error_code; } - lwm2m_firmware_set_update_state(STATE_DOWNLOADING); + lwm2m_firmware_set_update_state_inst(obj_inst_id, STATE_DOWNLOADING); return 0; }