Skip to content

Commit c54e574

Browse files
Matter.framework should explicitly look for things in the SRP domain.
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 3c5b92c commit c54e574

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+
nullptr, // Default domain
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+
nullptr, // Default domain
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)