1
1
Fork 0
mirror of https://github.com/oxen-io/lokinet synced 2023-12-14 06:53:00 +01:00
lokinet/llarp/handlers/exit.hpp

180 lines
4.6 KiB
C++
Raw Normal View History

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