Refactor TunEndpoint::Configure() (partially)

pull/1246/head
Stephen Shelton 4 years ago committed by Jeff Becker
parent f2a26adcaa
commit 960dc37c1f
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -1,4 +1,5 @@
#include <algorithm> #include <algorithm>
#include "net/net.hpp"
// harmless on other platforms // harmless on other platforms
#define __USE_MINGW_ANSI_STDIO 1 #define __USE_MINGW_ANSI_STDIO 1
#include <handlers/tun.hpp> #include <handlers/tun.hpp>
@ -104,27 +105,22 @@ namespace llarp
} }
bool bool
TunEndpoint::Configure(const NetworkConfig& conf) TunEndpoint::Configure(const NetworkConfig& conf, const DnsConfig& dnsConf)
{ {
/* if (conf.m_reachable)
if (k == "reachable")
{ {
if (IsFalseValue(v))
{
m_PublishIntroSet = false;
LogInfo(Name(), " setting to be not reachable by default");
}
else if (IsTrueValue(v))
{
m_PublishIntroSet = true; m_PublishIntroSet = true;
LogInfo(Name(), " setting to be reachable by default"); LogInfo(Name(), " setting to be reachable by default");
}
else
{
LogError(Name(), " config option reachable = '", v, "' does not make sense");
return false;
}
} }
else
{
m_PublishIntroSet = false;
LogInfo(Name(), " setting to be not reachable by default");
}
/*
* TODO: reinstate this option (it's not even clear what section this came from...)
*
if (k == "isolate-network" && IsTrueValue(v.c_str())) if (k == "isolate-network" && IsTrueValue(v.c_str()))
{ {
#if defined(__linux__) #if defined(__linux__)
@ -141,6 +137,12 @@ namespace llarp
return false; return false;
#endif #endif
} }
*/
/*
* TODO: this is currently defined for [router] / RouterConfig, but is clearly an [endpoint]
* option. either move it to [endpoint] or plumb RouterConfig through
*
if (k == "strict-connect") if (k == "strict-connect")
{ {
RouterID connect; RouterID connect;
@ -164,27 +166,29 @@ namespace llarp
} }
return true; return true;
} }
// Name won't be set because we need to read the config before we can read */
// the keyfile
if (k == "exit-node") #ifdef LOKINET_EXITS
if (not conf.m_exitNode.empty())
{ {
IPRange exitRange; IPRange exitRange;
llarp::RouterID exitRouter; llarp::RouterID exitRouter;
std::string routerStr; std::string routerStr;
const auto pos = v.find(","); const auto pos = conf.m_exitNode.find(",");
if (pos != std::string::npos) if (pos != std::string::npos)
{ {
auto range_str = v.substr(1 + pos); auto range_str = conf.m_exitNode.substr(1 + pos);
if (!exitRange.FromString(range_str)) if (!exitRange.FromString(range_str))
{ {
LogError("bad exit range: '", range_str, "'"); LogError("bad exit range: '", range_str, "'");
return false; return false;
} }
routerStr = v.substr(0, pos); routerStr = conf.m_exitNode.substr(0, pos);
} }
else else
{ {
routerStr = v; routerStr = conf.m_exitNode;
} }
routerStr = str(TrimWhitespace(routerStr)); routerStr = str(TrimWhitespace(routerStr));
if (!(exitRouter.FromString(routerStr) if (!(exitRouter.FromString(routerStr)
@ -203,54 +207,31 @@ namespace llarp
m_ExitMap.Insert(exitRange, exit); m_ExitMap.Insert(exitRange, exit);
llarp::LogInfo(Name(), " using exit at ", exitRouter, " for ", exitRange); llarp::LogInfo(Name(), " using exit at ", exitRouter, " for ", exitRange);
} }
if (k == "local-dns") #endif
{
std::string resolverAddr = v; m_LocalResolverAddr = dnsConf.m_bind;
uint16_t dnsport = 53; m_UpstreamResolvers = dnsConf.m_upstreamDNS;
auto pos = v.find(":");
if (pos != std::string::npos) if (not conf.m_mapAddr.empty())
{
resolverAddr = v.substr(0, pos);
dnsport = std::atoi(v.substr(pos + 1).c_str());
}
m_LocalResolverAddr = llarp::Addr(resolverAddr, dnsport);
// this field is ignored on all other platforms
tunif->dnsaddr = m_LocalResolverAddr.ton();
llarp::LogInfo(Name(), " binding DNS server to ", m_LocalResolverAddr);
}
if (k == "upstream-dns")
{
std::string resolverAddr = v;
uint16_t dnsport = 53;
auto pos = v.find(":");
if (pos != std::string::npos)
{
resolverAddr = v.substr(0, pos);
dnsport = std::atoi(v.substr(pos + 1).c_str());
}
m_UpstreamResolvers.emplace_back(resolverAddr, dnsport);
llarp::LogInfo(Name(), " adding upstream DNS server ", resolverAddr, ":", dnsport);
}
if (k == "mapaddr")
{ {
auto pos = v.find(":"); auto pos = conf.m_mapAddr.find(":");
if (pos == std::string::npos) if (pos == std::string::npos)
{ {
llarp::LogError( llarp::LogError(
"Cannot map address ", "Cannot map address ",
v, conf.m_mapAddr,
" invalid format, missing colon (:), expects " " invalid format, missing colon (:), expects "
"address.loki:ip.address.goes.here"); "address.loki:ip.address.goes.here");
return false; return false;
} }
service::Address addr; service::Address addr;
auto addr_str = v.substr(0, pos); auto addr_str = conf.m_mapAddr.substr(0, pos);
if (!addr.FromString(addr_str)) if (!addr.FromString(addr_str))
{ {
llarp::LogError(Name() + " cannot map invalid address ", addr_str); llarp::LogError(Name() + " cannot map invalid address ", addr_str);
return false; return false;
} }
auto ip_str = v.substr(pos + 1); auto ip_str = conf.m_mapAddr.substr(pos + 1);
huint32_t ip; huint32_t ip;
huint128_t ipv6; huint128_t ipv6;
if (ip.FromString(ip_str)) if (ip.FromString(ip_str))
@ -265,41 +246,51 @@ namespace llarp
llarp::LogError(Name(), "failed to map ", ip_str, " failed to parse IP"); llarp::LogError(Name(), "failed to map ", ip_str, " failed to parse IP");
return false; return false;
} }
return MapAddress(addr, ipv6, false);
if (not MapAddress(addr, ipv6, false))
return false;
} }
if (k == "ifname" && tunif)
std::string ifname = conf.m_ifname;
if (ifname.empty())
ifname = FindFreeTun();
LogWarn("ifname @ TunEndpoint: ", ifname);
if (tunif)
{ {
if (v.length() >= sizeof(tunif->ifname)) if (ifname.length() >= sizeof(tunif->ifname))
{ {
llarp::LogError(Name() + " ifname '", v, "' is too long"); llarp::LogError(Name() + " ifname '", ifname, "' is too long");
return false; return false;
} }
strncpy(tunif->ifname, v.c_str(), sizeof(tunif->ifname) - 1); strncpy(tunif->ifname, ifname.c_str(), sizeof(tunif->ifname) - 1);
llarp::LogInfo(Name() + " setting ifname to ", tunif->ifname); llarp::LogInfo(Name() + " setting ifname to ", tunif->ifname);
return true;
} }
if (k == "ifaddr" && tunif)
std::string ifaddr = conf.m_ifaddr;
if (ifaddr.empty())
ifaddr = FindFreeRange();
LogWarn("ifaddr @ TunEndpoint: ", ifaddr);
if (tunif)
{ {
std::string addr; std::string addr;
m_UseV6 = addr.find(":") != std::string::npos; m_UseV6 = addr.find(":") != std::string::npos;
auto pos = v.find("/"); auto pos = ifaddr.find("/");
if (pos != std::string::npos) if (pos != std::string::npos)
{ {
int num; std::string part = ifaddr.substr(pos + 1);
std::string part = v.substr(pos + 1); int num = std::stoi(part);
#if defined(ANDROID) || defined(RPI)
num = atoi(part.c_str());
#else
num = std::stoi(part);
#endif
if (num > 0) if (num > 0)
{ {
tunif->netmask = num; tunif->netmask = num;
addr = v.substr(0, pos); addr = ifaddr.substr(0, pos);
} }
else else
{ {
llarp::LogError("bad ifaddr value: ", v); llarp::LogError("bad ifaddr value: ", ifaddr);
return false; return false;
} }
} }
@ -309,14 +300,13 @@ namespace llarp
tunif->netmask = 128; tunif->netmask = 128;
else else
tunif->netmask = 32; tunif->netmask = 32;
addr = v; addr = ifaddr;
} }
llarp::LogInfo(Name() + " set ifaddr to ", addr, " with netmask ", tunif->netmask); llarp::LogInfo(Name() + " set ifaddr to ", addr, " with netmask ", tunif->netmask);
strncpy(tunif->ifaddr, addr.c_str(), sizeof(tunif->ifaddr) - 1); strncpy(tunif->ifaddr, addr.c_str(), sizeof(tunif->ifaddr) - 1);
return true;
} }
*/
return Endpoint::Configure(conf); return Endpoint::Configure(conf, dnsConf);
} }
bool bool

