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_