2424#include " MigrationManager.h"
2525#include < cmsis_os2.h>
2626#include < crypto/CHIPCryptoPAL.h>
27+ #include < lib/support/ScopedBuffer.h>
2728#include < platform/CHIPDeviceLayer.h>
2829#include < platform/KeyValueStoreManager.h>
2930#include < platform/silabs/SilabsConfig.h>
@@ -51,10 +52,6 @@ KeyValueStoreManagerImpl KeyValueStoreManagerImpl::sInstance;
5152
5253CHIP_ERROR KeyValueStoreManagerImpl::Init (void )
5354{
54- ReturnErrorOnFailure (SilabsConfig::Init ());
55-
56- Silabs::MigrationManager::GetMigrationInstance ().applyMigrations ();
57-
5855 memset (mKvsKeyMap , 0 , sizeof (mKvsKeyMap ));
5956 size_t outLen = 0 ;
6057 CHIP_ERROR error = SilabsConfig::ReadConfigValueBin (SilabsConfig::kConfigKey_KvsStringKeyMap ,
@@ -275,33 +272,42 @@ void KeyValueStoreManagerImpl::ErasePartition(void)
275272
276273void KeyValueStoreManagerImpl::KvsMapMigration (void )
277274{
278- size_t readlen = 0 ;
279- constexpr uint8_t oldMaxEntires = 120 ;
280- char mKvsStoredKeyString [oldMaxEntires][PersistentStorageDelegate::kKeyLengthMax + 1 ] = { 0 };
281- CHIP_ERROR err =
282- SilabsConfig::ReadConfigValueBin (SilabsConfig::kConfigKey_KvsStringKeyMap , reinterpret_cast <uint8_t *>(mKvsStoredKeyString ),
283- sizeof (mKvsStoredKeyString ), readlen);
275+ // this migration precedes Series 3, we don't need to run it in that case
276+ #ifndef _SILICON_LABS_32B_SERIES_3
277+ size_t readlen = 0 ;
278+ constexpr size_t oldMaxEntries = 120 ;
279+ constexpr uint32_t maxStringLen = 33 ; // value of PersistentStorageDelegate::kKeyLengthMax + 1 when migration was added
280+ Platform::ScopedMemoryBuffer<char > mKvsStoredKeyString ;
281+ mKvsStoredKeyString .Alloc (oldMaxEntries * maxStringLen);
282+
283+ VerifyOrReturn (mKvsStoredKeyString .Get () != nullptr );
284+
285+ CHIP_ERROR err = SilabsConfig::ReadConfigValueBin (SilabsConfig::kConfigKey_KvsStringKeyMap ,
286+ reinterpret_cast <uint8_t *>(mKvsStoredKeyString .Get ()),
287+ oldMaxEntries * maxStringLen, readlen);
284288
285289 if (err == CHIP_NO_ERROR)
286290 {
287- for (uint8_t i = 0 ; i < oldMaxEntires; i++)
291+ // Migrate the old String Based KvsKeyMap to the Hash based KvsKeyMap
292+ for (size_t i = 0 ; i < std::min (oldMaxEntries, KeyValueStoreManagerImpl::kMaxEntries ); i++)
288293 {
289- if (mKvsStoredKeyString [i][0 ] != 0 )
294+ char * keyString = mKvsStoredKeyString .Get () + (i * maxStringLen);
295+ if (keyString[0 ] != 0 )
290296 {
291297 size_t dataLen = 0 ;
292298 uint32_t nvm3Key = CONVERT_KEYMAP_INDEX_TO_NVM3KEY (i);
293299
294300 if (SilabsConfig::ConfigValueExists (nvm3Key, dataLen))
295301 {
296302 // Read old data and prefix it with the string Key for the collision prevention mechanism.
297- size_t keyStringLen = strlen (mKvsStoredKeyString [i] );
303+ size_t keyStringLen = strlen (keyString );
298304 uint8_t * prefixedData = static_cast <uint8_t *>(Platform::MemoryAlloc (keyStringLen + dataLen));
299305 VerifyOrDie (prefixedData != nullptr );
300- memcpy (prefixedData, mKvsStoredKeyString [i] , keyStringLen);
306+ memcpy (prefixedData, keyString , keyStringLen);
301307
302308 SilabsConfig::ReadConfigValueBin (nvm3Key, prefixedData + keyStringLen, dataLen, readlen);
303309 SilabsConfig::WriteConfigValueBin (nvm3Key, prefixedData, keyStringLen + dataLen);
304- mKvsKeyMap [i] = KeyValueStoreMgrImpl ().hashKvsKeyString (mKvsStoredKeyString [i] );
310+ mKvsKeyMap [i] = KeyValueStoreMgrImpl ().hashKvsKeyString (keyString );
305311 Platform::MemoryFree (prefixedData);
306312 }
307313 }
@@ -315,6 +321,7 @@ void KeyValueStoreManagerImpl::KvsMapMigration(void)
315321 // start with a fresh kvs section.
316322 KeyValueStoreMgrImpl ().ErasePartition ();
317323 }
324+ #endif
318325}
319326
320327void KeyValueStoreManagerImpl::KvsKeyMapCleanup (void * argument)
0 commit comments