From 4f09090c58dcc7f33e686d896aa7ea5a5bf62bdd Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 4 May 2020 13:02:28 -0300 Subject: [PATCH 01/10] Add [network]:enabled to ignored settings list No one knows what this option does or did, but it is in some generated config files. --- llarp/config/config.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index 3a34b851a..bc81d376e 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -204,7 +204,7 @@ namespace llarp "network", "blacklist-snode", false, true, "", [this](std::string arg) { RouterID id; if (not id.FromString(arg)) - throw std::invalid_argument(stringify("Invalide RouterID: ", arg)); + throw std::invalid_argument(stringify("Invalid RouterID: ", arg)); auto itr = m_snodeBlacklist.emplace(std::move(id)); if (itr.second) @@ -509,6 +509,8 @@ namespace llarp addIgnoreOption("router", "threads"); addIgnoreOption("metrics", "json-metrics-path"); + + addIgnoreOption("network", "enabled"); } void From cd7fd1b6ad0a0f46dc6480638e4bab94a9b4b081 Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 4 May 2020 13:27:14 -0300 Subject: [PATCH 02/10] FIXME fix the FIXME --- llarp/router/router.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/llarp/router/router.hpp b/llarp/router/router.hpp index bda0d622c..39d9b88da 100644 --- a/llarp/router/router.hpp +++ b/llarp/router/router.hpp @@ -228,6 +228,7 @@ namespace llarp bool ExitEnabled() const { + return false; // FIXME - have to fix the FIXME because FIXME throw std::runtime_error("FIXME: this needs to be derived from config"); /* // TODO: use equal_range ? From 6aa79b7ca9a1ff87c1c827fd89eae700b176072a Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 12:33:44 -0400 Subject: [PATCH 03/10] set network section --- llarp/router/router.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index 0721257f9..2e1301b17 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -421,6 +421,8 @@ namespace llarp m_isServiceNode = true; } + networkConfig = conf->network; + /// build a set of strictConnectPubkeys ( /// TODO: make this consistent with config -- do we support multiple strict connections // or not? From e33a1a2e0f2c1a5e087a2003b5a702c84010b60a Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 12:51:57 -0400 Subject: [PATCH 04/10] proper autodetect of ifname and ifaddr --- llarp/config/config.cpp | 25 +++++++++++++++--- llarp/handlers/tun.cpp | 10 ++------ llarp/net/net.cpp | 57 +++++++++++++++++------------------------ llarp/net/net.hpp | 4 +-- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index bc81d376e..dbf716420 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -195,10 +195,27 @@ namespace llarp m_mapAddr = arg; }); - conf.defineOption( - "network", "ifaddr", false, "", [this](std::string arg) { m_ifaddr = arg; }); - conf.defineOption( - "network", "ifname", false, "", [this](std::string arg) { m_ifname = arg; }); + conf.defineOption("network", "ifaddr", false, "", [this](std::string arg) { + if (arg.empty()) + { + const auto maybe = llarp::FindFreeRange(); + if (not maybe.has_value()) + throw std::invalid_argument("cannot determine free ip range"); + arg = maybe.value(); + } + m_ifaddr = arg; + }); + + conf.defineOption("network", "ifname", false, "", [this](std::string arg) { + if (arg.empty()) + { + const auto maybe = llarp::FindFreeTun(); + if (not maybe.has_value()) + throw std::invalid_argument("cannot determine free interface name"); + arg = maybe.value(); + } + m_ifname = arg; + }); conf.defineOption( "network", "blacklist-snode", false, true, "", [this](std::string arg) { diff --git a/llarp/handlers/tun.cpp b/llarp/handlers/tun.cpp index a1fdd5eca..7ed1eac56 100644 --- a/llarp/handlers/tun.cpp +++ b/llarp/handlers/tun.cpp @@ -109,8 +109,8 @@ namespace llarp { if (conf.m_reachable) { - m_PublishIntroSet = true; - LogInfo(Name(), " setting to be reachable by default"); + m_PublishIntroSet = true; + LogInfo(Name(), " setting to be reachable by default"); } else { @@ -252,9 +252,6 @@ namespace llarp } std::string ifname = conf.m_ifname; - if (ifname.empty()) - ifname = FindFreeTun(); - if (tunif) { if (ifname.length() >= sizeof(tunif->ifname)) @@ -267,9 +264,6 @@ namespace llarp } std::string ifaddr = conf.m_ifaddr; - if (ifaddr.empty()) - ifaddr = FindFreeRange(); - if (tunif) { std::string addr; diff --git a/llarp/net/net.cpp b/llarp/net/net.cpp index 569366eb2..6b2f6b53d 100644 --- a/llarp/net/net.cpp +++ b/llarp/net/net.cpp @@ -344,10 +344,13 @@ llarp_getifaddr(const char* ifname, int af, struct sockaddr* addr) #else if (!strcmp(ifname, "lo") || !strcmp(ifname, "lo0")) { - sockaddr_in* lo = (sockaddr_in*)addr; - lo->sin_family = af; - lo->sin_port = 0; - inet_pton(af, "127.0.0.1", &lo->sin_addr); + if (addr) + { + sockaddr_in* lo = (sockaddr_in*)addr; + lo->sin_family = af; + lo->sin_port = 0; + inet_pton(af, "127.0.0.1", &lo->sin_addr); + } return true; } if (!getifaddrs(&ifa)) @@ -367,13 +370,16 @@ llarp_getifaddr(const char* ifname, int af, struct sockaddr* addr) // if(!a.isPrivate()) //{ // llarp::LogInfo(__FILE__, "found ", ifname, " af: ", af); - memcpy(addr, i->ifa_addr, sl); - if (af == AF_INET6) + if (addr) { - // set scope id - auto* ip6addr = (sockaddr_in6*)addr; - ip6addr->sin6_scope_id = if_nametoindex(ifname); - ip6addr->sin6_flowinfo = 0; + memcpy(addr, i->ifa_addr, sl); + if (af == AF_INET6) + { + // set scope id + auto* ip6addr = (sockaddr_in6*)addr; + ip6addr->sin6_scope_id = if_nametoindex(ifname); + ip6addr->sin6_flowinfo = 0; + } } found = true; break; @@ -436,7 +442,7 @@ namespace llarp } // TODO: ipv6? - std::string + std::optional FindFreeRange() { std::vector currentRanges; @@ -505,43 +511,26 @@ namespace llarp return loaddr.ToString() + "/24"; ++oct; } - LogError( - "cannot autodetect any free ip ranges on your system for use, please " - "configure this manually"); - return ""; + return std::nullopt; } - std::string + std::optional FindFreeTun() { - uint8_t num = 0; + int num = 0; while (num < 255) { std::stringstream ifname_ss; ifname_ss << "lokitun" << num; std::string iftestname = ifname_ss.str(); - struct sockaddr addr; - bool found = llarp_getifaddr(iftestname.c_str(), AF_INET, &addr); + bool found = llarp_getifaddr(iftestname.c_str(), AF_INET, nullptr); if (!found) { - llarp::LogDebug("Detected " + iftestname + " is available for use, configuring as such"); - break; + return iftestname; } num++; } - if (num == 255) - { - llarp::LogError("Could not find any free lokitun interface names"); - return ""; - } -// include lokitun prefix to communicate result is valid -#if defined(ANDROID) || defined(RPI) - char buff[IFNAMSIZ + 1] = {0}; - snprintf(buff, sizeof(buff), "lokitun%u", num); - return buff; -#else - return "lokitun" + std::to_string(num); -#endif + return std::nullopt; } bool diff --git a/llarp/net/net.hpp b/llarp/net/net.hpp index 5192a628f..741043f5b 100644 --- a/llarp/net/net.hpp +++ b/llarp/net/net.hpp @@ -168,11 +168,11 @@ namespace llarp GetBestNetIF(std::string& ifname, int af = AF_INET); /// look at adapter ranges and find a free one - std::string + std::optional FindFreeRange(); /// look at adapter names and find a free one - std::string + std::optional FindFreeTun(); /// get network interface address for network interface with ifname From 1cbf50296c3658966f79703f7ce2fa52c8df75c8 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 12:58:46 -0400 Subject: [PATCH 05/10] only add endpoint for hidden service if not service node --- llarp/router/router.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index 2e1301b17..2829ec9cc 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -573,8 +573,10 @@ namespace llarp // API config enableRPCServer = conf->api.m_enableRPCServer; rpcBindAddr = conf->api.m_rpcBindAddr; - - hiddenServiceContext().AddEndpoint(*conf); + if (not IsServiceNode()) + { + hiddenServiceContext().AddEndpoint(*conf); + } // Logging config LogContext::Instance().Initialize( From c4b5b641bba3c622afa09ed274b370adb0d3c271 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 13:14:46 -0400 Subject: [PATCH 06/10] default to default data dir given by params instead --- llarp/config/config.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index dbf716420..d823dcb48 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -71,14 +71,13 @@ namespace llarp conf.defineOption("router", "nickname", false, "", AssignmentAcceptor(m_nickname)); - conf.defineOption( - "router", "data-dir", false, GetDefaultDataDir(), [this](std::string arg) { - fs::path dir = arg; - if (not fs::exists(dir)) + conf.defineOption( + "router", "data-dir", false, params.defaultDataDir, [this](fs::path arg) { + if (not fs::exists(arg)) throw std::runtime_error( stringify("Specified [router]:data-dir ", arg, " does not exist")); - m_dataDir = std::move(dir); + m_dataDir = std::move(arg); }); conf.defineOption("router", "public-address", false, "", [this](std::string arg) { From f307c25d3eaf77bd7874081039cd59ed0b66d600 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 13:30:58 -0400 Subject: [PATCH 07/10] set datadir path when giving filename for config --- llarp/context.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llarp/context.cpp b/llarp/context.cpp index 43ec511a0..782c384e0 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -305,7 +305,8 @@ extern "C" llarp_config_load_file(const char* fname, struct llarp_config** conf, bool isRelay) { llarp_config* c = new llarp_config(); - if (c->impl.Load(fname, isRelay, {})) + const fs::path filepath(fname); + if (c->impl.Load(fname, isRelay, filepath.parent_path())) { *conf = c; return true; From c425355a6b9a80d2dc2638184113441f7ae8afce Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 13:32:10 -0400 Subject: [PATCH 08/10] set data dir in in loadconfig too --- llarp/context.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llarp/context.cpp b/llarp/context.cpp index 782c384e0..08caf0b66 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -215,7 +215,8 @@ namespace llarp { config = std::make_unique(); configfile = fname; - return Configure(isRelay, {}); + const fs::path filepath(fname); + return Configure(isRelay, filepath.parent_path()); } #ifdef LOKINET_HIVE From f1edca9fa1de21aa321237d2e8d0d571997c3b12 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 14:39:14 -0400 Subject: [PATCH 09/10] additional cleanup of cruft --- llarp/config/config.cpp | 1 - llarp/link/server.cpp | 15 +++++++++++++-- llarp/net/net.cpp | 11 +++++------ llarp/net/net.hpp | 4 ++-- llarp/net/net_addr.cpp | 11 ++++++++--- llarp/router/router.cpp | 26 +++++++------------------- 6 files changed, 35 insertions(+), 33 deletions(-) diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index d823dcb48..686eb55be 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -100,7 +100,6 @@ namespace llarp if (arg <= 0) throw std::invalid_argument("public-port must be > 0"); - // Not needed to flip upside-down - this is done in llarp::Addr(const AddressInfo&) m_ip4addr.sin_port = arg; m_addrInfo.port = arg; m_publicOverride = true; diff --git a/llarp/link/server.cpp b/llarp/link/server.cpp index 45f87511e..73e3b3494 100644 --- a/llarp/link/server.cpp +++ b/llarp/link/server.cpp @@ -123,8 +123,19 @@ namespace llarp if (!AllInterfaces(af, m_ourAddr)) return false; } - else if (!GetIFAddr(ifname, m_ourAddr, af)) - m_ourAddr = Addr(ifname); + else + { + const auto maybe = GetIFAddr(ifname, af); + if (maybe.has_value()) + { + m_ourAddr = maybe.value(); + } + else + { + if (not m_ourAddr.FromString(ifname)) + throw std::invalid_argument(stringify("cannot parse network address: ", ifname)); + } + } m_ourAddr.port(port); return llarp_ev_add_udp(m_Loop.get(), &m_udp, m_ourAddr) != -1; } diff --git a/llarp/net/net.cpp b/llarp/net/net.cpp index 6b2f6b53d..c813bac8d 100644 --- a/llarp/net/net.cpp +++ b/llarp/net/net.cpp @@ -533,15 +533,14 @@ namespace llarp return std::nullopt; } - bool - GetIFAddr(const std::string& ifname, Addr& addr, int af) + std::optional + GetIFAddr(const std::string& ifname, int af) { sockaddr_storage s; - auto* sptr = (sockaddr*)&s; + sockaddr* sptr = (sockaddr*)&s; if (!llarp_getifaddr(ifname.c_str(), af, sptr)) - return false; - addr = *sptr; - return true; + return std::nullopt; + return llarp::Addr{*sptr}; } bool diff --git a/llarp/net/net.hpp b/llarp/net/net.hpp index 741043f5b..23e6ea5b9 100644 --- a/llarp/net/net.hpp +++ b/llarp/net/net.hpp @@ -176,8 +176,8 @@ namespace llarp FindFreeTun(); /// get network interface address for network interface with ifname - bool - GetIFAddr(const std::string& ifname, Addr& addr, int af = AF_INET); + std::optional + GetIFAddr(const std::string& ifname, int af = AF_INET); } // namespace llarp diff --git a/llarp/net/net_addr.cpp b/llarp/net/net_addr.cpp index 2b862cab8..8f7f43c21 100644 --- a/llarp/net/net_addr.cpp +++ b/llarp/net/net_addr.cpp @@ -14,6 +14,8 @@ #define inet_aton(x, y) inet_pton(AF_INET, x, y) #endif +#include + namespace llarp { Addr::Addr() @@ -58,11 +60,14 @@ namespace llarp Addr::Addr(std::string_view str) : Addr() { - this->FromString(str); + if (not FromString(str)) + throw std::invalid_argument(stringify("failed to parse bullshit value: ", str)); } - Addr::Addr(std::string_view str, const uint16_t p_port) : Addr(str) + Addr::Addr(std::string_view str, const uint16_t p_port) : Addr() { + if (not FromString(str)) + throw std::invalid_argument(stringify("failed to parse bullshit value: ", str)); this->port(p_port); } @@ -271,7 +276,7 @@ namespace llarp break; // TODO : sockaddr_ll default: - break; + throw std::invalid_argument("bad address family"); } } diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index 2829ec9cc..c31fa5667 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -848,14 +848,10 @@ namespace llarp rpcBindAddr = DefaultRPCBindAddr; } rpcServer = std::make_unique(this); - while (!rpcServer->Start(rpcBindAddr)) + if (not rpcServer->Start(rpcBindAddr)) { LogError("failed to bind jsonrpc to ", rpcBindAddr); -#if defined(ANDROID) || defined(RPI) - sleep(1); -#else - std::this_thread::sleep_for(std::chrono::seconds(1)); -#endif + return false; } LogInfo("Bound RPC server to ", rpcBindAddr); } @@ -873,14 +869,10 @@ namespace llarp { rpcCaller = std::make_unique(this); rpcCaller->SetAuth(lokidRPCUser, lokidRPCPassword); - while (!rpcCaller->Start(lokidRPCAddr)) + if (not rpcCaller->Start(lokidRPCAddr)) { - LogError("failed to start jsonrpc caller to ", lokidRPCAddr); -#if defined(ANDROID) || defined(RPI) - sleep(1); -#else - std::this_thread::sleep_for(std::chrono::seconds(1)); -#endif + LogError("RPC Caller to ", lokidRPCAddr, " failed to start"); + return false; } LogInfo("RPC Caller to ", lokidRPCAddr, " started"); } @@ -901,11 +893,6 @@ namespace llarp Addr publicAddr(this->addrInfo); - if (this->publicOverride) - { - LogDebug("public address:port ", publicAddr); - } - // set public signing key _rc.pubkey = seckey_topublic(identity()); // set router version if service node @@ -914,8 +901,8 @@ namespace llarp _rc.routerVersion = RouterVersion(llarp::VERSION, LLARP_PROTO_VERSION); } - AddressInfo ai; _linkManager.ForEachInboundLink([&](LinkLayer_ptr link) { + AddressInfo ai; if (link->GetOurAddressInfo(ai)) { // override ip and port @@ -926,6 +913,7 @@ namespace llarp } if (RouterContact::BlockBogons && IsBogon(ai.ip)) return; + LogInfo("adding address: ", ai); _rc.addrs.push_back(ai); if (ExitEnabled()) { From 7e4fdc5b0e6da04047719d68b42f54299110782c Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 4 May 2020 15:05:33 -0400 Subject: [PATCH 10/10] check for zero address for bogons --- llarp/net/net.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/llarp/net/net.cpp b/llarp/net/net.cpp index c813bac8d..74f3d8a02 100644 --- a/llarp/net/net.cpp +++ b/llarp/net/net.cpp @@ -578,7 +578,12 @@ namespace llarp return false; #else if (!ipv6_is_siit(addr)) + { + static in6_addr zero = {}; + if (addr == zero) + return true; return false; + } return IsIPv4Bogon( ipaddr_ipv4_bits(addr.s6_addr[12], addr.s6_addr[13], addr.s6_addr[14], addr.s6_addr[15])); #endif