Skip to content

Commit b4463ec

Browse files
andy31415andreilitvinrestyled-commits
authoredJul 7, 2023
Make MinMDNS only report commissiabe nodes for active browse. (#27670)
* Make MinMDNS only report commissiabe nodes for active browse. MinMDNS had no way to differentiate what type of active commissionable browse operations existed so would report any commissioner or commissionable node the same to devices. This would make commissioner devices like chip-tool be able to detect themselves as 'commissionable' resulting in failed processing. * Restyled by clang-format * Fix unit tests --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> Co-authored-by: Restyled.io <commits@restyled.io>
1 parent cb1a151 commit b4463ec

6 files changed

+97
-32
lines changed
 

‎src/lib/dnssd/ActiveResolveAttempts.cpp

+32-2
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,48 @@ void ActiveResolveAttempts::Complete(const PeerId & peerId)
5555
#endif
5656
}
5757

58-
void ActiveResolveAttempts::Complete(const chip::Dnssd::DiscoveredNodeData & data)
58+
void ActiveResolveAttempts::CompleteCommissioner(const chip::Dnssd::DiscoveredNodeData & data)
5959
{
6060
for (auto & item : mRetryQueue)
6161
{
62-
if (item.attempt.Matches(data))
62+
if (item.attempt.Matches(data, chip::Dnssd::DiscoveryType::kCommissionerNode))
6363
{
6464
item.attempt.Clear();
6565
return;
6666
}
6767
}
6868
}
6969

