Skip to content

Commit b8f80db

Browse files
ShekarKurva SaiChandrakurvaSai
ShekarKurva SaiChandra
authored andcommitted
Pull request project-chip#1498: Cherry pick/mpc enable mDNS discovery
Merge in WMN_TOOLS/matter from cherry-pick/mpc-enable-mDNS-discovery to RC_2.3.0-1.3 Squashed commit of the following: commit e84099fa71ddb00c7e8c6e956c86d9f0b4e9348e Author: shasaicha <shsaicha@silabs.com> Date: Wed Jan 17 21:32:35 2024 +0530 Adds check before calling Resolver Init commit 2df60ff2f807afaaab8a1b218d6bf6ca79a8c42b Author: Suhas Shankar <Suhas.Shankar@silabs.com> Date: Mon Oct 16 13:26:08 2023 +0000 Pull request project-chip#1237: Pull request project-chip#1024: MATTER-2541: Added Operational Node discorvery to the mDNS resolver. Merge in WMN_TOOLS/matter from cherry-pick/mpc-enable-mDNS-discovery to RC_2.2.0-1.2 Squashed commit of the following: commit fffa064f6f3fecb2f9c7ad529301aa7135298792 Author: Suhas Shankar <Suhas.Shankar@silabs.com> Date: Thu Aug 17 15:55:06 2023 +0000 Pull request project-chip#1024: Added Operational Node discorvery to the mDNS resolver. enables MPC node discovery as well Squashed commit of the following: commit 523637915ef3edf7e110c370200f0cee71541b13 Author: Anders Lynge Esbensen <anders.esbensen@silabs.com> Date: Sun Mar 12 14:10:04 2023 +0100 Added Operational Node discorvery to the mDNS resolver. Added new delegate and interface function for discovering operational devices.
1 parent 9ce9b24 commit b8f80db

9 files changed

+138
-3
lines changed

src/controller/tests/TestCommissionableNodeController.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* limitations under the License.
1717
*/
1818

