---
title: llarp/path/ihophandler.hpp

---

# llarp/path/ihophandler.hpp



## Namespaces

| Name           |
| -------------- |
| **[llarp](Namespaces/namespacellarp.md)** <br>[crypto.hpp] |
| **[llarp::routing](Namespaces/namespacellarp_1_1routing.md)**  |
| **[llarp::path](Namespaces/namespacellarp_1_1path.md)**  |

## Classes

|                | Name           |
| -------------- | -------------- |
| struct | **[llarp::path::IHopHandler](Classes/structllarp_1_1path_1_1IHopHandler.md)**  |




## Source code

```cpp
#pragma once

#include <llarp/crypto/types.hpp>
#include <llarp/util/types.hpp>
#include <llarp/crypto/encrypted_frame.hpp>
#include <llarp/util/decaying_hashset.hpp>
#include <llarp/messages/relay.hpp>
#include <vector>

#include <memory>

struct llarp_buffer_t;

namespace llarp
{
  struct AbstractRouter;

  namespace routing
  {
    struct IMessage;
  }

  namespace path
  {
    struct IHopHandler
    {
      using TrafficEvent_t = std::pair<std::vector<byte_t>, TunnelNonce>;
      using TrafficQueue_t = std::list<TrafficEvent_t>;

      virtual ~IHopHandler() = default;

      virtual PathID_t
      RXID() const = 0;

      void
      DecayFilters(llarp_time_t now);

      virtual bool
      Expired(llarp_time_t now) const = 0;

      virtual bool
      ExpiresSoon(llarp_time_t now, llarp_time_t dlt) const = 0;

      virtual bool
      SendRoutingMessage(const routing::IMessage& msg, AbstractRouter* r) = 0;

      // handle data in upstream direction
      virtual bool
      HandleUpstream(const llarp_buffer_t& X, const TunnelNonce& Y, AbstractRouter*);
      // handle data in downstream direction
      virtual bool
      HandleDownstream(const llarp_buffer_t& X, const TunnelNonce& Y, AbstractRouter*);

      virtual llarp_time_t
      LastRemoteActivityAt() const = 0;

      virtual bool
      HandleLRSM(uint64_t status, std::array<EncryptedFrame, 8>& frames, AbstractRouter* r) = 0;

      uint64_t
      NextSeqNo()
      {
        return m_SequenceNum++;
      }

      virtual void
      FlushUpstream(AbstractRouter* r) = 0;

      virtual void
      FlushDownstream(AbstractRouter* r) = 0;

     protected:
      uint64_t m_SequenceNum = 0;
      TrafficQueue_t m_UpstreamQueue;
      TrafficQueue_t m_DownstreamQueue;
      util::DecayingHashSet<TunnelNonce> m_UpstreamReplayFilter;
      util::DecayingHashSet<TunnelNonce> m_DownstreamReplayFilter;

      virtual void
      UpstreamWork(TrafficQueue_t queue, AbstractRouter* r) = 0;

      virtual void
      DownstreamWork(TrafficQueue_t queue, AbstractRouter* r) = 0;

      virtual void
      HandleAllUpstream(std::vector<RelayUpstreamMessage> msgs, AbstractRouter* r) = 0;
      virtual void
      HandleAllDownstream(std::vector<RelayDownstreamMessage> msgs, AbstractRouter* r) = 0;
    };

    using HopHandler_ptr = std::shared_ptr<IHopHandler>;
  }  // namespace path
}  // namespace llarp
```


-------------------------------

Updated on 2022-11-08 at 16:19:49 +0000
