Skip to content

Commit 23f11a3

Browse files
[Scenes] EFS TLV container fix (project-chip#30663)
* Removed un-necessaery containter in extension field set and changed comment about max size tested given past optimisation * Removed the tag from ExtensionFieldSetsImpl.Serialize() signature * Removed logging of empty efs array * Update src/lib/core/CHIPConfig.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Remove the conditionnal storage of EFS --------- Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
1 parent ad34317 commit 23f11a3

File tree

6 files changed

+25
-38
lines changed

6 files changed

+25
-38
lines changed

src/app/clusters/scenes-server/ExtensionFieldSets.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ class ExtensionFieldSets
3434
ExtensionFieldSets(){};
3535
virtual ~ExtensionFieldSets() = default;
3636

37-
virtual CHIP_ERROR Serialize(TLV::TLVWriter & writer, TLV::Tag structTa) const = 0;
38-
virtual CHIP_ERROR Deserialize(TLV::TLVReader & reader, TLV::Tag structTa) = 0;
39-
virtual void Clear() = 0;
40-
virtual bool IsEmpty() const = 0;
37+
virtual CHIP_ERROR Serialize(TLV::TLVWriter & writer) const = 0;
38+
virtual CHIP_ERROR Deserialize(TLV::TLVReader & reader) = 0;
39+
virtual void Clear() = 0;
40+
virtual bool IsEmpty() const = 0;
4141
/// @brief Gets a count of how many initialized fields sets are in the object
4242
/// @return The number of initialized field sets the object
4343
/// @note Field set refers to extension field sets, from the scene cluster (see 1.4.6.2 ExtensionFieldSet in Matter Application

src/app/clusters/scenes-server/ExtensionFieldSetsImpl.cpp

+4-14
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,8 @@
2020
namespace chip {
2121
namespace scenes {
2222

23-
// ExtensionFieldSetsImpl::ExtensionFieldSetsImpl() : ExtensionFieldSets() {}
24-
25-
CHIP_ERROR ExtensionFieldSetsImpl::Serialize(TLV::TLVWriter & writer, TLV::Tag structTag) const
23+
CHIP_ERROR ExtensionFieldSetsImpl::Serialize(TLV::TLVWriter & writer) const
2624
{
27-
TLV::TLVType structureContainer;
28-
ReturnErrorOnFailure(writer.StartContainer(structTag, TLV::kTLVType_Structure, structureContainer));
2925
TLV::TLVType arrayContainer;
3026
ReturnErrorOnFailure(
3127
writer.StartContainer(TLV::ContextTag(TagEFS::kFieldSetArrayContainer), TLV::kTLVType_Array, arrayContainer));
@@ -34,16 +30,11 @@ CHIP_ERROR ExtensionFieldSetsImpl::Serialize(TLV::TLVWriter & writer, TLV::Tag s
3430
ReturnErrorOnFailure(mFieldSets[i].Serialize(writer));
3531
}
3632

37-
ReturnErrorOnFailure(writer.EndContainer(arrayContainer));
38-
return writer.EndContainer(structureContainer);
33+
return writer.EndContainer(arrayContainer);
3934
}
4035

41-
CHIP_ERROR ExtensionFieldSetsImpl::Deserialize(TLV::TLVReader & reader, TLV::Tag structTag)
36+
CHIP_ERROR ExtensionFieldSetsImpl::Deserialize(TLV::TLVReader & reader)
4237
{
43-
TLV::TLVType structureContainer;
44-
ReturnErrorOnFailure(reader.Next(TLV::kTLVType_Structure, structTag));
45-
ReturnErrorOnFailure(reader.EnterContainer(structureContainer));
46-
4738
TLV::TLVType arrayContainer;
4839
ReturnErrorOnFailure(reader.Next(TLV::kTLVType_Array, TLV::ContextTag(TagEFS::kFieldSetArrayContainer)));
4940
ReturnErrorOnFailure(reader.EnterContainer(arrayContainer));
@@ -69,8 +60,7 @@ CHIP_ERROR ExtensionFieldSetsImpl::Deserialize(TLV::TLVReader & reader, TLV::Tag
6960
return err;
7061
}
7162

72-
ReturnErrorOnFailure(reader.ExitContainer(arrayContainer));
73-
return reader.ExitContainer(structureContainer);
63+
return reader.ExitContainer(arrayContainer);
7464
}
7565

7666
void ExtensionFieldSetsImpl::Clear()

src/app/clusters/scenes-server/ExtensionFieldSetsImpl.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ class ExtensionFieldSetsImpl : public ExtensionFieldSets
122122
~ExtensionFieldSetsImpl() override{};
123123

124124
// overrides
125-
CHIP_ERROR Serialize(TLV::TLVWriter & writer, TLV::Tag structTag) const override;
126-
CHIP_ERROR Deserialize(TLV::TLVReader & reader, TLV::Tag structTag) override;
125+
CHIP_ERROR Serialize(TLV::TLVWriter & writer) const override;
126+
CHIP_ERROR Deserialize(TLV::TLVReader & reader) override;
127127
void Clear() override;
128128
bool IsEmpty() const override { return (mFieldSetsCount == 0); }
129129
uint8_t GetFieldSetCount() const override { return mFieldSetsCount; };

src/app/clusters/scenes-server/SceneTableImpl.cpp

+5-8
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ enum class TagScene : uint8_t
3939
kSceneID,
4040
kName,
4141
kTransitionTimeMs,
42-
kExtensionFieldSetsContainer,
4342
};
4443

4544
using SceneTableEntry = DefaultSceneTableImpl::SceneTableEntry;
@@ -99,7 +98,7 @@ struct EndpointSceneCount : public PersistentData<kPersistentBufferSceneCountByt
9998
}
10099
};
101100

