Skip to content

Commit d96d8a3

Browse files
Add IM event path filter (project-chip#7110)
Summary of Changes: -- Pass the particular interested event Path to EventManagement, and fetch events based upon those path. -- Update unit test to filter the interested path with multiple clusters, and calculate the number of filtered event, and compare with the expected event number.
1 parent e86bb35 commit d96d8a3

9 files changed

+103
-46
lines changed

src/CMakeLists.txt

Whitespace-only changes.

src/app/EventLoggingTypes.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#pragma once
1919

20+
#include <app/ClusterInfo.h>
2021
#include <app/util/basic-types.h>
2122
#include <core/CHIPCore.h>
2223
#include <core/CHIPTLV.h>
@@ -168,10 +169,12 @@ struct EventLoadOutContext
168169
TLV::TLVWriter & mWriter;
169170
PriorityLevel mPriority = PriorityLevel::Invalid;
170171
EventNumber mStartingEventNumber = 0;
172+
Timestamp mPreviousSystemTime;
171173
Timestamp mCurrentSystemTime;
172174
EventNumber mCurrentEventNumber = 0;
173175
Timestamp mCurrentUTCTime;
174-
bool mFirst = true;
176+
ClusterInfo * mpInterestedEventPaths = nullptr;
177+
bool mFirst = true;
175178
};
176179
} // namespace app
177180
} // namespace chip

src/app/EventManagement.cpp

+51-13
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ struct EventEnvelopeContext
9292
Timestamp mDeltaSystemTime = Timestamp::System(0);
9393
Timestamp mDeltaUtc = Timestamp::UTC(0);
9494
PriorityLevel mPriority = PriorityLevel::First;
95+
NodeId mNodeId = 0;
96+
ClusterId mClusterId = 0;
97+
EndpointId mEndpointId = 0;
98+
EventId mEventId = 0;
9599
};
96100

97101
EventManagement::EventManagement(Messaging::ExchangeManager * apExchangeMgr, int aNumBuffers,
@@ -433,7 +437,8 @@ CHIP_ERROR EventManagement::CopyAndAdjustDeltaTime(const TLVReader & aReader, si
433437
}
434438
else
435439
{
436-
err = ctx->mpWriter->CopyElement(reader);
440+
err = ctx->mpWriter->Put(TLV::ContextTag(EventDataElement::kCsTag_DeltaSystemTimestamp),
441+
ctx->mpContext->mCurrentSystemTime.mValue - ctx->mpContext->mPreviousSystemTime.mValue);
437442
}
438443
}
439444
else
@@ -595,6 +600,25 @@ CHIP_ERROR EventManagement::CopyEvent(const TLVReader & aReader, TLVWriter & aWr
595600
return err;
596601
}
597602

