Skip to content

Commit 9f27eb3

Browse files
WIP
1 parent bdb88bd commit 9f27eb3

File tree

8 files changed

+130
-19
lines changed

8 files changed

+130
-19
lines changed

src/app/BUILD.gn

+4
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ source_set("constants") {
144144
]
145145
}
146146

147+
source_set("test-event-trigger") {
148+
sources = [ "TestEventTriggerDelegate.h" ]
149+
}
150+
147151
# interaction-model is a static-library because it currently requires global functions (app/util/...) that are stubbed in different test files that depend on the app static_library
148152
# which in tern depens on the interaction-model.
149153
# Using source_set prevents the unit test to build correctly.

src/app/icd/server/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ source_set("manager") {
7676
":notifier",
7777
":observer",
7878
"${chip_root}/src/app:subscription-manager",
79+
"${chip_root}/src/app:test-event-trigger",
7980
"${chip_root}/src/credentials:credentials",
8081
"${chip_root}/src/messaging",
8182
]

src/app/icd/server/ICDManager.cpp

+28-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ static_assert(UINT8_MAX >= CHIP_CONFIG_MAX_EXCHANGE_CONTEXTS,
4242
"ICDManager::mOpenExchangeContextCount cannot hold count for the max exchange count");
4343

4444
void ICDManager::Init(PersistentStorageDelegate * storage, FabricTable * fabricTable, Crypto::SymmetricKeystore * symmetricKeystore,
45-
Messaging::ExchangeManager * exchangeManager, SubscriptionsInfoProvider * subInfoProvider)
45+
Messaging::ExchangeManager * exchangeManager, SubscriptionsInfoProvider * subInfoProvider,
46+
TestEventTriggerDelegate * testEventTriggerDelegate)
4647
{
4748
#if CHIP_CONFIG_ENABLE_ICD_CIP
4849
VerifyOrDie(storage != nullptr);
@@ -52,6 +53,9 @@ void ICDManager::Init(PersistentStorageDelegate * storage, FabricTable * fabricT
5253
VerifyOrDie(subInfoProvider != nullptr);
5354
#endif // CHIP_CONFIG_ENABLE_ICD_CIP
5455

56+
VerifyOrDie(testEventTriggerDelegate);
57+
testEventTriggerDelegate->AddHandler(this);
58+
5559
#if CHIP_CONFIG_ENABLE_ICD_LIT
5660
// LIT ICD Verification Checks
5761
if (SupportsFeature(Feature::kLongIdleTimeSupport))
@@ -87,8 +91,11 @@ void ICDManager::Init(PersistentStorageDelegate * storage, FabricTable * fabricT
8791
UpdateOperationState(OperationalState::IdleMode);
8892
}
8993

90-
void ICDManager::Shutdown()
94+
void ICDManager::Shutdown(TestEventTriggerDelegate * testEventTriggerDelegate)
9195
{
96+
VerifyOrDie(testEventTriggerDelegate);
97+
testEventTriggerDelegate->RemoveHandler(this);
98+
9299
ICDNotifier::GetInstance().Unsubscribe(this);
93100

94101
// cancel any running timer of the icd
@@ -554,6 +561,25 @@ void ICDManager::ExtendActiveMode(Milliseconds16 extendDuration)
554561
}
555562
}
556563

564+
CHIP_ERROR ICDManager::HandleEventTrigger(uint64_t eventTrigger)
565+
{
566+
ICDTestEventTriggerEvent trigger = static_cast<ICDTestEventTriggerEvent>(eventTrigger);
567+
CHIP_ERROR err = CHIP_NO_ERROR;
568+
569+
switch (trigger)
570+
{
571+
case ICDTestEventTriggerEvent::kDoubleICDCounterValue:
572+
break;
573+
case ICDTestEventTriggerEvent::kInvalidateICDCounter:
574+
break;
575+
default:
576+
err = CHIP_ERROR_INVALID_ARGUMENT;
577+
break;
578+
}
579+
580+
return err;
581+
}
582+
557583
ICDManager::ObserverPointer * ICDManager::RegisterObserver(ICDStateObserver * observer)
558584
{
559585
return mStateObserverPool.CreateObject(observer);

src/app/icd/server/ICDManager.h

+34-14
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,11 @@
1616
*/
1717
#pragma once
1818

19-
#include <app-common/zap-generated/cluster-enums.h>
20-
2119
#include <app/icd/server/ICDServerConfig.h>
2220

23-
#if CHIP_CONFIG_ENABLE_ICD_CIP
24-
#include <app/icd/server/ICDCheckInSender.h> // nogncheck
25-
#include <app/icd/server/ICDMonitoringTable.h> // nogncheck
26-
#endif // CHIP_CONFIG_ENABLE_ICD_CIP
27-
21+
#include <app-common/zap-generated/cluster-enums.h>
2822
#include <app/SubscriptionsInfoProvider.h>
23+
#include <app/TestEventTriggerDelegate.h>
2924
#include <app/icd/server/ICDConfigurationData.h>
3025
#include <app/icd/server/ICDNotifier.h>
3126
#include <app/icd/server/ICDStateObserver.h>
@@ -37,6 +32,11 @@
3732
#include <platform/internal/CHIPDeviceLayerInternal.h>
3833
#include <system/SystemClock.h>
3934

35+
#if CHIP_CONFIG_ENABLE_ICD_CIP
36+
#include <app/icd/server/ICDCheckInSender.h> // nogncheck
37+
#include <app/icd/server/ICDMonitoringTable.h> // nogncheck
38+
#endif // CHIP_CONFIG_ENABLE_ICD_CIP
39+
4040
namespace chip {
4141
namespace Crypto {
4242
using SymmetricKeystore = SessionKeystore;
@@ -53,7 +53,7 @@ class TestICDManager;
5353
/**
5454
* @brief ICD Manager is responsible of processing the events and triggering the correct action for an ICD
5555
*/
56-
class ICDManager : public ICDListener
56+
class ICDManager : public ICDListener, public TestEventTriggerHandler
5757
{
5858
public:
5959
// This structure is used for the creation an ObjectPool of ICDStateObserver pointers
@@ -81,8 +81,9 @@ class ICDManager : public ICDListener
8181

8282
ICDManager() {}
8383
void Init(PersistentStorageDelegate * storage, FabricTable * fabricTable, Crypto::SymmetricKeystore * symmetricKeyStore,
84-
Messaging::ExchangeManager * exchangeManager, SubscriptionsInfoProvider * manager);
85-
void Shutdown();
84+
Messaging::ExchangeManager * exchangeManager, SubscriptionsInfoProvider * manager,
85+
TestEventTriggerDelegate * testEventTriggerDelegate);
86+
void Shutdown(TestEventTriggerDelegate * testEventTriggerDelegate);
8687
void UpdateICDMode();
8788
void UpdateOperationState(OperationalState state);
8889
void SetKeepActiveModeRequirements(KeepActiveFlags flag, bool state);
@@ -117,6 +118,15 @@ class ICDManager : public ICDListener
117118
*/
118119
uint32_t StayActiveRequest(uint32_t stayActiveDuration);
119120

121+
/**
122+
* @brief TestEventTriggerHandler for the ICD feature set
123+
*
124+
* @param eventTrigger Event trigger to handle.
125+
* @return CHIP_ERROR CHIP_NO_ERROR - No erros during the processing
126+
* CHIP_ERROR_INVALID_ARGUMENT - eventTrigger isn't a valid value
127+
*/
128+
CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override;
129+
120130
#if CHIP_CONFIG_ENABLE_ICD_CIP
121131
void SendCheckInMsgs();
122132

@@ -139,14 +149,14 @@ class ICDManager : public ICDListener
139149
void OnSubscriptionReport() override;
140150

141151
protected:
152+
friend class TestICDManager;
153+
142154
/**
143155
* @brief Hepler function that extends the Active Mode duration as well as the Active Mode Jitter timer for the transition to
144156
* iddle mode.
145157
*/
146158
void ExtendActiveMode(System::Clock::Milliseconds16 extendDuration);
147159

148-
friend class TestICDManager;
149-
150160
static void OnIdleModeDone(System::Layer * aLayer, void * appState);
151161
static void OnActiveModeDone(System::Layer * aLayer, void * appState);
152162

@@ -165,13 +175,23 @@ class ICDManager : public ICDListener
165175
uint8_t mOpenExchangeContextCount = 0;
166176

167177
private:
178+
enum class ICDTestEventTriggerEvent : uint64_t
179+
{
180+
kForceToActiveMode = 0x0046'0000'00000001,
181+
kForceToIdleMode = 0x0046'0000'00000002,
182+
kAddActiveModeReq = 0x0046'0000'00000003,
183+
kRemoveActiveModeReq = 0x0046'0000'00000004,
184+
kDoubleICDCounterValue = 0x0046'0000'00000005,
185+
kInvalidateICDCounter = 0x0046'0000'00000006,
186+
};
187+
168188
#if CHIP_CONFIG_ENABLE_ICD_CIP
169189
/**
170190
* @brief Function checks if at least one client registration would require a Check-In message
171191
*
172192
* @return true At least one registration would require an Check-In message if we were entering ActiveMode.
173-
* @return false None of the registration would require a Check-In message either because there are no registration or because
174-
* they all have associated subscriptions.
193+
* @return false None of the registration would require a Check-In message either because there are no registration or
194+
* because they all have associated subscriptions.
175195
*/
176196
bool CheckInMessagesWouldBeSent();
177197
#endif // CHIP_CONFIG_ENABLE_ICD_CIP

src/app/server/Server.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ CHIP_ERROR Server::Init(const ServerInitParams & initParams)
342342
mICDManager.RegisterObserver(&app::DnssdServer::Instance());
343343

344344
mICDManager.Init(mDeviceStorage, &GetFabricTable(), mSessionKeystore, &mExchangeMgr,
345-
chip::app::InteractionModelEngine::GetInstance());
345+
chip::app::InteractionModelEngine::GetInstance(), mTestEventTriggerDelegate);
346346
#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
347347

348348
// This code is necessary to restart listening to existing groups after a reboot
@@ -569,7 +569,7 @@ void Server::Shutdown()
569569
Access::ResetAccessControlToDefault();
570570
Credentials::SetGroupDataProvider(nullptr);
571571
#if CHIP_CONFIG_ENABLE_ICD_SERVER
572-
mICDManager.Shutdown();
572+
mICDManager.Shutdown(mTestEventTriggerDelegate);
573573
#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
574574
mAttributePersister.Shutdown();
575575
// TODO(16969): Remove chip::Platform::MemoryInit() call from Server class, it belongs to outer code

src/protocols/secure_channel/BUILD.gn

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import("//build_overrides/chip.gni")
22

33
source_set("check-in-counter") {
4-
sources = [ "CheckInCounter.h" ]
4+
sources = [
5+
"CheckInCounter.cpp",
6+
"CheckInCounter.h",
7+
]
58

69
deps = [
710
"${chip_root}/src/crypto",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2024 Project CHIP Authors
3+
* All rights reserved.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
/**
19+
* @brief The file implements the Matter Check-In counter
20+
*
21+
*/
22+
23+
#include <protocols/secure_channel/CheckInCounter.h>
24+
25+
namespace chip {
26+
namespace Protocols {
27+
namespace SecureChannel {
28+
29+
CHIP_ERROR CheckInCounter::DoubleCheckInCounterValues()
30+
{
31+
return CHIP_NO_ERROR;
32+
}
33+
34+
CHIP_ERROR CheckInCounter::InvalidateAllCheckInCounterValues()
35+
{
36+
return CHIP_NO_ERROR;
37+
}
38+
39+
} // namespace SecureChannel
40+
} // namespace Protocols
41+
} // namespace chip

src/protocols/secure_channel/CheckInCounter.h

+16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#pragma once
2323

2424
#include <crypto/RandUtils.h>
25+
#include <lib/core/CHIPError.h>
2526
#include <lib/support/PersistedCounter.h>
2627

2728
namespace chip {
@@ -45,6 +46,21 @@ class CheckInCounter : public PersistedCounter<uint32_t>
4546
*/
4647
inline uint32_t GetNextCheckInCounterValue() { return (mCounterValue + 1); };
4748

49+
/**
50+
* @brief Doubles the current Check-In counter value to invalidate at least half of the valid values
51+
*
52+
* @return CHIP_ERROR
53+
*/
54+
CHIP_ERROR DoubleCheckInCounterValues();
55+
56+
/**
57+
* @brief Invalidates all the Check-In counter values. After function call, new Check-In couter value will be equal to current -
58+
* 1 (with rollovers)
59+
*
60+
* @return CHIP_ERROR
61+
*/
62+
CHIP_ERROR InvalidateAllCheckInCounterValues();
63+
4864
private:
4965
/**
5066
* @brief Get the Initial Counter Value for the Check-In counter

0 commit comments

Comments
 (0)