2018-11-12 16:43:40 +00:00
|
|
|
#ifndef LLARP_EXIT_SESSION_HPP
|
|
|
|
#define LLARP_EXIT_SESSION_HPP
|
2018-12-12 02:52:51 +00:00
|
|
|
|
|
|
|
#include <messages/exit.hpp>
|
|
|
|
#include <messages/transfer_traffic.hpp>
|
2019-01-14 21:46:07 +00:00
|
|
|
#include <net/ip.hpp>
|
2019-01-11 01:19:36 +00:00
|
|
|
#include <path/pathbuilder.hpp>
|
2018-12-12 02:52:51 +00:00
|
|
|
|
2018-11-28 16:38:20 +00:00
|
|
|
#include <deque>
|
2018-12-20 12:41:17 +00:00
|
|
|
#include <queue>
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
{
|
|
|
|
namespace exit
|
|
|
|
{
|
2019-03-01 19:10:42 +00:00
|
|
|
struct BaseSession;
|
|
|
|
|
|
|
|
using SessionReadyFunc = std::function< void(BaseSession*) >;
|
|
|
|
|
2019-02-01 01:58:06 +00:00
|
|
|
/// a persisting exit session with an exit router
|
2018-11-12 16:43:40 +00:00
|
|
|
struct BaseSession : public llarp::path::Builder
|
|
|
|
{
|
2018-11-29 13:12:35 +00:00
|
|
|
static constexpr size_t MaxUpstreamQueueLength = 256;
|
2018-12-13 12:27:14 +00:00
|
|
|
static constexpr llarp_time_t LifeSpan = 60 * 10 * 1000;
|
2018-11-29 13:12:35 +00:00
|
|
|
|
2018-11-14 19:34:17 +00:00
|
|
|
BaseSession(const llarp::RouterID& exitRouter,
|
2019-02-01 01:58:06 +00:00
|
|
|
std::function< bool(const llarp_buffer_t&) > writepkt,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r, size_t numpaths, size_t hoplen);
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2018-11-29 13:12:35 +00:00
|
|
|
virtual ~BaseSession();
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2019-02-11 17:14:43 +00:00
|
|
|
util::StatusObject
|
|
|
|
ExtractStatus() const override;
|
2019-02-08 19:43:25 +00:00
|
|
|
|
2019-03-30 13:02:10 +00:00
|
|
|
void
|
|
|
|
HandlePathDied(llarp::path::Path* p) override;
|
|
|
|
|
2018-11-12 16:43:40 +00:00
|
|
|
bool
|
|
|
|
SelectHop(llarp_nodedb* db, const RouterContact& prev, RouterContact& cur,
|
2018-11-14 18:02:27 +00:00
|
|
|
size_t hop, llarp::path::PathRole roles) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2018-11-16 14:03:13 +00:00
|
|
|
bool
|
|
|
|
ShouldBuildMore(llarp_time_t now) const override;
|
|
|
|
|
2018-11-14 19:34:17 +00:00
|
|
|
void
|
|
|
|
HandlePathBuilt(llarp::path::Path* p) override;
|
|
|
|
|
|
|
|
bool
|
2018-11-28 16:38:20 +00:00
|
|
|
QueueUpstreamTraffic(llarp::net::IPv4Packet pkt, const size_t packSize);
|
|
|
|
|
2018-12-20 12:41:17 +00:00
|
|
|
/// flush upstream and downstream traffic
|
2018-11-28 16:38:20 +00:00
|
|
|
bool
|
2018-12-20 12:41:17 +00:00
|
|
|
Flush();
|
2018-11-28 16:38:20 +00:00
|
|
|
|
2019-03-07 15:17:29 +00:00
|
|
|
path::PathRole
|
|
|
|
GetRoles() const override
|
|
|
|
{
|
|
|
|
return path::ePathRoleExit;
|
|
|
|
}
|
|
|
|
|
2018-12-24 16:09:05 +00:00
|
|
|
/// send close and stop session
|
|
|
|
bool
|
|
|
|
Stop() override;
|
|
|
|
|
2018-12-02 18:07:07 +00:00
|
|
|
bool
|
2018-11-29 13:12:35 +00:00
|
|
|
IsReady() const;
|
|
|
|
|
2018-12-10 15:44:18 +00:00
|
|
|
const llarp::RouterID
|
|
|
|
Endpoint() const
|
|
|
|
{
|
|
|
|
return m_ExitRouter;
|
|
|
|
}
|
|
|
|
|
2018-12-13 12:27:14 +00:00
|
|
|
bool
|
|
|
|
IsExpired(llarp_time_t now) const;
|
|
|
|
|
2018-12-13 16:14:44 +00:00
|
|
|
bool
|
|
|
|
LoadIdentityFromFile(const char* fname);
|
|
|
|
|
2019-03-01 19:10:42 +00:00
|
|
|
void
|
|
|
|
AddReadyHook(SessionReadyFunc func);
|
|
|
|
|
2018-11-12 16:43:40 +00:00
|
|
|
protected:
|
|
|
|
llarp::RouterID m_ExitRouter;
|
2018-12-13 16:14:44 +00:00
|
|
|
llarp::SecretKey m_ExitIdentity;
|
2019-02-01 01:58:06 +00:00
|
|
|
std::function< bool(const llarp_buffer_t&) > m_WritePacket;
|
2018-12-02 18:07:07 +00:00
|
|
|
|
|
|
|
virtual void
|
|
|
|
PopulateRequest(llarp::routing::ObtainExitMessage& msg) const = 0;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2018-11-14 19:34:17 +00:00
|
|
|
bool
|
|
|
|
HandleTrafficDrop(llarp::path::Path* p, const llarp::PathID_t& path,
|
|
|
|
uint64_t s);
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2018-11-14 19:34:17 +00:00
|
|
|
bool
|
|
|
|
HandleGotExit(llarp::path::Path* p, llarp_time_t b);
|
|
|
|
|
|
|
|
bool
|
2019-02-01 01:58:06 +00:00
|
|
|
HandleTraffic(llarp::path::Path* p, const llarp_buffer_t& buf,
|
|
|
|
uint64_t seqno);
|
2018-11-14 19:34:17 +00:00
|
|
|
|
2018-12-02 18:07:07 +00:00
|
|
|
private:
|
|
|
|
using UpstreamTrafficQueue_t =
|
|
|
|
std::deque< llarp::routing::TransferTrafficMessage >;
|
|
|
|
using TieredQueue_t = std::map< uint8_t, UpstreamTrafficQueue_t >;
|
2018-11-29 15:45:27 +00:00
|
|
|
TieredQueue_t m_Upstream;
|
2018-12-20 12:41:17 +00:00
|
|
|
|
|
|
|
using DownstreamPkt = std::pair< uint64_t, llarp::net::IPv4Packet >;
|
|
|
|
|
|
|
|
struct DownstreamPktSorter
|
|
|
|
{
|
|
|
|
bool
|
|
|
|
operator()(const DownstreamPkt& left, const DownstreamPkt& right) const
|
|
|
|
{
|
2018-12-20 13:06:36 +00:00
|
|
|
return left.first < right.first;
|
2018-12-20 12:41:17 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
using DownstreamTrafficQueue_t =
|
|
|
|
std::priority_queue< DownstreamPkt, std::vector< DownstreamPkt >,
|
|
|
|
DownstreamPktSorter >;
|
|
|
|
DownstreamTrafficQueue_t m_Downstream;
|
|
|
|
|
2018-11-29 21:19:20 +00:00
|
|
|
uint64_t m_Counter;
|
2018-12-13 12:27:14 +00:00
|
|
|
llarp_time_t m_LastUse;
|
2019-03-01 19:10:42 +00:00
|
|
|
|
|
|
|
std::vector< SessionReadyFunc > m_PendingCallbacks;
|
2019-03-07 15:17:29 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
CallPendingCallbacks(bool success);
|
2018-11-12 16:43:40 +00:00
|
|
|
};
|
|
|
|
|
2018-11-29 13:12:35 +00:00
|
|
|
struct ExitSession final : public BaseSession
|
|
|
|
{
|
|
|
|
ExitSession(const llarp::RouterID& snodeRouter,
|
2019-02-01 01:58:06 +00:00
|
|
|
std::function< bool(const llarp_buffer_t&) > writepkt,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r, size_t numpaths, size_t hoplen)
|
2018-12-02 18:07:07 +00:00
|
|
|
: BaseSession(snodeRouter, writepkt, r, numpaths, hoplen){};
|
|
|
|
|
|
|
|
~ExitSession(){};
|
|
|
|
|
2019-03-22 14:10:30 +00:00
|
|
|
std::string
|
|
|
|
Name() const override;
|
|
|
|
|
2018-12-02 18:07:07 +00:00
|
|
|
protected:
|
|
|
|
virtual void
|
|
|
|
PopulateRequest(llarp::routing::ObtainExitMessage& msg) const override
|
2018-11-29 13:12:35 +00:00
|
|
|
{
|
|
|
|
// TODO: set expiration time
|
|
|
|
msg.X = 0;
|
|
|
|
msg.E = 1;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct SNodeSession final : public BaseSession
|
|
|
|
{
|
|
|
|
SNodeSession(const llarp::RouterID& snodeRouter,
|
2019-02-01 01:58:06 +00:00
|
|
|
std::function< bool(const llarp_buffer_t&) > writepkt,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r, size_t numpaths, size_t hoplen,
|
2018-12-13 16:14:44 +00:00
|
|
|
bool useRouterSNodeKey = false);
|
2018-11-29 13:12:35 +00:00
|
|
|
|
2018-12-02 18:07:07 +00:00
|
|
|
~SNodeSession(){};
|
2018-11-29 13:12:35 +00:00
|
|
|
|
2019-03-22 14:10:30 +00:00
|
|
|
std::string
|
|
|
|
Name() const override;
|
|
|
|
|
2018-12-02 18:07:07 +00:00
|
|
|
protected:
|
|
|
|
void
|
|
|
|
PopulateRequest(llarp::routing::ObtainExitMessage& msg) const override
|
2018-11-29 13:12:35 +00:00
|
|
|
{
|
|
|
|
// TODO: set expiration time
|
|
|
|
msg.X = 0;
|
|
|
|
msg.E = 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-11-12 16:43:40 +00:00
|
|
|
} // namespace exit
|
|
|
|
} // namespace llarp
|
|
|
|
|
2018-12-10 15:44:18 +00:00
|
|
|
#endif
|