Skip to content

Commit 4728323

Browse files
chrisdecenzopull[bot]
authored andcommitted
Address DNS-SD issues (#16625)
* fix PH, allow for longer extended discovery timeout * ci fix * address comments * fix v6-only tv-app casting * fix CI
1 parent 649eec0 commit 4728323

File tree

5 files changed

+47
-17
lines changed

5 files changed

+47
-17
lines changed

examples/tv-app/tv-common/include/CHIPProjectAppConfig.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,27 @@
3333
// TVs need to be both commissioners and commissionees
3434
#define CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE 1
3535

36+
// TVs that are not commissionees,
37+
// or that don't automatically enter commissioning mode should set this to 0
38+
#define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART 1
39+
3640
// TVs do not typically need this - enable for debugging
3741
// #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT 1
3842

43+
// Enable extended discovery, set timeout to 24 hours
3944
#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1
45+
#define CHIP_DEVICE_CONFIG_EXTENDED_DISCOVERY_TIMEOUT_SECS (24 * 60 * 60)
4046

47+
// Advertise TV device type in DNS-SD
4148
#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE 1
4249

4350
#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 35 // 0x0023 = 35 = Video Player
4451

52+
// Include device name in discovery for casting use case
4553
#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_NAME 1
46-
4754
#define CHIP_DEVICE_CONFIG_DEVICE_NAME "Test TV"
4855

56+
// Enable app platform
4957
#define CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED 1
5058

5159
// overrides CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT in CHIPProjectConfig

src/app/server/Dnssd.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,15 @@ bool DnssdServer::HaveOperationalCredentials()
8484

8585
#if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
8686

87-
void DnssdServer::SetExtendedDiscoveryTimeoutSecs(int16_t secs)
87+
void DnssdServer::SetExtendedDiscoveryTimeoutSecs(int32_t secs)
8888
{
89-
ChipLogDetail(Discovery, "Setting extended discovery timeout to %" PRId16 "s", secs);
89+
ChipLogDetail(Discovery, "Setting extended discovery timeout to %" PRId32 "s", secs);
9090
chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Put(DefaultStorageKeyAllocator::DNSExtendedDiscoveryTimeout(), secs);
9191
}
9292

93-
int16_t DnssdServer::GetExtendedDiscoveryTimeoutSecs()
93+
int32_t DnssdServer::GetExtendedDiscoveryTimeoutSecs()
9494
{
95-
int16_t secs;
95+
int32_t secs;
9696
CHIP_ERROR err = chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Get(
9797
DefaultStorageKeyAllocator::DNSExtendedDiscoveryTimeout(), &secs);
9898

@@ -199,7 +199,7 @@ void DnssdServer::OnDiscoveryExpiration(System::Layer * aSystemLayer, void * aAp
199199
ChipLogDetail(Discovery, "OnDiscoveryExpiration callback for valid session");
200200

201201
#if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
202-
int16_t extTimeout = GetExtendedDiscoveryTimeoutSecs();
202+
int32_t extTimeout = GetExtendedDiscoveryTimeoutSecs();
203203
if (extTimeout != CHIP_DEVICE_CONFIG_DISCOVERY_DISABLED)
204204
{
205205
CHIP_ERROR err = AdvertiseCommissionableNode(chip::Dnssd::CommissioningMode::kDisabled);
@@ -232,16 +232,16 @@ CHIP_ERROR DnssdServer::ScheduleDiscoveryExpiration()
232232
#if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
233233
CHIP_ERROR DnssdServer::ScheduleExtendedDiscoveryExpiration()
234234
{
235-
int16_t extendedDiscoveryTimeoutSecs = GetExtendedDiscoveryTimeoutSecs();
235+
int32_t extendedDiscoveryTimeoutSecs = GetExtendedDiscoveryTimeoutSecs();
236236
if (extendedDiscoveryTimeoutSecs == CHIP_DEVICE_CONFIG_DISCOVERY_NO_TIMEOUT)
237237
{
238238
return CHIP_NO_ERROR;
239239
}
240-
ChipLogDetail(Discovery, "Scheduling extended discovery timeout in %" PRId16 "s", extendedDiscoveryTimeoutSecs);
240+
ChipLogDetail(Discovery, "Scheduling extended discovery timeout in %" PRId32 "s", extendedDiscoveryTimeoutSecs);
241241

242-
mExtendedDiscoveryExpiration = mTimeSource.GetMonotonicTimestamp() + System::Clock::Seconds16(extendedDiscoveryTimeoutSecs);
242+
mExtendedDiscoveryExpiration = mTimeSource.GetMonotonicTimestamp() + System::Clock::Seconds32(extendedDiscoveryTimeoutSecs);
243243

244-
return DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds16(extendedDiscoveryTimeoutSecs),
244+
return DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(extendedDiscoveryTimeoutSecs),
245245
HandleExtendedDiscoveryExpiration, nullptr);
246246
}
247247
#endif // CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
@@ -378,7 +378,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi
378378

379379
advertiseParameters.SetMRPConfig(GetLocalMRPConfig()).SetTcpSupported(Optional<bool>(INET_CONFIG_ENABLE_TCP_ENDPOINT));
380380

381-
if (mode != chip::Dnssd::CommissioningMode::kEnabledEnhanced)
381+
if (!HaveOperationalCredentials())
382382
{
383383
if (DeviceLayer::ConfigurationMgr().GetInitialPairingHint(value) != CHIP_NO_ERROR)
384384
{

src/app/server/Dnssd.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class DLL_EXPORT DnssdServer
8888

8989
#if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
9090
/// Sets the extended discovery timeout. Value will be persisted across reboots
91-
void SetExtendedDiscoveryTimeoutSecs(int16_t secs);
91+
void SetExtendedDiscoveryTimeoutSecs(int32_t secs);
9292

9393
/// Callback from Extended Discovery Expiration timer
9494
/// Checks if extended discovery has expired and if so,
@@ -173,7 +173,7 @@ class DLL_EXPORT DnssdServer
173173

174174
#if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
175175
/// get the current extended discovery timeout (from persistent storage)
176-
int16_t GetExtendedDiscoveryTimeoutSecs();
176+
int32_t GetExtendedDiscoveryTimeoutSecs();
177177

178178
/// schedule next extended discovery expiration
179179
CHIP_ERROR ScheduleExtendedDiscoveryExpiration();

src/include/platform/CHIPDeviceConfig.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -1233,11 +1233,13 @@
12331233
* Default time in seconds that a device will advertise commissionable node discovery
12341234
* after commissioning mode ends. This value can be overridden by the user.
12351235
*
1236-
* Only valid when CCHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY==1
1236+
* Only valid when CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY==1
12371237
*/
12381238
#define CHIP_DEVICE_CONFIG_DISCOVERY_DISABLED 0
12391239
#define CHIP_DEVICE_CONFIG_DISCOVERY_NO_TIMEOUT -1
1240+
#ifndef CHIP_DEVICE_CONFIG_EXTENDED_DISCOVERY_TIMEOUT_SECS
12401241
#define CHIP_DEVICE_CONFIG_EXTENDED_DISCOVERY_TIMEOUT_SECS (15 * 60)
1242+
#endif
12411243

12421244
/**
12431245
* CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE

src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp

+23-3
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,12 @@ void UserDirectedCommissioningServer::OnCommissionableNodeFound(const Dnssd::Dis
111111
{
112112
if (nodeData.numIPs == 0)
113113
{
114-
ChipLogError(AppServer, "SetUDCClientProcessingState no IP addresses returned for instance name=%s", nodeData.instanceName);
114+
ChipLogError(AppServer, "OnCommissionableNodeFound no IP addresses returned for instance name=%s", nodeData.instanceName);
115115
return;
116116
}
117117
if (nodeData.port == 0)
118118
{
119-
ChipLogError(AppServer, "SetUDCClientProcessingState no port returned for instance name=%s", nodeData.instanceName);
119+
ChipLogError(AppServer, "OnCommissionableNodeFound no port returned for instance name=%s", nodeData.instanceName);
120120
return;
121121
}
122122

@@ -127,7 +127,8 @@ void UserDirectedCommissioningServer::OnCommissionableNodeFound(const Dnssd::Dis
127127
(int) client->GetUDCClientProcessingState(), (int) UDCClientProcessingState::kPromptingUser);
128128
client->SetUDCClientProcessingState(UDCClientProcessingState::kPromptingUser);
129129

130-
// currently IPv6 addresses do not work for some reason
130+
#if INET_CONFIG_ENABLE_IPV4
131+
// prefer IPv4 if its an option
131132
bool foundV4 = false;
132133
for (unsigned i = 0; i < nodeData.numIPs; ++i)
133134
{
@@ -143,6 +144,25 @@ void UserDirectedCommissioningServer::OnCommissionableNodeFound(const Dnssd::Dis
143144
{
144145
client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[0], nodeData.port));
145146
}
147+
#else // INET_CONFIG_ENABLE_IPV4
148+
// if we only support V6, then try to find a v6 address
149+
bool foundV6 = false;
150+
for (unsigned i = 0; i < nodeData.numIPs; ++i)
151+
{
152+
if (nodeData.ipAddress[i].IsIPv6())
153+
{
154+
foundV6 = true;
155+
client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[i], nodeData.port));
156+
break;
157+
}
158+
}
159+
// last resort, try with what we have
160+
if (!foundV6)
161+
{
162+
ChipLogError(AppServer, "OnCommissionableNodeFound no v6 returned for instance name=%s", nodeData.instanceName);
163+
client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[0], nodeData.port));
164+
}
165+
#endif // INET_CONFIG_ENABLE_IPV4
146166

147167
client->SetDeviceName(nodeData.deviceName);
148168
client->SetLongDiscriminator(nodeData.longDiscriminator);

0 commit comments

Comments
 (0)