fix address mapping bug

pull/935/head
Jeff Becker 5 years ago committed by Jason Rhinelander
parent 5188873288
commit 0828307906

@ -336,6 +336,32 @@ namespace llarp
return msg.questions[0].IsName("localhost.loki");
}
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;
}
bool
TunEndpoint::HandleHookedDNSMessage(
dns::Message &&msg, std::function< void(dns::Message) > reply)
@ -479,18 +505,17 @@ namespace llarp
reply(msg);
return true;
}
llarp::service::Address addr(
ObtainAddrForIP< llarp::service::Address >(ip, true));
if(!addr.IsZero())
RouterID snodeAddr;
if(FindAddrForIP(snodeAddr, ip))
{
msg.AddAReply(addr.ToString(".snode"));
msg.AddAReply(snodeAddr.ToString());
reply(msg);
return true;
}
addr = ObtainAddrForIP< llarp::service::Address >(ip, false);
if(!addr.IsZero())
service::Address lokiAddr;
if(FindAddrForIP(lokiAddr, ip))
{
msg.AddAReply(addr.ToString(".loki"));
msg.AddAReply(lokiAddr.ToString());
reply(msg);
return true;
}
@ -708,7 +733,13 @@ namespace llarp
llarp::LogInfo(Name(), " allocated up to ", m_MaxIP, " on range ",
m_OurRange);
MapAddress(m_Identity.pub.Addr(), GetIfAddr(), IsSNode());
const service::Address ourAddr = m_Identity.pub.Addr();
if(not MapAddress(ourAddr, GetIfAddr(), false))
{
return false;
}
if(m_OnUp)
{
m_OnUp->NotifyAsync(NotifyParams());
@ -717,8 +748,8 @@ namespace llarp
{
vpnif->injected(vpnif, true);
}
auto itr = m_IPToAddr.find(GetIFAddr());
return itr != m_IPToAddr.end() && itr->second == m_Identity.pub.Addr();
return HasAddress(ourAddr);
}
std::unordered_map< std::string, std::string >

@ -148,22 +148,24 @@ namespace llarp
handleTickTun(void* u);
/// get a key for ip address
template < typename Addr >
Addr
template < typename Addr_t >
Addr_t
ObtainAddrForIP(huint128_t ip, bool isSNode)
{
Addr_t addr;
auto itr = m_IPToAddr.find(ip);
if(itr == m_IPToAddr.end() || m_SNodes[itr->second] != isSNode)
if(itr != m_IPToAddr.end() and m_SNodes[itr->second] == isSNode)
{
// not found
Addr addr;
addr.Zero();
return addr;
addr = Addr_t(itr->second);
}
// found
return Addr{itr->second};
return addr;
}
template < typename Addr_t >
bool
FindAddrForIP(Addr_t& addr, huint128_t ip);
bool
HasAddress(const AlignedBuffer< 32 >& addr) const
{
@ -314,6 +316,7 @@ namespace llarp
void
FlushToUser(std::function< bool(net::IPPacket&) > sendfunc);
};
} // namespace handlers
} // namespace llarp

@ -87,7 +87,7 @@ namespace llarp
bool
IPPacket::Load(const llarp_buffer_t &pkt)
{
if(pkt.sz > sizeof(buf))
if(pkt.sz > sizeof(buf) or pkt.sz == 0)
return false;
sz = pkt.sz;
std::copy_n(pkt.base, sz, buf);

@ -150,7 +150,7 @@ namespace llarp
{
LogicCall(r->logic(), flushIt);
}
if(not m_DownstreamGather.disabled())
if(m_DownstreamGather.enabled())
m_DownstreamGather.pushBack(msg);
}
m_DownstreamWorkCounter--;
@ -185,7 +185,7 @@ namespace llarp
{
LogicCall(r->logic(), flushIt);
}
if(not m_UpstreamGather.disabled())
if(m_UpstreamGather.enabled())
m_UpstreamGather.pushBack(msg);
}
m_UpstreamWorkCounter--;

@ -1136,6 +1136,8 @@ namespace llarp
Endpoint::SendToServiceOrQueue(const service::Address& remote,
const llarp_buffer_t& data, ProtocolType t)
{
if(data.sz == 0)
return false;
// inbound converstation
const auto now = Now();

Loading…
Cancel
Save