ble_mesh: Fix mesh node device role restore

Old version of BLE Mesh has no device role storage, because
previously we only support storing mesh node info.
If the binary of the node is upgraded from old version to a
new version (support storing provisioner info), the mesh info
of the node will not be restored because mesh role does not
exist in the flash.
This commit is contained in:
lly 2020-04-04 16:45:40 +08:00
parent 793d2b11f1
commit 2ea69e6df5
2 changed files with 30 additions and 0 deletions

View file

@ -285,6 +285,29 @@ if BLE_MESH
introduce message replay attacks and system security will be in a introduce message replay attacks and system security will be in a
vulnerable state. vulnerable state.
config BLE_MESH_SETTINGS_BACKWARD_COMPATIBILITY
bool "A specific option for settings backward compatibility"
depends on BLE_MESH_NODE
default n
help
This option is created to solve the issue of failure in recovering
node information after mesh stack updates. In the old version mesh
stack, there is no key of "mesh/role" in nvs. In the new version
mesh stack, key of "mesh/role" is added in nvs, recovering node
information needs to check "mesh/role" key in nvs and implements
selective recovery of mesh node information. Therefore, there may
be failure in recovering node information during node restarting
after OTA.
The new version mesh stack adds the option of "mesh/role" because
we have added the support of storing Provisioner information, while
the old version only supports storing node information.
If users are updating their nodes from old version to new version,
we recommend enabling this option, so that system could set the flag
in advance before recovering node information and make sure the node
information recovering could work as expected.
endif # if BLE_MESH_SETTINGS endif # if BLE_MESH_SETTINGS
config BLE_MESH_SUBNET_COUNT config BLE_MESH_SUBNET_COUNT

View file

@ -182,7 +182,14 @@ static int role_set(const char *name)
} }
if (exist == false) { if (exist == false) {
#if CONFIG_BLE_MESH_SETTINGS_BACKWARD_COMPATIBILITY
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) &&
!IS_ENABLED(CONFIG_BLE_MESH_PROVISIONER)) {
bt_mesh_atomic_set_bit(bt_mesh.flags, BLE_MESH_NODE);
}
#else
return 0; return 0;
#endif
} }
BT_INFO("Restored mesh device role %lu", bt_mesh_atomic_get(bt_mesh.flags) & DEVICE_ROLE_BITS); BT_INFO("Restored mesh device role %lu", bt_mesh_atomic_get(bt_mesh.flags) & DEVICE_ROLE_BITS);