Skip to content

Commit

Permalink
Make SetUpCodePairer only browse for nodes that are in commissioning …
Browse files Browse the repository at this point in the history
…mode. (#17356)

* Make SetUpCodePairer only browse for nodes that are in commissioning mode.

If we don't browse for the _CM subtype, we might find (and ignore) a
node that's not yet in commissioning mode (but has extended
commissioning discovery turned on) and when it enters commissioning
mode we won't notice because there won't be any new service instances
of the sort we are looking for, just TXT record changes.

* Address review comments
  • Loading branch information
bzbarsky-apple authored Apr 15, 2022
1 parent d1512e5 commit a689c84
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion src/controller/SetUpCodePairer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,26 @@ CHIP_ERROR SetUpCodePairer::StartDiscoverOverIP(SetupPayload & payload)
: Dnssd::DiscoveryFilterType::kLongDiscriminator;
currentFilter.code =
payload.isShortDiscriminator ? static_cast<uint16_t>((payload.discriminator >> 8) & 0x0F) : payload.discriminator;

// We're going to ensure that anything we discover matches currentFilter
// before we use it, which will do our discriminator checks for us.
//
// We are using an mdns continuous query for some PTR record to discover
// devices. If the PTR record we use is for one of the discriminator-based
// subtypes (based on currentFilter), then we can run into a problem where
// we discover a (possibly stale) advertisement for a non-commissionable
// (CM=0) node and ignore it, and then when it becomes commissionable we
// don't notice because that just updates the TXT record to CM=1 and does
// not touch the PTR record we are querying for.
//
// So instead we query the PTR record for the "_CM" subtype, which will get
// added when a node enters commissioning mode.
Dnssd::DiscoveryFilter filter;
filter.type = Dnssd::DiscoveryFilterType::kCommissioningMode;

// Handle possibly-sync callbacks.
mWaitingForDiscovery[kIPTransport] = true;
CHIP_ERROR err = mCommissioner->DiscoverCommissionableNodes(currentFilter);
CHIP_ERROR err = mCommissioner->DiscoverCommissionableNodes(filter);
if (err != CHIP_NO_ERROR)
{
mWaitingForDiscovery[kIPTransport] = false;
Expand Down

0 comments on commit a689c84

Please sign in to comment.