102-
// Worst case tested: Add Scene Command with EFS using the default SerializeAdd Method. This yielded a serialized scene of 212bytes
101+
// Worst case tested: Add Scene Command with EFS using the default SerializeAdd Method. This yielded a serialized scene of 175 bytes
103102
// when using the OnOff, Level Control and Color Control as well as the maximal name length of 16 bytes. Putting 256 gives some
104103
// slack in case different clusters are used. Value obtained by using writer.GetLengthWritten at the end of the SceneTableData
105104
// Serialize method.
@@ -150,8 +149,7 @@ struct SceneTableData : public SceneTableEntry, PersistentData<kPersistentSceneB
150149
}
151150

152151
ReturnErrorOnFailure(writer.Put(TLV::ContextTag(TagScene::kTransitionTimeMs), mStorageData.mSceneTransitionTimeMs));
153-
ReturnErrorOnFailure(
154-
mStorageData.mExtensionFieldSets.Serialize(writer, TLV::ContextTag(TagScene::kExtensionFieldSetsContainer)));
152+
ReturnErrorOnFailure(mStorageData.mExtensionFieldSets.Serialize(writer));
155153

156154
return writer.EndContainer(container);
157155
}
@@ -173,7 +171,7 @@ struct SceneTableData : public SceneTableEntry, PersistentData<kPersistentSceneB
173171
ReturnErrorOnFailure(reader.Next());
174172
TLV::Tag currTag = reader.GetTag();
175173
VerifyOrReturnError(TLV::ContextTag(TagScene::kName) == currTag || TLV::ContextTag(TagScene::kTransitionTimeMs) == currTag,
176-
CHIP_ERROR_WRONG_TLV_TYPE);
174+
CHIP_ERROR_INVALID_TLV_TAG);
177175

178176
CharSpan nameSpan;
179177
// A name may or may not have been stored. Check whether it was.
@@ -184,10 +182,9 @@ struct SceneTableData : public SceneTableEntry, PersistentData<kPersistentSceneB
184182
}
185183
// Empty name will be initialized if the name wasn't stored
186184
mStorageData.SetName(nameSpan);
187-
188185
ReturnErrorOnFailure(reader.Get(mStorageData.mSceneTransitionTimeMs));
189-
ReturnErrorOnFailure(
190-
mStorageData.mExtensionFieldSets.Deserialize(reader, TLV::ContextTag(TagScene::kExtensionFieldSetsContainer)));
186+
187+
ReturnErrorOnFailure(mStorageData.mExtensionFieldSets.Deserialize(reader));
191188

192189
return reader.ExitContainer(container);
193190
}

src/app/tests/TestExtensionFieldSets.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -235,15 +235,15 @@ void TestSerializeDerializeExtensionFieldSet(nlTestSuite * aSuite, void * aConte
235235
// All ExtensionFieldSets serialize / deserialize
236236
writer.Init(sceneEFSBuffer);
237237
writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outer);
238-
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == EFS->Serialize(writer, TLV::ContextTag(TagTestEFS::kEFS)));
238+
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == EFS->Serialize(writer));
239239
writer.EndContainer(outer);
240240
sceneEFS_serialized_length = writer.GetLengthWritten();
241241
NL_TEST_ASSERT(aSuite, sceneEFS_serialized_length <= kPersistentSceneBufferMax);
242242

243243
reader.Init(sceneEFSBuffer);
244244
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.Next());
245245
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.EnterContainer(outerRead));
246-
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == testSceneEFS.Deserialize(reader, TLV::ContextTag(TagTestEFS::kEFS)));
246+
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == testSceneEFS.Deserialize(reader));
247247

248248
NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.ExitContainer(outerRead));
249249
NL_TEST_ASSERT(aSuite, *EFS == testSceneEFS);

src/lib/core/CHIPConfig.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -1484,16 +1484,16 @@ extern const char CHIP_NON_PRODUCTION_MARKER[];
14841484
* }
14851485
*
14861486
* Including all the TLV fields, the following values can help estimate the needed size for a scenes given a number of clusters:
1487-
* Empty EFS Scene Max name size: 33bytes
1488-
* Scene Max name size + OnOff : 51 bytes
1489-
* Scene Max name size + LevelControl : 60 bytes
1490-
* Scene Max name size + ColorControl : 126 bytes
1491-
* Scene Max name size + OnOff + LevelControl + ColoControl : 171 bytes
1487+
* Empty EFS Scene Max name size: 37 bytes
1488+
* Scene Max name size + OnOff : 55 bytes
1489+
* Scene Max name size + LevelControl : 64 bytes
1490+
* Scene Max name size + ColorControl : 130 bytes
1491+
* Scene Max name size + OnOff + LevelControl + ColoControl : 175 bytes
14921492
*
14931493
* Cluster Sizes:
1494-
* OnOff Cluster Max Size: 18 bytes
1495-
* LevelControl Cluster Max Size: 27 bytes
1496-
* Color Control Cluster Max Size: 93 bytes
1494+
* OnOff Cluster Max Size: 21 bytes
1495+
* LevelControl Cluster Max Size: 30 bytes
1496+
* Color Control Cluster Max Size: 96 bytes
14971497
* */
14981498
#ifndef CHIP_CONFIG_SCENES_MAX_SERIALIZED_SCENE_SIZE_BYTES
14991499
#define CHIP_CONFIG_SCENES_MAX_SERIALIZED_SCENE_SIZE_BYTES 256

0 commit comments

Comments
 (0)