Skip to content

Commit e2dd0fa

Browse files
committed
passing domain from browse to resolve working
1 parent fcd52e7 commit e2dd0fa

File tree

1 file changed

+50
-13
lines changed

1 file changed

+50
-13
lines changed

src/platform/Darwin/DnssdImpl.cpp

+50-13
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,17 @@ std::shared_ptr<uint32_t> GetCounterHolder(const char * name)
131131
return std::make_shared<uint32_t>(0);
132132
}
133133

134+
bool MatchDnssdServices(DnssdService service, DnssdService other)
135+
{
136+
return strcmp(service.mName, other.mName) == 0 && GetFullType(&service) == GetFullType(&other) &&
137+
service.mInterface == other.mInterface;
138+
}
139+
140+
bool IsSRPDomain(const char * domain)
141+
{
142+
return strcmp(kSrpDot, domain) == 0;
143+
}
144+
134145
} // namespace
135146

136147
namespace chip {
@@ -401,22 +412,32 @@ static void OnResolve(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t inter
401412
}
402413

403414
static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::Inet::IPAddressType addressType, const char * type,
404-
const char * name)
415+
const char * name, const char * domain)
405416
{
406417
ChipLogProgress(Discovery, "Resolve type=%s name=%s interface=%" PRIu32, StringOrNullMarker(type), StringOrNullMarker(name),
407418
interfaceId);
408419

409420
auto err = DNSServiceCreateConnection(&sdCtx->serviceRef);
410421
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
411422

412-
// Similar to browse, will try to resolve using both the default domain and the srp domain.
413-
auto sdRefLocal = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
414-
err = DNSServiceResolve(&sdRefLocal, kResolveFlags, interfaceId, name, type, kLocalDot, OnResolve, &sdCtx->localResolveContext);
415-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
416-
417-
auto sdRefSrp = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
418-
err = DNSServiceResolve(&sdRefSrp, kResolveFlags, interfaceId, name, type, kSrpDot, OnResolve, &sdCtx->srpResolveContext);
419-
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
423+
if (domain != nullptr)
424+
{
425+
auto sdRef = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
426+
err = DNSServiceResolve(&sdRef, kResolveFlags, interfaceId, name, type, domain, OnResolve, IsSRPDomain(domain) ? &sdCtx->srpResolveContext : &sdCtx->localResolveContext);
427+
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
428+
sdCtx->startSrpTimerForResolve = false;
429+
}
430+
else
431+
{
432+
// Similar to browse, will try to resolve using both the default domain and the srp domain.
433+
auto sdRefLocal = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
434+
err = DNSServiceResolve(&sdRefLocal, kResolveFlags, interfaceId, name, type, kLocalDot, OnResolve, &sdCtx->localResolveContext);
435+
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
436+
437+
auto sdRefSrp = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection
438+
err = DNSServiceResolve(&sdRefSrp, kResolveFlags, interfaceId, name, type, kSrpDot, OnResolve, &sdCtx->srpResolveContext);
439+
VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err));
440+
}
420441

421442
auto retval = MdnsContexts::GetInstance().Add(sdCtx, sdCtx->serviceRef);
422443
if (retval == CHIP_NO_ERROR)
@@ -427,14 +448,14 @@ static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::In
427448
}
428449

429450
static CHIP_ERROR Resolve(void * context, DnssdResolveCallback callback, uint32_t interfaceId,
430-
chip::Inet::IPAddressType addressType, const char * type, const char * name)
451+
chip::Inet::IPAddressType addressType, const char * type, const char * name, const char * domain)
431452
{
432453
auto counterHolder = GetCounterHolder(name);
433454
auto sdCtx = chip::Platform::New<ResolveContext>(context, callback, addressType, name,
434455
BrowseContext::sContextDispatchingSuccess, std::move(counterHolder));
435456
VerifyOrReturnError(nullptr != sdCtx, CHIP_ERROR_NO_MEMORY);
436457

437-
return Resolve(sdCtx, interfaceId, addressType, type, name);
458+
return Resolve(sdCtx, interfaceId, addressType, type, name, domain);
438459
}
439460

440461
static CHIP_ERROR Resolve(CommissioningResolveDelegate * delegate, uint32_t interfaceId, chip::Inet::IPAddressType addressType,
@@ -444,7 +465,7 @@ static CHIP_ERROR Resolve(CommissioningResolveDelegate * delegate, uint32_t inte
444465
auto sdCtx = chip::Platform::New<ResolveContext>(delegate, addressType, name, std::move(counterHolder));
445466
VerifyOrReturnError(nullptr != sdCtx, CHIP_ERROR_NO_MEMORY);
446467

447-
return Resolve(sdCtx, interfaceId, addressType, type, name);
468+
return Resolve(sdCtx, interfaceId, addressType, type, name, nullptr);
448469
}
449470

450471
} // namespace
@@ -582,7 +603,23 @@ CHIP_ERROR ChipDnssdResolve(DnssdService * service, chip::Inet::InterfaceId inte
582603

583604
auto regtype = GetFullType(service);
584605
auto interfaceId = GetInterfaceId(interface);
585-
return Resolve(context, callback, interfaceId, service->mAddressType, regtype.c_str(), service->mName);
606+
ChipLogError(Discovery, "Mdns: ChipDnssdResolve for %d", interfaceId);
607+
const char * domain = nullptr;
608+
609+
if (BrowseContext::sContextDispatchingSuccess != nullptr)
610+
{
611+
for (auto iter : BrowseContext::sContextDispatchingSuccess->services)
612+
{
613+
ChipLogError(Discovery, "Mdns: ChipDnssdResolve MatchDnssdServices name %s", iter.first.mName);
614+
if (MatchDnssdServices(*service, iter.first))
615+
{
616+
ChipLogError(Discovery, "Mdns: ChipDnssdResolve domain %s", iter.second.c_str());
617+
domain = iter.second.c_str();
618+
}
619+
}
620+
}
621+
622+
return Resolve(context, callback, interfaceId, service->mAddressType, regtype.c_str(), service->mName, domain);
586623
}
587624

588625
CHIP_ERROR ChipDnssdResolve(DnssdService * service, chip::Inet::InterfaceId interface, CommissioningResolveDelegate * delegate)

0 commit comments

Comments
 (0)