diff --git a/src/platform/Darwin/BUILD.gn b/src/platform/Darwin/BUILD.gn index 8728178735404d..9dbb8460ae0566 100644 --- a/src/platform/Darwin/BUILD.gn +++ b/src/platform/Darwin/BUILD.gn @@ -76,6 +76,8 @@ static_library("Darwin") { "PosixConfig.h", "SystemPlatformConfig.h", "SystemTimeSupport.cpp", + "UserDefaults.h", + "UserDefaults.mm", ] if (chip_enable_wifi) { diff --git a/src/platform/Darwin/DnssdImpl.cpp b/src/platform/Darwin/DnssdImpl.cpp index 4156c7a4bf0924..b80e5958310e68 100644 --- a/src/platform/Darwin/DnssdImpl.cpp +++ b/src/platform/Darwin/DnssdImpl.cpp @@ -17,6 +17,7 @@ #include "DnssdImpl.h" #include "DnssdType.h" #include "MdnsError.h" +#include "UserDefaults.h" #include @@ -29,6 +30,7 @@ using namespace chip::Dnssd; using namespace chip::Dnssd::Internal; +using namespace chip::Platform; namespace { @@ -76,8 +78,14 @@ void LogOnFailure(const char * name, DNSServiceErrorType err) */ CHIP_ERROR StartSRPTimer(uint16_t timeoutInMSecs, ResolveContext * ctx) { + // Check to see if a user default value exists for the SRP timeout. If it does, override the timeoutInMSecs with user default + // value. To override the timeout value, use ` defaults write org.csa-iot.matter.darwin SRPTimeoutInMSecsOverride + // ` See UserDefaults.mm for details. + timeoutInMSecs = GetUserDefaultDnssdSRPTimeoutInMSecs().value_or(timeoutInMSecs); + VerifyOrReturnValue(ctx != nullptr, CHIP_ERROR_INCORRECT_STATE); - ChipLogProgress(Discovery, "Starting timer to wait for possible SRP resolve results for %s", ctx->instanceName.c_str()); + ChipLogProgress(Discovery, "Starting timer to wait for %d milliseconds for possible SRP resolve results for %s", timeoutInMSecs, + ctx->instanceName.c_str()); return chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Milliseconds16(timeoutInMSecs), ResolveContext::SRPTimerExpiredCallback, static_cast(ctx)); } diff --git a/src/platform/Darwin/DnssdImpl.h b/src/platform/Darwin/DnssdImpl.h index 42ae55fdd9d4c0..3bf78fac6cb2bd 100644 --- a/src/platform/Darwin/DnssdImpl.h +++ b/src/platform/Darwin/DnssdImpl.h @@ -262,8 +262,8 @@ struct ResolveContext : public GenericContext std::shared_ptr consumerCounter; BrowseContext * const browseThatCausedResolve; // Can be null - // Indicates whether the timer for 250 msecs should be started - // to give the resolve on SRP domain some extra time to complete. + // Indicates whether the timer should be started to give the resolve + // on SRP domain some extra time to complete. bool shouldStartSRPTimerForResolve = false; bool isSRPTimerRunning = false; diff --git a/src/platform/Darwin/UserDefaults.h b/src/platform/Darwin/UserDefaults.h new file mode 100644 index 00000000000000..5df5d2064256b9 --- /dev/null +++ b/src/platform/Darwin/UserDefaults.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +namespace chip { +namespace Platform { + +std::optional GetUserDefaultDnssdSRPTimeoutInMSecs(); + +} // namespace Platform +} // namespace chip diff --git a/src/platform/Darwin/UserDefaults.mm b/src/platform/Darwin/UserDefaults.mm new file mode 100644 index 00000000000000..d24b0a4ee20f37 --- /dev/null +++ b/src/platform/Darwin/UserDefaults.mm @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "UserDefaults.h" +#include +#include + +#import + +static NSString * const kUserDefaultDomain = @"org.csa-iot.matter.darwin"; +static NSString * const kSRPTimeoutInMsecsUserDefaultKey = @"SRPTimeoutInMSecsOverride"; + +namespace chip { +namespace Platform { + + std::optional GetUserDefaultDnssdSRPTimeoutInMSecs() + { + NSUserDefaults * defaults = [[NSUserDefaults alloc] initWithSuiteName:kUserDefaultDomain]; + NSInteger srpTimeoutValue = [defaults integerForKey:kSRPTimeoutInMsecsUserDefaultKey]; + if (CanCastTo(srpTimeoutValue)) { + uint16_t timeoutinMsecs = static_cast(srpTimeoutValue); + ChipLogProgress(Discovery, "Got a user default value for Dnssd SRP timeout - %d msecs", timeoutinMsecs); + return std::make_optional(timeoutinMsecs); + } + return std::nullopt; + } + +} // namespace Platform +} // namespace chip