diff --git a/src/app/InteractionModelEngine.cpp b/src/app/InteractionModelEngine.cpp index 132e8cdf108a72..08b41fe519d70c 100644 --- a/src/app/InteractionModelEngine.cpp +++ b/src/app/InteractionModelEngine.cpp @@ -853,6 +853,11 @@ Protocols::InteractionModel::Status InteractionModelEngine::OnReadInitialRequest return Status::ResourceExhausted; } + if (apExchangeContext->GetSessionHandle()->AllowsLargePayload()) + { + handler->UseLargePayloadBuffer(); + } + handler->OnInitialRequest(std::move(aPayload)); return Status::Success; diff --git a/src/app/ReadHandler.h b/src/app/ReadHandler.h index a30f1f8974ad25..f4b8f6652864a1 100644 --- a/src/app/ReadHandler.h +++ b/src/app/ReadHandler.h @@ -491,6 +491,10 @@ class ReadHandler : public Messaging::ExchangeDelegate /// @param aFlag Flag to clear void ClearStateFlag(ReadHandlerFlags aFlag); + + void UseLargePayloadBuffer() { mUseLargePayloadBuffer = true; } + bool ShouldUseLargePayloadBuffer() { return mUseLargePayloadBuffer; } + AttributePathExpandIterator mAttributePathExpandIterator = AttributePathExpandIterator(nullptr); // The current generation of the reporting engine dirty set the last time we were notified that a path we're interested in was @@ -572,6 +576,8 @@ class ReadHandler : public Messaging::ExchangeDelegate // TODO (#27675): Merge all observers into one and that one will dispatch the callbacks to the right place. Observer * mObserver = nullptr; + + bool mUseLargePayloadBuffer = false; }; } // namespace app } // namespace chip diff --git a/src/app/StatusResponse.h b/src/app/StatusResponse.h index 93f2557b679854..d99a90f53aa23f 100644 --- a/src/app/StatusResponse.h +++ b/src/app/StatusResponse.h @@ -27,6 +27,7 @@ namespace chip { namespace app { static constexpr size_t kMaxSecureSduLengthBytes = kMaxAppMessageLen + kMaxTagLen; +static constexpr size_t kMaxLargeSecureSduLengthBytes = kMaxLargeAppMessageLen + kMaxTagLen; class StatusResponse { diff --git a/src/app/reporting/Engine.cpp b/src/app/reporting/Engine.cpp index 39c582f3e45f0b..060a99046810d6 100644 --- a/src/app/reporting/Engine.cpp +++ b/src/app/reporting/Engine.cpp @@ -492,10 +492,11 @@ CHIP_ERROR Engine::BuildAndSendSingleReportData(ReadHandler * apReadHandler) CHIP_ERROR err = CHIP_NO_ERROR; chip::System::PacketBufferTLVWriter reportDataWriter; ReportDataMessage::Builder reportDataBuilder; - chip::System::PacketBufferHandle bufHandle = System::PacketBufferHandle::New(chip::app::kMaxSecureSduLengthBytes); - uint16_t reservedSize = 0; - bool hasMoreChunks = false; - bool needCloseReadHandler = false; + size_t maxSduSize = chip::app::kMaxSecureSduLengthBytes; + chip::System::PacketBufferHandle bufHandle = nullptr; + uint16_t reservedSize = 0; + bool hasMoreChunks = false; + bool needCloseReadHandler = false; // Reserved size for the MoreChunks boolean flag, which takes up 1 byte for the control tag and 1 byte for the context tag. const uint32_t kReservedSizeForMoreChunksFlag = 1 + 1; @@ -512,11 +513,18 @@ CHIP_ERROR Engine::BuildAndSendSingleReportData(ReadHandler * apReadHandler) VerifyOrExit(apReadHandler != nullptr, err = CHIP_ERROR_INVALID_ARGUMENT); VerifyOrExit(apReadHandler->GetSession() != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + + if (apReadHandler->ShouldUseLargePayloadBuffer()) + { + maxSduSize = chip::app::kMaxLargeSecureSduLengthBytes; + } + + bufHandle = System::PacketBufferHandle::New(maxSduSize); VerifyOrExit(!bufHandle.IsNull(), err = CHIP_ERROR_NO_MEMORY); - if (bufHandle->AvailableDataLength() > kMaxSecureSduLengthBytes) + if (bufHandle->AvailableDataLength() > maxSduSize) { - reservedSize = static_cast(bufHandle->AvailableDataLength() - kMaxSecureSduLengthBytes); + reservedSize = static_cast(bufHandle->AvailableDataLength() - maxSduSize); } reportDataWriter.Init(std::move(bufHandle));