28
28
29
29
#include " border_agent.hpp"
30
30
31
+ #include < atomic>
31
32
#include < chrono>
32
33
#include < thread>
33
34
@@ -42,6 +43,8 @@ namespace ot {
42
43
43
44
namespace commissioner {
44
45
46
+ static std::atomic<bool > gIsDiscoverCancelled ;
47
+
45
48
struct BorderAgentOrErrorMsg
46
49
{
47
50
BorderAgent mBorderAgent ;
@@ -59,6 +62,11 @@ static int HandleRecord(const struct sockaddr *from,
59
62
size_t length,
60
63
void * user_data);
61
64
65
+ void CancelDiscoverBorderAgent ()
66
+ {
67
+ gIsDiscoverCancelled = true ;
68
+ }
69
+
62
70
Error DiscoverBorderAgent (BorderAgentHandler aBorderAgentHandler, size_t aTimeout)
63
71
{
64
72
static constexpr size_t kDefaultBufferSize = 1024 * 16 ;
@@ -67,18 +75,21 @@ Error DiscoverBorderAgent(BorderAgentHandler aBorderAgentHandler, size_t aTimeou
67
75
68
76
Error error;
69
77
uint8_t buf[kDefaultBufferSize ];
78
+ size_t borderAgentCount = 0 ;
70
79
71
80
auto begin = std::chrono::system_clock::now ();
72
81
73
82
int socket = mdns_socket_open_ipv4 ();
74
83
VerifyOrExit (socket >= 0 , error = ERROR_IO_ERROR (" failed to open mDNS IPv4 socket" ));
75
84
85
+ gIsDiscoverCancelled = false ;
86
+
76
87
if (mdns_query_send (socket, kMdnsQueryType , kServiceName , strlen (kServiceName ), buf, sizeof (buf)) != 0 )
77
88
{
78
89
ExitNow (error = ERROR_IO_ERROR (" failed to send mDNS query" ));
79
90
}
80
91
81
- while (begin + std::chrono::milliseconds (aTimeout) >= std::chrono::system_clock::now ())
92
+ while (! gIsDiscoverCancelled && begin + std::chrono::milliseconds (aTimeout) >= std::chrono::system_clock::now ())
82
93
{
83
94
BorderAgentOrErrorMsg curBorderAgentOrErrorMsg;
84
95
@@ -91,11 +102,15 @@ Error DiscoverBorderAgent(BorderAgentHandler aBorderAgentHandler, size_t aTimeou
91
102
else if (curBorderAgentOrErrorMsg.mBorderAgent .mPresentFlags != 0 )
92
103
{
93
104
aBorderAgentHandler (&curBorderAgentOrErrorMsg.mBorderAgent , ERROR_NONE);
105
+ ++borderAgentCount;
94
106
}
95
107
96
108
std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
97
109
}
98
110
111
+ VerifyOrExit (!gIsDiscoverCancelled , error = ERROR_CANCELLED (" Border Agent discovery was cancelled" ));
112
+ VerifyOrExit (borderAgentCount != 0 , error = ERROR_TIMEOUT (" Found no Border Agent" ));
113
+
99
114
exit :
100
115
if (socket >= 0 )
101
116
{
0 commit comments