Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ICD] Add default ICD Behavior to readhandler when establishing a subscription #28375

Merged
merged 10 commits into from
Aug 1, 2023
51 changes: 51 additions & 0 deletions src/app/ReadHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,57 @@ CHIP_ERROR ReadHandler::ProcessSubscribeRequest(System::PacketBufferHandle && aP
ReturnErrorOnFailure(subscribeRequestParser.GetMaxIntervalCeilingSeconds(&mMaxInterval));
VerifyOrReturnError(mMinIntervalFloorSeconds <= mMaxInterval, CHIP_ERROR_INVALID_ARGUMENT);

#if CHIP_CONFIG_ENABLE_ICD_SERVER

// Default behavior for ICDs where the wanted MaxInterval for a subscription is the IdleModeInterval
// defined in the ICD Management Cluster.
// Behavior can be changed with the OnSubscriptionRequested function defined in the application callbacks

// Default Behavior Steps :
// If MinInterval > IdleModeInterval, try to set the MaxInterval to the first interval of IdleModeIntervals above the
// MinInterval.
// If the next interval is greater than the MaxIntervalCeiling, use the MaxIntervalCeiling.
// Otherwise, use IdleModeInterval as MaxInterval

// GetPublisherSelectedIntervalLimit() returns the IdleModeInterval if the device is an ICD
uint32_t decidedMaxInterval = GetPublisherSelectedIntervalLimit();

// Check if the PublisherSelectedIntervalLimit is 0. If so, set decidedMaxInterval to MaxIntervalCeiling
if (decidedMaxInterval == 0)
{
decidedMaxInterval = mMaxInterval;
}

// If requestedMinInterval is greater than the IdleTimeInterval, select next active up time as max interval
if (mMinIntervalFloorSeconds > decidedMaxInterval)
{
uint16_t ratio = mMinIntervalFloorSeconds / static_cast<uint16_t>(decidedMaxInterval);
mkardous-silabs marked this conversation as resolved.
Show resolved Hide resolved
if (mMinIntervalFloorSeconds % decidedMaxInterval)
{
ratio++;
}

decidedMaxInterval *= ratio;
}

// Verify that decidedMaxInterval is an acceptable value (overflow)
if (decidedMaxInterval > System::Clock::Seconds16::max().count())
{
decidedMaxInterval = System::Clock::Seconds16::max().count();
}

// Verify that the decidedMaxInterval respects MAX(GetPublisherSelectedIntervalLimit(), MaxIntervalCeiling)
uint16_t maximumMaxInterval = std::max(GetPublisherSelectedIntervalLimit(), mMaxInterval);
if (decidedMaxInterval > maximumMaxInterval)
{
decidedMaxInterval = maximumMaxInterval;
}

// Set max interval of the subscription
mMaxInterval = static_cast<uint16_t>(decidedMaxInterval);
mkardous-silabs marked this conversation as resolved.
Show resolved Hide resolved

#endif // CHIP_CONFIG_ENABLE_ICD_SERVER

//
// Notify the application (if requested) of the impending subscription and check whether we should still proceed to set it up.
// This also provides the application an opportunity to modify the negotiated min/max intervals set above.
Expand Down
4 changes: 2 additions & 2 deletions src/app/icd/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ source_set("manager-srcs") {
"ICDManager.h",
]

deps = [
public_deps = [
":cluster-srcs",
":observer-srcs",
"${chip_root}/src/credentials:credentials",
]
public_deps = [ "${chip_root}/src/credentials:credentials" ]
}

# ICD management cluster source-set is broken out of the main source-set to enable unit tests
Expand Down
7 changes: 5 additions & 2 deletions src/app/tests/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import("//build_overrides/chip.gni")
import("//build_overrides/nlunit_test.gni")

import("${chip_root}/build/chip/chip_test_suite.gni")
import("${chip_root}/src/app/icd/icd.gni")
import("${chip_root}/src/platform/device.gni")

static_library("helpers") {
Expand Down Expand Up @@ -186,7 +187,6 @@ chip_test_suite("tests") {
":time-sync-data-provider-test-srcs",
"${chip_root}/src/app",
"${chip_root}/src/app/common:cluster-objects",
"${chip_root}/src/app/icd:cluster-srcs",
"${chip_root}/src/app/icd:manager-srcs",
"${chip_root}/src/app/tests:helpers",
"${chip_root}/src/app/util/mock:mock_ember",
Expand All @@ -195,7 +195,10 @@ chip_test_suite("tests") {
"${nlunit_test_root}:nlunit-test",
]

if (chip_config_network_layer_ble &&
# Do not run TestCommissionManager when running ICD specific unit tests.
# ICDManager has a dependency on the Accessors.h file which causes a link error
# when building the TestCommissionManager
if (!chip_enable_icd_server && chip_config_network_layer_ble &&
(chip_device_platform == "linux" || chip_device_platform == "darwin")) {
test_sources += [ "TestCommissionManager.cpp" ]
public_deps += [ "${chip_root}/src/app/server" ]
Expand Down
Loading