19+
#include "lib/dnssd/Resolver.h"
1920
#include <controller/CHIPCommissionableNodeController.h>
2021
#include <lib/support/CHIPMemString.h>
2122
#include <lib/support/UnitTestRegistration.h>
@@ -43,7 +44,10 @@ class MockResolver : public Resolver
4344
{
4445
return CHIP_ERROR_NOT_IMPLEMENTED;
4546
}
47+
4648
CHIP_ERROR StopDiscovery(DiscoveryContext &) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
49+
CHIP_ERROR DiscoverOperational(DiscoveryFilter filter, DiscoveryContext &) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
50+
4751
CHIP_ERROR ReconfirmRecord(const char * hostname, Inet::IPAddress address, Inet::InterfaceId interfaceId) override
4852
{
4953
return CHIP_ERROR_NOT_IMPLEMENTED;

src/lib/dnssd/Discovery_ImplPlatform.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,31 @@ void DiscoveryImplPlatform::NodeIdResolutionNoLongerNeeded(const PeerId & peerId
653653
ChipDnssdResolveNoLongerNeeded(name);
654654
}
655655

656+
CHIP_ERROR DiscoveryImplPlatform::DiscoverOperational(DiscoveryFilter filter, DiscoveryContext & context)
657+
{
658+
ReturnErrorOnFailure(InitImpl());
659+
StopDiscovery(context);
660+
661+
char serviceName[kMaxCommissionerServiceNameSize];
662+
ReturnErrorOnFailure(MakeServiceTypeName(serviceName, sizeof(serviceName), filter, DiscoveryType::kOperational));
663+
664+
intptr_t browseIdentifier;
665+
// Increase the reference count of the context to keep it alive until HandleNodeBrowse is called back.
666+
CHIP_ERROR error = ChipDnssdBrowse(serviceName, DnssdServiceProtocol::kDnssdProtocolUdp, Inet::IPAddressType::kAny,
667+
Inet::InterfaceId::Null(), HandleNodeBrowse, context.Retain(), &browseIdentifier);
668+
669+
if (error == CHIP_NO_ERROR)
670+
{
671+
context.SetBrowseIdentifier(browseIdentifier);
672+
}
673+
else
674+
{
675+
context.Release();
676+
}
677+
678+
return CHIP_NO_ERROR;
679+
}
680+
656681
CHIP_ERROR DiscoveryImplPlatform::DiscoverCommissionableNodes(DiscoveryFilter filter, DiscoveryContext & context)
657682
{
658683
ReturnErrorOnFailure(InitImpl());

src/lib/dnssd/Discovery_ImplPlatform.h

+3
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,14 @@ class DiscoveryImplPlatform : public ServiceAdvertiser, public Resolver
5151

5252
// Members that implement Resolver interface.
5353
void SetOperationalDelegate(OperationalResolveDelegate * delegate) override { mOperationalDelegate = delegate; }
54+
5455
CHIP_ERROR ResolveNodeId(const PeerId & peerId) override;
5556
void NodeIdResolutionNoLongerNeeded(const PeerId & peerId) override;
5657
CHIP_ERROR DiscoverCommissionableNodes(DiscoveryFilter filter, DiscoveryContext & context) override;
5758
CHIP_ERROR DiscoverCommissioners(DiscoveryFilter filter, DiscoveryContext & context) override;
59+
CHIP_ERROR DiscoverOperational(DiscoveryFilter filter, DiscoveryContext & context) override;
5860
CHIP_ERROR StopDiscovery(DiscoveryContext & context) override;
61+
5962
CHIP_ERROR ReconfirmRecord(const char * hostname, Inet::IPAddress address, Inet::InterfaceId interfaceId) override;
6063

6164
static DiscoveryImplPlatform & GetInstance();

src/lib/dnssd/Resolver.h

+42-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,19 @@ class OperationalResolveDelegate
5959
virtual void OnOperationalNodeResolutionFailed(const PeerId & peerId, CHIP_ERROR error) = 0;
6060
};
6161

62+
/// Callback for Browsing for nodes without resolving the DNS records
63+
///
64+
class OperationalBrowseDelegate
65+
{
66+
public:
67+
virtual ~OperationalBrowseDelegate() = default;
68+
/// Called within the CHIP event loop once a node is discovered.
69+
///
70+
/// May be called multiple times as more nodes send their answer to a
71+
/// multicast discovery query
72+
virtual void OnOperationalNodeDiscovered(const OperationalNodeData & operationalData) = 0;
73+
};
74+
6275
/**
6376
* Node discovery context class.
6477
*
@@ -91,8 +104,22 @@ class DiscoveryContext : public ReferenceCounted<DiscoveryContext>
91104
}
92105
}
93106

107+
void SetOperationalBrowseDelegate(OperationalBrowseDelegate * delegate) { mBrowseOperationalDelegate = delegate; }
108+
109+
void OnOperationalNodeDiscovered(const OperationalNodeData & operationalData)
110+
{
111+
if (mBrowseOperationalDelegate != nullptr){
112+
mBrowseOperationalDelegate->OnOperationalNodeDiscovered(operationalData);
113+
}
114+
else
115+
{
116+
ChipLogError(Discovery, "Missing Browse delegate. Data discarded");
117+
}
118+
}
119+
94120
private:
95121
CommissioningResolveDelegate * mCommissioningDelegate = nullptr;
122+
OperationalBrowseDelegate * mBrowseOperationalDelegate = nullptr;
96123
Optional<intptr_t> mBrowseIdentifier;
97124
};
98125

@@ -192,7 +219,21 @@ class Resolver
192219
virtual CHIP_ERROR DiscoverCommissioners(DiscoveryFilter filter, DiscoveryContext & context) = 0;
193220

194221
/**
195-
* Stop discovery (of commissionable or commissioner nodes).
222+
* @brief Start Browising for operational devices
223+
*
224+
* This will start periodical brwosing of operational devices. The when a new node is
225+
* found the delegate set with SetOperationalBrowseDelegate is called. The mDNS queryies
226+
* will continue unitil StopDiscovery is called.
227+
*
228+
* Note, this will locate all the Operational devices on the network. Typically an
229+
* application would filter the found nodes by relevant fabrics.
230+
*
231+
* If needed a discovery filter may be specified to narrow the search.
232+
*/
233+
virtual CHIP_ERROR DiscoverOperational(DiscoveryFilter filter, DiscoveryContext & context) = 0;
234+
235+
/**
236+
* Stop discovery (of operational, commissionable or commissioner nodes).
196237
*
197238
* Some back ends may not support stopping discovery, so consumers should
198239
* not assume they will stop getting callbacks after calling this.

src/lib/dnssd/ResolverProxy.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ CHIP_ERROR ResolverProxy::Init(Inet::EndPointManager<Inet::UDPEndPoint> * udpEnd
2626
{
2727
VerifyOrReturnError(mContext == nullptr, CHIP_ERROR_INCORRECT_STATE);
2828

29-
ReturnErrorOnFailure(mResolver.Init(udpEndPoint));
29+
if (!mResolver.IsInitialized())
30+
{
31+
ReturnErrorOnFailure(mResolver.Init(udpEndPoint));
32+
}
3033
mContext = Platform::New<DiscoveryContext>();
3134
VerifyOrReturnError(mContext != nullptr, CHIP_ERROR_NO_MEMORY);
3235

@@ -55,6 +58,13 @@ CHIP_ERROR ResolverProxy::DiscoverCommissioners(DiscoveryFilter filter)
5558
return mResolver.DiscoverCommissioners(filter, *mContext);
5659
}
5760

61+
CHIP_ERROR ResolverProxy::DiscoverOperational(DiscoveryFilter filter)
62+
{
63+
VerifyOrReturnError(mContext != nullptr, CHIP_ERROR_INCORRECT_STATE);
64+
65+
return mResolver.DiscoverOperational(filter, *mContext);
66+
}
67+
5868
CHIP_ERROR ResolverProxy::StopDiscovery()
5969
{
6070
VerifyOrReturnError(mContext != nullptr, CHIP_ERROR_INCORRECT_STATE);

src/lib/dnssd/ResolverProxy.h

+9
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,17 @@ class ResolverProxy
5252
}
5353
}
5454

55+
void SetOperationalBrowseDelegate(OperationalBrowseDelegate * delegate)
56+
{
57+
if (mContext != nullptr)
58+
{
59+
mContext->SetOperationalBrowseDelegate(delegate);
60+
}
61+
}
62+
5563
CHIP_ERROR DiscoverCommissionableNodes(DiscoveryFilter filter = DiscoveryFilter());
5664
CHIP_ERROR DiscoverCommissioners(DiscoveryFilter filter = DiscoveryFilter());
65+
CHIP_ERROR DiscoverOperational(DiscoveryFilter filter = DiscoveryFilter());
5766
CHIP_ERROR StopDiscovery();
5867

5968
private:

src/lib/dnssd/Resolver_ImplMinimalMdns.cpp

+20-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
*/
1717

1818
#include "Resolver.h"
19+
#include "lib/dnssd/minimal_mdns/core/Constants.h"
1920

21+
#include <cstddef>
2022
#include <limits>
2123

2224
#include <lib/core/CHIPConfig.h>
@@ -283,17 +285,20 @@ class MinMdnsResolver : public Resolver, public MdnsPacketDelegate
283285
bool IsInitialized() override;
284286
void Shutdown() override;
285287
void SetOperationalDelegate(OperationalResolveDelegate * delegate) override { mOperationalDelegate = delegate; }
288+
286289
CHIP_ERROR ResolveNodeId(const PeerId & peerId) override;
287290
void NodeIdResolutionNoLongerNeeded(const PeerId & peerId) override;
288291
CHIP_ERROR DiscoverCommissionableNodes(DiscoveryFilter filter, DiscoveryContext & context) override;
289292
CHIP_ERROR DiscoverCommissioners(DiscoveryFilter filter, DiscoveryContext & context) override;
293+
CHIP_ERROR DiscoverOperational(DiscoveryFilter filter, DiscoveryContext & context) override;
290294
CHIP_ERROR StopDiscovery(DiscoveryContext & context) override;
291295
CHIP_ERROR ReconfirmRecord(const char * hostname, Inet::IPAddress address, Inet::InterfaceId interfaceId) override;
292296

293297
private:
294298
OperationalResolveDelegate * mOperationalDelegate = nullptr;
295299
DiscoveryContext * mDiscoveryContext = nullptr;
296300
System::Layer * mSystemLayer = nullptr;
301+
297302
ActiveResolveAttempts mActiveResolves;
298303
PacketParser mPacketParser;
299304

@@ -440,14 +445,19 @@ void MinMdnsResolver::AdvancePendingResolverStates()
440445
{
441446
MATTER_TRACE_SCOPE("Active operational delegate call", "MinMdnsResolver");
442447
ResolvedNodeData nodeData;
443-
444448
CHIP_ERROR err = resolver->Take(nodeData);
445449
if (err != CHIP_NO_ERROR)
446450
{
447451
ChipLogError(Discovery, "Failed to take discovery result: %" CHIP_ERROR_FORMAT, err.Format());
448452
}
449453

450454
mActiveResolves.Complete(nodeData.operationalData.peerId);
455+
456+
if (mDiscoveryContext != nullptr)
457+
{
458+
mDiscoveryContext->OnOperationalNodeDiscovered(nodeData.operationalData);
459+
}
460+
451461
if (mOperationalDelegate != nullptr)
452462
{
453463
mOperationalDelegate->OnOperationalNodeResolved(nodeData);
@@ -701,6 +711,15 @@ CHIP_ERROR MinMdnsResolver::DiscoverCommissioners(DiscoveryFilter filter, Discov
701711
return BrowseNodes(DiscoveryType::kCommissionerNode, filter);
702712
}
703713

714+
715+
CHIP_ERROR MinMdnsResolver::DiscoverOperational(DiscoveryFilter filter, DiscoveryContext & context)
716+
{
717+
// minmdns currently supports only one discovery context at a time so override the previous context
718+
SetDiscoveryContext(&context);
719+
720+
return BrowseNodes(DiscoveryType::kOperational, filter);
721+
}
722+
704723
CHIP_ERROR MinMdnsResolver::StopDiscovery(DiscoveryContext & context)
705724
{
706725
SetDiscoveryContext(nullptr);

src/lib/dnssd/Resolver_ImplNone.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,17 @@ class NoneResolver : public Resolver
4444
{
4545
return CHIP_ERROR_NOT_IMPLEMENTED;
4646
}
47+
4748
CHIP_ERROR DiscoverCommissioners(DiscoveryFilter filter, DiscoveryContext & context) override
4849
{
4950
return CHIP_ERROR_NOT_IMPLEMENTED;
5051
}
52+
CHIP_ERROR DiscoverOperational(DiscoveryFilter filter, DiscoveryContext & context) override
53+
{
54+
return CHIP_ERROR_NOT_IMPLEMENTED;
55+
}
5156
CHIP_ERROR StopDiscovery(DiscoveryContext & context) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
57+
5258
CHIP_ERROR ReconfirmRecord(const char * hostname, Inet::IPAddress address, Inet::InterfaceId interfaceId) override
5359
{
5460
return CHIP_ERROR_NOT_IMPLEMENTED;

src/lib/shell/commands/Dns.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,21 @@ CHIP_ERROR BrowseCommissionerHandler(int argc, char ** argv)
228228
return sResolverProxy.DiscoverCommissioners(filter);
229229
}
230230

231+
CHIP_ERROR BrowseOpertionalHandler(int argc, char ** argv)
232+
{
233+
Dnssd::DiscoveryFilter filter;
234+
235+
if (!ParseSubType(argc, argv, filter))
236+
{
237+
streamer_printf(streamer_get(), "Invalid argument\r\n");
238+
return CHIP_ERROR_INVALID_ARGUMENT;
239+
}
240+
241+
streamer_printf(streamer_get(), "Browsing operational nodes...\r\n");
242+
243+
return sResolverProxy.DiscoverOperational(filter);
244+
}
245+
231246
CHIP_ERROR BrowseHandler(int argc, char ** argv)
232247
{
233248
if (argc == 0)
@@ -262,6 +277,9 @@ void RegisterDnsCommands()
262277
"Browse Matter commissionable nodes. Usage: dns browse commissionable [subtype]" },
263278
{ &BrowseCommissionerHandler, "commissioner",
264279
"Browse Matter commissioner nodes. Usage: dns browse commissioner [subtype]" },
280+
{ &BrowseOpertionalHandler, "operational",
281+
"Browse Matter all operationional nodes. Usage: dns browse operational [subtype]" },
282+
265283
};
266284

267285
static const shell_command_t sDnsSubCommands[] = {

0 commit comments

Comments
 (0)