@ -33,7 +33,7 @@ namespace llarp
} }
bool bool
Configure(const NetworkConfig& conf) override; Configure(const NetworkConfig& conf, const DnsConfig& dnsConf) override;
void void
Tick(llarp_time_t now) override; Tick(llarp_time_t now) override;

@ -572,7 +572,7 @@ namespace llarp
enableRPCServer = conf->api.m_enableRPCServer; enableRPCServer = conf->api.m_enableRPCServer;
rpcBindAddr = conf->api.m_rpcBindAddr; rpcBindAddr = conf->api.m_rpcBindAddr;
hiddenServiceContext().AddEndpoint(conf->network); hiddenServiceContext().AddEndpoint(*conf);
// Logging config // Logging config
LogContext::Instance().Initialize( LogContext::Instance().Initialize(
@ -831,17 +831,6 @@ namespace llarp
_rcLookupHandler.SetRouterWhitelist(routers); _rcLookupHandler.SetRouterWhitelist(routers);
} }
/// Populates some default values on networkConfig if they are absent
void
Router::PopulateConfigDefaults()
{
if (networkConfig.m_ifname.empty())
networkConfig.m_ifname = llarp::FindFreeTun();
if (networkConfig.m_ifaddr.empty())
networkConfig.m_ifaddr = llarp::FindFreeRange();
}
bool bool
Router::StartJsonRpc() Router::StartJsonRpc()
{ {
@ -966,8 +955,6 @@ namespace llarp
return false; return false;
} }
PopulateConfigDefaults();
if (IsServiceNode()) if (IsServiceNode())
{ {
// initialize as service node // initialize as service node

@ -499,9 +499,6 @@ namespace llarp
void void
MessageSent(const RouterID& remote, SendStatus status); MessageSent(const RouterID& remote, SendStatus status);
void
PopulateConfigDefaults();
}; };
} // namespace llarp } // namespace llarp