70+
void ActiveResolveAttempts::CompleteCommissionable(const chip::Dnssd::DiscoveredNodeData & data)
71+
{
72+
for (auto & item : mRetryQueue)
73+
{
74+
if (item.attempt.Matches(data, chip::Dnssd::DiscoveryType::kCommissionableNode))
75+
{
76+
item.attempt.Clear();
77+
return;
78+
}
79+
}
80+
}
81+
82+
bool ActiveResolveAttempts::HasBrowseFor(chip::Dnssd::DiscoveryType type) const
83+
{
84+
for (auto & item : mRetryQueue)
85+
{
86+
if (!item.attempt.IsBrowse())
87+
{
88+
continue;
89+
}
90+
91+
if (item.attempt.BrowseData().type == type)
92+
{
93+
return true;
94+
}
95+
}
96+
97+
return false;
98+
}
99+
70100
void ActiveResolveAttempts::CompleteIpResolution(SerializedQNameIterator targetHostName)
71101
{
72102
for (auto & item : mRetryQueue)

‎src/lib/dnssd/ActiveResolveAttempts.h

+9-7
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class ActiveResolveAttempts
140140
{
141141
return resolveData.Is<Resolve>() && (resolveData.Get<Resolve>().peerId == peer);
142142
}
143-
bool Matches(const chip::Dnssd::DiscoveredNodeData & data) const
143+
bool Matches(const chip::Dnssd::DiscoveredNodeData & data, chip::Dnssd::DiscoveryType type) const
144144
{
145145
if (!resolveData.Is<Browse>())
146146
{
@@ -149,13 +149,11 @@ class ActiveResolveAttempts
149149

150150
auto & browse = resolveData.Get<Browse>();
151151

152-
// TODO: we should mark returned node data based on the query
153-
if (browse.type != chip::Dnssd::DiscoveryType::kCommissionableNode)
152+
if (browse.type != type)
154153
{
155-
// We don't currently have markers in the returned DiscoveredNodeData to differentiate these, so assume all returned
156-
// packets match
157-
return true;
154+
return false;
158155
}
156+
159157
switch (browse.filter.type)
160158
{
161159
case chip::Dnssd::DiscoveryFilterType::kNone:
@@ -251,7 +249,8 @@ class ActiveResolveAttempts
251249

252250
/// Mark a resolution as a success, removing it from the internal list
253251
void Complete(const chip::PeerId & peerId);
254-
void Complete(const chip::Dnssd::DiscoveredNodeData & data);
252+
void CompleteCommissioner(const chip::Dnssd::DiscoveredNodeData & data);
253+
void CompleteCommissionable(const chip::Dnssd::DiscoveredNodeData & data);
255254
void CompleteIpResolution(SerializedQNameIterator targetHostName);
256255

257256
/// Mark all browse-type scheduled attemptes as a success, removing them
@@ -289,6 +288,9 @@ class ActiveResolveAttempts
289288
/// IP resolution.
290289
bool IsWaitingForIpResolutionFor(SerializedQNameIterator hostName) const;
291290

291+
/// Check if a browse operation is active for the given discovery type
292+
bool HasBrowseFor(chip::Dnssd::DiscoveryType type) const;
293+
292294
private:
293295
struct RetryEntry
294296
{

‎src/lib/dnssd/IncrementalResolve.cpp

+9-15
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,12 @@ class TxtParser : public mdns::Minimal::TxtRecordDelegate
5454
DataType & mData;
5555
};
5656

57-
enum class ServiceNameType
58-
{
59-
kInvalid, // not a matter service name
60-
kOperational,
61-
kCommissioner,
62-
kCommissionable,
63-
};
64-
6557
// Common prefix to check for all operational/commissioner/commissionable name parts
6658
constexpr QNamePart kOperationalSuffix[] = { kOperationalServiceName, kOperationalProtocol, kLocalDomain };
6759
constexpr QNamePart kCommissionableSuffix[] = { kCommissionableServiceName, kCommissionProtocol, kLocalDomain };
6860
constexpr QNamePart kCommissionerSuffix[] = { kCommissionerServiceName, kCommissionProtocol, kLocalDomain };
6961

70-
ServiceNameType ComputeServiceNameType(SerializedQNameIterator name)
62+
IncrementalResolver::ServiceNameType ComputeServiceNameType(SerializedQNameIterator name)
7163
{
7264
// SRV record names look like:
7365
// <compressed-fabric-id>-<node-id>._matter._tcp.local (operational)
@@ -78,25 +70,25 @@ ServiceNameType ComputeServiceNameType(SerializedQNameIterator name)
7870
if (!name.Next() || !name.IsValid())
7971
{
8072
// missing required components - empty service name
81-
return ServiceNameType::kInvalid;
73+
return IncrementalResolver::ServiceNameType::kInvalid;
8274
}
8375

8476
if (name == kOperationalSuffix)
8577
{
86-
return ServiceNameType::kOperational;
78+
return IncrementalResolver::ServiceNameType::kOperational;
8779
}
8880

8981
if (name == kCommissionableSuffix)
9082
{
91-
return ServiceNameType::kCommissionable;
83+
return IncrementalResolver::ServiceNameType::kCommissionable;
9284
}
9385

9486
if (name == kCommissionerSuffix)
9587
{
96-
return ServiceNameType::kCommissioner;
88+
return IncrementalResolver::ServiceNameType::kCommissioner;
9789
}
9890

99-
return ServiceNameType::kInvalid;
91+
return IncrementalResolver::ServiceNameType::kInvalid;
10092
}
10193

10294
/// Automatically resets a IncrementalResolver to inactive in its destructor
@@ -171,7 +163,9 @@ CHIP_ERROR IncrementalResolver::InitializeParsing(mdns::Minimal::SerializedQName
171163
Platform::CopyString(mCommonResolutionData.hostName, serverName.Value());
172164
}
173165

174-
switch (ComputeServiceNameType(name))
166+
mServiceNameType = ComputeServiceNameType(name);
167+
168+
switch (mServiceNameType)
175169
{
176170
case ServiceNameType::kOperational:
177171
mSpecificResolutionData.Set<OperationalNodeData>();

‎src/lib/dnssd/IncrementalResolve.h

+13-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,16 @@ class IncrementalResolver
8484
};
8585
using RequiredInformationFlags = BitFlags<RequiredInformationBitFlags>;
8686

87-
IncrementalResolver() {}
87+
// Type of service name that is contained in this resolver
88+
enum class ServiceNameType
89+
{
90+
kInvalid, // not a matter service name
91+
kOperational,
92+
kCommissioner,
93+
kCommissionable,
94+
};
95+
96+
IncrementalResolver() = default;
8897

8998
/// Checks if object has been initialized using the `InitializeParsing`
9099
/// method.
@@ -93,6 +102,8 @@ class IncrementalResolver
93102
bool IsActiveCommissionParse() const { return mSpecificResolutionData.Is<CommissionNodeData>(); }
94103
bool IsActiveOperationalParse() const { return mSpecificResolutionData.Is<OperationalNodeData>(); }
95104

105+
ServiceNameType GetCurrentType() const { return mServiceNameType; }
106+
96107
/// Start parsing a new record. SRV records are the records we are mainly
97108
/// interested on, after which TXT and A/AAAA are looked for.
98109
///
@@ -171,6 +182,7 @@ class IncrementalResolver
171182

172183
StoredServerName mRecordName; // Record name for what is parsed (SRV/PTR/TXT)
173184
StoredServerName mTargetHostName; // `Target` for the SRV record
185+
ServiceNameType mServiceNameType = ServiceNameType::kInvalid;
174186
CommonResolutionData mCommonResolutionData;
175187
ParsedRecordSpecificData mSpecificResolutionData;
176188
};

‎src/lib/dnssd/Resolver_ImplMinimalMdns.cpp

+32-5
Original file line numberDiff line numberDiff line change
@@ -380,18 +380,45 @@ void MinMdnsResolver::AdvancePendingResolverStates()
380380
if (err != CHIP_NO_ERROR)
381381
{
382382
ChipLogError(Discovery, "Failed to take discovery result: %" CHIP_ERROR_FORMAT, err.Format());
383+
continue;
383384
}
384385

385-
mActiveResolves.Complete(nodeData);
386-
if (mCommissioningDelegate != nullptr)
386+
// TODO: Ideally commissioning delegates should be aware of the
387+
// node types they receive, however they are currently not
388+
// so try to help out by only calling the delegate when an
389+
// active browse exists.
390+
//
391+
// This is NOT ok and probably we should have separate comissioner
392+
// or commissionable delegates or pass in a node type argument.
393+
bool discoveredNodeIsRelevant = false;
394+
395+
switch (resolver->GetCurrentType())
387396
{
388-
mCommissioningDelegate->OnNodeDiscovered(nodeData);
397+
case IncrementalResolver::ServiceNameType::kCommissioner:
398+
discoveredNodeIsRelevant = mActiveResolves.HasBrowseFor(chip::Dnssd::DiscoveryType::kCommissionerNode);
399+
mActiveResolves.CompleteCommissioner(nodeData);
400+
break;
401+
case IncrementalResolver::ServiceNameType::kCommissionable:
402+
discoveredNodeIsRelevant = mActiveResolves.HasBrowseFor(chip::Dnssd::DiscoveryType::kCommissionableNode);
403+
mActiveResolves.CompleteCommissionable(nodeData);
404+
break;
405+
default:
406+
ChipLogError(Discovery, "Unexpected type for commission data parsing");
407+
continue;
389408
}
390-
else
409+
410+
if (discoveredNodeIsRelevant)
391411
{
412+
if (mCommissioningDelegate != nullptr)
413+
{
414+
mCommissioningDelegate->OnNodeDiscovered(nodeData);
415+
}
416+
else
417+
{
392418
#if CHIP_MINMDNS_HIGH_VERBOSITY
393-
ChipLogError(Discovery, "No delegate to report commissioning node discovery");
419+
ChipLogError(Discovery, "No delegate to report commissioning node discovery");
394420
#endif
421+
}
395422
}
396423
}
397424
else if (resolver->IsActiveOperationalParse())

‎src/lib/dnssd/tests/TestActiveResolveAttempts.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ void TestSingleBrowseAddRemove(nlTestSuite * inSuite, void * inContext)
127127
// once complete, nothing to schedule
128128
Dnssd::DiscoveredNodeData data;
129129
data.commissionData.longDiscriminator = 1234;
130-
attempts.Complete(data);
130+
attempts.CompleteCommissionable(data);
131131
NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue());
132132
NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue());
133133
}
@@ -376,7 +376,7 @@ void TestCombination(nlTestSuite * inSuite, void * inContext)
376376
attempts.Complete(MakePeerId(1));
377377
Dnssd::DiscoveredNodeData data;
378378
data.commissionData.longDiscriminator = 1234;
379-
attempts.Complete(data);
379+
attempts.CompleteCommissionable(data);
380380

381381
NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue());
382382
NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue());

0 commit comments

Comments
 (0)
Please sign in to comment.