llarp/dtls/session.hpp

Namespaces

Name
llarp
[crypto.hpp]
llarp::dtls

Classes

Name
struct llarp::dtls::BIO_Deleter
struct llarp::dtls::SSL_CTX_Deleter
struct llarp::dtls::SSL_Deleter
struct llarp::dtls::Session

Source code

#pragma once

#include <llarp/link/session.hpp>

#include <openssl/ssl.h>

#include <deque>

namespace llarp::dtls
{
  struct LinkLayer;

  struct BIO_Deleter
  {
    void
    operator()(BIO* b) const
    {
      Delete(b);
    }
    static void
    Delete(BIO* b);
  };

  struct SSL_CTX_Deleter
  {
    void
    operator()(SSL_CTX* c) const
    {
      Delete(c);
    }
    static void
    Delete(SSL_CTX* c);
  };

  struct SSL_Deleter
  {
    void
    operator()(SSL* s) const
    {
      Delete(s);
    }
    static void
    Delete(SSL* s);
  };

  using BIO_ptr = std::unique_ptr<BIO, BIO_Deleter>;
  using SSL_CTX_ptr = std::unique_ptr<SSL_CTX, SSL_CTX_Deleter>;
  using SSL_ptr = std::unique_ptr<SSL, SSL_Deleter>;

  struct Session final : ILinkSession, std::enable_shared_from_this<Session>
  {
    Session(LinkLayer* parent, const RouterContact& rc, const AddressInfo& ai);
    Session(LinkLayer* parent, const SockAddr& from);
    ~Session() override;

    void
    Pump() override;

    void
    Tick(llarp_time_t now) override;

    bool
    SendMessageBuffer(Message_t msg, CompletionHandler handler, uint16_t priority) override;

    void
    Start() override;

    void
    Close() override;

    bool
    Recv_LL(Packet_t pkt) override;

    bool
    SendKeepAlive() override;

    bool
    IsEstablished() const override;

    bool
    TimedOut(llarp_time_t now) const override;

    PubKey
    GetPubKey() const override
    {
      return m_RemoteRC.pubkey;
    }

    bool
    IsInbound() const override
    {
      return m_Inbound;
    }

    const SockAddr&
    GetRemoteEndpoint() const override
    {
      return m_RemoteAddr;
    }

    RouterContact
    GetRemoteRC() const override
    {
      return m_RemoteRC;
    }

    size_t
    SendQueueBacklog() const override
    {
      return m_SendQueue.size();
    }

    ILinkLayer*
    GetLinkLayer() const override;

    bool
    RenegotiateSession() override;

    bool
    ShouldPing() const override;

    SessionStats
    GetSessionStats() const override;

    void
    HandlePlaintext() override;

   private:
    struct PendingSend
    {
      Message_t msg;
      CompletionHandler handler;
      uint16_t priority;
    };

    bool
    InitTLS();

    bool
    PumpHandshake();

    bool
    DrainApplicationData();

    bool
    FlushCiphertext();

    bool
    SendAppData(const Message_t& msg, CompletionHandler handler, uint16_t priority);

    LinkLayer* const m_Parent;
    const bool m_Inbound;
    const SockAddr m_RemoteAddr;
    RouterContact m_RemoteRC;

    SSL_CTX_ptr m_CTX = nullptr;
    SSL_ptr m_SSL = nullptr;
    BIO_ptr m_ReadBIO = nullptr;
    BIO_ptr m_WriteBIO = nullptr;

    bool m_Started = false;
    bool m_Established = false;
    bool m_Closed = false;

    llarp_time_t m_CreatedAt = 0s;
    llarp_time_t m_LastRX = 0s;
    llarp_time_t m_LastTX = 0s;

    SessionStats m_Stats;
    std::deque<PendingSend> m_SendQueue;
  };
}  // namespace llarp::dtls

Updated on 2026-08-23 at 15:46:34 +0000