603+
static bool IsInterestedEventPaths(EventLoadOutContext * eventLoadOutContext, const EventEnvelopeContext & event)
604+
{
605+
ClusterInfo * interestedEventPaths = eventLoadOutContext->mpInterestedEventPaths;
606+
if (eventLoadOutContext->mCurrentEventNumber < eventLoadOutContext->mStartingEventNumber)
607+
{
608+
return false;
609+
}
610+
while (interestedEventPaths != nullptr)
611+
{
612+
if (interestedEventPaths->mNodeId == event.mNodeId && interestedEventPaths->mEndpointId == event.mEndpointId &&
613+
interestedEventPaths->mClusterId == event.mClusterId && interestedEventPaths->mEventId == event.mEventId)
614+
{
615+
return true;
616+
}
617+
interestedEventPaths = interestedEventPaths->mpNext;
618+
}
619+
return false;
620+
}
621+
598622
CHIP_ERROR EventManagement::EventIterator(const TLVReader & aReader, size_t aDepth, EventLoadOutContext * apEventLoadOutContext)
599623
{
600624
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -603,28 +627,30 @@ CHIP_ERROR EventManagement::EventIterator(const TLVReader & aReader, size_t aDep
603627
EventEnvelopeContext event;
604628

605629
innerReader.Init(aReader);
606-
err = innerReader.EnterContainer(tlvType);
607-
SuccessOrExit(err);
630+
ReturnErrorOnFailure(innerReader.EnterContainer(tlvType));
608631

609632
err = TLV::Utilities::Iterate(innerReader, FetchEventParameters, &event, false /*recurse*/);
610-
VerifyOrExit(event.mFieldsToRead == kRequiredEventField, err = CHIP_NO_ERROR);
633+
if (event.mFieldsToRead != kRequiredEventField)
634+
{
635+
return CHIP_ERROR_INVALID_ARGUMENT;
636+
}
611637

612638
if (err == CHIP_END_OF_TLV)
613639
{
614640
err = CHIP_NO_ERROR;
615641
}
616-
SuccessOrExit(err);
642+
ReturnErrorOnFailure(err);
617643

618644
if (event.mPriority == apEventLoadOutContext->mPriority)
619645
{
620646
apEventLoadOutContext->mCurrentSystemTime.mValue += event.mDeltaSystemTime.mValue;
621-
VerifyOrExit(apEventLoadOutContext->mCurrentEventNumber < apEventLoadOutContext->mStartingEventNumber,
622-
err = CHIP_EVENT_ID_FOUND);
623-
apEventLoadOutContext->mCurrentEventNumber++;
647+
if (IsInterestedEventPaths(apEventLoadOutContext, event))
648+
{
649+
return CHIP_EVENT_ID_FOUND;
650+
}
624651
}
625652

626-
exit:
627-
return err;
653+
return CHIP_NO_ERROR;
628654
}
629655

630656
CHIP_ERROR EventManagement::CopyEventsSince(const TLVReader & aReader, size_t aDepth, void * apContext)
@@ -633,6 +659,7 @@ CHIP_ERROR EventManagement::CopyEventsSince(const TLVReader & aReader, size_t aD
633659
TLV::TLVWriter checkpoint;
634660
EventLoadOutContext * loadOutContext = static_cast<EventLoadOutContext *>(apContext);
635661
err = EventIterator(aReader, aDepth, loadOutContext);
662+
loadOutContext->mCurrentEventNumber++;
636663
if (err == CHIP_EVENT_ID_FOUND)
637664
{
638665
// checkpoint the writer
@@ -646,9 +673,8 @@ CHIP_ERROR EventManagement::CopyEventsSince(const TLVReader & aReader, size_t aD
646673
// before we began the copy operation.
647674
VerifyOrExit((err == CHIP_NO_ERROR) || (err == CHIP_END_OF_TLV), loadOutContext->mWriter = checkpoint);
648675

649-
loadOutContext->mCurrentSystemTime.mValue = 0;
650-
loadOutContext->mFirst = false;
651-
loadOutContext->mCurrentEventNumber++;
676+
loadOutContext->mPreviousSystemTime.mValue = loadOutContext->mCurrentSystemTime.mValue;
677+
loadOutContext->mFirst = false;
652678
}
653679

654680
exit:
@@ -673,6 +699,7 @@ CHIP_ERROR EventManagement::FetchEventsSince(TLVWriter & aWriter, ClusterInfo *
673699
buf = buf->GetNextCircularEventBuffer();
674700
}
675701

702+
context.mpInterestedEventPaths = apClusterInfolist;
676703
context.mCurrentSystemTime.mValue = buf->GetFirstEventSystemTimestamp();
677704
context.mCurrentEventNumber = buf->GetFirstEventNumber();
678705
err = GetEventReader(reader, aPriority, &bufWrapper);
@@ -712,6 +739,17 @@ CHIP_ERROR EventManagement::FetchEventParameters(const TLVReader & aReader, size
712739
uint16_t extPriority; // Note: the type here matches the type case in EventManagement::LogEvent, priority section
713740
reader.Init(aReader);
714741

742+
if (reader.GetTag() == TLV::ContextTag(EventDataElement::kCsTag_EventPath))
743+
{
744+
EventPath::Parser path;
745+
SuccessOrExit(err = path.Init(aReader));
746+
SuccessOrExit(err = path.GetNodeId(&(envelope->mNodeId)));
747+
SuccessOrExit(err = path.GetEndpointId(&(envelope->mEndpointId)));
748+
SuccessOrExit(err = path.GetClusterId(&(envelope->mClusterId)));
749+
SuccessOrExit(err = path.GetEventId(&(envelope->mEventId)));
750+
envelope->mFieldsToRead |= 1 << EventDataElement::kCsTag_EventPath;
751+
}
752+
715753
if (reader.GetTag() == TLV::ContextTag(EventDataElement::kCsTag_PriorityLevel))
716754
{
717755
err = reader.Get(extPriority);

src/app/EventManagement.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939

4040
namespace chip {
4141
namespace app {
42-
constexpr size_t kMaxEventSizeReserve = 512;
43-
constexpr uint16_t kRequiredEventField =
44-
(1 << EventDataElement::kCsTag_PriorityLevel) | (1 << EventDataElement::kCsTag_DeltaSystemTimestamp);
42+
constexpr size_t kMaxEventSizeReserve = 512;
43+
constexpr uint16_t kRequiredEventField = (1 << EventDataElement::kCsTag_PriorityLevel) |
44+
(1 << EventDataElement::kCsTag_DeltaSystemTimestamp) | (1 << EventDataElement::kCsTag_EventPath);
4545

4646
/**
4747
* @brief

src/app/InteractionModelEngine.h

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ namespace app {
6161
constexpr size_t kMaxSecureSduLengthBytes = 1024;
6262
constexpr uint32_t kImMessageTimeoutMsec = 6000;
6363
constexpr FieldId kRootFieldId = 0;
64+
6465
/**
6566
* @class InteractionModelEngine
6667
*

src/app/tests/TestEventLogging.cpp

+39-26
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848

4949
namespace {
5050

51-
static const chip::NodeId kTestDeviceNodeId = 0x18B4300000000001ULL;
51+
static const chip::NodeId kTestDeviceNodeId1 = 0x18B4300000000001ULL;
52+
static const chip::NodeId kTestDeviceNodeId2 = 0x18B4300000000002ULL;
5253
static const chip::ClusterId kLivenessClusterId = 0x00000022;
5354
static const uint32_t kLivenessChangeEvent = 1;
5455
static const chip::EndpointId kTestEndpointId = 2;
@@ -71,7 +72,7 @@ void InitializeChip(nlTestSuite * apSuite)
7172
CHIP_ERROR err = CHIP_NO_ERROR;
7273
chip::Optional<chip::Transport::PeerAddress> peer(chip::Transport::Type::kUndefined);
7374
chip::Transport::AdminPairingTable admins;
74-
chip::Transport::AdminPairingInfo * adminInfo = admins.AssignAdminId(gAdminId, kTestDeviceNodeId);
75+
chip::Transport::AdminPairingInfo * adminInfo = admins.AssignAdminId(gAdminId, kTestDeviceNodeId1);
7576

7677
NL_TEST_ASSERT(apSuite, adminInfo != nullptr);
7778

@@ -80,7 +81,7 @@ void InitializeChip(nlTestSuite * apSuite)
8081

8182
gSystemLayer.Init(nullptr);
8283

83-
err = gSessionManager.Init(chip::kTestDeviceNodeId, &gSystemLayer, &gTransportManager, &admins, &gMessageCounterManager);
84+
err = gSessionManager.Init(kTestDeviceNodeId1, &gSystemLayer, &gTransportManager, &admins, &gMessageCounterManager);
8485
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
8586

8687
err = gExchangeManager.Init(&gSessionManager);
@@ -143,25 +144,22 @@ static void CheckLogState(nlTestSuite * apSuite, chip::app::EventManagement & aL
143144
}
144145

145146
static void CheckLogReadOut(nlTestSuite * apSuite, chip::app::EventManagement & alogMgmt, chip::app::PriorityLevel priority,
146-
chip::EventNumber startingEventNumber, size_t expectedNumEvents)
147+
chip::EventNumber startingEventNumber, size_t expectedNumEvents, chip::app::ClusterInfo * clusterInfo)
147148
{
148149
CHIP_ERROR err;
149150
chip::TLV::TLVReader reader;
150151
chip::TLV::TLVWriter writer;
151152
uint8_t backingStore[1024];
152153
size_t elementCount;
153154
writer.Init(backingStore, 1024);
154-
chip::app::ClusterInfo testClusterInfo;
155-
testClusterInfo.mEventId = 1;
156-
err = alogMgmt.FetchEventsSince(writer, &testClusterInfo, priority, startingEventNumber);
155+
err = alogMgmt.FetchEventsSince(writer, clusterInfo, priority, startingEventNumber);
157156
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR || err == CHIP_END_OF_TLV);
158157

159158
reader.Init(backingStore, writer.GetLengthWritten());
160159

161160
err = chip::TLV::Utilities::Count(reader, elementCount, false);
162161
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
163162
NL_TEST_ASSERT(apSuite, elementCount == expectedNumEvents);
164-
165163
reader.Init(backingStore, writer.GetLengthWritten());
166164
chip::TLV::Debug::Dump(reader, SimpleDumpWriter);
167165
}
@@ -186,39 +184,42 @@ static void CheckLogEventWithEvictToNextBuffer(nlTestSuite * apSuite, void * apC
186184
{
187185
CHIP_ERROR err = CHIP_NO_ERROR;
188186
chip::EventNumber eid1, eid2, eid3, eid4, eid5, eid6;
189-
chip::app::EventSchema schema = { kTestDeviceNodeId, kTestEndpointId, kLivenessClusterId, kLivenessChangeEvent,
190-
chip::app::PriorityLevel::Info };
191-
chip::app::EventOptions options;
187+
chip::app::EventSchema schema1 = { kTestDeviceNodeId1, kTestEndpointId, kLivenessClusterId, kLivenessChangeEvent,
188+
chip::app::PriorityLevel::Info };
189+
chip::app::EventSchema schema2 = { kTestDeviceNodeId2, kTestEndpointId, kLivenessClusterId, kLivenessChangeEvent,
190+
chip::app::PriorityLevel::Info };
191+
chip::app::EventOptions options1;
192+
chip::app::EventOptions options2;
192193
TestEventGenerator testEventGenerator;
193194

194-
options.mpEventSchema = &schema;
195-
195+
options1.mpEventSchema = &schema1;
196+
options2.mpEventSchema = &schema2;
196197
chip::app::EventManagement & logMgmt = chip::app::EventManagement::GetInstance();
197198
testEventGenerator.SetStatus(0);
198-
err = logMgmt.LogEvent(&testEventGenerator, options, eid1);
199+
err = logMgmt.LogEvent(&testEventGenerator, options1, eid1);
199200
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
200201
CheckLogState(apSuite, logMgmt, 1, chip::app::PriorityLevel::Debug);
201202
testEventGenerator.SetStatus(1);
202-
err = logMgmt.LogEvent(&testEventGenerator, options, eid2);
203+
err = logMgmt.LogEvent(&testEventGenerator, options1, eid2);
203204
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
204205
CheckLogState(apSuite, logMgmt, 2, chip::app::PriorityLevel::Debug);
205206
testEventGenerator.SetStatus(0);
206-
err = logMgmt.LogEvent(&testEventGenerator, options, eid3);
207+
err = logMgmt.LogEvent(&testEventGenerator, options1, eid3);
207208
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
208209
CheckLogState(apSuite, logMgmt, 3, chip::app::PriorityLevel::Debug);
209210
// Start to copy info event to next buffer since current debug buffer is full and info event is higher priority
210211
testEventGenerator.SetStatus(1);
211-
err = logMgmt.LogEvent(&testEventGenerator, options, eid4);
212+
err = logMgmt.LogEvent(&testEventGenerator, options2, eid4);
212213
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
213214
CheckLogState(apSuite, logMgmt, 4, chip::app::PriorityLevel::Info);
214215

215216
testEventGenerator.SetStatus(0);
216-
err = logMgmt.LogEvent(&testEventGenerator, options, eid5);
217+
err = logMgmt.LogEvent(&testEventGenerator, options2, eid5);
217218
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
218219
CheckLogState(apSuite, logMgmt, 5, chip::app::PriorityLevel::Info);
219220

220221
testEventGenerator.SetStatus(1);
221-
err = logMgmt.LogEvent(&testEventGenerator, options, eid6);
222+
err = logMgmt.LogEvent(&testEventGenerator, options2, eid6);
222223
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
223224
CheckLogState(apSuite, logMgmt, 6, chip::app::PriorityLevel::Info);
224225

@@ -229,19 +230,31 @@ static void CheckLogEventWithEvictToNextBuffer(nlTestSuite * apSuite, void * apC
229230
NL_TEST_ASSERT(apSuite, (eid3 + 1) == eid4);
230231
NL_TEST_ASSERT(apSuite, (eid4 + 1) == eid5);
231232
NL_TEST_ASSERT(apSuite, (eid5 + 1) == eid6);
232-
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid1, 6);
233-
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid2, 5);
234-
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid3, 4);
235-
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid4, 3);
236-
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid5, 2);
237-
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid6, 1);
233+
234+
chip::app::ClusterInfo testClusterInfo1;
235+
testClusterInfo1.mNodeId = kTestDeviceNodeId1;
236+
testClusterInfo1.mEndpointId = kTestEndpointId;
237+
testClusterInfo1.mClusterId = kLivenessClusterId;
238+
testClusterInfo1.mEventId = kLivenessChangeEvent;
239+
chip::app::ClusterInfo testClusterInfo2;
240+
testClusterInfo2.mNodeId = kTestDeviceNodeId2;
241+
testClusterInfo2.mEndpointId = kTestEndpointId;
242+
testClusterInfo2.mClusterId = kLivenessClusterId;
243+
testClusterInfo2.mEventId = kLivenessChangeEvent;
244+
245+
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid1, 3, &testClusterInfo1);
246+
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid2, 2, &testClusterInfo1);
247+
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid3, 1, &testClusterInfo1);
248+
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid4, 3, &testClusterInfo2);
249+
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid5, 2, &testClusterInfo2);
250+
CheckLogReadOut(apSuite, logMgmt, chip::app::PriorityLevel::Info, eid6, 1, &testClusterInfo2);
238251
}
239252

240253
static void CheckLogEventWithDiscardLowEvent(nlTestSuite * apSuite, void * apContext)
241254
{
242255
CHIP_ERROR err = CHIP_NO_ERROR;
243256
chip::EventNumber eid1, eid2, eid3, eid4, eid5, eid6;
244-
chip::app::EventSchema schema = { kTestDeviceNodeId, kTestEndpointId, kLivenessClusterId, kLivenessChangeEvent,
257+
chip::app::EventSchema schema = { kTestDeviceNodeId1, kTestEndpointId, kLivenessClusterId, kLivenessChangeEvent,
245258
chip::app::PriorityLevel::Debug };
246259
chip::app::EventOptions options;
247260
TestEventGenerator testEventGenerator;

src/app/tests/TestReportingEngine.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ CHIP_ERROR ReadSingleClusterData(AttributePathParams & aAttributePathParams, TLV
6464
VerifyOrExit(aAttributePathParams.mClusterId == kTestClusterId && aAttributePathParams.mEndpointId == kTestEndpointId,
6565
err = CHIP_ERROR_INVALID_ARGUMENT);
6666

67-
if (aAttributePathParams.mFieldId == kRootFieldId || aAttributePathParams.mFieldId == kTestFieldId1)
67+
if (aAttributePathParams.mFieldId == kTestFieldId1)
6868
{
6969
err = aWriter.Put(TLV::ContextTag(kTestFieldId1), kTestFieldValue1);
7070
SuccessOrExit(err);
7171
}
72-
if (aAttributePathParams.mFieldId == kRootFieldId || aAttributePathParams.mFieldId == kTestFieldId2)
72+
if (aAttributePathParams.mFieldId == kTestFieldId2)
7373
{
7474
err = aWriter.Put(TLV::ContextTag(kTestFieldId2), kTestFieldValue2);
7575
SuccessOrExit(err);

src/app/tests/integration/chip_im_initiator.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ CHIP_ERROR SendReadRequest(void)
178178
{
179179
CHIP_ERROR err = CHIP_NO_ERROR;
180180
chip::EventNumber number = 0;
181-
chip::app::EventPathParams eventPathParams(chip::kTestDeviceNodeId, kTestEndpointId, kTestClusterId, kLivenessChangeEvent,
181+
chip::app::EventPathParams eventPathParams(kTestNodeId, kTestEndpointId, kTestClusterId, kLivenessChangeEvent,
182182
false /*not urgent*/);
183183

184184
chip::app::AttributePathParams attributePathParams(chip::kTestDeviceNodeId, kTestEndpointId, kTestClusterId, 1, 0,

src/app/tests/integration/common.h

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
extern chip::Messaging::ExchangeManager gExchangeManager;
3434

35+
constexpr chip::NodeId kTestNodeId = 0x1ULL;
36+
constexpr chip::NodeId kTestNodeId1 = 0x2ULL;
3537
constexpr chip::ClusterId kTestClusterId = 6;
3638
constexpr chip::CommandId kTestCommandId = 40;
3739
constexpr chip::EndpointId kTestEndpointId = 1;

0 commit comments

Comments
 (0)