Skip to content

Commit 741b788

Browse files
Juha Heiskanenrlubos
Juha Heiskanen
authored andcommitted
net: lwm2m_client_utils: Advanced FOTA push fix
Fixed interobility issue with AVSystem Coiote server for do Firmware update with Push-mode. Server cancel at idle state was not accepted and cause failure to FOTA process. Signed-off-by: Juha Heiskanen <juha.heiskanen@nordicsemi.no>
1 parent 7a153ad commit 741b788

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

doc/nrf/releases_and_maturity/releases/release-notes-changelog.rst

+2
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,8 @@ Libraries for networking
882882
* The ``location_assist_agps_request_set()`` function has been renamed to :c:func:`location_assist_agnss_request_set`.
883883
* The ``location_assist_agps_set_elevation_mask()`` function has been renamed to :c:func:`location_assist_agnss_set_elevation_mask`.
884884
* The ``location_assist_agps_get_elevation_mask()`` function has been renamed to :c:func:`location_assist_agnss_get_elevation_mask`.
885+
* The advanced LwM2M FOTA object to accept zero length of a firmware package for reset state and result resources.
886+
This fixes an interoperability issue with AVSystem's Coiote Device Management server related to firmware update by push-mode.
885887

886888
* :ref:`lib_aws_fota` library:
887889

subsys/net/lib/lwm2m_client_utils/lwm2m/lwm2m_adv_firmware.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -255,18 +255,18 @@ static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id, uint16_t res_
255255
lwm2m_engine_set_data_cb_t callback;
256256

257257
state = lwm2m_adv_firmware_get_update_state(obj_inst_id);
258-
if (state == STATE_IDLE) {
259-
lwm2m_adv_firmware_set_update_state(obj_inst_id, STATE_DOWNLOADING);
260-
} else if (data_len == 0U || (data_len == 1U && data[0] == '\0')) {
261-
if (state == STATE_DOWNLOADED || state == STATE_DOWNLOADING) {
262-
/* reset to state idle and result default */
263-
lwm2m_adv_firmware_set_update_result(obj_inst_id, RESULT_DEFAULT);
264-
LOG_DBG("Update canceled by writing %d bytes", data_len);
265-
return 0;
258+
if (data_len == 0U || (data_len == 1U && data[0] == '\0')) {
259+
if (state == STATE_UPDATING) {
260+
/* Cancel at Updating state is not accepted */
261+
LOG_WRN("Download has already completed");
262+
return -EPERM;
266263
}
267-
LOG_WRN("Download has already completed");
268-
return -EPERM;
269264

265+
lwm2m_adv_firmware_set_update_result(obj_inst_id, RESULT_DEFAULT);
266+
return 0;
267+
268+
} else if (state == STATE_IDLE) {
269+
lwm2m_adv_firmware_set_update_state(obj_inst_id, STATE_DOWNLOADING);
270270
} else if (state != STATE_DOWNLOADING) {
271271
LOG_WRN("Cannot download: state = %d", state);
272272
return -EPERM;

tests/subsys/net/lib/lwm2m_fota_utils/src/firmware.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -699,13 +699,18 @@ ZTEST(lwm2m_client_utils_firmware, test_firmware_update)
699699

700700
ZTEST(lwm2m_client_utils_firmware, test_firmware_push_update)
701701
{
702-
int rc;
702+
int rc, inavalid_cancel;
703703
uint8_t test_dummy_data[32];
704704
uint8_t state;
705705

706+
#if defined(CONFIG_LWM2M_CLIENT_UTILS_ADV_FIRMWARE_UPDATE_OBJ_SUPPORT)
707+
inavalid_cancel = 0;
708+
#else
709+
inavalid_cancel = -EINVAL;
710+
#endif
706711
dfu_target_mcuboot_identify_fake.return_val = false;
707712
rc = post_write_to_resource(app_instance, LWM2M_FOTA_PACKAGE_ID, NULL, 0, false, 0);
708-
zassert_equal(rc, -EINVAL, "wrong return value");
713+
zassert_equal(rc, inavalid_cancel, "wrong return value");
709714

710715
rc = post_write_to_resource(app_instance, LWM2M_FOTA_PACKAGE_ID, test_dummy_data, 32, false,
711716
64);

0 commit comments

Comments
 (0)