From 68714c0e2d9f5239b5182962b6733911ab8b8b05 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Mon, 8 Jan 2024 15:31:54 +0530 Subject: [PATCH] Ensure backward compatibility for attributes stored in NVS with primitive data type Removed config option ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE. Previously, the ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE option determined whether to store attributes as a blob or a primitive data type in NVS. Since this configuration is not backward compatible, we now read the attribute as a primitive data type if not found. If it's a blob, we read it and rewrite it as a primitive data type. --- components/esp_matter/Kconfig | 12 ---- .../esp_matter/private/esp_matter_nvs.cpp | 56 +++++++++++++------ .../all_device_types_app/sdkconfig.defaults | 3 - examples/blemesh_bridge/sdkconfig.defaults | 3 - examples/controller/sdkconfig.defaults | 3 - examples/controller/sdkconfig.defaults.otbr | 3 - examples/generic_switch/sdkconfig.defaults | 3 - examples/icd_app/sdkconfig.defaults | 3 - examples/light/sdkconfig.defaults | 3 - examples/light/sdkconfig.defaults.ext_plat_ci | 3 - examples/light_switch/sdkconfig.defaults | 3 - examples/refrigerator/sdkconfig.defaults | 3 - .../room_air_conditioner/sdkconfig.defaults | 3 - .../sdkconfig.defaults.ext_plat_ci | 3 - examples/zigbee_bridge/sdkconfig.defaults | 3 - .../sdkconfig.defaults.zb_gw_board | 3 - 16 files changed, 38 insertions(+), 72 deletions(-) diff --git a/components/esp_matter/Kconfig b/components/esp_matter/Kconfig index 6e88e9834..2bc9d6ddc 100644 --- a/components/esp_matter/Kconfig +++ b/components/esp_matter/Kconfig @@ -210,18 +210,6 @@ menu "ESP Matter" endchoice #ESP_MATTER_MEM_ALLOC_MODE - config ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE - bool "Use compact attribute storage" - default n - help - Attributes can be stored as primitive data type or blob in NVS. - This option lets you select which one to use. - - If enabled, attributes are stored as primitive data types in NVS. - If disabled, then attributes are stored as blob which consumes more space in NVS. - - This option is kept disabled by default to maintain the backward compatibility. - config ESP_MATTER_ENABLE_DATA_MODEL bool "Use ESP-Matter data model" default y diff --git a/components/esp_matter/private/esp_matter_nvs.cpp b/components/esp_matter/private/esp_matter_nvs.cpp index 1597b6662..4564cccda 100644 --- a/components/esp_matter/private/esp_matter_nvs.cpp +++ b/components/esp_matter/private/esp_matter_nvs.cpp @@ -45,6 +45,9 @@ static void get_attribute_key(uint16_t endpoint_id, uint32_t cluster_id, uint32_ attribute_key[14] = 0; } +static esp_err_t nvs_store_val(const char *nvs_namespace, const char *attribute_key, const esp_matter_attr_val_t & val); +static esp_err_t nvs_erase_val(const char *nvs_namespace, const char *attribute_key); + static esp_err_t nvs_get_val(const char *nvs_namespace, const char *attribute_key, esp_matter_attr_val_t & val) { nvs_handle_t handle; @@ -71,13 +74,18 @@ static esp_err_t nvs_get_val(const char *nvs_namespace, const char *attribute_ke val.val.a.n = len; val.val.a.t = len + (val.val.a.t - val.val.a.s); val.val.a.s = len; - nvs_get_blob(handle, attribute_key, buffer, &len); + err = nvs_get_blob(handle, attribute_key, buffer, &len); } } - } else { - // Handling how to get attributes in NVS based on config option. -#if CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE - // This switch case handles primitive data types + + nvs_close(handle); + return err; + } + + // This switch case handles primitive data types + // if value is stored as primitive data type return it, else check if its stored as blob + // and convert it to primitive data type + { switch (val.type) { case ESP_MATTER_VAL_TYPE_BOOLEAN: @@ -173,17 +181,35 @@ static esp_err_t nvs_get_val(const char *nvs_namespace, const char *attribute_ke default: { // handle the case where the type is not recognized - err = ESP_ERR_INVALID_ARG; + nvs_close(handle); ESP_LOGE(TAG, "Invalid attribute type: %u", val.type); - break; + return ESP_ERR_INVALID_ARG; } } -#else + } + + // Found the value as primitive data type + if (err == ESP_OK) { + nvs_close(handle); + return err; + } + + if (err == ESP_ERR_NVS_NOT_FOUND) { + // Read as blob, if found, write as primitive data type size_t len = sizeof(esp_matter_attr_val_t); err = nvs_get_blob(handle, attribute_key, &val, &len); -#endif // CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE + if (err == ESP_OK) { + // found it as a blob, close the handle + nvs_close(handle); + + // nvs_store_val always stores primitive value using primitive data type APIs + err = nvs_store_val(nvs_namespace, attribute_key, val); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to store as primitive data type"); + } + } } - nvs_close(handle); + return err; } @@ -203,14 +229,12 @@ static esp_err_t nvs_store_val(const char *nvs_namespace, const char *attribute_ /* Store only if value is not NULL */ if (val.val.a.b) { err = nvs_set_blob(handle, attribute_key, val.val.a.b, val.val.a.s); - nvs_commit(handle); } else { err = ESP_OK; } } else { - // Handling how to store attributes in NVS based on config option. -#if CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE // This switch case handles primitive data types + // always store values as primitive data type switch (val.type) { case ESP_MATTER_VAL_TYPE_BOOLEAN: @@ -306,12 +330,8 @@ static esp_err_t nvs_store_val(const char *nvs_namespace, const char *attribute_ break; } } -#else - err = nvs_set_blob(handle, attribute_key, &val, sizeof(esp_matter_attr_val_t)); -#endif // CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE - - nvs_commit(handle); } + nvs_commit(handle); nvs_close(handle); return err; } diff --git a/examples/all_device_types_app/sdkconfig.defaults b/examples/all_device_types_app/sdkconfig.defaults index 6d1bf1131..b94c081b5 100644 --- a/examples/all_device_types_app/sdkconfig.defaults +++ b/examples/all_device_types_app/sdkconfig.defaults @@ -38,9 +38,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/blemesh_bridge/sdkconfig.defaults b/examples/blemesh_bridge/sdkconfig.defaults index 5365e7d09..9c1ffc58c 100644 --- a/examples/blemesh_bridge/sdkconfig.defaults +++ b/examples/blemesh_bridge/sdkconfig.defaults @@ -55,9 +55,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/controller/sdkconfig.defaults b/examples/controller/sdkconfig.defaults index 85b1a8fa3..6f904548f 100644 --- a/examples/controller/sdkconfig.defaults +++ b/examples/controller/sdkconfig.defaults @@ -41,9 +41,6 @@ CONFIG_ENABLE_CHIP_CONTROLLER_BUILD=y CONFIG_ESP_MATTER_CONTROLLER_ENABLE=y CONFIG_ESP_MATTER_COMMISSIONER_ENABLE=y -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/controller/sdkconfig.defaults.otbr b/examples/controller/sdkconfig.defaults.otbr index 5513e8585..d416be1bf 100644 --- a/examples/controller/sdkconfig.defaults.otbr +++ b/examples/controller/sdkconfig.defaults.otbr @@ -67,9 +67,6 @@ CONFIG_BUILD_CHIP_TESTS=n # Disable OTA Requestor CONFIG_ENABLE_OTA_REQUESTOR=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Disable route hook for matter since OTBR has already initialize the route hook CONFIG_ENABLE_ROUTE_HOOK=n diff --git a/examples/generic_switch/sdkconfig.defaults b/examples/generic_switch/sdkconfig.defaults index a1c49db72..4baf067bd 100644 --- a/examples/generic_switch/sdkconfig.defaults +++ b/examples/generic_switch/sdkconfig.defaults @@ -46,9 +46,6 @@ CONFIG_FACTORY_DEVICE_INFO_PROVIDER=y CONFIG_FACTORY_DEVICE_INSTANCE_INFO_PROVIDER=y CONFIG_FACTORY_COMMISSIONABLE_DATA_PROVIDER=y -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/icd_app/sdkconfig.defaults b/examples/icd_app/sdkconfig.defaults index adb802253..6fb7162bd 100644 --- a/examples/icd_app/sdkconfig.defaults +++ b/examples/icd_app/sdkconfig.defaults @@ -31,9 +31,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/light/sdkconfig.defaults b/examples/light/sdkconfig.defaults index 9b6905016..a8af7c941 100644 --- a/examples/light/sdkconfig.defaults +++ b/examples/light/sdkconfig.defaults @@ -38,9 +38,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/light/sdkconfig.defaults.ext_plat_ci b/examples/light/sdkconfig.defaults.ext_plat_ci index e03657152..d05834662 100644 --- a/examples/light/sdkconfig.defaults.ext_plat_ci +++ b/examples/light/sdkconfig.defaults.ext_plat_ci @@ -45,9 +45,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/light_switch/sdkconfig.defaults b/examples/light_switch/sdkconfig.defaults index 6d1bf1131..b94c081b5 100644 --- a/examples/light_switch/sdkconfig.defaults +++ b/examples/light_switch/sdkconfig.defaults @@ -38,9 +38,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/refrigerator/sdkconfig.defaults b/examples/refrigerator/sdkconfig.defaults index 8a0a5f442..543f826df 100644 --- a/examples/refrigerator/sdkconfig.defaults +++ b/examples/refrigerator/sdkconfig.defaults @@ -41,8 +41,5 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/room_air_conditioner/sdkconfig.defaults b/examples/room_air_conditioner/sdkconfig.defaults index 6d1bf1131..b94c081b5 100644 --- a/examples/room_air_conditioner/sdkconfig.defaults +++ b/examples/room_air_conditioner/sdkconfig.defaults @@ -38,9 +38,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/room_air_conditioner/sdkconfig.defaults.ext_plat_ci b/examples/room_air_conditioner/sdkconfig.defaults.ext_plat_ci index 11702527b..c1bf4d742 100644 --- a/examples/room_air_conditioner/sdkconfig.defaults.ext_plat_ci +++ b/examples/room_air_conditioner/sdkconfig.defaults.ext_plat_ci @@ -44,8 +44,5 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/zigbee_bridge/sdkconfig.defaults b/examples/zigbee_bridge/sdkconfig.defaults index 21342b062..27987cc63 100644 --- a/examples/zigbee_bridge/sdkconfig.defaults +++ b/examples/zigbee_bridge/sdkconfig.defaults @@ -41,9 +41,6 @@ CONFIG_ZB_RADIO_MACSPLIT_UART=y # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y diff --git a/examples/zigbee_bridge/sdkconfig.defaults.zb_gw_board b/examples/zigbee_bridge/sdkconfig.defaults.zb_gw_board index 28b666dfa..e32b8cb85 100644 --- a/examples/zigbee_bridge/sdkconfig.defaults.zb_gw_board +++ b/examples/zigbee_bridge/sdkconfig.defaults.zb_gw_board @@ -39,9 +39,6 @@ CONFIG_ESP_MATTER_ZIGBEE_BRIDGE_BOARD_DEV_KIT=y # USB Console CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y