llarp/iwp/linklayer.hpp

Namespaces

Name
llarp
[crypto.hpp]
llarp::iwp

Classes

Name
struct llarp::iwp::LinkLayer

Source code

#pragma once

#include <cstdint>
#include <llarp/constants/link_layer.hpp>
#include <llarp/crypto/crypto.hpp>
#include <llarp/crypto/encrypted.hpp>
#include <llarp/crypto/types.hpp>
#include <llarp/link/server.hpp>
#include <llarp/config/key_manager.hpp>

#include <memory>

#include <llarp/ev/ev.hpp>

#include "hasher.hpp"

namespace llarp::iwp
{
  struct Session;

  struct LinkLayer final : public ILinkLayer
  {
    LinkLayer(
        std::shared_ptr<KeyManager> keyManager,
        std::shared_ptr<EventLoop> 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<ILinkSession>
    NewOutboundSession(const RouterContact& rc, const AddressInfo& ai) override;

    std::string_view
    Name() const override;

    uint16_t
    Rank() const override;

    void
    RecvFrom(const SockAddr& from, ILinkSession::Packet_t pkt) override;

    void
    WakeupPlaintext();

    std::string
    PrintableName() const;

    Hasher*
    hasher()
    {
      return &m_Hasher;
    }

    void
    TriggerHashing(std::shared_ptr<Session> s);

   private:
    void
    HandleWakeupPlaintext();

    void
    HandleWorkerCompletion();

    struct SessionAddrHash
    {
      size_t
      hash(const std::shared_ptr<Session>& s) const;

      size_t
      operator()(const std::shared_ptr<Session>& s) const
      {
        return hash(s);
      }
    };

    const std::shared_ptr<EventLoopWakeup> m_Wakeup, m_HashingWakeup;
    std::vector<ILinkSession*> m_WakingUp;
    std::unordered_set<std::shared_ptr<Session>, SessionAddrHash> m_CollectHash;

    Hasher m_Hasher;

    const bool m_Inbound;

    std::shared_ptr<Session>
    SessionForAddr(const SockAddr& addr) const;
  };

  using LinkLayer_ptr = std::shared_ptr<LinkLayer>;
}  // namespace llarp::iwp

Updated on 2026-01-10 at 22:49:45 +0000