#pragma once #include #include #include #include #include #include #include #include namespace llarp::iwp { struct Session; struct LinkLayer final : public ILinkLayer { LinkLayer( std::shared_ptr keyManager, std::shared_ptr ev, GetRCFunc getrc, LinkMessageHandler h, SignBufferFunc sign, BeforeConnectFunc_t before, SessionEstablishedHandler est, SessionRenegotiateHandler reneg, TimeoutHandler timeout, SessionClosedHandler closed, PumpDoneHandler pumpDone, WorkerFunc_t dowork, bool permitInbound); std::shared_ptr NewOutboundSession(const RouterContact& rc, const AddressInfo& ai) override; const char* Name() const override; uint16_t Rank() const override; void RecvFrom(const SockAddr& from, ILinkSession::Packet_t pkt) override; bool MapAddr(const RouterID& pk, ILinkSession* s) override; void UnmapAddr(const SockAddr& addr); void WakeupPlaintext(); void AddWakeup(std::weak_ptr peer); private: void HandleWakeupPlaintext(); const std::shared_ptr m_Wakeup; std::unordered_map, SockAddr::Hash> m_PlaintextRecv; std::unordered_map m_AuthedAddrs; const bool permitInbound; }; using LinkLayer_ptr = std::shared_ptr; } // namespace llarp::iwp