11#include <promeki/config.h>
12#if PROMEKI_ENABLE_MDNS
30PROMEKI_NAMESPACE_BEGIN
34using MdnsParsedRecord = DnsRecord;
90class MdnsBrowser :
public ObjectBase {
91 PROMEKI_OBJECT(MdnsBrowser, ObjectBase)
102 explicit MdnsBrowser(
const MdnsServiceType &type, ObjectBase *parent =
nullptr);
105 ~MdnsBrowser()
override;
117 void setManager(MdnsManager *manager);
120 MdnsManager *manager()
const {
return _manager; }
132 MdnsManager *effectiveManager()
const;
135 const MdnsServiceType &serviceType()
const {
return _type; }
148 bool isActive()
const {
return _active.value(); }
200 void onManagerTick(
const TimeStamp &now);
203 static constexpr int64_t InitialQueryIntervalMs = 1000;
206 static constexpr int64_t MaxQueryIntervalMs = 3600 * 1000;
218 static constexpr int64_t CacheFlushGraceMs = 1000;
234 static constexpr int64_t DirectedQueryDebounceMs = 2000;
245 Duration currentBackoffInterval()
const;
256 uint64_t queryFireCount()
const {
return _queryFireCount.value(); }
276 int evictExpiredAt(
const TimeStamp &now);
286 List<MdnsServiceInstance> instances()
const;
297 void handlePacket(
const Buffer &data,
const SocketAddress &sender,
298 const NetworkInterface &iface);
304 PROMEKI_SIGNAL(serviceFound, MdnsServiceInstance);
306 PROMEKI_SIGNAL(serviceUpdated, MdnsServiceInstance);
308 PROMEKI_SIGNAL(serviceLost, MdnsServiceInstance);
315 MdnsServiceInstance instance;
325 TimeStamp lastV4FlushAt;
326 TimeStamp lastV6FlushAt;
332 TimeStamp lastDirectedQuerySrvAt;
333 TimeStamp lastDirectedQueryTxtAt;
334 TimeStamp lastDirectedQueryAAt;
335 TimeStamp lastDirectedQueryAaaaAt;
336 bool foundEmitted =
false;
340 struct DirectedQuery {
342 uint16_t recordType = 0;
350 String extractInstanceLabel(
const String &targetFqdn)
const;
353 static String foldName(
const String &s);
363 void processRecord(
const MdnsParsedRecord &record,
364 const NetworkInterface &iface,
365 List<DirectedQuery> &directedQueries);
373 void planDirectedFollowups(Entry &entry,
const TimeStamp &now,
374 List<DirectedQuery> &directedQueries);
378 void issueDirectedQueries(
const List<DirectedQuery> &queries);
384 List<MdnsRecord> composeKnownAnswers()
const;
390 static bool isAddressable(
const MdnsServiceInstance &inst);
392 MdnsServiceType _type;
393 MdnsManager *_manager =
nullptr;
394 mutable Mutex _entriesMtx;
395 Map<String, Entry> _entries;
396 Atomic<bool> _active;
397 Atomic<uint64_t> _queryFireCount;
402 TimeStamp _nextQueryAt;
403 Duration _currentInterval;