fix empty config case (#1400)

* fix empty config case

* * fix case for empty ifname / ifaddr on relay
* bail if no dns server bound

* use AssignmentAcceptor
pull/1405/head
Jeff 4 years ago committed by GitHub
parent 50aea744f6
commit 3b70b99dd2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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<std::string>(
"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, "'"));
}
});

@ -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

@ -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"

@ -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();

Loading…
Cancel
Save