@@ -153,6 +153,14 @@ static void HandleNodeBrowse(void * context, DnssdService * services, size_t ser
153
153
154
154
if (error != CHIP_NO_ERROR)
155
155
{
156
+ // We don't have access to the ResolverProxy here to clear out its
157
+ // mDiscoveryContext. The underlying implementation of
158
+ // ChipDnssdStopBrowse needs to handle a possibly-stale reference
159
+ // safely, so this won't lead to crashes, but it can lead to
160
+ // mis-behavior if a stale mDiscoveryContext happens to match a newer
161
+ // browse operation.
162
+ //
163
+ // TODO: Have a way to clear that state here.
156
164
proxy->Release ();
157
165
return ;
158
166
}
@@ -174,6 +182,14 @@ static void HandleNodeBrowse(void * context, DnssdService * services, size_t ser
174
182
175
183
if (finalBrowse)
176
184
{
185
+ // We don't have access to the ResolverProxy here to clear out its
186
+ // mDiscoveryContext. The underlying implementation of
187
+ // ChipDnssdStopBrowse needs to handle a possibly-stale reference
188
+ // safely, so this won't lead to crashes, but it can lead to
189
+ // mis-behavior if a stale mDiscoveryContext happens to match a newer
190
+ // browse operation.
191
+ //
192
+ // TODO: Have a way to clear that state here.
177
193
proxy->Release ();
178
194
}
179
195
}
@@ -616,6 +632,12 @@ CHIP_ERROR DiscoveryImplPlatform::DiscoverCommissioners(DiscoveryFilter filter)
616
632
return mResolverProxy .DiscoverCommissioners (filter);
617
633
}
618
634
635
+ CHIP_ERROR DiscoveryImplPlatform::StopDiscovery ()
636
+ {
637
+ ReturnErrorOnFailure (InitImpl ());
638
+ return mResolverProxy .StopDiscovery ();
639
+ }
640
+
619
641
DiscoveryImplPlatform & DiscoveryImplPlatform::GetInstance ()
620
642
{
621
643
return sManager ;
@@ -656,6 +678,8 @@ ResolverProxy::~ResolverProxy()
656
678
657
679
CHIP_ERROR ResolverProxy::DiscoverCommissionableNodes (DiscoveryFilter filter)
658
680
{
681
+ StopDiscovery ();
682
+
659
683
VerifyOrReturnError (mDelegate != nullptr , CHIP_ERROR_INCORRECT_STATE);
660
684
mDelegate ->Retain ();
661
685
@@ -674,12 +698,17 @@ CHIP_ERROR ResolverProxy::DiscoverCommissionableNodes(DiscoveryFilter filter)
674
698
char serviceName[kMaxCommissionableServiceNameSize ];
675
699
ReturnErrorOnFailure (MakeServiceTypeName (serviceName, sizeof (serviceName), filter, DiscoveryType::kCommissionableNode ));
676
700
677
- return ChipDnssdBrowse (serviceName, DnssdServiceProtocol::kDnssdProtocolUdp , Inet::IPAddressType::kAny ,
678
- Inet::InterfaceId::Null (), HandleNodeBrowse, mDelegate );
701
+ intptr_t browseIdentifier;
702
+ ReturnErrorOnFailure (ChipDnssdBrowse (serviceName, DnssdServiceProtocol::kDnssdProtocolUdp , Inet::IPAddressType::kAny ,
703
+ Inet::InterfaceId::Null (), HandleNodeBrowse, mDelegate , &browseIdentifier));
704
+ mDiscoveryContext .Emplace (browseIdentifier);
705
+ return CHIP_NO_ERROR;
679
706
}
680
707
681
708
CHIP_ERROR ResolverProxy::DiscoverCommissioners (DiscoveryFilter filter)
682
709
{
710
+ StopDiscovery ();
711
+
683
712
VerifyOrReturnError (mDelegate != nullptr , CHIP_ERROR_INCORRECT_STATE);
684
713
mDelegate ->Retain ();
685
714
@@ -698,8 +727,24 @@ CHIP_ERROR ResolverProxy::DiscoverCommissioners(DiscoveryFilter filter)
698
727
char serviceName[kMaxCommissionerServiceNameSize ];
699
728
ReturnErrorOnFailure (MakeServiceTypeName (serviceName, sizeof (serviceName), filter, DiscoveryType::kCommissionerNode ));
700
729
701
- return ChipDnssdBrowse (serviceName, DnssdServiceProtocol::kDnssdProtocolUdp , Inet::IPAddressType::kAny ,
702
- Inet::InterfaceId::Null (), HandleNodeBrowse, mDelegate );
730
+ intptr_t browseIdentifier;
731
+ ReturnErrorOnFailure (ChipDnssdBrowse (serviceName, DnssdServiceProtocol::kDnssdProtocolUdp , Inet::IPAddressType::kAny ,
732
+ Inet::InterfaceId::Null (), HandleNodeBrowse, mDelegate , &browseIdentifier));
733
+ mDiscoveryContext .Emplace (browseIdentifier);
734
+ return CHIP_NO_ERROR;
735
+ }
736
+
737
+ CHIP_ERROR ResolverProxy::StopDiscovery ()
738
+ {
739
+ if (!mDiscoveryContext .HasValue ())
740
+ {
741
+ // No discovery going on.
742
+ return CHIP_NO_ERROR;
743
+ }
744
+
745
+ CHIP_ERROR err = ChipDnssdStopBrowse (mDiscoveryContext .Value ());
746
+ mDiscoveryContext .ClearValue ();
747
+ return err;
703
748
}
704
749
705
750
} // namespace Dnssd
0 commit comments