2019-04-21 16:44:27 +00:00
|
|
|
#ifndef LLARP_SERVICE_OUTBOUND_CONTEXT_HPP
|
|
|
|
#define LLARP_SERVICE_OUTBOUND_CONTEXT_HPP
|
|
|
|
|
|
|
|
#include <path/pathbuilder.hpp>
|
|
|
|
#include <service/sendcontext.hpp>
|
|
|
|
#include <util/status.hpp>
|
|
|
|
|
|
|
|
#include <unordered_map>
|
2019-09-20 16:56:19 +00:00
|
|
|
#include <unordered_set>
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
{
|
|
|
|
namespace service
|
|
|
|
{
|
|
|
|
struct AsyncKeyExchange;
|
|
|
|
struct Endpoint;
|
|
|
|
|
|
|
|
/// context needed to initiate an outbound hidden service session
|
2020-04-07 18:38:56 +00:00
|
|
|
struct OutboundContext : public path::Builder,
|
|
|
|
public SendContext,
|
|
|
|
public std::enable_shared_from_this<OutboundContext>
|
2019-04-21 16:44:27 +00:00
|
|
|
{
|
|
|
|
OutboundContext(const IntroSet& introSet, Endpoint* parent);
|
2019-07-30 23:42:13 +00:00
|
|
|
~OutboundContext() override;
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
util::StatusObject
|
|
|
|
ExtractStatus() const;
|
|
|
|
|
|
|
|
bool
|
|
|
|
ShouldBundleRC() const override;
|
|
|
|
|
2019-04-23 16:13:22 +00:00
|
|
|
path::PathSet_ptr
|
|
|
|
GetSelf() override
|
|
|
|
{
|
|
|
|
return shared_from_this();
|
|
|
|
}
|
|
|
|
|
2019-04-21 16:44:27 +00:00
|
|
|
bool
|
|
|
|
Stop() override;
|
|
|
|
|
|
|
|
bool
|
2019-04-23 14:28:59 +00:00
|
|
|
HandleDataDrop(path::Path_ptr p, const PathID_t& dst, uint64_t s);
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
void
|
2019-04-23 14:28:59 +00:00
|
|
|
HandlePathDied(path::Path_ptr p) override;
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
/// set to true if we are updating the remote introset right now
|
|
|
|
bool updatingIntroSet;
|
|
|
|
|
|
|
|
/// update the current selected intro to be a new best introduction
|
|
|
|
/// return true if we have changed intros
|
|
|
|
bool
|
|
|
|
ShiftIntroduction(bool rebuild = true) override;
|
|
|
|
|
2019-09-20 16:56:19 +00:00
|
|
|
/// shift the intro off the current router it is using
|
|
|
|
void
|
|
|
|
ShiftIntroRouter(const RouterID remote);
|
|
|
|
|
2019-04-21 16:44:27 +00:00
|
|
|
/// mark the current remote intro as bad
|
|
|
|
bool
|
|
|
|
MarkCurrentIntroBad(llarp_time_t now) override;
|
|
|
|
|
2019-09-20 16:56:19 +00:00
|
|
|
bool
|
|
|
|
MarkIntroBad(const Introduction& marked, llarp_time_t now);
|
|
|
|
|
2019-04-21 16:44:27 +00:00
|
|
|
/// return true if we are ready to send
|
|
|
|
bool
|
|
|
|
ReadyToSend() const;
|
|
|
|
|
|
|
|
bool
|
|
|
|
ShouldBuildMore(llarp_time_t now) const override;
|
|
|
|
|
2019-04-23 16:13:22 +00:00
|
|
|
/// pump internal state
|
2019-04-21 16:44:27 +00:00
|
|
|
/// return true to mark as dead
|
|
|
|
bool
|
2019-04-23 16:13:22 +00:00
|
|
|
Pump(llarp_time_t now);
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
/// return true if it's safe to remove ourselves
|
|
|
|
bool
|
|
|
|
IsDone(llarp_time_t now) const;
|
|
|
|
|
|
|
|
bool
|
2019-04-23 14:28:59 +00:00
|
|
|
CheckPathIsDead(path::Path_ptr p, llarp_time_t dlt);
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
AsyncGenIntro(const llarp_buffer_t& payload, ProtocolType t) override;
|
|
|
|
|
|
|
|
/// issues a lookup to find the current intro set of the remote service
|
|
|
|
void
|
2020-02-14 20:14:43 +00:00
|
|
|
UpdateIntroSet() override;
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
void
|
2019-04-23 14:28:59 +00:00
|
|
|
HandlePathBuilt(path::Path_ptr path) override;
|
2019-04-21 16:44:27 +00:00
|
|
|
|
2019-09-20 16:56:19 +00:00
|
|
|
void
|
|
|
|
HandlePathBuildTimeout(path::Path_ptr path) override;
|
|
|
|
|
2019-04-21 16:44:27 +00:00
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
SelectHop(
|
|
|
|
llarp_nodedb* db,
|
|
|
|
const std::set<RouterID>& prev,
|
|
|
|
RouterContact& cur,
|
|
|
|
size_t hop,
|
|
|
|
path::PathRole roles) override;
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
bool
|
2019-04-23 14:28:59 +00:00
|
|
|
HandleHiddenServiceFrame(path::Path_ptr p, const ProtocolFrame& frame);
|
2019-04-21 16:44:27 +00:00
|
|
|
|
|
|
|
std::string
|
|
|
|
Name() const override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
/// swap remoteIntro with next intro
|
|
|
|
void
|
|
|
|
SwapIntros();
|
|
|
|
|
|
|
|
void
|
|
|
|
OnGeneratedIntroFrame(AsyncKeyExchange* k, PathID_t p);
|
|
|
|
|
|
|
|
bool
|
2020-05-01 19:51:15 +00:00
|
|
|
OnIntroSetUpdate(const Address& addr, std::optional<IntroSet> i, const RouterID& endpoint);
|
2019-04-21 16:44:27 +00:00
|
|
|
|
2020-01-27 21:30:41 +00:00
|
|
|
const dht::Key_t location;
|
2019-04-21 16:44:27 +00:00
|
|
|
uint64_t m_UpdateIntrosetTX = 0;
|
|
|
|
IntroSet currentIntroSet;
|
|
|
|
Introduction m_NextIntro;
|
2020-04-07 18:38:56 +00:00
|
|
|
std::unordered_map<Introduction, llarp_time_t, Introduction::Hash> m_BadIntros;
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t lastShift = 0s;
|
2019-04-21 16:44:27 +00:00
|
|
|
uint16_t m_LookupFails = 0;
|
2020-04-07 18:38:56 +00:00
|
|
|
uint16_t m_BuildFails = 0;
|
2019-04-21 16:44:27 +00:00
|
|
|
};
|
|
|
|
} // namespace service
|
|
|
|
|
|
|
|
} // namespace llarp
|
|
|
|
#endif
|