llarp/iwp/worker.hpp

Namespaces

Name
llarp
[crypto.hpp]
llarp::iwp

Classes

Name
class llarp::iwp::EncryptWorker
class llarp::iwp::DecryptWorker
class llarp::iwp::Worker

Source code

#pragma once
#include <llarp/util/thread/queue.hpp>
#include <llarp/ev/ev.hpp>

#include <memory>
#include <thread>

namespace llarp
{
  struct AbstractRouter;
}

namespace llarp::iwp
{
  static constexpr size_t worker_queue_size = 128;

  struct Session;

  class EncryptWorker
  {
    std::vector<std::jthread> m_Threads;
    void
    Work();

    friend Session;

   public:
    using Packet_t = std::vector<byte_t>;
    EncryptWorker() = default;
    ~EncryptWorker();

    void
    Start(size_t threads);

    void Submit(std::weak_ptr<Session>, Packet_t);

   private:
    thread::Queue<std::pair<std::weak_ptr<Session>, Packet_t>> m_SubmitQueue{worker_queue_size};
    static void
    EncryptPacket(Session*, Packet_t);
    uint64_t m_Seq{};
  };

  class DecryptWorker
  {
    std::vector<std::jthread> m_Threads;

    void
    Work();

   public:
    using Packet_t = std::vector<byte_t>;
    DecryptWorker() = default;
    ~DecryptWorker();

    void
    Start(size_t threads);

    void Submit(std::weak_ptr<Session>, Packet_t);

   private:
    using Event_t = std::pair<uint64_t, Packet_t>;
    thread::Queue<std::pair<std::weak_ptr<Session>, Event_t>> m_SubmitQueue{worker_queue_size};
    uint64_t m_Seq{};
  };

  class Worker
  {
    EncryptWorker m_Encrypt;
    DecryptWorker m_Decrypt;

   public:
    Worker() = default;
    ~Worker() = default;

    void
    Start(size_t threads);

    void Encrypt(std::weak_ptr<Session>, EncryptWorker::Packet_t);

    void Decrypt(std::weak_ptr<Session>, DecryptWorker::Packet_t);
  };

}  // namespace llarp::iwp

Updated on 2026-04-01 at 23:35:40 +0000