From a0f1d548f89187c38c9da8b4227fe42108b8649d Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Wed, 6 Jun 2018 17:23:57 -0400 Subject: [PATCH] more shadow stuff --- Makefile | 2 +- contrib/shadow/genconf.py | 16 +++++--- daemon.ini | 4 +- daemon/main.c | 2 +- include/llarp/logger.hpp | 5 ++- llarp/ev.cpp | 4 +- llarp/ev.hpp | 2 +- llarp/ev_epoll.hpp | 4 +- llarp/ev_kqueue.hpp | 3 +- llarp/iwp_link.cpp | 45 +++++++++++++-------- llarp/net.hpp | 20 +++++----- llarp/router.cpp | 84 ++++++++++++++++++++++++++------------- llarp/router.hpp | 4 +- 13 files changed, 122 insertions(+), 73 deletions(-) diff --git a/Makefile b/Makefile index 115138796..04992db71 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ shadow-build: shadow-configure shadow: shadow-build python3 contrib/shadow/genconf.py $(SHADOW_CONFIG) - $(SHADOW_BIN) -w 16 $(SHADOW_CONFIG) + bash -c "$(SHADOW_BIN) -w 16 $(SHADOW_CONFIG) &> shadow.log.txt" format: clang-format -i $$(find daemon llarp include | grep -E '\.[h,c](pp)?$$') diff --git a/contrib/shadow/genconf.py b/contrib/shadow/genconf.py index 9aaa6953d..dfaec4c66 100644 --- a/contrib/shadow/genconf.py +++ b/contrib/shadow/genconf.py @@ -18,7 +18,10 @@ def nodeconf(conf, baseDir, name, ifname, port): conf['router']['contact-file'] = os.path.join(baseDir, '{}.signed'.format(name)) conf['router']['ident-privkey'] = os.path.join(baseDir, '{}-ident.key'.format(name)) conf['router']['transport-privkey'] = os.path.join(baseDir, '{}-transport.key'.format(name)) - conf['iwp-links'] = {ifname : port} + if ifname != '*': + conf['iwp-links'] = {'*' : port + 1000, ifname: port} + else: + conf['iwp-links'] = {ifname : port} conf['iwp-connect'] = {} def addPeer(conf, baseDir, peer): @@ -27,7 +30,7 @@ def addPeer(conf, baseDir, peer): def createNode(pluginName, root, peer): node = etree.SubElement(root, 'host') node.attrib['id'] = peer['name'] - node.attrib['geocodehint'] = 'US' + node.attrib['interfacebuffer'] = '{}'.format(1024 * 1024 * 100) app = etree.SubElement(node, 'process') app.attrib['plugin'] = pluginName app.attrib['time'] = '50' @@ -73,7 +76,8 @@ def genconf(settings, outf): plugin = etree.SubElement(root, "plugin") plugin.attrib['id'] = pluginName plugin.attrib['path'] = libpath - basePort = getSetting(settings, 'base-port', 19000) + basePort = getSetting(settings, 'svc-base-port', 19000) + clientBasePort = getSetting(settings, 'client-base-port', 18000) svcNodeCount = getSetting(settings, 'service-nodes', 20) peers = list() for nodeid in range(svcNodeCount): @@ -88,11 +92,11 @@ def genconf(settings, outf): # add client nodes for nodeid in range(getSetting(settings, 'client-nodes', 200)): - peer = makeClient(settings, 'client-node-{}'.format(nodeid), str(nodeid), basePort +1) + peer = makeClient(settings, 'client-node-{}'.format(nodeid), str(nodeid), clientBasePort +1) peers.append(peer) - for p in range(getSetting(settings, 'client-connect-to', 1)): + for p in range(getSetting(settings, 'client-connect-to', 3)): addPeer(peer['config'], baseDir, 'svc-node-{}'.format((p + nodeid) % svcNodeCount)) - basePort += 1 + clientBasePort += 1 # generate xml and settings files diff --git a/daemon.ini b/daemon.ini index c967b314a..e6f794483 100644 --- a/daemon.ini +++ b/daemon.ini @@ -8,9 +8,11 @@ ident-privkey=server-ident.key dir=./tmp-nodes [iwp-connect] +i2p.rocks=i2p.rocks.signed #other=other.signed #named-node1=/path/to/routercontact1 [iwp-links] -lo=1090 +*=1091 +#lo=1090 #lo=eth diff --git a/daemon/main.c b/daemon/main.c index 5979882d3..b1c0c9eb6 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -11,7 +11,7 @@ handle_signal(int sig) } #ifndef TESTNET -#define TESTNET false +#define TESTNET 0 #endif int diff --git a/include/llarp/logger.hpp b/include/llarp/logger.hpp index 24fcabb95..2d9dc3225 100644 --- a/include/llarp/logger.hpp +++ b/include/llarp/logger.hpp @@ -19,7 +19,7 @@ namespace llarp struct Logger { - LogLevel minlevel = eLogDebug; + LogLevel minlevel = eLogInfo; std::ostream& out = std::cout; }; @@ -86,6 +86,9 @@ namespace llarp LogAppend(ss, std::forward< TArgs >(args)...); ss << (char)27 << "[0;0m"; _glog.out << ss.str() << std::endl; +#ifdef SHADOW_TESTNET + _glog.out << "\n" << std::flush; +#endif } } diff --git a/llarp/ev.cpp b/llarp/ev.cpp index f8b06c229..0b99e04af 100644 --- a/llarp/ev.cpp +++ b/llarp/ev.cpp @@ -49,10 +49,10 @@ llarp_ev_loop_run_single_process(struct llarp_ev_loop *ev, { while(true) { + if(ev->tick(10) == -1) + return; llarp_logic_tick(logic); llarp_threadpool_tick(tp); - if(ev->tick() == -1) - return; } } diff --git a/llarp/ev.hpp b/llarp/ev.hpp index e45d691cb..3ad4eac6a 100644 --- a/llarp/ev.hpp +++ b/llarp/ev.hpp @@ -29,7 +29,7 @@ struct llarp_ev_loop run() = 0; virtual int - tick() = 0; + tick(int ms) = 0; virtual void stop() = 0; diff --git a/llarp/ev_epoll.hpp b/llarp/ev_epoll.hpp index 372f7068e..9d0898e54 100644 --- a/llarp/ev_epoll.hpp +++ b/llarp/ev_epoll.hpp @@ -101,13 +101,13 @@ struct llarp_epoll_loop : public llarp_ev_loop } int - tick() + tick(int ms) { epoll_event events[1024]; int result; byte_t readbuf[2048]; - result = epoll_wait(epollfd, events, 1024, 100); + result = epoll_wait(epollfd, events, 1024, ms); if(result > 0) { int idx = 0; diff --git a/llarp/ev_kqueue.hpp b/llarp/ev_kqueue.hpp index 84efff243..69bd06a5f 100644 --- a/llarp/ev_kqueue.hpp +++ b/llarp/ev_kqueue.hpp @@ -93,8 +93,9 @@ struct llarp_kqueue_loop : public llarp_ev_loop } int - tick() + tick(int ms) { + (void)ms; struct kevent events[1024]; int result; byte_t readbuf[2048]; diff --git a/llarp/iwp_link.cpp b/llarp/iwp_link.cpp index 3d3f41737..12a5ef34d 100644 --- a/llarp/iwp_link.cpp +++ b/llarp/iwp_link.cpp @@ -797,18 +797,7 @@ namespace iwp } static void - handle_verify_session_start(iwp_async_session_start *s) - { - session *self = static_cast< session * >(s->user); - if(!s->buf) - { - // verify fail - // TODO: remove session? - llarp::Warn("session start verify failed"); - return; - } - self->send_LIM(); - } + handle_verify_session_start(iwp_async_session_start *s); void send_LIM() @@ -948,7 +937,7 @@ namespace iwp if(introack->buf == nullptr) { // invalid signature - llarp::Error("introack verify failed"); + llarp::Error("introack verify failed from ", link->addr); return; } link->EnterState(eIntroAckRecv); @@ -961,7 +950,9 @@ namespace iwp handle_generated_session_start(iwp_async_session_start *start) { session *link = static_cast< session * >(start->user); - llarp_ev_udp_sendto(link->udp, link->addr, start->buf, start->sz); + if(llarp_ev_udp_sendto(link->udp, link->addr, start->buf, start->sz) + == -1) + llarp::Error("sendto failed"); link->EnterState(eSessionStartSent); } @@ -1029,7 +1020,9 @@ namespace iwp { session *self = static_cast< session * >(frame->user); llarp::Debug("tx ", frame->sz, " frames=", self->frames); - llarp_ev_udp_sendto(self->udp, self->addr, frame->buf, frame->sz); + if(llarp_ev_udp_sendto(self->udp, self->addr, frame->buf, frame->sz) + == -1) + llarp::Warn("sendto failed"); self->frames--; } @@ -1070,7 +1063,7 @@ namespace iwp session *self = static_cast< session * >(intro->user); if(!intro->buf) { - llarp::Error("intro verify failed"); + llarp::Error("intro verify failed from ", self->addr); delete self; return; } @@ -1241,7 +1234,9 @@ namespace iwp char keyfile[255]; uint32_t timeout_job_id; - typedef std::map< llarp::Addr, llarp_link_session > LinkMap_t; + typedef std::unordered_map< llarp::Addr, llarp_link_session, + llarp::addrhash > + LinkMap_t; LinkMap_t m_sessions; mtx_t m_sessions_Mutex; @@ -1485,6 +1480,7 @@ namespace iwp { // new inbound session s = link->create_session(*saddr, link->seckey); + llarp::Debug("new inbound session from ", s->addr); } s->recv(buf, sz); } @@ -1641,6 +1637,21 @@ namespace iwp return true; } + void + session::handle_verify_session_start(iwp_async_session_start *s) + { + session *self = static_cast< session * >(s->user); + if(!s->buf) + { + // verify fail + // TODO: remove session? + llarp::Warn("session start verify failed from ", self->addr); + self->serv->RemoveSessionByAddr(self->addr); + return; + } + self->send_LIM(); + } + server * link_alloc(struct llarp_router *router, const char *keyfile, struct llarp_crypto *crypto, struct llarp_logic *logic, diff --git a/llarp/net.hpp b/llarp/net.hpp index 0551b15bb..ca1870c88 100644 --- a/llarp/net.hpp +++ b/llarp/net.hpp @@ -181,16 +181,8 @@ namespace llarp bool operator<(const Addr& other) const { - int a = af(); - if(a == other.af()) - { - if(a == AF_INET) - { - return port() < other.port() && memcmp(addr4(), other.addr4(), 4) < 0; - } - } - return af() < other.af() && port() < other.port() - && memcmp(addr6(), other.addr6(), 16) < 0; + return port() < other.port() || *addr6() < *other.addr6() + || af() < other.af(); } bool @@ -199,6 +191,12 @@ namespace llarp return af() == other.af() && memcmp(addr6(), other.addr6(), 16) == 0 && port() == other.port(); } + + bool + operator!=(const Addr& other) const + { + return !(*this == other); + } }; struct addrhash @@ -207,7 +205,7 @@ namespace llarp operator()(Addr const& a) const noexcept { uint8_t empty[16] = {0}; - return a.af() + memcmp(a.addr6(), empty, 16) + a.port(); + return (a.af() + memcmp(a.addr6(), empty, 16)) ^ a.port(); } }; } diff --git a/llarp/router.cpp b/llarp/router.cpp index c1a1ce7a4..8187fc7ac 100644 --- a/llarp/router.cpp +++ b/llarp/router.cpp @@ -52,8 +52,13 @@ llarp_router::SendToOrQueue(const llarp::RouterID &remote, std::vector< llarp::ILinkMessage * > msgs) { bool has = false; - for(auto &link : links) + for(auto &item : links) + { + if(!item.second) + continue; + auto link = item.first; has |= link->has_session_to(link, remote); + } if(!has) { @@ -147,9 +152,9 @@ llarp_router::EnsureIdentity() } void -llarp_router::AddLink(struct llarp_link *link) +llarp_router::AddLink(struct llarp_link *link, bool isOutbound) { - links.push_back(link); + links.push_back({link, isOutbound}); ready = true; } @@ -189,8 +194,9 @@ llarp_router::SaveRC() void llarp_router::Close() { - for(auto &link : links) + for(auto &pair : links) { + auto link = pair.first; link->stop_link(link); link->free_impl(link); delete link; @@ -204,7 +210,8 @@ llarp_router::connect_job_retry(void *user) llarp_link_establish_job *job = static_cast< llarp_link_establish_job * >(user); - llarp::Info("trying to establish session again"); + llarp::Addr remote = job->ai; + llarp::Info("trying to establish session again with ", remote); job->link->try_establish(job->link, job); } @@ -286,8 +293,11 @@ llarp_router::Tick() iter.visit = &send_padded_message; if(sendPadding) { - for(auto link : links) + for(auto &item : links) { + if(!item.second) + continue; + auto link = item.first; link->iter_sessions(link, iter); } } @@ -325,11 +335,14 @@ llarp_router::SendTo(llarp::RouterID remote, llarp::ILinkMessage *msg) buf.cur = buf.base; bool sent = false; - for(auto link : links) + for(auto &item : links) { + if(!item.second) + continue; if(!sent) { - sent = link->sendto(link, remote, buf); + auto link = item.first; + sent = link->sendto(link, remote, buf); } } } @@ -380,11 +393,15 @@ llarp_router::FlushOutboundFor(const llarp::RouterID &remote) llarp::RouterID peer = remote; bool sent = false; - for(auto &link : links) + for(auto &item : links) { - if(!sent) + if(item.second) { - sent = link->sendto(link, peer, buf); + if(!sent) + { + auto link = item.first; + sent = link->sendto(link, peer, buf); + } } } if(!sent) @@ -439,8 +456,11 @@ llarp_router::Run() llarp::Zero(&rc, sizeof(llarp_rc)); // fill our address list rc.addrs = llarp_ai_list_new(); - for(auto link : links) + for(auto &item : links) { + if(item.second) + continue; + auto link = item.first; llarp_ai addr; link->get_our_address(link, &addr); llarp_ai_list_pushback(rc.addrs, &addr); @@ -461,8 +481,9 @@ llarp_router::Run() llarp_dht_context_start(dht, ourPubkey); // start links - for(auto link : links) + for(auto &item : links) { + auto link = item.first; int result = link->start_link(link, logic); if(result == -1) llarp::Warn("Link ", link->name(), " failed to start"); @@ -517,7 +538,7 @@ llarp_init_router(struct llarp_threadpool *tp, struct llarp_ev_loop *netloop, #ifdef TESTNET router->disk = tp; #else - router->disk = llarp_init_threadpool("llarp-diskio", 1); + router->disk = llarp_init_threadpool(1, "llarp-diskio"); #endif llarp_crypto_libsodium_init(&router->crypto); } @@ -552,11 +573,22 @@ llarp_router_try_connect(struct llarp_router *router, struct llarp_rc *remote) llarp_ai addr; if(llarp_ai_list_index(remote->addrs, 0, &addr)) { - llarp_router_iterate_links(router, - {&addr, &llarp_router::iter_try_connect}); - return true; + for(auto &item : router->links) + { + if(!item.second) + continue; + auto link = item.first; + llarp_link_establish_job *job = new llarp_link_establish_job; + + llarp_ai_copy(&job->ai, &addr); + job->timeout = 10000; + job->result = &llarp_router::on_try_connect_result; + // give router as user pointer + job->user = router; + link->try_establish(link, job); + return true; + } } - return false; } @@ -666,9 +698,10 @@ void llarp_router_iterate_links(struct llarp_router *router, struct llarp_router_link_iter i) { - for(auto link : router->links) - if(!i.visit(&i, router, link)) - return; + for(auto item : router->links) + if(item.second) + if(!i.visit(&i, router, item.first)) + return; } void @@ -724,13 +757,10 @@ namespace llarp iwp_link_init(link, args); if(llarp_link_initialized(link)) { - llarp::Debug("link ", key, " initialized"); + llarp::Info("link ", key, " initialized"); if(link->configure(link, self->netloop, key, af, proto)) { - llarp_ai ai; - link->get_our_address(link, &ai); - llarp::Addr addr = ai; - self->AddLink(link); + self->AddLink(link, llarp::StrEq(key, "*")); return; } if(af == AF_INET6) @@ -744,7 +774,7 @@ namespace llarp llarp_ai ai; link->get_our_address(link, &ai); llarp::Addr addr = ai; - self->AddLink(link); + self->AddLink(link, llarp::StrEq(key, "*")); return; } } diff --git a/llarp/router.hpp b/llarp/router.hpp index 488464888..2a766286e 100644 --- a/llarp/router.hpp +++ b/llarp/router.hpp @@ -68,7 +68,7 @@ struct llarp_router llarp::InboundMessageParser inbound_msg_parser; - std::list< llarp_link * > links; + std::list< std::pair< llarp_link *, bool > > links; typedef std::queue< llarp::ILinkMessage * > MessageQueue; @@ -86,7 +86,7 @@ struct llarp_router HandleRecvLinkMessage(struct llarp_link_session *from, llarp_buffer_t msg); void - AddLink(struct llarp_link *link); + AddLink(struct llarp_link *link, bool isOutbound); void Close();