2018-06-10 14:05:48 +00:00
|
|
|
#ifndef LLARP_PATH_HPP
|
|
|
|
#define LLARP_PATH_HPP
|
2018-12-12 02:04:32 +00:00
|
|
|
|
2019-06-17 23:19:39 +00:00
|
|
|
#include <constants/path.hpp>
|
2019-01-14 21:46:07 +00:00
|
|
|
#include <crypto/encrypted_frame.hpp>
|
2019-01-13 16:30:07 +00:00
|
|
|
#include <crypto/types.hpp>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <messages/relay.hpp>
|
2019-06-17 23:19:39 +00:00
|
|
|
#include <path/ihophandler.hpp>
|
2019-01-11 01:19:36 +00:00
|
|
|
#include <path/path_types.hpp>
|
|
|
|
#include <path/pathbuilder.hpp>
|
|
|
|
#include <path/pathset.hpp>
|
2018-12-12 02:52:51 +00:00
|
|
|
#include <router_id.hpp>
|
2018-12-12 02:04:32 +00:00
|
|
|
#include <routing/handler.hpp>
|
|
|
|
#include <routing/message.hpp>
|
2019-04-22 18:35:19 +00:00
|
|
|
#include <service/intro.hpp>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <util/aligned.hpp>
|
2019-05-07 12:31:34 +00:00
|
|
|
#include <util/compare_ptr.hpp>
|
2019-09-01 13:26:16 +00:00
|
|
|
#include <util/thread/threading.hpp>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <util/time.hpp>
|
2018-06-10 14:05:48 +00:00
|
|
|
|
2019-04-19 18:24:33 +00:00
|
|
|
#include <algorithm>
|
2018-07-11 13:20:14 +00:00
|
|
|
#include <functional>
|
2018-06-19 17:11:24 +00:00
|
|
|
#include <list>
|
|
|
|
#include <map>
|
2018-06-10 14:05:48 +00:00
|
|
|
#include <unordered_map>
|
2020-02-10 17:12:20 +00:00
|
|
|
#include <unordered_set>
|
2018-06-10 14:05:48 +00:00
|
|
|
#include <vector>
|
|
|
|
|
2020-01-03 12:05:28 +00:00
|
|
|
#include <util/decaying_hashset.hpp>
|
|
|
|
|
2018-06-10 14:05:48 +00:00
|
|
|
namespace llarp
|
|
|
|
{
|
2019-02-11 19:45:42 +00:00
|
|
|
class Logic;
|
2019-01-29 02:16:31 +00:00
|
|
|
struct AbstractRouter;
|
2019-01-14 21:46:07 +00:00
|
|
|
struct LR_CommitMessage;
|
2019-02-11 19:45:42 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
namespace path
|
2018-06-10 14:05:48 +00:00
|
|
|
{
|
2019-06-17 23:19:39 +00:00
|
|
|
struct TransitHop;
|
|
|
|
struct TransitHopInfo;
|
2018-06-25 15:12:08 +00:00
|
|
|
|
2019-05-07 12:31:34 +00:00
|
|
|
using TransitHop_ptr = std::shared_ptr< TransitHop >;
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
/// configuration for a single hop when building a path
|
2019-04-19 15:10:26 +00:00
|
|
|
struct PathHopConfig
|
2018-06-22 00:25:30 +00:00
|
|
|
{
|
2018-06-25 15:12:08 +00:00
|
|
|
/// path id
|
|
|
|
PathID_t txID, rxID;
|
|
|
|
// router contact of router
|
2018-08-30 18:48:43 +00:00
|
|
|
RouterContact rc;
|
2018-06-25 15:12:08 +00:00
|
|
|
// temp public encryption key
|
|
|
|
SecretKey commkey;
|
|
|
|
/// shared secret at this hop
|
|
|
|
SharedSecret shared;
|
2018-07-28 22:20:32 +00:00
|
|
|
/// hash of shared secret used for nonce mutation
|
|
|
|
ShortHash nonceXOR;
|
2018-06-25 15:12:08 +00:00
|
|
|
/// next hop's router id
|
|
|
|
RouterID upstream;
|
|
|
|
/// nonce for key exchange
|
|
|
|
TunnelNonce nonce;
|
|
|
|
// lifetime
|
2020-02-24 19:40:45 +00:00
|
|
|
Time_t lifetime = default_lifetime;
|
2018-06-25 15:12:08 +00:00
|
|
|
|
2019-02-11 17:14:43 +00:00
|
|
|
util::StatusObject
|
2019-04-19 15:10:26 +00:00
|
|
|
ExtractStatus() const;
|
2018-06-25 15:12:08 +00:00
|
|
|
};
|
2018-06-22 00:25:30 +00:00
|
|
|
|
2019-06-17 23:19:39 +00:00
|
|
|
inline bool
|
|
|
|
operator<(const PathHopConfig& lhs, const PathHopConfig& rhs)
|
|
|
|
{
|
|
|
|
return std::tie(lhs.txID, lhs.rxID, lhs.rc, lhs.upstream, lhs.lifetime)
|
|
|
|
< std::tie(rhs.txID, rhs.rxID, rhs.rc, rhs.upstream, rhs.lifetime);
|
|
|
|
}
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
/// A path we made
|
2019-06-20 16:22:29 +00:00
|
|
|
struct Path final : public IHopHandler,
|
|
|
|
public routing::IMessageHandler,
|
|
|
|
public std::enable_shared_from_this< Path >
|
2018-06-25 15:12:08 +00:00
|
|
|
{
|
2019-04-23 14:28:59 +00:00
|
|
|
using BuildResultHookFunc = std::function< void(Path_ptr) >;
|
|
|
|
using CheckForDeadFunc = std::function< bool(Path_ptr, llarp_time_t) >;
|
2018-11-22 23:59:03 +00:00
|
|
|
using DropHandlerFunc =
|
2019-04-23 14:28:59 +00:00
|
|
|
std::function< bool(Path_ptr, const PathID_t&, uint64_t) >;
|
2018-11-22 23:59:03 +00:00
|
|
|
using HopList = std::vector< PathHopConfig >;
|
|
|
|
using DataHandlerFunc =
|
2019-04-23 14:28:59 +00:00
|
|
|
std::function< bool(Path_ptr, const service::ProtocolFrame&) >;
|
|
|
|
using ExitUpdatedFunc = std::function< bool(Path_ptr) >;
|
|
|
|
using ExitClosedFunc = std::function< bool(Path_ptr) >;
|
2018-11-22 23:59:03 +00:00
|
|
|
using ExitTrafficHandlerFunc =
|
2019-04-23 14:28:59 +00:00
|
|
|
std::function< bool(Path_ptr, const llarp_buffer_t&, uint64_t) >;
|
2018-11-14 18:02:27 +00:00
|
|
|
/// (path, backoff) backoff is 0 on success
|
2019-04-23 14:28:59 +00:00
|
|
|
using ObtainedExitHandler = std::function< bool(Path_ptr, llarp_time_t) >;
|
2018-08-02 00:48:43 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
HopList hops;
|
2018-07-11 16:11:19 +00:00
|
|
|
|
2019-04-23 16:13:22 +00:00
|
|
|
PathSet* const m_PathSet;
|
2018-09-26 13:04:25 +00:00
|
|
|
|
2019-04-22 17:38:29 +00:00
|
|
|
service::Introduction intro;
|
2018-07-11 16:11:19 +00:00
|
|
|
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t buildStarted = 0s;
|
2018-06-19 17:11:24 +00:00
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
Path(const std::vector< RouterContact >& routers, PathSet* parent,
|
2020-02-20 22:04:08 +00:00
|
|
|
PathRole startingRoles, std::string shortName);
|
2018-11-14 18:02:27 +00:00
|
|
|
|
2019-02-11 17:14:43 +00:00
|
|
|
util::StatusObject
|
2019-04-19 15:10:26 +00:00
|
|
|
ExtractStatus() const;
|
2019-02-08 19:43:25 +00:00
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
PathRole
|
|
|
|
Role() const
|
|
|
|
{
|
|
|
|
return _role;
|
|
|
|
}
|
|
|
|
|
2019-09-19 14:41:31 +00:00
|
|
|
struct Hash
|
|
|
|
{
|
|
|
|
size_t
|
|
|
|
operator()(const Path& p) const
|
|
|
|
{
|
|
|
|
const auto& tx = p.hops[0].txID;
|
|
|
|
const auto& rx = p.hops[0].rxID;
|
|
|
|
const auto& r = p.hops[0].upstream;
|
|
|
|
const size_t rhash =
|
|
|
|
std::accumulate(r.begin(), r.end(), 0, std::bit_xor< size_t >());
|
|
|
|
return std::accumulate(rx.begin(), rx.begin(),
|
|
|
|
std::accumulate(tx.begin(), tx.end(), rhash,
|
|
|
|
std::bit_xor< size_t >()),
|
|
|
|
std::bit_xor< size_t >());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-02-10 17:12:20 +00:00
|
|
|
/// hash for std::shared_ptr
|
2019-09-19 14:41:31 +00:00
|
|
|
struct Ptr_Hash
|
|
|
|
{
|
|
|
|
size_t
|
2020-02-10 17:12:20 +00:00
|
|
|
operator()(const Path_ptr& p) const
|
2019-09-19 14:41:31 +00:00
|
|
|
{
|
|
|
|
if(p == nullptr)
|
|
|
|
return 0;
|
|
|
|
return Hash{}(*p);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-02-10 17:12:20 +00:00
|
|
|
/// hash for std::shared_ptr by path endpoint
|
|
|
|
struct Endpoint_Hash
|
|
|
|
{
|
|
|
|
size_t
|
|
|
|
operator()(const Path_ptr& p) const
|
|
|
|
{
|
|
|
|
if(p == nullptr)
|
|
|
|
return 0;
|
|
|
|
return RouterID::Hash{}(p->Endpoint());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/// comparision for equal endpoints
|
|
|
|
struct Endpoint_Equals
|
|
|
|
{
|
|
|
|
bool
|
|
|
|
operator()(const Path_ptr& left, const Path_ptr& right) const
|
|
|
|
{
|
|
|
|
return left && right && left->Endpoint() == left->Endpoint();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/// unordered set of paths with unique endpoints
|
|
|
|
using UniqueEndpointSet_t =
|
|
|
|
std::unordered_set< Path_ptr, Endpoint_Hash, Endpoint_Equals >;
|
|
|
|
|
2019-05-07 12:31:34 +00:00
|
|
|
bool
|
|
|
|
operator<(const Path& other) const
|
|
|
|
{
|
2019-05-08 14:59:28 +00:00
|
|
|
return hops < other.hops;
|
2019-05-07 12:31:34 +00:00
|
|
|
}
|
|
|
|
|
2018-11-16 14:22:13 +00:00
|
|
|
void
|
2018-11-16 14:21:23 +00:00
|
|
|
MarkActive(llarp_time_t now)
|
|
|
|
{
|
2018-12-20 15:03:37 +00:00
|
|
|
m_LastRecvMessage = std::max(now, m_LastRecvMessage);
|
2018-11-16 14:21:23 +00:00
|
|
|
}
|
|
|
|
|
2018-11-21 12:31:36 +00:00
|
|
|
/// return true if ALL of the specified roles are supported
|
2018-11-14 18:02:27 +00:00
|
|
|
bool
|
2018-11-21 12:31:36 +00:00
|
|
|
SupportsAllRoles(PathRole roles) const
|
2018-11-14 18:02:27 +00:00
|
|
|
{
|
|
|
|
return (_role & roles) == roles;
|
|
|
|
}
|
|
|
|
|
2018-11-21 12:31:36 +00:00
|
|
|
/// return true if ANY of the specified roles are supported
|
|
|
|
bool
|
|
|
|
SupportsAnyRoles(PathRole roles) const
|
|
|
|
{
|
2019-05-07 18:15:22 +00:00
|
|
|
return roles == ePathRoleAny || (_role | roles) != 0;
|
2018-11-21 12:31:36 +00:00
|
|
|
}
|
|
|
|
|
2019-05-08 12:50:33 +00:00
|
|
|
/// clear role bits
|
|
|
|
void
|
|
|
|
ClearRoles(PathRole roles)
|
|
|
|
{
|
|
|
|
_role &= ~roles;
|
|
|
|
}
|
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
PathStatus
|
|
|
|
Status() const
|
|
|
|
{
|
|
|
|
return _status;
|
|
|
|
}
|
2018-06-19 17:11:24 +00:00
|
|
|
|
2020-02-20 21:46:07 +00:00
|
|
|
const std::string&
|
2020-02-20 21:37:39 +00:00
|
|
|
ShortName() const;
|
|
|
|
|
2019-03-11 13:58:31 +00:00
|
|
|
std::string
|
|
|
|
HopsString() const;
|
|
|
|
|
2018-12-27 14:32:37 +00:00
|
|
|
llarp_time_t
|
|
|
|
LastRemoteActivityAt() const override
|
|
|
|
{
|
|
|
|
return m_LastRecvMessage;
|
|
|
|
}
|
|
|
|
|
2019-06-04 18:31:17 +00:00
|
|
|
bool
|
|
|
|
HandleLRSM(uint64_t status, std::array< EncryptedFrame, 8 >& frames,
|
|
|
|
AbstractRouter* r) override;
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
void
|
|
|
|
SetBuildResultHook(BuildResultHookFunc func);
|
2018-06-22 00:25:30 +00:00
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
void
|
|
|
|
SetExitTrafficHandler(ExitTrafficHandlerFunc handler)
|
|
|
|
{
|
|
|
|
m_ExitTrafficHandler = handler;
|
|
|
|
}
|
|
|
|
|
2018-11-14 12:23:08 +00:00
|
|
|
void
|
|
|
|
SetCloseExitFunc(ExitClosedFunc handler)
|
|
|
|
{
|
|
|
|
m_ExitClosed = handler;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SetUpdateExitFunc(ExitUpdatedFunc handler)
|
|
|
|
{
|
|
|
|
m_ExitUpdated = handler;
|
|
|
|
}
|
|
|
|
|
2018-08-02 00:48:43 +00:00
|
|
|
void
|
|
|
|
SetDataHandler(DataHandlerFunc func)
|
|
|
|
{
|
|
|
|
m_DataHandler = func;
|
|
|
|
}
|
|
|
|
|
2018-09-11 15:28:36 +00:00
|
|
|
void
|
|
|
|
SetDropHandler(DropHandlerFunc func)
|
|
|
|
{
|
|
|
|
m_DropHandler = func;
|
|
|
|
}
|
|
|
|
|
2018-09-13 12:27:28 +00:00
|
|
|
void
|
|
|
|
SetDeadChecker(CheckForDeadFunc func)
|
|
|
|
{
|
|
|
|
m_CheckForDead = func;
|
|
|
|
}
|
|
|
|
|
2018-09-13 13:07:00 +00:00
|
|
|
void
|
2018-10-29 16:48:36 +00:00
|
|
|
EnterState(PathStatus st, llarp_time_t now);
|
2018-09-13 13:07:00 +00:00
|
|
|
|
2018-08-14 21:17:18 +00:00
|
|
|
llarp_time_t
|
|
|
|
ExpireTime() const
|
|
|
|
{
|
|
|
|
return buildStarted + hops[0].lifetime;
|
|
|
|
}
|
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
bool
|
2020-02-24 19:40:45 +00:00
|
|
|
ExpiresSoon(llarp_time_t now, llarp_time_t dlt = 5s) const override
|
2018-11-14 18:02:27 +00:00
|
|
|
{
|
|
|
|
return now >= (ExpireTime() - dlt);
|
|
|
|
}
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
bool
|
2018-11-19 13:39:35 +00:00
|
|
|
Expired(llarp_time_t now) const override;
|
2018-06-10 14:05:48 +00:00
|
|
|
|
2019-05-06 14:54:05 +00:00
|
|
|
/// build a new path on the same set of hops as us
|
|
|
|
/// regenerates keys
|
|
|
|
void
|
|
|
|
Rebuild();
|
|
|
|
|
2020-01-03 11:04:47 +00:00
|
|
|
bool
|
|
|
|
HandleUpstream(const llarp_buffer_t& X, const TunnelNonce& Y,
|
|
|
|
AbstractRouter*) override;
|
|
|
|
bool
|
|
|
|
HandleDownstream(const llarp_buffer_t& X, const TunnelNonce& Y,
|
|
|
|
AbstractRouter*) override;
|
|
|
|
|
2018-06-29 16:02:39 +00:00
|
|
|
void
|
2019-02-11 19:45:42 +00:00
|
|
|
Tick(llarp_time_t now, AbstractRouter* r);
|
2018-06-29 16:02:39 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
SendRoutingMessage(const routing::IMessage& msg,
|
|
|
|
AbstractRouter* r) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleObtainExitMessage(const routing::ObtainExitMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2018-11-14 12:23:08 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleUpdateExitVerifyMessage(const routing::UpdateExitVerifyMessage& msg,
|
|
|
|
AbstractRouter* r) override;
|
2018-11-14 12:23:08 +00:00
|
|
|
|
2018-11-12 16:43:40 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleTransferTrafficMessage(const routing::TransferTrafficMessage& msg,
|
|
|
|
AbstractRouter* r) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleUpdateExitMessage(const routing::UpdateExitMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleCloseExitMessage(const routing::CloseExitMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleGrantExitMessage(const routing::GrantExitMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-11-12 16:43:40 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleRejectExitMessage(const routing::RejectExitMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-06-19 17:11:24 +00:00
|
|
|
|
2018-09-11 15:28:36 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleDataDiscardMessage(const routing::DataDiscardMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-09-11 15:28:36 +00:00
|
|
|
|
2019-06-04 18:31:17 +00:00
|
|
|
bool
|
|
|
|
HandlePathConfirmMessage(AbstractRouter* r);
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandlePathConfirmMessage(const routing::PathConfirmMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-06-19 17:11:24 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandlePathLatencyMessage(const routing::PathLatencyMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-06-19 17:11:24 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandlePathTransferMessage(const routing::PathTransferMessage& msg,
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* r) override;
|
2018-06-26 16:23:43 +00:00
|
|
|
|
2018-08-02 00:48:43 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleHiddenServiceFrame(const service::ProtocolFrame& frame) override;
|
2018-08-02 00:48:43 +00:00
|
|
|
|
2018-07-09 17:32:11 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleGotIntroMessage(const dht::GotIntroMessage& msg);
|
2018-07-09 17:32:11 +00:00
|
|
|
|
2018-06-26 16:23:43 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
HandleDHTMessage(const dht::IMessage& msg, AbstractRouter* r) override;
|
2018-06-22 00:25:30 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
bool
|
2019-01-29 02:16:31 +00:00
|
|
|
HandleRoutingMessage(const llarp_buffer_t& buf, AbstractRouter* r);
|
2018-06-22 00:25:30 +00:00
|
|
|
|
2018-07-11 16:11:19 +00:00
|
|
|
bool
|
|
|
|
IsReady() const;
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
// Is this deprecated?
|
|
|
|
// nope not deprecated :^DDDD
|
2018-12-18 19:03:50 +00:00
|
|
|
PathID_t
|
2018-06-25 15:12:08 +00:00
|
|
|
TXID() const;
|
2018-06-23 11:28:37 +00:00
|
|
|
|
2018-07-23 07:38:29 +00:00
|
|
|
RouterID
|
|
|
|
Endpoint() const;
|
|
|
|
|
2018-12-10 17:22:59 +00:00
|
|
|
PubKey
|
|
|
|
EndpointPubKey() const;
|
|
|
|
|
2018-09-24 11:36:47 +00:00
|
|
|
bool
|
|
|
|
IsEndpoint(const RouterID& router, const PathID_t& path) const;
|
|
|
|
|
2018-12-18 19:03:50 +00:00
|
|
|
PathID_t
|
2018-06-25 15:12:08 +00:00
|
|
|
RXID() const;
|
2018-06-19 17:11:24 +00:00
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
RouterID
|
|
|
|
Upstream() const;
|
2018-06-22 13:59:28 +00:00
|
|
|
|
2018-09-13 13:07:00 +00:00
|
|
|
std::string
|
|
|
|
Name() const;
|
|
|
|
|
2018-11-14 19:34:17 +00:00
|
|
|
void
|
|
|
|
AddObtainExitHandler(ObtainedExitHandler handler)
|
|
|
|
{
|
|
|
|
m_ObtainedExitHooks.push_back(handler);
|
|
|
|
}
|
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
SendExitRequest(const routing::ObtainExitMessage& msg, AbstractRouter* r);
|
2018-11-14 18:02:27 +00:00
|
|
|
|
2018-12-24 16:09:05 +00:00
|
|
|
bool
|
2019-04-22 17:38:29 +00:00
|
|
|
SendExitClose(const routing::CloseExitMessage& msg, AbstractRouter* r);
|
2018-12-24 16:09:05 +00:00
|
|
|
|
2019-09-05 17:39:09 +00:00
|
|
|
void
|
2019-09-16 10:21:12 +00:00
|
|
|
FlushUpstream(AbstractRouter* r) override;
|
|
|
|
|
|
|
|
void
|
|
|
|
FlushDownstream(AbstractRouter* r) override;
|
2019-09-05 17:39:09 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
void
|
2019-09-16 10:21:12 +00:00
|
|
|
UpstreamWork(TrafficQueue_ptr queue, AbstractRouter* r) override;
|
2019-09-05 17:39:09 +00:00
|
|
|
|
|
|
|
void
|
2019-09-16 10:21:12 +00:00
|
|
|
DownstreamWork(TrafficQueue_ptr queue, AbstractRouter* r) override;
|
2019-09-05 17:39:09 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
HandleAllUpstream(std::vector< RelayUpstreamMessage > msgs,
|
|
|
|
AbstractRouter* r) override;
|
|
|
|
|
|
|
|
void
|
|
|
|
HandleAllDownstream(std::vector< RelayDownstreamMessage > msgs,
|
|
|
|
AbstractRouter* r) override;
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
private:
|
2018-11-14 18:02:27 +00:00
|
|
|
/// call obtained exit hooks
|
|
|
|
bool
|
|
|
|
InformExitResult(llarp_time_t b);
|
|
|
|
|
2018-06-25 15:12:08 +00:00
|
|
|
BuildResultHookFunc m_BuiltHook;
|
2018-08-02 00:48:43 +00:00
|
|
|
DataHandlerFunc m_DataHandler;
|
2018-09-11 15:28:36 +00:00
|
|
|
DropHandlerFunc m_DropHandler;
|
2018-09-13 12:27:28 +00:00
|
|
|
CheckForDeadFunc m_CheckForDead;
|
2018-11-14 12:23:08 +00:00
|
|
|
ExitUpdatedFunc m_ExitUpdated;
|
|
|
|
ExitClosedFunc m_ExitClosed;
|
2018-11-14 18:02:27 +00:00
|
|
|
ExitTrafficHandlerFunc m_ExitTrafficHandler;
|
|
|
|
std::vector< ObtainedExitHandler > m_ObtainedExitHooks;
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t m_LastRecvMessage = 0s;
|
|
|
|
llarp_time_t m_LastLatencyTestTime = 0s;
|
2018-06-26 16:23:43 +00:00
|
|
|
uint64_t m_LastLatencyTestID = 0;
|
2018-11-14 12:23:08 +00:00
|
|
|
uint64_t m_UpdateExitTX = 0;
|
|
|
|
uint64_t m_CloseExitTX = 0;
|
2018-11-14 18:02:27 +00:00
|
|
|
uint64_t m_ExitObtainTX = 0;
|
|
|
|
PathStatus _status;
|
|
|
|
PathRole _role;
|
2020-01-06 12:20:16 +00:00
|
|
|
util::DecayingHashSet< TunnelNonce > m_UpstreamReplayFilter;
|
|
|
|
util::DecayingHashSet< TunnelNonce > m_DownstreamReplayFilter;
|
2020-02-08 16:21:18 +00:00
|
|
|
uint64_t m_LastRXRate = 0;
|
|
|
|
uint64_t m_RXRate = 0;
|
|
|
|
uint64_t m_LastTXRate = 0;
|
|
|
|
uint64_t m_TXRate = 0;
|
2020-02-20 21:37:39 +00:00
|
|
|
|
2020-02-20 21:46:07 +00:00
|
|
|
const std::string m_shortName;
|
2018-06-25 15:12:08 +00:00
|
|
|
};
|
|
|
|
} // namespace path
|
2018-06-18 22:03:50 +00:00
|
|
|
} // namespace llarp
|
2018-06-10 14:05:48 +00:00
|
|
|
|
2018-06-14 20:13:07 +00:00
|
|
|
#endif
|