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 <jarno.lamsa@nordicsemi.no>
This commit is contained in:
Jarno Lamsa 2021-12-14 09:52:54 +02:00 committed by Carles Cufí
parent 9782f86450
commit eedbbdc61a
3 changed files with 50 additions and 28 deletions

View File

@ -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. */

View File

@ -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;

View File

@ -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;
}