@@ -131,6 +131,17 @@ std::shared_ptr<uint32_t> GetCounterHolder(const char * name)
131
131
return std::make_shared<uint32_t >(0 );
132
132
}
133
133
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
+
134
145
} // namespace
135
146
136
147
namespace chip {
@@ -401,22 +412,32 @@ static void OnResolve(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t inter
401
412
}
402
413
403
414
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 )
405
416
{
406
417
ChipLogProgress (Discovery, " Resolve type=%s name=%s interface=%" PRIu32, StringOrNullMarker (type), StringOrNullMarker (name),
407
418
interfaceId);
408
419
409
420
auto err = DNSServiceCreateConnection (&sdCtx->serviceRef );
410
421
VerifyOrReturnError (kDNSServiceErr_NoError == err, sdCtx->Finalize (err));
411
422
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
+ }
420
441
421
442
auto retval = MdnsContexts::GetInstance ().Add (sdCtx, sdCtx->serviceRef );
422
443
if (retval == CHIP_NO_ERROR)
@@ -427,14 +448,14 @@ static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::In
427
448
}
428
449
429
450
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 )
431
452
{
432
453
auto counterHolder = GetCounterHolder (name);
433
454
auto sdCtx = chip::Platform::New<ResolveContext>(context, callback, addressType, name,
434
455
BrowseContext::sContextDispatchingSuccess , std::move (counterHolder));
435
456
VerifyOrReturnError (nullptr != sdCtx, CHIP_ERROR_NO_MEMORY);
436
457
437
- return Resolve (sdCtx, interfaceId, addressType, type, name);
458
+ return Resolve (sdCtx, interfaceId, addressType, type, name, domain );
438
459
}
439
460
440
461
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
444
465
auto sdCtx = chip::Platform::New<ResolveContext>(delegate, addressType, name, std::move (counterHolder));
445
466
VerifyOrReturnError (nullptr != sdCtx, CHIP_ERROR_NO_MEMORY);
446
467
447
- return Resolve (sdCtx, interfaceId, addressType, type, name);
468
+ return Resolve (sdCtx, interfaceId, addressType, type, name, nullptr );
448
469
}
449
470
450
471
} // namespace
@@ -582,7 +603,23 @@ CHIP_ERROR ChipDnssdResolve(DnssdService * service, chip::Inet::InterfaceId inte
582
603
583
604
auto regtype = GetFullType (service);
584
605
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);
586
623
}
587
624
588
625
CHIP_ERROR ChipDnssdResolve (DnssdService * service, chip::Inet::InterfaceId interface, CommissioningResolveDelegate * delegate)
0 commit comments