11#include <promeki/config.h>
12#if PROMEKI_ENABLE_MDNS
29PROMEKI_NAMESPACE_BEGIN
106class MdnsPublisher :
public ObjectBase {
107 PROMEKI_OBJECT(MdnsPublisher, ObjectBase)
110 enum class State : uint8_t {
120 static constexpr int64_t ProbeIntervalMs = 250;
123 static constexpr int ProbeCount = 3;
126 static constexpr int64_t AnnounceIntervalMs = 1000;
129 static constexpr int AnnounceCount = 2;
141 static constexpr int MaxRenameAttempts = 8;
144 explicit MdnsPublisher(ObjectBase *parent =
nullptr);
147 ~MdnsPublisher()
override;
156 void setInstance(
const MdnsServiceInstance &instance);
159 const MdnsServiceInstance &instance()
const {
return _instance; }
170 void setAutoRename(
bool enable) { _autoRename = enable; }
173 bool autoRename()
const {
return _autoRename; }
183 void setManager(MdnsManager *manager);
186 MdnsManager *manager()
const {
return _manager; }
189 MdnsManager *effectiveManager()
const;
192 State state()
const {
return _state.value(); }
195 bool isActive()
const {
return state() != State::Idle && state() != State::Conflicted; }
233 List<MdnsRecord> records()
const;
247 void handlePacket(
const Buffer &data,
const SocketAddress &sender,
248 const NetworkInterface &iface);
255 void onManagerTick(
const TimeStamp &now);
258 PROMEKI_SIGNAL(announced, MdnsServiceInstance);
269 PROMEKI_SIGNAL(conflict, MdnsServiceInstance);
281 PROMEKI_SIGNAL(renamed, MdnsServiceInstance, MdnsServiceInstance);
283 PROMEKI_SIGNAL(withdrawn, MdnsServiceInstance);
306 static List<MdnsRecord> filterByKnownAnswers(
const List<MdnsRecord> &answers,
307 const Buffer &inboundQuery);
311 static List<MdnsRecord> composeRecords(
const MdnsServiceInstance &i);
316 void enterState(State s);
317 void advance(
const TimeStamp &now);
322 bool detectConflict(
const Buffer &data);
327 void respondToQueries(
const Buffer &data);
333 static MdnsServiceInstance bumpInstanceName(
const MdnsServiceInstance &in);
335 MdnsServiceInstance _instance;
336 MdnsManager *_manager =
nullptr;
337 mutable Mutex _stateMtx;
338 List<MdnsRecord> _records;
340 Atomic<State> _state;
341 Atomic<int> _probeIdx;
342 Atomic<int> _announceIdx;
343 Atomic<int> _renameAttempts;
344 bool _autoRename =
true;
348 TimeStamp _nextActionAt;