34 #ifndef OTBR_AGENT_MDNS_AVAHI_HPP_
35 #define OTBR_AGENT_MDNS_AVAHI_HPP_
41 #include <avahi-client/client.h>
42 #include <avahi-client/lookup.h>
43 #include <avahi-client/publish.h>
44 #include <avahi-common/domain.h>
45 #include <avahi-common/watch.h>
79 void SubscribeService(
const std::string &aType,
const std::string &aInstanceName)
override;
80 void UnsubscribeService(
const std::string &aType,
const std::string &aInstanceName)
override;
85 void Stop(
void)
override;
88 otbrError PublishServiceImpl(
const std::string &aHostName,
89 const std::string &aName,
90 const std::string &aType,
91 const SubTypeList &aSubTypeList,
93 const TxtList & aTxtList,
95 otbrError PublishHostImpl(
const std::string & aName,
96 const std::vector<Ip6Address> &aAddresses,
98 void OnServiceResolveFailedImpl(
const std::string &aType,
99 const std::string &aInstanceName,
100 int32_t aErrorCode)
override;
101 void OnHostResolveFailedImpl(
const std::string &aHostName, int32_t aErrorCode)
override;
102 otbrError DnsErrorToOtbrError(int32_t aErrorCode)
override;
105 static constexpr
size_t kMaxSizeOfTxtRecord = 1024;
106 static constexpr uint32_t kDefaultTtl = 10;
111 AvahiServiceRegistration(
const std::string &aHostName,
112 const std::string &aName,
113 const std::string &aType,
114 const SubTypeList &aSubTypeList,
116 const TxtList & aTxtList,
118 AvahiEntryGroup * aEntryGroup,
126 std::move(aCallback),
128 , mEntryGroup(aEntryGroup)
132 ~AvahiServiceRegistration(
void)
override;
133 const AvahiEntryGroup *GetEntryGroup(
void)
const {
return mEntryGroup; }
136 AvahiEntryGroup *mEntryGroup;
142 AvahiHostRegistration(
const std::string & aName,
143 const std::vector<Ip6Address> &aAddresses,
145 AvahiEntryGroup * aEntryGroup,
148 , mEntryGroup(aEntryGroup)
152 ~AvahiHostRegistration(
void)
override;
153 const AvahiEntryGroup *GetEntryGroup(
void)
const {
return mEntryGroup; }
156 AvahiEntryGroup *mEntryGroup;
164 : mPublisherAvahi(&aPublisherAvahi)
169 struct ServiceSubscription :
public Subscription
171 explicit ServiceSubscription(
PublisherAvahi &aPublisherAvahi, std::string aType, std::string aInstanceName)
172 : Subscription(aPublisherAvahi)
173 , mType(std::move(aType))
174 , mInstanceName(std::move(aInstanceName))
175 , mServiceBrowser(
nullptr)
179 ~ServiceSubscription() { Release(); }
183 void Resolve(uint32_t aInterfaceIndex,
184 AvahiProtocol aProtocol,
185 const std::string &aInstanceName,
186 const std::string &aType);
187 void AddServiceResolver(AvahiServiceResolver *aServiceResolver);
188 void RemoveServiceResolver(AvahiServiceResolver *aServiceResolver);
190 static void HandleBrowseResult(AvahiServiceBrowser * aServiceBrowser,
191 AvahiIfIndex aInterfaceIndex,
192 AvahiProtocol aProtocol,
193 AvahiBrowserEvent aEvent,
196 const char * aDomain,
197 AvahiLookupResultFlags aFlags,
200 void HandleBrowseResult(AvahiServiceBrowser * aServiceBrowser,
201 AvahiIfIndex aInterfaceIndex,
202 AvahiProtocol aProtocol,
203 AvahiBrowserEvent aEvent,
206 const char * aDomain,
207 AvahiLookupResultFlags aFlags);
209 static void HandleResolveResult(AvahiServiceResolver * aServiceResolver,
210 AvahiIfIndex aInterfaceIndex,
211 AvahiProtocol Protocol,
212 AvahiResolverEvent aEvent,
215 const char * aDomain,
216 const char * aHostName,
217 const AvahiAddress * aAddress,
219 AvahiStringList * aTxt,
220 AvahiLookupResultFlags aFlags,
223 void HandleResolveResult(AvahiServiceResolver * aServiceResolver,
224 AvahiIfIndex aInterfaceIndex,
225 AvahiProtocol Protocol,
226 AvahiResolverEvent aEvent,
229 const char * aDomain,
230 const char * aHostName,
231 const AvahiAddress * aAddress,
233 AvahiStringList * aTxt,
234 AvahiLookupResultFlags aFlags);
237 std::string mInstanceName;
238 AvahiServiceBrowser * mServiceBrowser;
239 std::set<AvahiServiceResolver *> mServiceResolvers;
242 struct HostSubscription :
public Subscription
244 explicit HostSubscription(
PublisherAvahi &aAvahiPublisher, std::string aHostName)
245 : Subscription(aAvahiPublisher)
246 , mHostName(std::move(aHostName))
247 , mRecordBrowser(
nullptr)
251 ~HostSubscription() { Release(); }
255 static void HandleResolveResult(AvahiRecordBrowser * aRecordBrowser,
256 AvahiIfIndex aInterfaceIndex,
257 AvahiProtocol aProtocol,
258 AvahiBrowserEvent aEvent,
264 AvahiLookupResultFlags aFlags,
267 void HandleResolveResult(AvahiRecordBrowser * aRecordBrowser,
268 AvahiIfIndex aInterfaceIndex,
269 AvahiProtocol aProtocol,
270 AvahiBrowserEvent aEvent,
276 AvahiLookupResultFlags aFlags);
278 std::string mHostName;
280 AvahiRecordBrowser *mRecordBrowser;
283 typedef std::vector<std::unique_ptr<ServiceSubscription>> ServiceSubscriptionList;
284 typedef std::vector<std::unique_ptr<HostSubscription>> HostSubscriptionList;
286 static void HandleClientState(AvahiClient *aClient, AvahiClientState aState,
void *aContext);
287 void HandleClientState(AvahiClient *aClient, AvahiClientState aState);
289 AvahiEntryGroup *CreateGroup(AvahiClient *aClient);
290 static void ReleaseGroup(AvahiEntryGroup *aGroup);
292 static void HandleGroupState(AvahiEntryGroup *aGroup, AvahiEntryGroupState aState,
void *aContext);
293 void HandleGroupState(AvahiEntryGroup *aGroup, AvahiEntryGroupState aState);
294 void CallHostOrServiceCallback(AvahiEntryGroup *aGroup,
otbrError aError);
296 static otbrError TxtListToAvahiStringList(
const TxtList & aTxtList,
297 AvahiStringList * aBuffer,
299 AvahiStringList *&aHead);
302 HostRegistration * FindHostRegistration(
const AvahiEntryGroup *aEntryGroup);
304 AvahiClient * mClient;
305 std::unique_ptr<AvahiPoller> mPoller;
309 ServiceSubscriptionList mSubscribedServices;
310 HostSubscriptionList mSubscribedHosts;
320 #endif // OTBR_AGENT_MDNS_AVAHI_HPP_