Skip to content

Commit 98b14ed

Browse files
Matter.framework should explicitly look for things in the SRP domain. (#33319)
The operational browse and connectivity monitoring in Matter.framework should happen on both the SRP domain and the default domain, so we are sure we'll notice Thread devices properly.
1 parent e01eb4e commit 98b14ed

File tree

2 files changed

+53
-29
lines changed

2 files changed

+53
-29
lines changed

src/darwin/Framework/CHIP/MTRDeviceConnectivityMonitor.mm

+36-22
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,23 @@
2323
#import <os/lock.h>
2424

2525
#include <lib/dnssd/ServiceNaming.h>
26+
#include <lib/support/CodeUtils.h>
27+
#include <vector>
2628

2729
@implementation MTRDeviceConnectivityMonitor {
2830
NSString * _instanceName;
29-
DNSServiceRef _resolver;
31+
std::vector<DNSServiceRef> _resolvers;
3032
NSMutableDictionary<NSString *, nw_connection_t> * _connections;
3133

3234
MTRDeviceConnectivityMonitorHandler _monitorHandler;
3335
dispatch_queue_t _handlerQueue;
3436
}
3537

3638
namespace {
37-
constexpr char kLocalDot[] = "local.";
39+
constexpr const char * kResolveDomains[] = {
40+
"default.service.arpa.", // SRP
41+
"local.",
42+
};
3843
constexpr char kOperationalType[] = "_matter._tcp";
3944
constexpr int64_t kSharedConnectionLingerIntervalSeconds = (10);
4045
}
@@ -68,8 +73,8 @@ - (instancetype)initWithCompressedFabricID:(NSNumber *)compressedFabricID nodeID
6873

6974
- (void)dealloc
7075
{
71-
if (_resolver) {
72-
DNSServiceRefDeallocate(_resolver);
76+
for (auto & resolver : _resolvers) {
77+
DNSServiceRefDeallocate(resolver);
7378
}
7479
}
7580

@@ -188,32 +193,39 @@ - (void)startMonitoringWithHandler:(MTRDeviceConnectivityMonitorHandler)handler
188193
_handlerQueue = queue;
189194

190195
// If there's already a resolver running, just return
191-
if (_resolver) {
196+
if (_resolvers.size() != 0) {
192197
MTR_LOG_INFO("%@ connectivity monitor already running", self);
193198
return;
194199
}
195200

196201
MTR_LOG_INFO("%@ start connectivity monitoring for %@ (%lu monitoring objects)", self, _instanceName, static_cast<unsigned long>(sConnectivityMonitorCount));
197202

198-
_resolver = [MTRDeviceConnectivityMonitor _sharedResolverConnection];
199-
if (!_resolver) {
203+
auto sharedConnection = [MTRDeviceConnectivityMonitor _sharedResolverConnection];
204+
if (!sharedConnection) {
200205
MTR_LOG_ERROR("%@ failed to get shared resolver connection", self);
201206
return;
202207
}
203-
DNSServiceErrorType dnsError = DNSServiceResolve(&_resolver,
204-
kDNSServiceFlagsShareConnection,
205-
kDNSServiceInterfaceIndexAny,
206-
_instanceName.UTF8String,
207-
kOperationalType,
208-
kLocalDot,
209-
ResolveCallback,
210-
(__bridge void *) self);
211-
if (dnsError != kDNSServiceErr_NoError) {
212-
MTR_LOG_ERROR("%@ failed to create resolver", self);
213-
return;
208+
209+
for (auto domain : kResolveDomains) {
210+
DNSServiceRef resolver = sharedConnection;
211+
DNSServiceErrorType dnsError = DNSServiceResolve(&resolver,
212+
kDNSServiceFlagsShareConnection,
213+
kDNSServiceInterfaceIndexAny,
214+
_instanceName.UTF8String,
215+
kOperationalType,
216+
domain,
217+
ResolveCallback,
218+
(__bridge void *) self);
219+
if (dnsError == kDNSServiceErr_NoError) {
220+
_resolvers.emplace_back(std::move(resolver));
221+
} else {
222+
MTR_LOG_ERROR("%@ failed to create resolver for \"%s\" domain: %" PRId32, self, StringOrNullMarker(domain), dnsError);
223+
}
214224
}
215225

216-
sConnectivityMonitorCount++;
226+
if (_resolvers.size() != 0) {
227+
sConnectivityMonitorCount++;
228+
}
217229
}
218230

219231
- (void)_stopMonitoring
@@ -227,9 +239,11 @@ - (void)_stopMonitoring
227239
_monitorHandler = nil;
228240
_handlerQueue = nil;
229241

230-
if (_resolver) {
231-
DNSServiceRefDeallocate(_resolver);
232-
_resolver = NULL;
242+
if (_resolvers.size() != 0) {
243+
for (auto & resolver : _resolvers) {
244+
DNSServiceRefDeallocate(resolver);
245+
}
246+
_resolvers.clear();
233247

234248
// If no monitor objects exist, schedule to deallocate shared connection and queue
235249
sConnectivityMonitorCount--;

src/darwin/Framework/CHIP/MTROperationalBrowser.mm

+17-7
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@
2121

2222
#include <cinttypes>
2323
#include <lib/dnssd/ServiceNaming.h>
24+
#include <lib/support/CodeUtils.h>
2425
#include <lib/support/logging/CHIPLogging.h>
2526
#include <platform/LockTracker.h>
2627

2728
namespace {
28-
constexpr char kLocalDot[] = "local.";
29+
constexpr const char * kBrowseDomains[] = {
30+
"default.service.arpa.", // SRP
31+
"local.",
32+
};
2933
constexpr char kOperationalType[] = "_matter._tcp";
30-
constexpr DNSServiceFlags kBrowseFlags = 0;
3134
}
3235

3336
MTROperationalBrowser::MTROperationalBrowser(MTRDeviceControllerFactory * aFactory, dispatch_queue_t aQueue)
@@ -43,23 +46,30 @@
4346
{
4447
assertChipStackLockedByCurrentThread();
4548

46-
ChipLogProgress(Controller, "Trying to start operational browse");
49+
ChipLogProgress(Controller, "Trying to start persistent operational browse");
4750

48-
auto err
49-
= DNSServiceBrowse(&mBrowseRef, kBrowseFlags, kDNSServiceInterfaceIndexAny, kOperationalType, kLocalDot, OnBrowse, this);
51+
auto err = DNSServiceCreateConnection(&mBrowseRef);
5052
if (err != kDNSServiceErr_NoError) {
51-
ChipLogError(Controller, "Failed to start operational browse: %" PRId32, err);
53+
ChipLogError(Controller, "Failed to create connection for persistent operational browse: %" PRId32, err);
5254
return;
5355
}
5456

5557
err = DNSServiceSetDispatchQueue(mBrowseRef, mQueue);
5658
if (err != kDNSServiceErr_NoError) {
57-
ChipLogError(Controller, "Failed to set up dispatch queue properly");
59+
ChipLogError(Controller, "Failed to set up dispatch queue properly for persistent operational browse: %" PRId32, err);
5860
DNSServiceRefDeallocate(mBrowseRef);
5961
return;
6062
}
6163

6264
mInitialized = true;
65+
66+
for (auto domain : kBrowseDomains) {
67+
auto browseRef = mBrowseRef; // Mandatory copy because of kDNSServiceFlagsShareConnection.
68+
err = DNSServiceBrowse(&browseRef, kDNSServiceFlagsShareConnection, kDNSServiceInterfaceIndexAny, kOperationalType, domain, OnBrowse, this);
69+
if (err != kDNSServiceErr_NoError) {
70+
ChipLogError(Controller, "Failed to start persistent operational browse for \"%s\" domain: %" PRId32, StringOrNullMarker(domain), err);
71+
}
72+
}
6373
}
6474

6575
void MTROperationalBrowser::OnBrowse(DNSServiceRef aServiceRef, DNSServiceFlags aFlags, uint32_t aInterfaceId,

0 commit comments

Comments
 (0)