34 #ifndef OTBR_AGENT_MDNS_MDNSSD_HPP_
35 #define OTBR_AGENT_MDNS_MDNSSD_HPP_
48 #include "common/types.hpp"
71 void SubscribeService(
const std::string &aType,
const std::string &aInstanceName)
override;
72 void UnsubscribeService(
const std::string &aType,
const std::string &aInstanceName)
override;
77 void Stop(
void)
override;
85 otbrError PublishServiceImpl(
const std::string &aHostName,
86 const std::string &aName,
87 const std::string &aType,
88 const SubTypeList &aSubTypeList,
90 const TxtList & aTxtList,
92 otbrError PublishHostImpl(
const std::string & aName,
93 const std::vector<Ip6Address> &aAddress,
95 void OnServiceResolveFailedImpl(
const std::string &aType,
96 const std::string &aInstanceName,
97 int32_t aErrorCode)
override;
98 void OnHostResolveFailedImpl(
const std::string &aHostName, int32_t aErrorCode)
override;
99 otbrError DnsErrorToOtbrError(int32_t aErrorCode)
override;
102 static constexpr uint32_t kDefaultTtl = 10;
107 DnssdServiceRegistration(
const std::string &aHostName,
108 const std::string &aName,
109 const std::string &aType,
110 const SubTypeList &aSubTypeList,
112 const TxtList & aTxtList,
114 DNSServiceRef aServiceRef,
122 std::move(aCallback),
124 , mServiceRef(aServiceRef)
128 ~DnssdServiceRegistration(
void)
override;
129 const DNSServiceRef &GetServiceRef()
const {
return mServiceRef; }
132 DNSServiceRef mServiceRef;
138 DnssdHostRegistration(
const std::string & aName,
139 const std::vector<Ip6Address> &aAddresses,
141 DNSServiceRef aServiceRef,
144 , mServiceRef(aServiceRef)
146 , mCallbackCount(aAddresses.size())
150 ~DnssdHostRegistration(
void)
override;
151 const DNSServiceRef & GetServiceRef()
const {
return mServiceRef; }
152 const std::map<DNSRecordRef, Ip6Address> &GetRecordRefMap()
const {
return mRecordRefMap; }
153 std::map<DNSRecordRef, Ip6Address> & GetRecordRefMap() {
return mRecordRefMap; }
156 DNSServiceRef mServiceRef;
159 std::map<DNSRecordRef, Ip6Address> mRecordRefMap;
160 uint32_t mCallbackCount;
165 DNSServiceRef mServiceRef;
167 explicit ServiceRef(
void)
168 : mServiceRef(
nullptr)
172 ~ServiceRef() { Release(); }
177 void DeallocateServiceRef(
void);
180 struct ServiceSubscription;
182 struct ServiceInstanceResolution :
public ServiceRef
184 explicit ServiceInstanceResolution(ServiceSubscription &aSubscription,
185 std::string aInstanceName,
188 uint32_t aNetifIndex)
190 , mSubscription(&aSubscription)
191 , mInstanceName(std::move(aInstanceName))
192 , mTypeEndWithDot(std::move(aType))
193 , mDomain(std::move(aDomain))
194 , mNetifIndex(aNetifIndex)
199 otbrError GetAddrInfo(uint32_t aInterfaceIndex);
200 void FinishResolution(
void);
202 static void HandleResolveResult(DNSServiceRef aServiceRef,
203 DNSServiceFlags aFlags,
204 uint32_t aInterfaceIndex,
205 DNSServiceErrorType aErrorCode,
206 const char * aFullName,
207 const char * aHostTarget,
210 const unsigned char *aTxtRecord,
212 void HandleResolveResult(DNSServiceRef aServiceRef,
213 DNSServiceFlags aFlags,
214 uint32_t aInterfaceIndex,
215 DNSServiceErrorType aErrorCode,
216 const char * aFullName,
217 const char * aHostTarget,
220 const unsigned char *aTxtRecord);
221 static void HandleGetAddrInfoResult(DNSServiceRef aServiceRef,
222 DNSServiceFlags aFlags,
223 uint32_t aInterfaceIndex,
224 DNSServiceErrorType aErrorCode,
225 const char * aHostName,
226 const struct sockaddr *aAddress,
229 void HandleGetAddrInfoResult(DNSServiceRef aServiceRef,
230 DNSServiceFlags aFlags,
231 uint32_t aInterfaceIndex,
232 DNSServiceErrorType aErrorCode,
233 const char * aHostName,
234 const struct sockaddr *aAddress,
237 ServiceSubscription * mSubscription;
238 std::string mInstanceName;
239 std::string mTypeEndWithDot;
241 uint32_t mNetifIndex;
245 struct ServiceSubscription :
public ServiceRef
247 explicit ServiceSubscription(
PublisherMDnsSd &aMDnsSd, std::string aType, std::string aInstanceName)
250 , mType(std::move(aType))
251 , mInstanceName(std::move(aInstanceName))
256 void Resolve(uint32_t aNetifIndex,
257 const std::string &aInstanceName,
258 const std::string &aType,
259 const std::string &aDomain);
260 void RemoveInstanceResolution(ServiceInstanceResolution &aInstanceResolution);
262 void ProcessAll(
const MainloopContext &aMainloop, std::vector<DNSServiceRef> &aReadyServices)
const;
264 static void HandleBrowseResult(DNSServiceRef aServiceRef,
265 DNSServiceFlags aFlags,
266 uint32_t aInterfaceIndex,
267 DNSServiceErrorType aErrorCode,
268 const char * aInstanceName,
270 const char * aDomain,
272 void HandleBrowseResult(DNSServiceRef aServiceRef,
273 DNSServiceFlags aFlags,
274 uint32_t aInterfaceIndex,
275 DNSServiceErrorType aErrorCode,
276 const char * aInstanceName,
278 const char * aDomain);
282 std::string mInstanceName;
284 std::vector<std::unique_ptr<ServiceInstanceResolution>> mResolvingInstances;
287 struct HostSubscription :
public ServiceRef
289 explicit HostSubscription(
PublisherMDnsSd &aMDnsSd, std::string aHostName)
292 , mHostName(std::move(aHostName))
297 static void HandleResolveResult(DNSServiceRef aServiceRef,
298 DNSServiceFlags aFlags,
299 uint32_t aInterfaceIndex,
300 DNSServiceErrorType aErrorCode,
301 const char * aHostName,
302 const struct sockaddr *aAddress,
305 void HandleResolveResult(DNSServiceRef aServiceRef,
306 DNSServiceFlags aFlags,
307 uint32_t aInterfaceIndex,
308 DNSServiceErrorType aErrorCode,
309 const char * aHostName,
310 const struct sockaddr *aAddress,
314 std::string mHostName;
318 using ServiceSubscriptionList = std::vector<std::unique_ptr<ServiceSubscription>>;
319 using HostSubscriptionList = std::vector<std::unique_ptr<HostSubscription>>;
321 static void HandleServiceRegisterResult(DNSServiceRef aService,
322 const DNSServiceFlags aFlags,
323 DNSServiceErrorType aError,
326 const char * aDomain,
328 void HandleServiceRegisterResult(DNSServiceRef aService,
329 const DNSServiceFlags aFlags,
330 DNSServiceErrorType aError,
333 const char * aDomain);
334 static void HandleRegisterHostResult(DNSServiceRef aHostsConnection,
335 DNSRecordRef aHostRecord,
336 DNSServiceFlags aFlags,
337 DNSServiceErrorType aErrorCode,
339 void HandleRegisterHostResult(DNSServiceRef aHostsConnection,
340 DNSRecordRef aHostRecord,
341 DNSServiceFlags aFlags,
342 DNSServiceErrorType aErrorCode);
344 static std::string MakeRegType(
const std::string &aType, SubTypeList aSubTypeList);
347 HostRegistration * FindHostRegistration(
const DNSServiceRef &aServiceRef,
const DNSRecordRef &aRecordRef);
349 DNSServiceRef mHostsRef;
353 ServiceSubscriptionList mSubscribedServices;
354 HostSubscriptionList mSubscribedHosts;
365 #endif // OTBR_AGENT_MDNS_MDNSSD_HPP_