From 8484e29c9b2c36a35487417d35bae811a96b5db5 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 23 Apr 2019 10:47:23 -0400 Subject: [PATCH] turn more stuff into std::shared_ptr remove dead codepaths --- llarp/CMakeLists.txt | 2 - llarp/context.cpp | 23 +- llarp/dns/dotlokilookup.cpp | 476 ------------------------------------ llarp/dns/dotlokilookup.hpp | 39 --- llarp/dns/iptracker.cpp | 197 --------------- llarp/dns/iptracker.hpp | 56 ----- llarp/exit/context.hpp | 4 +- llarp/handlers/tun.cpp | 4 +- llarp/router/router.cpp | 10 +- llarp/rpc/rpc.cpp | 2 +- llarp/service/context.cpp | 132 +--------- llarp/service/context.hpp | 43 +--- llarp/service/endpoint.hpp | 3 + 13 files changed, 28 insertions(+), 963 deletions(-) delete mode 100644 llarp/dns/dotlokilookup.cpp delete mode 100644 llarp/dns/dotlokilookup.hpp delete mode 100644 llarp/dns/iptracker.cpp delete mode 100644 llarp/dns/iptracker.hpp diff --git a/llarp/CMakeLists.txt b/llarp/CMakeLists.txt index 00855b21a..62a7e7055 100644 --- a/llarp/CMakeLists.txt +++ b/llarp/CMakeLists.txt @@ -109,9 +109,7 @@ if(WIN32) target_link_libraries(${PLATFORM_LIB} PUBLIC iphlpapi) endif() set(DNSLIB_SRC - dns/dotlokilookup.cpp dns/dns.cpp - dns/iptracker.cpp dns/message.cpp dns/name.cpp dns/query.cpp diff --git a/llarp/context.cpp b/llarp/context.cpp index d6390b653..449906676 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -464,18 +463,6 @@ extern "C" ptr->ctx->HandleSignal(sig); } - void - llarp_main_inject_vpn_fd(struct llarp_main *ptr, int rfd, int wfd) - { - llarp::handlers::TunEndpoint *tun = - ptr->ctx->router->hiddenServiceContext().getFirstTun(); - if(!tun) - return; - if(!tun->Promise) - return; - tun->Promise->Set({rfd, wfd}); - } - int llarp_main_setup(struct llarp_main *ptr) { @@ -538,6 +525,7 @@ extern "C" return ptr->ctx->LoadDatabase(); } + /* int llarp_main_iterateDatabase(struct llarp_main *ptr, struct llarp_nodedb_iter i) { @@ -611,13 +599,6 @@ extern "C" // llarp_dht_lookup_router(ptr->ctx->router->dht, job); } - bool - main_router_prefetch(struct llarp_main *ptr, - const llarp::service::Address &addr) - { - auto &endpoint = ptr->ctx->router->hiddenServiceContext(); - return endpoint.Prefetch(addr); - } llarp::handlers::TunEndpoint * main_router_getFirstTunEndpoint(struct llarp_main *ptr) @@ -640,6 +621,8 @@ extern "C" return ptr->ctx->router->hiddenServiceContext().getRange(); } + */ + const char * handleBaseCmdLineArgs(int argc, char *argv[]) { diff --git a/llarp/dns/dotlokilookup.cpp b/llarp/dns/dotlokilookup.cpp deleted file mode 100644 index 2b500568a..000000000 --- a/llarp/dns/dotlokilookup.cpp +++ /dev/null @@ -1,476 +0,0 @@ -#include - -#include -#include -#include - -std::string const default_chars = - "abcdefghijklmnaoqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - -#include - -std::string -random_string(size_t len = 15, std::string const &allowed_chars = default_chars) -{ - std::mt19937_64 gen{std::random_device()()}; - - std::uniform_int_distribution< size_t > dist{0, allowed_chars.length() - 1}; - - std::string ret; - - std::generate_n(std::back_inserter(ret), len, - [&] { return allowed_chars[dist(gen)]; }); - return ret; -} - -struct check_query_simple_request -{ - // already inside request - // const struct sockaddr *from; // source - const dnsd_question_request *request; -}; - -std::unordered_map< std::string, struct dnsd_query_hook_response * > - loki_tld_lookup_cache; - -static bool -decode_request_name(const std::string &name, llarp::AlignedBuffer< 32 > &addr, - bool &isSNode) -{ - llarp::service::Address serviceAddr; - llarp::RouterID snodeAddr; - auto pos = name.find(".snode"); - if(pos != std::string::npos) - { - if(!llarp::HexDecode(name.substr(0, pos).c_str(), serviceAddr.begin(), - serviceAddr.size())) - { - return false; - } - addr = snodeAddr; - isSNode = true; - } - else - { - if(!serviceAddr.FromString(name)) - { - return false; - } - addr = serviceAddr; - isSNode = false; - } - return true; -} - -void -llarp_dotlokilookup_checkQuery(void *u, __attribute__((unused)) uint64_t orig, - uint64_t left) -{ - if(left) - return; - // struct check_query_request *request = static_cast< struct - // check_query_request * >(u); - struct check_query_simple_request *qr = - static_cast< struct check_query_simple_request * >(u); - dotLokiLookup *dll = (dotLokiLookup *)qr->request->context->user; - if(!dll) - { - llarp::LogError("DNSd dotLokiLookup is not configured"); - write404_dnss_response(qr->request); - delete qr; - return; - } - - // we do have result - // if so send that - // else - // if we have a free private ip, send that - - /* - // cache hit - auto itr = loki_tld_lookup_cache.find(addr.ToString()); - if(itr != loki_tld_lookup_cache.end()) - { - llarp::LogDebug("Found in .loki lookup cache"); - writesend_dnss_response(itr->second->returnThis, qr->from, qr->request); - delete qr; - return; - } - - struct dns_pointer *free_private = dns_iptracker_get_free(dll->ip_tracker); - if(free_private) - { - */ - - // in_addr ip_address = ((sockaddr_in *)free_private->hostResult)->sin_addr; - - llarp::service::Context *routerHiddenServiceContext = - (llarp::service::Context *)dll->user; - if(!routerHiddenServiceContext) - { - llarp::LogWarn("dotLokiLookup user isnt a service::Context: ", dll->user); - write404_dnss_response(qr->request); - delete qr; - return; - } - llarp::huint32_t serviceIP; - llarp::AlignedBuffer< 32 > addr; - bool isSNode = false; - if(!decode_request_name(qr->request->question.name, addr, isSNode)) - { - llarp::LogWarn("decode_request_name failed"); - write404_dnss_response(qr->request); - delete qr; - return; - } - if(!routerHiddenServiceContext->FindBestAddressFor(addr, isSNode, serviceIP)) - { - llarp::LogWarn("dotLokiLookup failed to map address"); - write404_dnss_response(qr->request); - delete qr; - return; - } - - /* - bool mapResult = routerHiddenServiceContext->MapAddressAll( - addr, free_private->hostResult); - if(!mapResult) - { - llarp::LogWarn("dotLokiLookup failed to map address"); - write404_dnss_response(qr->from, qr->request); - delete qr; - return; - } - */ - - // make a dnsd_query_hook_response for the cache - dnsd_query_hook_response *response = new dnsd_query_hook_response; - response->dontLookUp = true; - response->dontSendResponse = false; - // llarp::Addr test(*free_private->hostResult.getSockAddr()); - // llarp::LogInfo("IP Test: ", test); - // response->returnThis = &free_private->hostResult; - response->returnThis = serviceIP; - llarp::LogInfo("Saving ", qr->request->question.name); - loki_tld_lookup_cache[qr->request->question.name] = response; - // we can't delete response now... - - /* - llarp::handlers::TunEndpoint *tunEndpoint = - (llarp::handlers::TunEndpoint *)dll->user; - if (!tunEndpoint) - { - llarp::LogWarn("dotLokiLookup user isnt a tunEndpoint: ", dll->user); - return; - } - bool mapResult = tunEndpoint->MapAddress(addr, - free_private->hostResult.tohl()); if(!mapResult) - { - delete qr; - return; - } - */ - llarp::huint32_t foundAddr; - if(!routerHiddenServiceContext->FindBestAddressFor(addr, isSNode, foundAddr)) - { - write404_dnss_response(qr->request); - delete qr; - return; - } - - // make a dnsd_query_hook_response for the cache - /* - dnsd_query_hook_response *response = new dnsd_query_hook_response; - response->dontLookUp = true; - response->dontSendResponse = false; - loki_tld_lookup_cache[addr.ToString()]=response; - */ - // we can't delete response now... - // sockaddr_in saddr; - // saddr.sin_family = AF_INET; - // saddr.sin_addr.s_addr = llarp::xhtonl(foundAddr).n; - // FIXME: flush cache to disk - // on crash we'll need to bring up all the same IPs we assigned before... - writesend_dnss_response(&foundAddr, qr->request); - delete qr; - return; -} - -std::vector< std::string > -split(std::string str) -{ - size_t pos = 0; - std::string token; - std::string s(str); - std::vector< std::string > tokens; - while((pos = s.find(".")) != std::string::npos) - { - token = s.substr(0, pos); - // llarp::LogInfo("token [", token, "]"); - tokens.push_back(token); - s.erase(0, pos + 1); - } - token = s.substr(0, pos); - tokens.push_back(token); - // llarp::LogInfo("token [", token, "]"); - return tokens; -} - -struct reverse_handler_iter_context -{ - std::string lName; - // const struct sockaddr *from; // aready inside dnsd_question_request - const dnsd_question_request *request; -}; - -#if defined(ANDROID) || defined(RPI) -static int -stoi(const std::string &s) -{ - return atoi(s.c_str()); -} -#endif - -bool -ReverseHandlerIter(struct llarp::service::Context::endpoint_iter *endpointCfg) -{ - reverse_handler_iter_context *context = - (reverse_handler_iter_context *)endpointCfg->user; - // llarp::LogInfo("context ", context->request->question.name); - // llarp::LogInfo("Checking ", lName); - llarp::handlers::TunEndpoint *tunEndpoint = - (llarp::handlers::TunEndpoint *)endpointCfg->endpoint; - if(!tunEndpoint) - { - llarp::LogError("No tunnel endpoint found"); - return true; // still continue - } - // llarp::LogInfo("for ", tunEndpoint->tunif.ifaddr); - std::string checkStr(tunEndpoint->tunif.ifaddr); - std::vector< std::string > tokensSearch = split(context->lName); - std::vector< std::string > tokensCheck = split(checkStr); - - // well the tunif is just one ip on a network range... - // support "b._dns-sd._udp.0.0.200.10.in-addr.arpa" - size_t searchTokens = tokensSearch.size(); - // if the query has five or fewer levels, - // tack on leading '0.'s to form a minimum six-level - // PTR query -rick - if(searchTokens < 6) - { - switch(searchTokens) - { - case 5: - tokensSearch.clear(); - context->lName.insert(0, "0."); - tokensSearch = split(context->lName); - searchTokens = tokensSearch.size(); - break; - case 4: - tokensSearch.clear(); - context->lName.insert(0, "0.0."); - tokensSearch = split(context->lName); - searchTokens = tokensSearch.size(); - break; - case 3: - tokensSearch.clear(); - context->lName.insert(0, "0.0.0."); - tokensSearch = split(context->lName); - searchTokens = tokensSearch.size(); - break; - default: - llarp::LogError("invalid PTR query: ", context->lName); - break; - } - } - // this expression assumes a six-level name - std::string searchIp = tokensSearch[searchTokens - 3] + "." - + tokensSearch[searchTokens - 4] + "." + tokensSearch[searchTokens - 5] - + "." + tokensSearch[searchTokens - 6]; - std::string checkIp = tokensCheck[0] + "." + tokensCheck[1] + "." - + tokensCheck[2] + "." + tokensCheck[3]; - llarp::LogDebug(searchIp, " vs ", checkIp); - - llarp::IPRange range = - llarp::iprange_ipv4(std::stoi(tokensCheck[0]), std::stoi(tokensCheck[1]), - std::stoi(tokensCheck[2]), std::stoi(tokensCheck[3]), - tunEndpoint->tunif.netmask); // create range - - llarp::huint32_t searchIPv4 = llarp::ipaddr_ipv4_bits( - std::stoi(tokensSearch[searchTokens - 3]), - std::stoi(tokensSearch[searchTokens - 4]), - std::stoi(tokensSearch[searchTokens - 5]), - std::stoi(tokensSearch[searchTokens - 6])); // create ip - - // bool inRange = range.Contains(searchAddr.xtohl()); - bool inRange = range.Contains(searchIPv4); - - llarp::Addr searchAddr(searchIp); - llarp::Addr checkAddr(checkIp); - llarp::LogInfo(searchIPv4, " vs ", range, " = ", - inRange ? "inRange" : "not match"); - - if(inRange) - { - llarp::AlignedBuffer< 32 > addr = - tunEndpoint->ObtainAddrForIP< llarp::AlignedBuffer< 32 > >(searchIPv4, - false); - if(addr.IsZero()) - { - addr = tunEndpoint->ObtainAddrForIP< llarp::AlignedBuffer< 32 > >( - searchIPv4, true); - if(!addr.IsZero()) - { - char stack[128] = {0}; - std::string saddr = llarp::HexEncode(addr, stack); - saddr += ".snode"; - writesend_dnss_revresponse(saddr, context->request); - } - else - write404_dnss_response(context->request); - } - else - { - llarp::service::Address saddr(addr); - // llarp::LogInfo("Returning [", saddr.ToString(), "]"); - writesend_dnss_revresponse(saddr.ToString(), context->request); - } - return false; - } - return true; // we don't do anything with the result yet -} - -static bool -should_intercept_query_with_name(const std::string &lName) -{ - // null terminated list - static const char *const matches[] = {".loki", ".snode", ".loki.", ".snode.", - 0}; - size_t idx = 0; - while(matches[idx]) - { - std::string match_str(matches[idx]); - if(lName.substr(lName.length() - match_str.length()) == match_str) - return true; - ++idx; - } - return false; -} - -dnsd_query_hook_response * -llarp_dotlokilookup_handler(std::string name, - const dnsd_question_request *request) -{ - dnsd_query_hook_response *response = new dnsd_query_hook_response; - response->dontLookUp = false; - response->dontSendResponse = false; - response->returnThis.h = 0; - llarp::LogDebug("Hooked ", name); - std::string lName = name; - std::transform(lName.begin(), lName.end(), lName.begin(), ::tolower); - // llarp::LogDebug("Transformed ", lName); - - // 253.0.200.10.in-addr.arpa - if(lName.find(".in-addr.arpa") != std::string::npos) - { - // llarp::LogDebug("Checking ", lName); - dotLokiLookup *dll = (dotLokiLookup *)request->context->user; - llarp::service::Context *routerHiddenServiceContext = - (llarp::service::Context *)dll->user; - if(!routerHiddenServiceContext) - { - llarp::LogWarn("dotLokiLookup user isnt a service::Context: ", dll->user); - return response; - } - // llarp::LogDebug("Starting rev iter for ", lName); - // which range? - // for each tun interface - struct reverse_handler_iter_context context; - context.lName = lName; - // context.from = request->from; - context.request = request; - - struct llarp::service::Context::endpoint_iter i; - i.user = &context; - i.index = 0; - i.visit = &ReverseHandlerIter; - bool res = routerHiddenServiceContext->iterate(i); - if(!res) - { - llarp::LogDebug("Reverse is ours"); - response->dontLookUp = true; - response->dontSendResponse = true; // should have already sent it - } - else - { - llarp::LogInfo("Reverse is not ours"); - } - } - else if(should_intercept_query_with_name(lName)) - { - llarp::LogInfo("Detect Loki Lookup for ", lName); - auto cache_check = loki_tld_lookup_cache.find(lName); - if(cache_check != loki_tld_lookup_cache.end()) - { - // was in cache - llarp::LogInfo("Reused address from LokiLookupCache"); - // FIXME: avoid the response allocation if you could - delete response; - return cache_check->second; - } - - // decode address - llarp::AlignedBuffer< 32 > addr; - bool isSNode = false; - if(!decode_request_name(lName, addr, isSNode)) - { - response->dontLookUp = true; - return response; - } - - dotLokiLookup *dll = (dotLokiLookup *)request->context->user; - llarp::service::Context *routerHiddenServiceContext = - (llarp::service::Context *)dll->user; - if(!routerHiddenServiceContext) - { - llarp::LogWarn("dotLokiLookup user isnt a service::Context: ", dll->user); - return response; - } - - // start path build early (if you're looking it up, you're probably going to - // use it) - // main_router_prefetch(ctx, addr); - - // schedule future response - check_query_simple_request *qr = new check_query_simple_request; - // qr->from = request->from; - qr->request = request; - - auto tun = routerHiddenServiceContext->getFirstTun(); - if(isSNode) - { - if(tun->HasPathToSNode(addr.as_array())) - { - llarp_dotlokilookup_checkQuery(qr, 0, 0); - response->dontSendResponse = true; // will send it shortly - return response; - } - } - else - { - if(tun->HasPathToService(llarp::service::Address(addr))) - { - llarp_dotlokilookup_checkQuery(qr, 0, 0); - response->dontSendResponse = true; // will send it shortly - return response; - } - } - - // nslookup on osx is about 5 sec before a retry, 2s on linux - request->context->client.logic->call_later( - {2000, qr, &llarp_dotlokilookup_checkQuery}); - - response->dontSendResponse = true; // will send it shortly - } - return response; -} diff --git a/llarp/dns/dotlokilookup.hpp b/llarp/dns/dotlokilookup.hpp deleted file mode 100644 index 7eb202620..000000000 --- a/llarp/dns/dotlokilookup.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef LLARP_DNS_DOTLOKILOOKUP_HPP -#define LLARP_DNS_DOTLOKILOOKUP_HPP - -#include -#include - -using map_address_hook_func = - std::function< bool(const byte_t *addr, bool isSNode, uint32_t ip) >; - -/// dotLokiLookup context/config -struct dotLokiLookup -{ - /// for timers (MAYBEFIXME? maybe we decouple this, yes pls have a generic - /// passed in) - // we can use DNSc for access to the logic - llarp::Logic *logic; - - /// which ip tracker to use - struct dns_iptracker *ip_tracker; - - /// tunEndpoint - // llarp::handlers::TunEndpoint *tunEndpoint; // is this even needed here? - void *user; // well dotLokiLookup current uses it to access the tun if - // pointer to tunendpoint properties? - // llarp::service::Context *hiddenServiceContext; - - // need a way to reference - // 1. mapaddress - map_address_hook_func map_address_handler; - // std::function< bool(const llarp::service::Address &addr, uint32_t ip), - // llarp::handlers::TunEndpoint * > callback; - // 2. prefetch -}; - -dnsd_query_hook_response * -llarp_dotlokilookup_handler(std::string name, - const dnsd_question_request *request); - -#endif diff --git a/llarp/dns/iptracker.cpp b/llarp/dns/iptracker.cpp deleted file mode 100644 index c6437b661..000000000 --- a/llarp/dns/iptracker.cpp +++ /dev/null @@ -1,197 +0,0 @@ -#include - -dns_iptracker g_dns_iptracker; - -void -dns_iptracker_init() -{ - /* - g_dns_iptracker.interfaces = llarp_getPrivateIfs(); - llarp::LogInfo("Interface uses 10.x.x.x? ", - g_dns_iptracker.interfaces.ten ? "Yes" : "No"); - g_dns_iptracker.used_privates = g_dns_iptracker.interfaces; - llarp::LogInfo("We used 10.x.x.x? ", - g_dns_iptracker.used_privates.ten ? "Yes" : "No"); - */ - - // disable all possibilities unless you setup a tunGateway - - g_dns_iptracker.used_privates.ten = true; - g_dns_iptracker.used_privates.oneSeven = true; - g_dns_iptracker.used_privates.oneNine = true; -} - -// not sure we want tunGatewayIP... we'll know when we get further -bool -dns_iptracker_setup_dotLokiLookup( - dotLokiLookup *dll, ABSL_ATTRIBUTE_UNUSED llarp::huint32_t tunGatewayIp) -{ - dll->ip_tracker = &g_dns_iptracker; - return true; -} - -// FIXME: pass in b32addr of client -bool -dns_iptracker_setup(dns_iptracker *iptracker, llarp::huint32_t tunGatewayIp) -{ - if(!iptracker) - iptracker = &g_dns_iptracker; // FIXME: god forgive I'm tired - // struct in_addr *addr = tunGatewayIp.addr4(); - // unsigned char *ip = (unsigned char *)&(addr->s_addr); - unsigned char *ip = (unsigned char *)&(tunGatewayIp.h); - /* - llarp::LogInfo("iptracker setup: (", std::to_string(ip[0]), ").[", - std::to_string(ip[1]), '.', std::to_string(ip[2]), "].", - std::to_string(ip[3])); - */ - std::unique_ptr< ip_range > range(new ip_range); - range->octet2 = ip[1]; // 2nd octet - range->octet3 = ip[2]; // 3rd octet - // FIXME: look up any static mappings to discount - range->left = 252; - // 4th octet, probably 1, set it - struct dns_pointer *result = new dns_pointer; - result->hostResult = tunGatewayIp; - // tunGatewayIp.CopyInto(result->hostResult); - // result->b32addr = ; // FIXME: should be our HS addr - range->used[ip[3]] = result; // claim tun IP - - // save tun range in tracker - // FIXME: forcing one and only one range - if(ip[0] == 10) - { - iptracker->used_ten_ips.push_back(std::move(range)); - iptracker->used_privates.ten = false; - } - else if(ip[0] == 172) - { - iptracker->used_seven_ips.push_back(std::move(range)); - iptracker->used_privates.oneSeven = false; - } - else if(ip[0] == 192) - { - iptracker->used_nine_ips.push_back(std::move(range)); - iptracker->used_privates.oneNine = false; - } - else - { - return false; - } - return true; -} - -inline struct dns_pointer * -dns_iptracker_allocate_range(std::unique_ptr< ip_range > &range, uint8_t first) -{ - // we have an IP - llarp::LogDebug("Range has ", (unsigned int)range->left, " ips left"); - range->left--; // use it up - struct dns_pointer *result = new dns_pointer; - llarp::Addr ip(first, range->octet2, range->octet3, - range->left + 2); // why plus 2? to start at .2 - llarp::LogDebug("Allocated ", ip); - // result->hostResult = new sockaddr; - // ip.CopyInto(result->hostResult); - result->hostResult = ip.xtohl(); - - // make an address and place into this sockaddr - range->used[range->left + 2] = result; - return result; -} - -struct dns_pointer * -dns_iptracker_check_range(std::vector< std::unique_ptr< ip_range > > &ranges, - uint8_t first) -{ - // tens not all used up - if(ranges.size()) - { - // FIXME: maybe find_if where left not 0 - // find a range - for(auto it = ranges.begin(); it != ranges.end(); ++it) - { - if((*it)->left) - { - struct dns_pointer *result = dns_iptracker_allocate_range(*it, first); - if(!(*it)->left) - { - // all used up - // FIXME: are there any more octets available? - } - return result; - } - } - } - else - { - // create one - std::unique_ptr< ip_range > new_range(new ip_range); - new_range->octet2 = 0; - switch(first) - { - case 172: - { - // FIXME: goes up to 31... - new_range->octet2 = 16; - break; - } - case 192: - { - new_range->octet2 = 168; - break; - } - } - new_range->octet3 = 0; // FIXME: counter (0-255) - // CHECK: planning a /24 but maybe that's too wide for broadcasts - new_range->left = 252; // 0 is net, 1 is gw, 255 is broadcast - ranges.push_back(std::move(new_range)); - // don't need to check if we're out since this is fresh range - return dns_iptracker_allocate_range(ranges[0], first); - } - return nullptr; -} - -struct dns_pointer * -dns_iptracker_get_free() -{ - return dns_iptracker_get_free(&g_dns_iptracker); -} - -struct dns_pointer * -dns_iptracker_get_free(dns_iptracker *iptracker) -{ - llarp::LogInfo("Was 10.x.x.x already in-use on start? ", - iptracker->used_privates.ten ? "Yes" : "No"); - if(!iptracker->used_privates.ten) - { - struct dns_pointer *test = - dns_iptracker_check_range(iptracker->used_ten_ips, 10); - if(test) - { - return test; - } - } - llarp::LogInfo("Was 172.16.x.x already in-use on start? ", - iptracker->used_privates.oneSeven ? "Yes" : "No"); - if(!iptracker->used_privates.oneSeven) - { - struct dns_pointer *test = - dns_iptracker_check_range(iptracker->used_seven_ips, 172); - if(test) - { - return test; - } - } - llarp::LogInfo("Was 192.168.x.x already in-use on start? ", - iptracker->used_privates.oneNine ? "Yes" : "No"); - if(!iptracker->used_privates.oneNine) - { - struct dns_pointer *test = - dns_iptracker_check_range(iptracker->used_nine_ips, 192); - if(test) - { - return test; - } - } - return nullptr; -} diff --git a/llarp/dns/iptracker.hpp b/llarp/dns/iptracker.hpp deleted file mode 100644 index e53f13d77..000000000 --- a/llarp/dns/iptracker.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef LLARP_DNSIPTRACKER_HPP -#define LLARP_DNSIPTRACKER_HPP - -#include -#include -#include - -#include -#include - -// either a request or response? -// neither, it's a result set row -struct dns_pointer -{ - llarp::huint32_t hostResult; - llarp::service::Address b32addr; - // we could store the timeout at which we expect it to be available - // or a list of pending requests for it -}; - -struct ip_range -{ - uint8_t octet2; - uint8_t octet3; - uint8_t left; - std::unordered_map< uint8_t, dns_pointer * > used; -}; - -struct dns_iptracker -{ - struct privatesInUse interfaces; - struct privatesInUse used_privates; - std::vector< std::unique_ptr< ip_range > > used_ten_ips; - std::vector< std::unique_ptr< ip_range > > used_seven_ips; - std::vector< std::unique_ptr< ip_range > > used_nine_ips; - // make it easier to find a entry - std::vector< std::unique_ptr< dns_pointer > > map; -}; - -void -dns_iptracker_init(); - -bool -dns_iptracker_setup_dotLokiLookup(dotLokiLookup *dll, - llarp::huint32_t tunGatewayIp); - -bool -dns_iptracker_setup(dns_iptracker *iptracker, llarp::huint32_t tunGatewayIp); - -struct dns_pointer * -dns_iptracker_get_free(); - -struct dns_pointer * -dns_iptracker_get_free(dns_iptracker *iptracker); - -#endif diff --git a/llarp/exit/context.hpp b/llarp/exit/context.hpp index 65acb4f29..b977c28f4 100644 --- a/llarp/exit/context.hpp +++ b/llarp/exit/context.hpp @@ -52,9 +52,9 @@ namespace llarp private: AbstractRouter *m_Router; std::unordered_map< std::string, - std::unique_ptr< llarp::handlers::ExitEndpoint > > + std::shared_ptr< llarp::handlers::ExitEndpoint > > m_Exits; - std::list< std::unique_ptr< llarp::handlers::ExitEndpoint > > m_Closed; + std::list< std::shared_ptr< llarp::handlers::ExitEndpoint > > m_Closed; }; } // namespace exit } // namespace llarp diff --git a/llarp/handlers/tun.cpp b/llarp/handlers/tun.cpp index 56da38925..001dda7ea 100644 --- a/llarp/handlers/tun.cpp +++ b/llarp/handlers/tun.cpp @@ -282,7 +282,7 @@ namespace llarp size_t counter = 0; context->ForEachService( [&](const std::string &, - const std::unique_ptr< service::Endpoint > &service) -> bool { + const std::shared_ptr< service::Endpoint > &service) -> bool { service::Address addr = service->GetIdentity().pub.Addr(); msg.AddCNAMEReply(addr.ToString(), 1); ++counter; @@ -314,7 +314,7 @@ namespace llarp size_t counter = 0; context->ForEachService( [&](const std::string &, - const std::unique_ptr< service::Endpoint > &service) -> bool { + const std::shared_ptr< service::Endpoint > &service) -> bool { huint32_t ip = service->GetIfAddr(); if(ip.h) { diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index 79a959848..9cd0444dc 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -1073,13 +1073,9 @@ namespace llarp ServiceNodeLookupRouterWhenExpired(remote); return; } - auto ep = hiddenServiceContext().getFirstEndpoint(); - if(ep == nullptr) - { - LogError("cannot lookup ", remote, " no service endpoints available"); - return; - } - ep->LookupRouterAnon(remote); + _hiddenServiceContext.ForEachService([=](const std::string &, const std::shared_ptr & ep) -> bool { + return !ep->LookupRouterAnon(remote); + }); } bool diff --git a/llarp/rpc/rpc.cpp b/llarp/rpc/rpc.cpp index fe3911ee6..d4a046c4e 100644 --- a/llarp/rpc/rpc.cpp +++ b/llarp/rpc/rpc.cpp @@ -252,7 +252,7 @@ namespace llarp Response services = Response::array(); auto visitor = [&](const std::string& name, - const std::unique_ptr< service::Endpoint >& ptr) -> bool { + const std::shared_ptr< service::Endpoint >& ptr) -> bool { numServices++; if(ptr->IsReady()) numServicesReady++; diff --git a/llarp/service/context.cpp b/llarp/service/context.cpp index b52b9c59f..c8865d0de 100644 --- a/llarp/service/context.cpp +++ b/llarp/service/context.cpp @@ -47,7 +47,7 @@ namespace llarp void Context::ForEachService( std::function< bool(const std::string &, - const std::unique_ptr< Endpoint > &) > + const std::shared_ptr< Endpoint > &) > visit) const { auto itr = m_Endpoints.begin(); @@ -66,7 +66,7 @@ namespace llarp auto itr = m_Endpoints.find(name); if(itr == m_Endpoints.end()) return false; - std::unique_ptr< Endpoint > ep = std::move(itr->second); + std::shared_ptr< Endpoint > ep = std::move(itr->second); m_Endpoints.erase(itr); ep->Stop(); m_Stopped.emplace_back(std::move(ep)); @@ -96,20 +96,20 @@ namespace llarp ++itr; } } - - auto ep = getFirstEndpoint(); - if(!ep) - return; std::vector< RouterID > expired; m_Router->nodedb()->visit([&](const RouterContact &rc) -> bool { if(rc.IsExpired(now)) expired.emplace_back(rc.pubkey); return true; }); - // TODO: we need to stop looking up service nodes that are gone forever - // how do? - for(const auto &k : expired) - ep->LookupRouterAnon(k); + ForEachService([&](const std::string &, const std::shared_ptr &ep) -> bool { + // TODO: we need to stop looking up service nodes that are gone forever + // how do? + for(const auto &k : expired) + if(!ep->LookupRouterAnon(k)) + return false; + return true; + }); } bool @@ -118,68 +118,6 @@ namespace llarp return m_Endpoints.size() ? true : false; } - service::Endpoint * - Context::getFirstEndpoint() - { - if(!m_Endpoints.size()) - { - LogError("No endpoints found"); - return nullptr; - } - auto itr = m_Endpoints.begin(); - if(itr == m_Endpoints.end()) - return nullptr; - return itr->second.get(); - } - - bool - Context::iterate(struct endpoint_iter &i) - { - if(!m_Endpoints.size()) - { - LogError("No endpoints found"); - return false; - } - i.index = 0; - // util::Lock lock(access); - auto itr = m_Endpoints.begin(); - while(itr != m_Endpoints.end()) - { - i.endpoint = itr->second.get(); - if(!i.visit(&i)) - return false; - // advance - i.index++; - itr++; - } - return true; - } - - handlers::TunEndpoint * - Context::getFirstTun() - { - service::Endpoint *endpointer = this->getFirstEndpoint(); - if(!endpointer) - { - return nullptr; - } - handlers::TunEndpoint *tunEndpoint = - static_cast< handlers::TunEndpoint * >(endpointer); - return tunEndpoint; - } - - llarp_tun_io * - Context::getRange() - { - handlers::TunEndpoint *tunEndpoint = this->getFirstTun(); - if(!tunEndpoint) - { - LogError("No tunnel endpoint found"); - return nullptr; - } - return &tunEndpoint->tunif; - } - bool Context::FindBestAddressFor(const AlignedBuffer< 32 > &addr, bool isSNode, huint32_t &ip) @@ -203,56 +141,6 @@ namespace llarp return false; } - bool - Context::Prefetch(const service::Address &addr) - { - handlers::TunEndpoint *tunEndpoint = this->getFirstTun(); - if(!tunEndpoint) - { - LogError("No tunnel endpoint found"); - return false; - } - // HiddenServiceAddresslookup *lookup = new - // HiddenServiceEndpoint(tunEndpoint, callback, addr, - // tunEndpoint->GenTXID()); - return tunEndpoint->EnsurePathToService( - addr, - [](__attribute__((unused)) Address addr, - __attribute__((unused)) void *ctx) {}, - 10000); - } - - bool - MapAddressAllIter(struct Context::endpoint_iter *endpointCfg) - { - Context::mapAddressAll_context *context = - (Context::mapAddressAll_context *)endpointCfg->user; - handlers::TunEndpoint *tunEndpoint = - (handlers::TunEndpoint *)endpointCfg->endpoint; - if(!tunEndpoint) - { - LogError("No tunnel endpoint found"); - return true; // still continue - } - return tunEndpoint->MapAddress( - context->serviceAddr, context->localPrivateIpAddr.xtohl(), false); - } - - bool - Context::MapAddressAll(const service::Address &addr, - Addr &localPrivateIpAddr) - { - struct Context::mapAddressAll_context context; - context.serviceAddr = addr; - context.localPrivateIpAddr = localPrivateIpAddr; - - struct Context::endpoint_iter i; - i.user = &context; - i.index = 0; - i.visit = &MapAddressAllIter; - return this->iterate(i); - } - bool Context::AddDefaultEndpoint( const std::unordered_multimap< std::string, std::string > &opts) diff --git a/llarp/service/context.hpp b/llarp/service/context.hpp index 1de3d71db..3683247a2 100644 --- a/llarp/service/context.hpp +++ b/llarp/service/context.hpp @@ -31,52 +31,17 @@ namespace llarp bool hasEndpoints(); - /// DRY refactor - service::Endpoint * - getFirstEndpoint(); - + bool FindBestAddressFor(const AlignedBuffer< 32 > &addr, bool isSNode, huint32_t &); - /// DRY refactor - handlers::TunEndpoint * - getFirstTun(); - - /// punch a hole to get ip range from first tun endpoint - llarp_tun_io * - getRange(); - - struct mapAddressAll_context - { - service::Address serviceAddr; - Addr localPrivateIpAddr; - }; - - struct endpoint_iter - { - void *user; - service::Endpoint *endpoint; - size_t index; - bool (*visit)(struct endpoint_iter *); - }; - - bool - iterate(struct endpoint_iter &i); - /// function visitor returns false to prematurely break iteration void ForEachService(std::function< bool(const std::string &, - const std::unique_ptr< Endpoint > &) > + const Endpoint_ptr &) > visit) const; - /// hint at possible path usage and trigger building early - bool - Prefetch(const service::Address &addr); - - bool - MapAddressAll(const service::Address &addr, Addr &localPrivateIpAddr); - /// add default endpoint with options bool AddDefaultEndpoint( @@ -96,9 +61,9 @@ namespace llarp private: AbstractRouter *m_Router; - std::unordered_map< std::string, std::unique_ptr< Endpoint > > + std::unordered_map< std::string, std::shared_ptr< Endpoint > > m_Endpoints; - std::list< std::unique_ptr< Endpoint > > m_Stopped; + std::list< std::shared_ptr< Endpoint > > m_Stopped; }; } // namespace service } // namespace llarp diff --git a/llarp/service/endpoint.hpp b/llarp/service/endpoint.hpp index 49dd6a244..ca2c5342a 100644 --- a/llarp/service/endpoint.hpp +++ b/llarp/service/endpoint.hpp @@ -436,6 +436,9 @@ namespace llarp std::unordered_map< Tag, CachedTagResult, Tag::Hash > m_PrefetchedTags; }; + + using Endpoint_ptr = std::shared_ptr; + } // namespace service } // namespace llarp