lokinet/llarp/handlers/exit.hpp

243 lines
5.7 KiB
C++
Raw Normal View History

#pragma once
#include "tun.hpp"
#include <llarp/dns/server.hpp>
#include <llarp/exit/endpoint.hpp>
#include <unordered_map>
2023-10-19 21:59:57 +00:00
namespace llarp
{
struct Router;
namespace handlers
{
struct ExitEndpoint : public dns::Resolver_Base, public EndpointBase
{
int
Rank() const override
{
return 0;
};
std::string_view
ResolverName() const override
{
return "snode";
}
bool
MaybeHookDNS(
std::shared_ptr<dns::PacketSource_Base> source,
const dns::Message& query,
const SockAddr& to,
const SockAddr& from) override;
ExitEndpoint(std::string name, Router* r);
2019-07-30 23:42:13 +00:00
~ExitEndpoint() override;
2021-03-26 13:16:43 +00:00
std::optional<AddressVariant_t>
GetEndpointWithConvoTag(service::ConvoTag tag) const override;
std::optional<service::ConvoTag>
GetBestConvoTagFor(AddressVariant_t addr) const override;
bool
EnsurePathTo(
AddressVariant_t addr,
std::function<void(std::optional<service::ConvoTag>)> hook,
llarp_time_t timeout) override;
void
lookup_name(std::string name, std::function<void(oxen::quic::message)> func) override;
2021-03-26 13:16:43 +00:00
const EventLoop_ptr&
Loop() override;
std::unordered_set<EndpointBase::AddressVariant_t>
AllRemoteEndpoints() const override;
void
SRVRecordsChanged() override;
void MarkAddressOutbound(service::Address) override{};
2021-06-05 13:06:17 +00:00
2021-03-26 13:16:43 +00:00
bool
2023-10-12 20:37:45 +00:00
send_to(service::ConvoTag tag, std::string payload) override;
2021-03-26 13:16:43 +00:00
void
Tick(llarp_time_t now);
void
Configure(const NetworkConfig& networkConfig, const DnsConfig& dnsConfig);
std::string
Name() const;
2018-11-14 19:53:03 +00:00
bool
2021-03-26 13:57:28 +00:00
VisitEndpointsFor(const PubKey& pk, std::function<bool(exit::Endpoint* const)> visit) const;
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;
bool
ShouldHookDNSMessage(const dns::Message& msg) const;
bool
HandleHookedDNSMessage(dns::Message msg, std::function<void(dns::Message)>);
2021-04-12 11:39:07 +00:00
void
LookupServiceAsync(
std::string name,
std::string service,
std::function<void(std::vector<dns::SRVData>)> handler) override;
2018-11-14 12:23:08 +00:00
bool
AllocateNewExit(const PubKey pk, const PathID_t& path, bool permitInternet);
2018-11-14 12:23:08 +00:00
exit::Endpoint*
FindEndpointByPath(const PathID_t& path);
2018-11-14 12:23:08 +00:00
exit::Endpoint*
FindEndpointByIP(huint32_t ip);
2018-11-14 12:23:08 +00:00
bool
UpdateEndpointPath(const PubKey& remote, const PathID_t& next);
2018-11-14 12:23:08 +00:00
/// handle ip packet from outside
void
OnInetPacket(net::IPPacket buf);
Router*
GetRouter();
2018-11-28 12:32:38 +00:00
llarp_time_t
Now() const;
template <typename Stats>
2018-11-14 18:02:27 +00:00
void
CalculateTrafficStats(Stats& stats)
{
for (auto& [pubkey, endpoint] : active_exits)
2018-11-14 18:02:27 +00:00
{
stats[pubkey].first += endpoint->TxRate();
stats[pubkey].second += endpoint->RxRate();
2018-11-14 18:02:27 +00:00
}
}
/// DO NOT CALL ME
2018-11-14 12:23:08 +00:00
void
DelEndpointInfo(const PathID_t& path);
2018-11-14 12:23:08 +00:00
/// DO NOT CALL ME
2018-11-14 18:02:27 +00:00
void
RemoveExit(const exit::Endpoint* ep);
2018-11-14 18:02:27 +00:00
bool
QueueOutboundTraffic(net::IPPacket pkt);
AddressVariant_t
LocalAddress() const override;
std::optional<SendStat>
GetStatFor(AddressVariant_t remote) const override;
/// sets up networking and starts traffic
bool
Start();
bool
Stop();
bool
ShouldRemove() const;
2018-11-15 16:19:24 +00:00
bool
HasLocalMappedAddrFor(const PubKey& pk) const;
2018-11-15 16:19:24 +00:00
2019-06-11 16:44:05 +00:00
huint128_t
GetIfAddr() const;
void
2018-11-28 16:38:20 +00:00
Flush();
link::TunnelManager*
GetQUICTunnel() override;
2021-03-26 13:16:43 +00:00
2019-06-11 16:44:05 +00:00
huint128_t
GetIPForIdent(const PubKey pk);
/// async obtain snode session and call callback when it's ready to send
void
ObtainSNodeSession(const RouterID& rid, exit::SessionReadyFunc obtain_cb);
private:
2019-06-11 16:44:05 +00:00
huint128_t
AllocateNewAddress();
/// 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
ObtainServiceNodeIP(const RouterID& router);
bool
2019-06-11 16:44:05 +00:00
QueueSNodePacket(const llarp_buffer_t& buf, huint128_t from);
void
2019-06-11 16:44:05 +00:00
MarkIPActive(huint128_t ip);
void
KickIdentOffExit(const PubKey& pk);
Router* router;
std::shared_ptr<dns::Server> resolver;
bool should_init_tun;
std::string name;
bool permit_exit;
std::unordered_map<PathID_t, PubKey> paths;
2018-12-23 13:29:11 +00:00
std::unordered_map<PubKey, exit::Endpoint*> chosen_exits;
2018-12-23 13:29:11 +00:00
std::unordered_multimap<PubKey, std::unique_ptr<exit::Endpoint>> active_exits;
std::unordered_map<PubKey, huint128_t> key_to_IP;
using SNodes_t = std::set<PubKey>;
/// set of pubkeys we treat as snodes
SNodes_t snode_keys;
using SNodeSessions_t = std::unordered_map<RouterID, std::shared_ptr<exit::SNodeSession>>;
/// snode sessions we are talking to directly
SNodeSessions_t snode_sessions;
std::unordered_map<huint128_t, PubKey> ip_to_key;
huint128_t if_addr;
huint128_t highest_addr;
2019-06-11 16:44:05 +00:00
huint128_t next_addr;
IPRange ip_range;
std::string if_name;
std::unordered_map<huint128_t, llarp_time_t> ip_activity;
std::shared_ptr<vpn::NetworkInterface> if_net;
SockAddr resolver_addr;
std::vector<SockAddr> upstream_resolvers;
2023-10-19 21:59:57 +00:00
// std::shared_ptr<link::TunnelManager> tunnel_manager;
2021-03-26 13:16:43 +00:00
2022-05-18 21:06:32 +00:00
using PacketQueue_t = std::
priority_queue<net::IPPacket, std::vector<net::IPPacket>, net::IPPacket::CompareOrder>;
/// internet to llarp packet queue
PacketQueue_t inet_to_network;
bool use_ipv6;
DnsConfig dns_conf;
};
} // namespace handlers
} // namespace llarp