From 51029f0f2fb4f74af76e5390588309ab183fb46a Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 23 Aug 2018 10:07:53 -0400 Subject: [PATCH] make loopback testnet work again --- contrib/testnet/genconf.py | 1 + llarp/service/context.cpp | 54 +++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/contrib/testnet/genconf.py b/contrib/testnet/genconf.py index cba37e584..ab5560b05 100644 --- a/contrib/testnet/genconf.py +++ b/contrib/testnet/genconf.py @@ -92,6 +92,7 @@ def main(): f.write('''[test-service] tag=test prefetch-tag=test +type=null ''') with open(args.out, 'w') as f: diff --git a/llarp/service/context.cpp b/llarp/service/context.cpp index f86df8de9..73b5eba55 100644 --- a/llarp/service/context.cpp +++ b/llarp/service/context.cpp @@ -33,19 +33,58 @@ namespace llarp bool Context::AddEndpoint(const Config::section_t &conf) { - auto itr = m_Endpoints.find(conf.first); - if(itr != m_Endpoints.end()) { - llarp::LogError("cannot add hidden service with duplicate name: ", - conf.first); - return false; + auto itr = m_Endpoints.find(conf.first); + if(itr != m_Endpoints.end()) + { + llarp::LogError("cannot add hidden service with duplicate name: ", + conf.first); + return false; + } } + // extract type + std::string endpointType = "tun"; + for(const auto &option : conf.second) + { + if(option.first == "type") + endpointType = option.second; + } + std::unique_ptr< llarp::service::Endpoint > service; + + static std::map< std::string, + std::function< llarp::service::Endpoint *( + const std::string &, llarp_router *) > > + endpointConstructors = { + {"tun", + [](const std::string &nick, + llarp_router *r) -> llarp::service::Endpoint * { + return new llarp::handlers::TunEndpoint(nick, r); + }}, + {"null", + [](const std::string &nick, + llarp_router *r) -> llarp::service::Endpoint * { + return new llarp::service::Endpoint(nick, r); + }}}; - std::unique_ptr< llarp::service::Endpoint > service( - new llarp::handlers::TunEndpoint(conf.first, m_Router)); + { + // detect type + auto itr = endpointConstructors.find(endpointType); + if(itr == endpointConstructors.end()) + { + llarp::LogError("no such endpoint type: ", endpointType); + return false; + } + + // construct + service = std::unique_ptr< llarp::service::Endpoint >( + itr->second(conf.first, m_Router)); + } + // configure for(const auto &option : conf.second) { auto &k = option.first; + if(k == "type") + continue; auto &v = option.second; if(!service->SetOption(k, v)) { @@ -54,6 +93,7 @@ namespace llarp return false; } } + // start if(service->Start()) { llarp::LogInfo("added hidden service endpoint ", service->Name());