diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index 2e7501137..786c6ba0c 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -480,16 +480,7 @@ namespace llarp "Interface name for lokinet traffic. If unset lokinet will look for a free name", "lokinetN, starting at 0 (e.g. lokinet0, lokinet1, ...).", }, - [this](std::string arg) { - if (arg.empty()) - { - const auto maybe = llarp::FindFreeTun(); - if (not maybe) - throw std::invalid_argument("cannot determine free interface name"); - arg = *maybe; - } - m_ifname = arg; - }); + AssignmentAcceptor(m_ifname)); conf.defineOption( "network", @@ -500,17 +491,9 @@ namespace llarp "lokinet will attempt to find an unused private range.", }, [this](std::string arg) { - if (arg.empty()) - { - const auto maybe = llarp::FindFreeRange(); - if (not maybe) - throw std::invalid_argument("cannot determine free ip range"); - m_ifaddr = *maybe; - return; - } if (not m_ifaddr.FromString(arg)) { - throw std::invalid_argument(stringify("[network]:ifaddr invalid value: ", arg)); + throw std::invalid_argument(stringify("[network]:ifaddr invalid value: '", arg, "'")); } }); diff --git a/llarp/dns/server.cpp b/llarp/dns/server.cpp index 0f22a3082..44622e1a9 100644 --- a/llarp/dns/server.cpp +++ b/llarp/dns/server.cpp @@ -49,10 +49,7 @@ namespace llarp LogicCall(m_ClientLogic, [=]() { llarp_ev_add_udp(self->m_ClientLoop.get(), &self->m_Client, any.createSockAddr()); }); - LogicCall(m_ServerLogic, [=]() { - llarp_ev_add_udp(self->m_ServerLoop.get(), &self->m_Server, addr.createSockAddr()); - }); - return true; + return llarp_ev_add_udp(self->m_ServerLoop.get(), &self->m_Server, addr.createSockAddr()); } static Proxy::Buffer_t diff --git a/llarp/handlers/exit.cpp b/llarp/handlers/exit.cpp index ca0b17e15..9ffcd7f66 100644 --- a/llarp/handlers/exit.cpp +++ b/llarp/handlers/exit.cpp @@ -551,6 +551,13 @@ namespace llarp m_UpstreamResolvers = dnsConfig.m_upstreamDNS; m_OurRange = networkConfig.m_ifaddr; + if (!m_OurRange.addr.h) + { + const auto maybe = llarp::FindFreeRange(); + if (not maybe.has_value()) + throw std::runtime_error("cannot find free interface range"); + m_OurRange = *maybe; + } const auto host_str = m_OurRange.BaseAddressString(); // string, or just a plain char array? strncpy(m_Tun.ifaddr, host_str.c_str(), sizeof(m_Tun.ifaddr) - 1); @@ -570,12 +577,19 @@ namespace llarp m_HigestAddr); m_UseV6 = not m_OurRange.IsV4(); - if (networkConfig.m_ifname.length() >= sizeof(m_Tun.ifname)) + std::string ifname = networkConfig.m_ifname; + if (ifname.empty()) + { + const auto maybe = llarp::FindFreeTun(); + if (not maybe.has_value()) + throw std::runtime_error("cannot find free interface name"); + ifname = *maybe; + } + if (ifname.length() >= sizeof(m_Tun.ifname)) { - throw std::invalid_argument( - stringify(Name() + " ifname '", networkConfig.m_ifname, "' is too long")); + throw std::invalid_argument(stringify(Name() + " ifname '", ifname, "' is too long")); } - strncpy(m_Tun.ifname, networkConfig.m_ifname.c_str(), sizeof(m_Tun.ifname) - 1); + strncpy(m_Tun.ifname, ifname.c_str(), sizeof(m_Tun.ifname) - 1); LogInfo(Name(), " set ifname to ", m_Tun.ifname); // TODO: "exit-whitelist" and "exit-blacklist" diff --git a/llarp/handlers/tun.cpp b/llarp/handlers/tun.cpp index 354d25789..33e4d1029 100644 --- a/llarp/handlers/tun.cpp +++ b/llarp/handlers/tun.cpp @@ -199,6 +199,13 @@ namespace llarp } std::string ifname = conf.m_ifname; + if (ifname.empty()) + { + const auto maybe = llarp::FindFreeTun(); + if (not maybe.has_value()) + throw std::runtime_error("cannot find free interface name"); + ifname = *maybe; + } if (tunif) { if (ifname.length() >= sizeof(tunif->ifname)) @@ -210,6 +217,16 @@ namespace llarp llarp::LogInfo(Name() + " setting ifname to ", tunif->ifname); m_OurRange = conf.m_ifaddr; + if (!m_OurRange.addr.h) + { + const auto maybe = llarp::FindFreeRange(); + if (not maybe.has_value()) + { + throw std::runtime_error("cannot find free address range"); + } + m_OurRange = *maybe; + } + m_UseV6 = not m_OurRange.IsV4(); tunif->netmask = m_OurRange.HostmaskBits(); const auto addr = m_OurRange.BaseAddressString();