34 #ifndef OTBR_AGENT_MDNS_HPP_
35 #define OTBR_AGENT_MDNS_HPP_
43 #include <sys/select.h>
45 #include "common/callback.hpp"
48 #include "common/types.hpp"
79 TxtEntry(
const char *aName,
const char *aValue)
80 :
TxtEntry(aName, reinterpret_cast<const uint8_t *>(aValue), strlen(aValue))
84 TxtEntry(
const char *aName,
const uint8_t *aValue,
size_t aValueLength)
85 :
TxtEntry(aName, strlen(aName), aValue, aValueLength)
89 TxtEntry(
const char *aName,
size_t aNameLength,
const uint8_t *aValue,
size_t aValueLength)
90 :
mName(aName, aNameLength)
91 ,
mValue(aValue, aValue + aValueLength)
95 bool operator==(
const TxtEntry &aOther)
const {
return mName == aOther.mName &&
mValue == aOther.mValue; }
98 typedef std::vector<TxtEntry> TxtList;
99 typedef std::vector<std::string> SubTypeList;
100 typedef std::vector<Ip6Address> AddressList;
174 virtual void Stop(
void) = 0;
205 const std::string &aName,
206 const std::string &aType,
207 const SubTypeList &aSubTypeList,
209 const TxtList & aTxtList,
262 virtual void SubscribeService(
const std::string &aType,
const std::string &aInstanceName) = 0;
276 virtual void UnsubscribeService(
const std::string &aType,
const std::string &aInstanceName) = 0;
288 virtual void SubscribeHost(
const std::string &aHostName) = 0;
385 static constexpr uint8_t kMaxTextEntrySize = 255;
394 : mCallback(std::move(aCallback))
395 , mPublisher(aPublisher)
402 bool IsCompleted()
const {
return mCallback.IsNull(); }
406 void TriggerCompleteCallback(
otbrError aError)
410 std::move(mCallback)(aError);
418 std::string mHostName;
421 SubTypeList mSubTypeList;
428 SubTypeList aSubTypeList,
434 , mHostName(std::move(aHostName))
435 , mName(std::move(aName))
436 , mType(std::move(aType))
437 , mSubTypeList(SortSubTypeList(std::move(aSubTypeList)))
439 , mTxtList(SortTxtList(std::move(aTxtList)))
449 bool IsOutdated(
const std::string &aHostName,
450 const std::string &aName,
451 const std::string &aType,
452 const SubTypeList &aSubTypeList,
454 const TxtList & aTxtList)
const;
461 std::vector<Ip6Address> mAddresses;
465 , mName(std::move(aName))
466 , mAddresses(SortAddressList(std::move(aAddresses)))
477 bool IsOutdated(
const std::string &aName,
const std::vector<Ip6Address> &aAddresses)
const;
480 using ServiceRegistrationPtr = std::unique_ptr<ServiceRegistration>;
481 using ServiceRegistrationMap = std::map<std::string, ServiceRegistrationPtr>;
482 using HostRegistrationPtr = std::unique_ptr<HostRegistration>;
483 using HostRegistrationMap = std::map<std::string, HostRegistrationPtr>;
485 static SubTypeList SortSubTypeList(SubTypeList aSubTypeList);
486 static TxtList SortTxtList(TxtList aTxtList);
487 static AddressList SortAddressList(AddressList aAddressList);
488 static std::string MakeFullServiceName(
const std::string &aName,
const std::string &aType);
489 static std::string MakeFullHostName(
const std::string &aName);
491 virtual otbrError PublishServiceImpl(
const std::string &aHostName,
492 const std::string &aName,
493 const std::string &aType,
494 const SubTypeList &aSubTypeList,
496 const TxtList & aTxtList,
498 virtual otbrError PublishHostImpl(
const std::string & aName,
499 const std::vector<Ip6Address> &aAddresses,
501 virtual void OnServiceResolveFailedImpl(
const std::string &aType,
502 const std::string &aInstanceName,
503 int32_t aErrorCode) = 0;
504 virtual void OnHostResolveFailedImpl(
const std::string &aHostName, int32_t aErrorCode) = 0;
506 virtual otbrError DnsErrorToOtbrError(int32_t aError) = 0;
508 void AddServiceRegistration(ServiceRegistrationPtr &&aServiceReg);
509 void RemoveServiceRegistration(
const std::string &aName,
const std::string &aType,
otbrError aError);
510 ServiceRegistration *FindServiceRegistration(
const std::string &aName,
const std::string &aType);
512 void OnServiceResolveFailed(
const std::string &aType,
const std::string &aInstanceName, int32_t aErrorCode);
513 void OnServiceRemoved(uint32_t aNetifIndex,
const std::string &aType,
const std::string &aInstanceName);
514 void OnHostResolved(
const std::string &aHostName,
const DiscoveredHostInfo &aHostInfo);
515 void OnHostResolveFailed(
const std::string &aHostName, int32_t aErrorCode);
520 ResultCallback HandleDuplicateServiceRegistration(
const std::string &aHostName,
521 const std::string &aName,
522 const std::string &aType,
523 const SubTypeList &aSubTypeList,
525 const TxtList & aTxtList,
528 ResultCallback HandleDuplicateHostRegistration(
const std::string & aName,
529 const std::vector<Ip6Address> &aAddresses,
532 void AddHostRegistration(HostRegistrationPtr &&aHostReg);
533 void RemoveHostRegistration(
const std::string &aName,
otbrError aError);
537 static void UpdateEmaLatency(uint32_t &aEmaLatency, uint32_t aLatency,
otbrError aError);
539 void UpdateServiceRegistrationEmaLatency(
const std::string &aInstanceName,
540 const std::string &aType,
542 void UpdateHostRegistrationEmaLatency(
const std::string &aHostName,
otbrError aError);
543 void UpdateServiceInstanceResolutionEmaLatency(
const std::string &aInstanceName,
544 const std::string &aType,
546 void UpdateHostResolutionEmaLatency(
const std::string &aHostName,
otbrError aError);
548 ServiceRegistrationMap mServiceRegistrations;
549 HostRegistrationMap mHostRegistrations;
551 uint64_t mNextSubscriberId = 1;
553 std::map<uint64_t, std::pair<DiscoveredServiceInstanceCallback, DiscoveredHostCallback>> mDiscoveredCallbacks;
555 std::map<std::pair<std::string, std::string>, Timepoint> mServiceRegistrationBeginTime;
557 std::map<std::string, Timepoint> mHostRegistrationBeginTime;
559 std::map<std::pair<std::string, std::string>, Timepoint> mServiceInstanceResolutionBeginTime;
561 std::map<std::string, Timepoint> mHostResolutionBeginTime;
574 #endif // OTBR_AGENT_MDNS_HPP_