#ifndef LLARP_IWP_LINKLAYER_HPP #define LLARP_IWP_LINKLAYER_HPP #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); ~LinkLayer() override; 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(); EventLoopWakeup* const 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 #endif