2018-11-12 16:43:40 +00:00
|
|
|
#ifndef LLARP_HANDLERS_EXIT_HPP
|
|
|
|
#define LLARP_HANDLERS_EXIT_HPP
|
|
|
|
|
2018-12-12 01:06:46 +00:00
|
|
|
#include <exit/endpoint.hpp>
|
2018-12-12 01:12:59 +00:00
|
|
|
#include <handlers/tun.hpp>
|
2018-12-13 16:14:44 +00:00
|
|
|
#include <dns/server.hpp>
|
2018-11-12 16:43:40 +00:00
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
{
|
2019-02-11 19:45:42 +00:00
|
|
|
struct AbstractRouter;
|
2018-11-12 16:43:40 +00:00
|
|
|
namespace handlers
|
|
|
|
{
|
2019-04-19 15:10:26 +00:00
|
|
|
struct ExitEndpoint : public dns::IQueryHandler
|
2018-11-12 16:43:40 +00:00
|
|
|
{
|
2019-02-11 19:45:42 +00:00
|
|
|
ExitEndpoint(const std::string& name, AbstractRouter* r);
|
2019-07-30 23:42:13 +00:00
|
|
|
~ExitEndpoint() override;
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
void
|
2018-11-15 13:13:19 +00:00
|
|
|
Tick(llarp_time_t now);
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
bool
|
2018-11-15 13:13:19 +00:00
|
|
|
SetOption(const std::string& k, const std::string& v);
|
2018-11-12 16:43:40 +00:00
|
|
|
|
2018-11-19 13:39:35 +00:00
|
|
|
std::string
|
2018-11-15 13:13:19 +00:00
|
|
|
Name() const;
|
2018-11-14 19:53:03 +00:00
|
|
|
|
2019-05-07 16:07:44 +00:00
|
|
|
bool
|
2019-05-07 17:46:38 +00:00
|
|
|
VisitEndpointsFor(const PubKey& pk,
|
|
|
|
std::function< bool(exit::Endpoint* const) > visit);
|
2019-05-07 16:07:44 +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
|
|
|
|
2019-06-11 19:42:11 +00:00
|
|
|
bool
|
|
|
|
SupportsV6() const;
|
|
|
|
|
2018-12-13 16:14:44 +00:00
|
|
|
bool
|
2019-01-07 22:15:31 +00:00
|
|
|
ShouldHookDNSMessage(const dns::Message& msg) const override;
|
2018-12-13 16:14:44 +00:00
|
|
|
|
|
|
|
bool
|
2019-01-07 22:15:31 +00:00
|
|
|
HandleHookedDNSMessage(dns::Message&& msg,
|
|
|
|
std::function< void(dns::Message) >) override;
|
2018-12-13 16:14:44 +00:00
|
|
|
|
2018-11-14 12:23:08 +00:00
|
|
|
bool
|
2019-01-07 22:15:31 +00:00
|
|
|
AllocateNewExit(const PubKey pk, const PathID_t& path,
|
2018-11-14 12:23:08 +00:00
|
|
|
bool permitInternet);
|
|
|
|
|
2019-01-07 22:15:31 +00:00
|
|
|
exit::Endpoint*
|
|
|
|
FindEndpointByPath(const PathID_t& path);
|
2018-11-14 12:23:08 +00:00
|
|
|
|
2019-01-07 22:15:31 +00:00
|
|
|
exit::Endpoint*
|
2018-11-15 13:13:19 +00:00
|
|
|
FindEndpointByIP(huint32_t ip);
|
|
|
|
|
2018-11-14 12:23:08 +00:00
|
|
|
bool
|
2019-01-07 22:15:31 +00:00
|
|
|
UpdateEndpointPath(const PubKey& remote, const PathID_t& next);
|
2018-11-14 12:23:08 +00:00
|
|
|
|
2018-11-15 13:13:19 +00:00
|
|
|
/// handle ip packet from outside
|
|
|
|
void
|
2019-11-20 19:45:23 +00:00
|
|
|
OnInetPacket(std::vector< byte_t > buf);
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter*
|
2019-01-07 22:15:31 +00:00
|
|
|
GetRouter();
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2018-11-28 12:32:38 +00:00
|
|
|
llarp_time_t
|
|
|
|
Now() const;
|
|
|
|
|
2018-11-14 18:02:27 +00:00
|
|
|
template < typename Stats >
|
|
|
|
void
|
|
|
|
CalculateTrafficStats(Stats& stats)
|
|
|
|
{
|
|
|
|
auto itr = m_ActiveExits.begin();
|
|
|
|
while(itr != m_ActiveExits.end())
|
|
|
|
{
|
2018-11-15 21:47:05 +00:00
|
|
|
stats[itr->first].first += itr->second->TxRate();
|
|
|
|
stats[itr->first].second += itr->second->RxRate();
|
2018-11-14 18:02:27 +00:00
|
|
|
++itr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-15 13:13:19 +00:00
|
|
|
/// DO NOT CALL ME
|
2018-11-14 12:23:08 +00:00
|
|
|
void
|
2019-01-07 22:15:31 +00:00
|
|
|
DelEndpointInfo(const PathID_t& path);
|
2018-11-14 12:23:08 +00:00
|
|
|
|
2018-11-15 13:13:19 +00:00
|
|
|
/// DO NOT CALL ME
|
2018-11-14 18:02:27 +00:00
|
|
|
void
|
2019-01-07 22:15:31 +00:00
|
|
|
RemoveExit(const exit::Endpoint* ep);
|
2018-11-14 18:02:27 +00:00
|
|
|
|
2018-11-15 13:13:19 +00:00
|
|
|
bool
|
2019-02-01 01:58:06 +00:00
|
|
|
QueueOutboundTraffic(const llarp_buffer_t& buf);
|
2018-11-15 13:13:19 +00:00
|
|
|
|
|
|
|
/// sets up networking and starts traffic
|
|
|
|
bool
|
|
|
|
Start();
|
|
|
|
|
2018-12-24 16:09:05 +00:00
|
|
|
bool
|
|
|
|
Stop();
|
|
|
|
|
|
|
|
bool
|
|
|
|
ShouldRemove() const;
|
|
|
|
|
2018-11-15 16:19:24 +00:00
|
|
|
bool
|
2019-01-07 22:15:31 +00:00
|
|
|
HasLocalMappedAddrFor(const PubKey& pk) const;
|
2018-11-15 16:19:24 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
huint128_t
|
2018-11-15 13:13:19 +00:00
|
|
|
GetIfAddr() const;
|
|
|
|
|
2018-11-12 16:43:40 +00:00
|
|
|
void
|
2018-11-28 16:38:20 +00:00
|
|
|
Flush();
|
2018-11-12 16:43:40 +00:00
|
|
|
|
|
|
|
private:
|
2019-06-11 16:44:05 +00:00
|
|
|
huint128_t
|
2019-01-07 22:15:31 +00:00
|
|
|
GetIPForIdent(const PubKey pk);
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
huint128_t
|
2018-11-15 13:13:19 +00:00
|
|
|
AllocateNewAddress();
|
|
|
|
|
2018-12-13 16:14:44 +00:00
|
|
|
/// obtain ip for service node session, creates a new session if one does
|
|
|
|
/// not existing already
|
2019-06-11 16:44:05 +00:00
|
|
|
huint128_t
|
2019-01-07 22:15:31 +00:00
|
|
|
ObtainServiceNodeIP(const RouterID& router);
|
2018-12-13 16:14:44 +00:00
|
|
|
|
2019-07-26 16:19:08 +00:00
|
|
|
/// async obtain snode session and call callback when it's ready to send
|
|
|
|
void
|
|
|
|
ObtainSNodeSession(const RouterID& router,
|
|
|
|
exit::SessionReadyFunc obtainCb);
|
|
|
|
|
2018-12-13 16:14:44 +00:00
|
|
|
bool
|
2019-06-11 16:44:05 +00:00
|
|
|
QueueSNodePacket(const llarp_buffer_t& buf, huint128_t from);
|
2018-12-13 16:14:44 +00:00
|
|
|
|
2018-11-15 13:13:19 +00:00
|
|
|
void
|
2019-06-11 16:44:05 +00:00
|
|
|
MarkIPActive(huint128_t ip);
|
2018-11-15 13:13:19 +00:00
|
|
|
|
|
|
|
void
|
2019-01-07 22:15:31 +00:00
|
|
|
KickIdentOffExit(const PubKey& pk);
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-02-11 19:45:42 +00:00
|
|
|
AbstractRouter* m_Router;
|
2019-05-22 16:20:50 +00:00
|
|
|
std::shared_ptr< dns::Proxy > m_Resolver;
|
2018-11-15 21:47:05 +00:00
|
|
|
bool m_ShouldInitTun;
|
2018-11-12 16:43:40 +00:00
|
|
|
std::string m_Name;
|
2018-11-14 12:23:08 +00:00
|
|
|
bool m_PermitExit;
|
2019-01-07 22:15:31 +00:00
|
|
|
std::unordered_map< PathID_t, PubKey, PathID_t::Hash > m_Paths;
|
2018-12-23 13:29:11 +00:00
|
|
|
|
2019-01-07 22:15:31 +00:00
|
|
|
std::unordered_map< PubKey, exit::Endpoint*, PubKey::Hash > m_ChosenExits;
|
2018-12-23 13:29:11 +00:00
|
|
|
|
2019-01-07 22:15:31 +00:00
|
|
|
std::unordered_multimap< PubKey, std::unique_ptr< exit::Endpoint >,
|
|
|
|
PubKey::Hash >
|
2018-11-12 16:43:40 +00:00
|
|
|
m_ActiveExits;
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
using KeyMap_t = std::unordered_map< PubKey, huint128_t, PubKey::Hash >;
|
2018-11-15 16:05:31 +00:00
|
|
|
|
|
|
|
KeyMap_t m_KeyToIP;
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-01-07 22:15:31 +00:00
|
|
|
using SNodes_t = std::set< PubKey >;
|
2018-12-13 16:14:44 +00:00
|
|
|
/// set of pubkeys we treat as snodes
|
|
|
|
SNodes_t m_SNodeKeys;
|
|
|
|
|
|
|
|
using SNodeSessions_t =
|
2019-04-23 16:13:22 +00:00
|
|
|
std::unordered_map< RouterID, std::shared_ptr< exit::SNodeSession >,
|
2019-01-07 22:15:31 +00:00
|
|
|
RouterID::Hash >;
|
2018-12-13 16:14:44 +00:00
|
|
|
/// snode sessions we are talking to directly
|
|
|
|
SNodeSessions_t m_SNodeSessions;
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
std::unordered_map< huint128_t, PubKey, huint128_t::Hash > m_IPToKey;
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
huint128_t m_IfAddr;
|
|
|
|
huint128_t m_HigestAddr;
|
|
|
|
|
|
|
|
huint128_t m_NextAddr;
|
2019-01-07 22:15:31 +00:00
|
|
|
IPRange m_OurRange;
|
2018-11-15 13:13:19 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
std::unordered_map< huint128_t, llarp_time_t, huint128_t::Hash >
|
2018-11-15 13:13:19 +00:00
|
|
|
m_IPActivity;
|
|
|
|
|
|
|
|
llarp_tun_io m_Tun;
|
|
|
|
|
2019-01-07 22:15:31 +00:00
|
|
|
Addr m_LocalResolverAddr;
|
|
|
|
std::vector< Addr > m_UpstreamResolvers;
|
2018-12-13 16:14:44 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
using Pkt_t = net::IPPacket;
|
2018-11-15 13:13:19 +00:00
|
|
|
using PacketQueue_t =
|
2019-01-07 22:15:31 +00:00
|
|
|
util::CoDelQueue< Pkt_t, Pkt_t::GetTime, Pkt_t::PutTime,
|
2019-03-03 15:01:05 +00:00
|
|
|
Pkt_t::CompareOrder, Pkt_t::GetNow, util::NullMutex,
|
|
|
|
util::NullLock, 5, 100, 1024 >;
|
2018-11-15 13:13:19 +00:00
|
|
|
|
|
|
|
/// internet to llarp packet queue
|
|
|
|
PacketQueue_t m_InetToNetwork;
|
2019-06-11 19:42:11 +00:00
|
|
|
bool m_UseV6;
|
2018-11-12 16:43:40 +00:00
|
|
|
};
|
|
|
|
} // namespace handlers
|
|
|
|
} // namespace llarp
|
2018-11-15 01:33:00 +00:00
|
|
|
#endif
|