Skip to content

Commit 2142870

Browse files
Use pointer for subject descriptor in datamodel provider instead of std::optional (#36246)
* Use a pointer for the subject descriptor. This seems to save about 88 bytes of flash on a test NRF board. * Restyle * Fix include * Fix include * Also fix PW rpc --------- Co-authored-by: Andrei Litvin <[email protected]>
1 parent 77b4780 commit 2142870

File tree

12 files changed

+42
-20
lines changed

12 files changed

+42
-20
lines changed

examples/common/pigweed/rpc_services/Attributes.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service<Attributes>
224224
app::DataModel::ReadAttributeRequest request;
225225
request.path = path;
226226
request.operationFlags.Set(app::DataModel::OperationFlags::kInternal);
227-
request.subjectDescriptor = subjectDescriptor;
227+
request.subjectDescriptor = &subjectDescriptor;
228228

229229
std::optional<app::DataModel::ClusterInfo> info = provider->GetClusterInfo(path);
230230
if (!info.has_value())

src/app/CommandHandlerImpl.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <app/CommandHandlerImpl.h>
1919

2020
#include <access/AccessControl.h>
21+
#include <access/SubjectDescriptor.h>
2122
#include <app-common/zap-generated/cluster-objects.h>
2223
#include <app/MessageDef/StatusIB.h>
2324
#include <app/RequiredPrivilege.h>
@@ -391,10 +392,11 @@ Status CommandHandlerImpl::ProcessCommandDataIB(CommandDataIB::Parser & aCommand
391392
VerifyOrReturnError(err == CHIP_NO_ERROR, Status::InvalidAction);
392393

393394
{
395+
Access::SubjectDescriptor subjectDescriptor = GetSubjectDescriptor();
394396
DataModel::InvokeRequest request;
395397

396398
request.path = concretePath;
397-
request.subjectDescriptor = GetSubjectDescriptor();
399+
request.subjectDescriptor = &subjectDescriptor;
398400
request.invokeFlags.Set(DataModel::InvokeFlags::kTimed, IsTimedInvoke());
399401

400402
Status preCheckStatus = mpCallback->ValidateCommandCanBeDispatched(request);
@@ -513,10 +515,11 @@ Status CommandHandlerImpl::ProcessGroupCommandDataIB(CommandDataIB::Parser & aCo
513515
const ConcreteCommandPath concretePath(mapping.endpoint_id, clusterId, commandId);
514516

515517
{
518+
Access::SubjectDescriptor subjectDescriptor = GetSubjectDescriptor();
516519
DataModel::InvokeRequest request;
517520

518521
request.path = concretePath;
519-
request.subjectDescriptor = GetSubjectDescriptor();
522+
request.subjectDescriptor = &subjectDescriptor;
520523
request.invokeFlags.Set(DataModel::InvokeFlags::kTimed, IsTimedInvoke());
521524

522525
Status preCheckStatus = mpCallback->ValidateCommandCanBeDispatched(request);

src/app/InteractionModelEngine.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1646,10 +1646,12 @@ void InteractionModelEngine::DispatchCommand(CommandHandlerImpl & apCommandObj,
16461646
{
16471647
#if CHIP_CONFIG_USE_DATA_MODEL_INTERFACE
16481648

1649+
Access::SubjectDescriptor subjectDescriptor = apCommandObj.GetSubjectDescriptor();
1650+
16491651
DataModel::InvokeRequest request;
16501652
request.path = aCommandPath;
16511653
request.invokeFlags.Set(DataModel::InvokeFlags::kTimed, apCommandObj.IsTimedInvoke());
1652-
request.subjectDescriptor = apCommandObj.GetSubjectDescriptor();
1654+
request.subjectDescriptor = &subjectDescriptor;
16531655

16541656
std::optional<DataModel::ActionReturnStatus> status = GetDataModelProvider()->Invoke(request, apPayload, &apCommandObj);
16551657

@@ -1702,7 +1704,7 @@ Protocols::InteractionModel::Status InteractionModelEngine::ValidateCommandCanBe
17021704

17031705
Protocols::InteractionModel::Status InteractionModelEngine::CheckCommandAccess(const DataModel::InvokeRequest & aRequest)
17041706
{
1705-
if (!aRequest.subjectDescriptor.has_value())
1707+
if (aRequest.subjectDescriptor == nullptr)
17061708
{
17071709
return Status::UnsupportedAccess; // we require a subject for invoke
17081710
}

src/app/WriteHandler.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ CHIP_ERROR WriteHandler::WriteClusterData(const Access::SubjectDescriptor & aSub
779779
DataModel::WriteAttributeRequest request;
780780

781781
request.path = aPath;
782-
request.subjectDescriptor = aSubject;
782+
request.subjectDescriptor = &aSubject;
783783
request.previousSuccessPath = mLastSuccessfullyWrittenPath;
784784
request.writeFlags.Set(DataModel::WriteFlags::kTimed, IsTimedWrite());
785785

src/app/codegen-data-model-provider/CodegenDataModelProvider_Read.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::ReadAttribute(const Data
106106
// ACL check for non-internal requests
107107
if (!request.operationFlags.Has(DataModel::OperationFlags::kInternal))
108108
{
109-
VerifyOrReturnError(request.subjectDescriptor.has_value(), CHIP_ERROR_INVALID_ARGUMENT);
109+
VerifyOrReturnError(request.subjectDescriptor != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
110110

111111
Access::RequestPath requestPath{ .cluster = request.path.mClusterId,
112112
.endpoint = request.path.mEndpointId,

src/app/codegen-data-model-provider/CodegenDataModelProvider_Write.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::WriteAttribute(const Dat
159159

160160
if (checkAcl)
161161
{
162-
VerifyOrReturnError(request.subjectDescriptor.has_value(), Status::UnsupportedAccess);
162+
VerifyOrReturnError(request.subjectDescriptor != nullptr, Status::UnsupportedAccess);
163163

164164
Access::RequestPath requestPath{ .cluster = request.path.mClusterId,
165165
.endpoint = request.path.mEndpointId,

src/app/data-model-provider/OperationTypes.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,16 @@ struct OperationRequest
5555
/// - operationFlags.Has(OperationFlags::kInternal) MUST NOT have this set
5656
///
5757
/// NOTE: once kInternal flag is removed, this will become non-optional
58-
std::optional<chip::Access::SubjectDescriptor> subjectDescriptor;
58+
const chip::Access::SubjectDescriptor * subjectDescriptor = nullptr;
5959

6060
/// Accessing fabric index is the subjectDescriptor fabric index (if any).
6161
/// This is a readability convenience function.
6262
///
6363
/// Returns kUndefinedFabricIndex if no subject descriptor is available
6464
FabricIndex GetAccessingFabricIndex() const
6565
{
66-
return subjectDescriptor.has_value() ? subjectDescriptor->fabricIndex : kUndefinedFabricIndex;
66+
VerifyOrReturnValue(subjectDescriptor != nullptr, kUndefinedFabricIndex);
67+
return subjectDescriptor->fabricIndex;
6768
}
6869
};
6970

src/app/data-model-provider/tests/ReadTesting.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class ReadOperation
136136
ReadOperation(const ConcreteAttributePath & path)
137137
{
138138
mRequest.path = path;
139-
mRequest.subjectDescriptor = kDenySubjectDescriptor;
139+
mRequest.subjectDescriptor = &kDenySubjectDescriptor;
140140
}
141141

142142
ReadOperation(EndpointId endpoint, ClusterId cluster, AttributeId attribute) :
@@ -146,7 +146,7 @@ class ReadOperation
146146
ReadOperation & SetSubjectDescriptor(const chip::Access::SubjectDescriptor & descriptor)
147147
{
148148
VerifyOrDie(mState == State::kInitializing);
149-
mRequest.subjectDescriptor = descriptor;
149+
mRequest.subjectDescriptor = &descriptor;
150150
return *this;
151151
}
152152

src/app/data-model-provider/tests/WriteTesting.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class WriteOperation
4747
WriteOperation(const ConcreteDataAttributePath & path)
4848
{
4949
mRequest.path = path;
50-
mRequest.subjectDescriptor = kDenySubjectDescriptor;
50+
mRequest.subjectDescriptor = &kDenySubjectDescriptor;
5151
}
5252

5353
WriteOperation(EndpointId endpoint, ClusterId cluster, AttributeId attribute) :
@@ -56,7 +56,7 @@ class WriteOperation
5656

5757
WriteOperation & SetSubjectDescriptor(const chip::Access::SubjectDescriptor & descriptor)
5858
{
59-
mRequest.subjectDescriptor = descriptor;
59+
mRequest.subjectDescriptor = &descriptor;
6060
return *this;
6161
}
6262

@@ -123,7 +123,11 @@ class WriteOperation
123123
AttributeValueDecoder DecoderFor(const T & value)
124124
{
125125
mTLVReader = ReadEncodedValue(value);
126-
return AttributeValueDecoder(mTLVReader, mRequest.subjectDescriptor.value_or(kDenySubjectDescriptor));
126+
if (mRequest.subjectDescriptor == nullptr)
127+
{
128+
AttributeValueDecoder(mTLVReader, kDenySubjectDescriptor);
129+
}
130+
return AttributeValueDecoder(mTLVReader, *mRequest.subjectDescriptor);
127131
}
128132

129133
private:

src/app/reporting/Read-DataModel.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ DataModel::ActionReturnStatus RetrieveClusterData(DataModel::Provider * dataMode
4747
{
4848
readRequest.readFlags.Set(DataModel::ReadFlags::kFabricFiltered);
4949
}
50-
readRequest.subjectDescriptor = subjectDescriptor;
50+
readRequest.subjectDescriptor = &subjectDescriptor;
5151
readRequest.path = path;
5252

5353
DataVersion version = 0;

src/app/tests/test-interaction-model-api.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
#include "access/SubjectDescriptor.h"
1617
#include <app/tests/test-interaction-model-api.h>
1718

1819
#include <app/InteractionModelEngine.h>
@@ -171,8 +172,13 @@ ActionReturnStatus TestImCustomDataModel::ReadAttribute(const ReadAttributeReque
171172
{
172173
AttributeEncodeState mutableState(&encoder.GetState()); // provide a state copy to start.
173174

174-
CHIP_ERROR err = ReadSingleClusterData(request.subjectDescriptor.value_or(Access::SubjectDescriptor()),
175-
request.readFlags.Has(ReadFlags::kFabricFiltered), request.path,
175+
Access::SubjectDescriptor subjectDescriptor;
176+
if (request.subjectDescriptor != nullptr)
177+
{
178+
subjectDescriptor = *request.subjectDescriptor;
179+
}
180+
181+
CHIP_ERROR err = ReadSingleClusterData(subjectDescriptor, request.readFlags.Has(ReadFlags::kFabricFiltered), request.path,
176182
TestOnlyAttributeValueEncoderAccessor(encoder).Builder(), &mutableState);
177183

178184
// state must survive CHIP_ERRORs as it is used for chunking

src/controller/tests/data_model/DataModelFixtures.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "DataModelFixtures.h"
2020

21+
#include <access/SubjectDescriptor.h>
2122
#include <app-common/zap-generated/cluster-objects.h>
2223
#include <app-common/zap-generated/ids/Clusters.h>
2324
#include <app/AttributeValueDecoder.h>
@@ -522,8 +523,13 @@ ActionReturnStatus CustomDataModel::ReadAttribute(const ReadAttributeRequest & r
522523
}
523524
#endif // CHIP_CONFIG_USE_EMBER_DATA_MODEL && CHIP_CONFIG_USE_DATA_MODEL_INTERFACE
524525

525-
CHIP_ERROR err = ReadSingleClusterData(request.subjectDescriptor.value_or(Access::SubjectDescriptor()),
526-
request.readFlags.Has(ReadFlags::kFabricFiltered), request.path,
526+
Access::SubjectDescriptor subjectDescriptor;
527+
if (request.subjectDescriptor != nullptr)
528+
{
529+
subjectDescriptor = *request.subjectDescriptor;
530+
}
531+
532+
CHIP_ERROR err = ReadSingleClusterData(subjectDescriptor, request.readFlags.Has(ReadFlags::kFabricFiltered), request.path,
527533
TestOnlyAttributeValueEncoderAccessor(encoder).Builder(), &mutableState);
528534

529535
// state must survive CHIP_ERRORs as it is used for chunking

0 commit comments

Comments
 (0)