diff --git a/llarp/handlers/tun.cpp b/llarp/handlers/tun.cpp index 51acaf020..1ec13199f 100644 --- a/llarp/handlers/tun.cpp +++ b/llarp/handlers/tun.cpp @@ -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 > diff --git a/llarp/handlers/tun.hpp b/llarp/handlers/tun.hpp index 1cf4d0c86..0cc4edfcf 100644 --- a/llarp/handlers/tun.hpp +++ b/llarp/handlers/tun.hpp @@ -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 diff --git a/llarp/net/ip.cpp b/llarp/net/ip.cpp index 8dba138d2..64eb0490b 100644 --- a/llarp/net/ip.cpp +++ b/llarp/net/ip.cpp @@ -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); diff --git a/llarp/path/transit_hop.cpp b/llarp/path/transit_hop.cpp index d9d5f6b37..07a164b39 100644 --- a/llarp/path/transit_hop.cpp +++ b/llarp/path/transit_hop.cpp @@ -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--; diff --git a/llarp/service/endpoint.cpp b/llarp/service/endpoint.cpp index 40bbb9e77..1f9d3e306 100644 --- a/llarp/service/endpoint.cpp +++ b/llarp/service/endpoint.cpp @@ -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();