|
|
@ -1,5 +1,6 @@
|
|
|
|
#include <algorithm>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <llarp/net/net.hpp>
|
|
|
|
#include <llarp/net/net.hpp>
|
|
|
|
|
|
|
|
#include <variant>
|
|
|
|
// harmless on other platforms
|
|
|
|
// harmless on other platforms
|
|
|
|
#define __USE_MINGW_ANSI_STDIO 1
|
|
|
|
#define __USE_MINGW_ANSI_STDIO 1
|
|
|
|
#include "tun.hpp"
|
|
|
|
#include "tun.hpp"
|
|
|
@ -297,32 +298,6 @@ namespace llarp
|
|
|
|
return msg.questions[0].IsLocalhost();
|
|
|
|
return msg.questions[0].IsLocalhost();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
|
|
|
TunEndpoint::FindAddrForIP(service::Address& addr, huint128_t ip)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
auto itr = m_IPToAddr.find(ip);
|
|
|
|
|
|
|
|
if (itr != m_IPToAddr.end() and not m_SNodes[itr->second])
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
addr = service::Address(itr->second.as_array());
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
|
|
|
TunEndpoint::FindAddrForIP(RouterID& addr, huint128_t ip)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
auto itr = m_IPToAddr.find(ip);
|
|
|
|
|
|
|
|
if (itr != m_IPToAddr.end() and m_SNodes[itr->second])
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
addr = RouterID(itr->second.as_array());
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static dns::Message&
|
|
|
|
static dns::Message&
|
|
|
|
clear_dns_message(dns::Message& msg)
|
|
|
|
clear_dns_message(dns::Message& msg)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -333,13 +308,25 @@ namespace llarp
|
|
|
|
return msg;
|
|
|
|
return msg;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::optional<std::variant<service::Address, RouterID>>
|
|
|
|
|
|
|
|
TunEndpoint::ObtainAddrForIP(huint128_t ip) const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
auto itr = m_IPToAddr.find(ip);
|
|
|
|
|
|
|
|
if (itr == m_IPToAddr.end())
|
|
|
|
|
|
|
|
return std::nullopt;
|
|
|
|
|
|
|
|
if (m_SNodes.at(itr->second))
|
|
|
|
|
|
|
|
return RouterID{itr->second.as_array()};
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
return service::Address{itr->second.as_array()};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
TunEndpoint::HandleHookedDNSMessage(dns::Message msg, std::function<void(dns::Message)> reply)
|
|
|
|
TunEndpoint::HandleHookedDNSMessage(dns::Message msg, std::function<void(dns::Message)> reply)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto ReplyToSNodeDNSWhenReady = [self = this, reply = reply](
|
|
|
|
auto ReplyToSNodeDNSWhenReady = [self = this, reply = reply](
|
|
|
|
RouterID snode, auto msg, bool isV6) -> bool {
|
|
|
|
RouterID snode, auto msg, bool isV6) -> bool {
|
|
|
|
return self->EnsurePathToSNode(snode, [=](const RouterID&, exit::BaseSession_ptr s) {
|
|
|
|
return self->EnsurePathToSNode(snode, [=](const RouterID&, exit::BaseSession_ptr s) {
|
|
|
|
self->SendDNSReply(snode, s, msg, reply, true, isV6);
|
|
|
|
self->SendDNSReply(snode, s, msg, reply, isV6);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
auto ReplyToLokiDNSWhenReady = [self = this, reply = reply](
|
|
|
|
auto ReplyToLokiDNSWhenReady = [self = this, reply = reply](
|
|
|
@ -349,7 +336,7 @@ namespace llarp
|
|
|
|
return self->EnsurePathToService(
|
|
|
|
return self->EnsurePathToService(
|
|
|
|
addr,
|
|
|
|
addr,
|
|
|
|
[=](const Address&, OutboundContext* ctx) {
|
|
|
|
[=](const Address&, OutboundContext* ctx) {
|
|
|
|
self->SendDNSReply(addr, ctx, msg, reply, false, isV6);
|
|
|
|
self->SendDNSReply(addr, ctx, msg, reply, isV6);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
2s);
|
|
|
|
2s);
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -666,17 +653,10 @@ namespace llarp
|
|
|
|
reply(msg);
|
|
|
|
reply(msg);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RouterID snodeAddr;
|
|
|
|
|
|
|
|
if (FindAddrForIP(snodeAddr, ip))
|
|
|
|
if (auto maybe = ObtainAddrForIP(ip))
|
|
|
|
{
|
|
|
|
|
|
|
|
msg.AddAReply(snodeAddr.ToString());
|
|
|
|
|
|
|
|
reply(msg);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
service::Address lokiAddr;
|
|
|
|
|
|
|
|
if (FindAddrForIP(lokiAddr, ip))
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
msg.AddAReply(lokiAddr.ToString());
|
|
|
|
std::visit([&msg](auto&& result) { msg.AddAReply(result.ToString()); }, *maybe);
|
|
|
|
reply(msg);
|
|
|
|
reply(msg);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1043,9 +1023,12 @@ namespace llarp
|
|
|
|
if (t != service::ProtocolType::TrafficV4 && t != service::ProtocolType::TrafficV6
|
|
|
|
if (t != service::ProtocolType::TrafficV4 && t != service::ProtocolType::TrafficV6
|
|
|
|
&& t != service::ProtocolType::Exit)
|
|
|
|
&& t != service::ProtocolType::Exit)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
AlignedBuffer<32> addr;
|
|
|
|
std::variant<service::Address, RouterID> addr;
|
|
|
|
bool snode = false;
|
|
|
|
if (auto maybe = GetEndpointWithConvoTag(tag))
|
|
|
|
if (!GetEndpointWithConvoTag(tag, addr, snode))
|
|
|
|
{
|
|
|
|
|
|
|
|
addr = *maybe;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
huint128_t src, dst;
|
|
|
|
huint128_t src, dst;
|
|
|
|
|
|
|
|
|
|
|
@ -1056,7 +1039,7 @@ namespace llarp
|
|
|
|
if (m_state->m_ExitEnabled)
|
|
|
|
if (m_state->m_ExitEnabled)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// exit side from exit
|
|
|
|
// exit side from exit
|
|
|
|
src = ObtainIPForAddr(addr, snode);
|
|
|
|
src = ObtainIPForAddr(addr);
|
|
|
|
if (t == service::ProtocolType::Exit)
|
|
|
|
if (t == service::ProtocolType::Exit)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (pkt.IsV4())
|
|
|
|
if (pkt.IsV4())
|
|
|
@ -1088,16 +1071,22 @@ namespace llarp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// find what exit we think this should be for
|
|
|
|
// find what exit we think this should be for
|
|
|
|
const auto mapped = m_ExitMap.FindAll(src);
|
|
|
|
const auto mapped = m_ExitMap.FindAll(src);
|
|
|
|
if (mapped.count(service::Address{addr}) == 0 or IsBogon(src))
|
|
|
|
if (IsBogon(src))
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (const auto ptr = std::get_if<service::Address>(&addr))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (mapped.count(*ptr) == 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// we got exit traffic from someone who we should not have gotten it from
|
|
|
|
// we got exit traffic from someone who we should not have gotten it from
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// snapp traffic
|
|
|
|
// snapp traffic
|
|
|
|
src = ObtainIPForAddr(addr, snode);
|
|
|
|
src = ObtainIPForAddr(addr);
|
|
|
|
dst = m_OurIP;
|
|
|
|
dst = m_OurIP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
HandleWriteIPPacket(buf, src, dst, seqno);
|
|
|
|
HandleWriteIPPacket(buf, src, dst, seqno);
|
|
|
@ -1136,10 +1125,20 @@ namespace llarp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
huint128_t
|
|
|
|
huint128_t
|
|
|
|
TunEndpoint::ObtainIPForAddr(const AlignedBuffer<32>& ident, bool snode)
|
|
|
|
TunEndpoint::ObtainIPForAddr(std::variant<service::Address, RouterID> addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
llarp_time_t now = Now();
|
|
|
|
llarp_time_t now = Now();
|
|
|
|
huint128_t nextIP = {0};
|
|
|
|
huint128_t nextIP = {0};
|
|
|
|
|
|
|
|
AlignedBuffer<32> ident{};
|
|
|
|
|
|
|
|
bool snode = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::visit([&ident](auto&& val) { ident = val.data(); }, addr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (std::get_if<RouterID>(&addr))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
snode = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// previously allocated address
|
|
|
|
// previously allocated address
|
|
|
|
auto itr = m_AddrToIP.find(ident);
|
|
|
|
auto itr = m_AddrToIP.find(ident);
|
|
|
|