@ -172,7 +172,7 @@ namespace llarp
} }
void void
Context::AddEndpoint(const NetworkConfig& conf, bool autostart) Context::AddEndpoint(const Config& conf, bool autostart)
{ {
// TODO: refactor Context to only contain one endpoint // TODO: refactor Context to only contain one endpoint
constexpr auto endpointName = "endpoint"; constexpr auto endpointName = "endpoint";
@ -193,7 +193,7 @@ namespace llarp
throw std::runtime_error(stringify("Failed to construct endpoint of type ", endpointType)); throw std::runtime_error(stringify("Failed to construct endpoint of type ", endpointType));
// pass conf to service // pass conf to service
service->Configure(conf); service->Configure(conf.network, conf.dns);
// autostart if requested // autostart if requested
if (autostart) if (autostart)

@ -39,7 +39,7 @@ namespace llarp
/// add endpoint via config /// add endpoint via config
void void
AddEndpoint(const NetworkConfig& conf, bool autostart = false); AddEndpoint(const Config& conf, bool autostart = false);
/// inject endpoint instance /// inject endpoint instance
void void

@ -43,7 +43,7 @@ namespace llarp
} }
bool bool
Endpoint::Configure(const NetworkConfig& conf) Endpoint::Configure(const NetworkConfig& conf, const DnsConfig& dnsConf)
{ {
numPaths = conf.m_paths; numPaths = conf.m_paths;
numHops = conf.m_hops; numHops = conf.m_hops;

@ -94,7 +94,7 @@ namespace llarp
SetHandler(IDataHandler* h); SetHandler(IDataHandler* h);
virtual bool virtual bool
Configure(const NetworkConfig& conf); Configure(const NetworkConfig& conf, const DnsConfig& dnsConf);
void void
Tick(llarp_time_t now) override; Tick(llarp_time_t now) override;

Loading…
Cancel
Save