more shadow stuff

pull/1/head
Jeff Becker 6 years ago
parent dc01aabafa
commit a0f1d548f8
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -47,7 +47,7 @@ shadow-build: shadow-configure
shadow: shadow-build shadow: shadow-build
python3 contrib/shadow/genconf.py $(SHADOW_CONFIG) 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: format:
clang-format -i $$(find daemon llarp include | grep -E '\.[h,c](pp)?$$') clang-format -i $$(find daemon llarp include | grep -E '\.[h,c](pp)?$$')

@ -18,7 +18,10 @@ def nodeconf(conf, baseDir, name, ifname, port):
conf['router']['contact-file'] = os.path.join(baseDir, '{}.signed'.format(name)) 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']['ident-privkey'] = os.path.join(baseDir, '{}-ident.key'.format(name))
conf['router']['transport-privkey'] = os.path.join(baseDir, '{}-transport.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'] = {} conf['iwp-connect'] = {}
def addPeer(conf, baseDir, peer): def addPeer(conf, baseDir, peer):
@ -27,7 +30,7 @@ def addPeer(conf, baseDir, peer):
def createNode(pluginName, root, peer): def createNode(pluginName, root, peer):
node = etree.SubElement(root, 'host') node = etree.SubElement(root, 'host')
node.attrib['id'] = peer['name'] node.attrib['id'] = peer['name']
node.attrib['geocodehint'] = 'US' node.attrib['interfacebuffer'] = '{}'.format(1024 * 1024 * 100)
app = etree.SubElement(node, 'process') app = etree.SubElement(node, 'process')
app.attrib['plugin'] = pluginName app.attrib['plugin'] = pluginName
app.attrib['time'] = '50' app.attrib['time'] = '50'
@ -73,7 +76,8 @@ def genconf(settings, outf):
plugin = etree.SubElement(root, "plugin") plugin = etree.SubElement(root, "plugin")
plugin.attrib['id'] = pluginName plugin.attrib['id'] = pluginName
plugin.attrib['path'] = libpath 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) svcNodeCount = getSetting(settings, 'service-nodes', 20)
peers = list() peers = list()
for nodeid in range(svcNodeCount): for nodeid in range(svcNodeCount):
@ -88,11 +92,11 @@ def genconf(settings, outf):
# add client nodes # add client nodes
for nodeid in range(getSetting(settings, 'client-nodes', 200)): 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) 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)) addPeer(peer['config'], baseDir, 'svc-node-{}'.format((p + nodeid) % svcNodeCount))
basePort += 1 clientBasePort += 1
# generate xml and settings files # generate xml and settings files

@ -8,9 +8,11 @@ ident-privkey=server-ident.key
dir=./tmp-nodes dir=./tmp-nodes
[iwp-connect] [iwp-connect]
i2p.rocks=i2p.rocks.signed
#other=other.signed #other=other.signed
#named-node1=/path/to/routercontact1 #named-node1=/path/to/routercontact1
[iwp-links] [iwp-links]
lo=1090 *=1091
#lo=1090
#lo=eth #lo=eth

@ -11,7 +11,7 @@ handle_signal(int sig)
} }
#ifndef TESTNET #ifndef TESTNET
#define TESTNET false #define TESTNET 0
#endif #endif
int int

@ -19,7 +19,7 @@ namespace llarp
struct Logger struct Logger
{ {
LogLevel minlevel = eLogDebug; LogLevel minlevel = eLogInfo;
std::ostream& out = std::cout; std::ostream& out = std::cout;
}; };
@ -86,6 +86,9 @@ namespace llarp
LogAppend(ss, std::forward< TArgs >(args)...); LogAppend(ss, std::forward< TArgs >(args)...);
ss << (char)27 << "[0;0m"; ss << (char)27 << "[0;0m";
_glog.out << ss.str() << std::endl; _glog.out << ss.str() << std::endl;
#ifdef SHADOW_TESTNET
_glog.out << "\n" << std::flush;
#endif
} }
} }

@ -49,10 +49,10 @@ llarp_ev_loop_run_single_process(struct llarp_ev_loop *ev,
{ {
while(true) while(true)
{ {
if(ev->tick(10) == -1)
return;
llarp_logic_tick(logic); llarp_logic_tick(logic);
llarp_threadpool_tick(tp); llarp_threadpool_tick(tp);
if(ev->tick() == -1)
return;
} }
} }

@ -29,7 +29,7 @@ struct llarp_ev_loop
run() = 0; run() = 0;
virtual int virtual int
tick() = 0; tick(int ms) = 0;
virtual void virtual void
stop() = 0; stop() = 0;

@ -101,13 +101,13 @@ struct llarp_epoll_loop : public llarp_ev_loop
} }
int int
tick() tick(int ms)
{ {
epoll_event events[1024]; epoll_event events[1024];
int result; int result;
byte_t readbuf[2048]; byte_t readbuf[2048];
result = epoll_wait(epollfd, events, 1024, 100); result = epoll_wait(epollfd, events, 1024, ms);
if(result > 0) if(result > 0)
{ {
int idx = 0; int idx = 0;

@ -93,8 +93,9 @@ struct llarp_kqueue_loop : public llarp_ev_loop
} }
int int
tick() tick(int ms)
{ {
(void)ms;
struct kevent events[1024]; struct kevent events[1024];
int result; int result;
byte_t readbuf[2048]; byte_t readbuf[2048];

@ -797,18 +797,7 @@ namespace iwp
} }
static void static void
handle_verify_session_start(iwp_async_session_start *s) 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();
}
void void
send_LIM() send_LIM()
@ -948,7 +937,7 @@ namespace iwp
if(introack->buf == nullptr) if(introack->buf == nullptr)
{ {
// invalid signature // invalid signature
llarp::Error("introack verify failed"); llarp::Error("introack verify failed from ", link->addr);
return; return;
} }
link->EnterState(eIntroAckRecv); link->EnterState(eIntroAckRecv);
@ -961,7 +950,9 @@ namespace iwp
handle_generated_session_start(iwp_async_session_start *start) handle_generated_session_start(iwp_async_session_start *start)
{ {
session *link = static_cast< session * >(start->user); 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); link->EnterState(eSessionStartSent);
} }
@ -1029,7 +1020,9 @@ namespace iwp
{ {
session *self = static_cast< session * >(frame->user); session *self = static_cast< session * >(frame->user);
llarp::Debug("tx ", frame->sz, " frames=", self->frames); 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--; self->frames--;
} }
@ -1070,7 +1063,7 @@ namespace iwp
session *self = static_cast< session * >(intro->user); session *self = static_cast< session * >(intro->user);
if(!intro->buf) if(!intro->buf)
{ {
llarp::Error("intro verify failed"); llarp::Error("intro verify failed from ", self->addr);
delete self; delete self;
return; return;
} }
@ -1241,7 +1234,9 @@ namespace iwp
char keyfile[255]; char keyfile[255];
uint32_t timeout_job_id; 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; LinkMap_t m_sessions;
mtx_t m_sessions_Mutex; mtx_t m_sessions_Mutex;
@ -1485,6 +1480,7 @@ namespace iwp
{ {
// new inbound session // new inbound session
s = link->create_session(*saddr, link->seckey); s = link->create_session(*saddr, link->seckey);
llarp::Debug("new inbound session from ", s->addr);
} }
s->recv(buf, sz); s->recv(buf, sz);
} }
@ -1641,6 +1637,21 @@ namespace iwp
return true; 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 * server *
link_alloc(struct llarp_router *router, const char *keyfile, link_alloc(struct llarp_router *router, const char *keyfile,
struct llarp_crypto *crypto, struct llarp_logic *logic, struct llarp_crypto *crypto, struct llarp_logic *logic,

@ -181,16 +181,8 @@ namespace llarp
bool bool
operator<(const Addr& other) const operator<(const Addr& other) const
{ {
int a = af(); return port() < other.port() || *addr6() < *other.addr6()
if(a == other.af()) || af() < 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;
} }
bool bool
@ -199,6 +191,12 @@ namespace llarp
return af() == other.af() && memcmp(addr6(), other.addr6(), 16) == 0 return af() == other.af() && memcmp(addr6(), other.addr6(), 16) == 0
&& port() == other.port(); && port() == other.port();
} }
bool
operator!=(const Addr& other) const
{
return !(*this == other);
}
}; };
struct addrhash struct addrhash
@ -207,7 +205,7 @@ namespace llarp
operator()(Addr const& a) const noexcept operator()(Addr const& a) const noexcept
{ {
uint8_t empty[16] = {0}; 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();
} }
}; };
} }

@ -52,8 +52,13 @@ llarp_router::SendToOrQueue(const llarp::RouterID &remote,
std::vector< llarp::ILinkMessage * > msgs) std::vector< llarp::ILinkMessage * > msgs)
{ {
bool has = false; 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); has |= link->has_session_to(link, remote);
}
if(!has) if(!has)
{ {
@ -147,9 +152,9 @@ llarp_router::EnsureIdentity()
} }
void 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; ready = true;
} }
@ -189,8 +194,9 @@ llarp_router::SaveRC()
void void
llarp_router::Close() llarp_router::Close()
{ {
for(auto &link : links) for(auto &pair : links)
{ {
auto link = pair.first;
link->stop_link(link); link->stop_link(link);
link->free_impl(link); link->free_impl(link);
delete link; delete link;
@ -204,7 +210,8 @@ llarp_router::connect_job_retry(void *user)
llarp_link_establish_job *job = llarp_link_establish_job *job =
static_cast< llarp_link_establish_job * >(user); 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); job->link->try_establish(job->link, job);
} }
@ -286,8 +293,11 @@ llarp_router::Tick()
iter.visit = &send_padded_message; iter.visit = &send_padded_message;
if(sendPadding) if(sendPadding)
{ {
for(auto link : links) for(auto &item : links)
{ {
if(!item.second)
continue;
auto link = item.first;
link->iter_sessions(link, iter); link->iter_sessions(link, iter);
} }
} }
@ -325,11 +335,14 @@ llarp_router::SendTo(llarp::RouterID remote, llarp::ILinkMessage *msg)
buf.cur = buf.base; buf.cur = buf.base;
bool sent = false; bool sent = false;
for(auto link : links) for(auto &item : links)
{ {
if(!item.second)
continue;
if(!sent) 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; llarp::RouterID peer = remote;
bool sent = false; 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) if(!sent)
@ -439,8 +456,11 @@ llarp_router::Run()
llarp::Zero(&rc, sizeof(llarp_rc)); llarp::Zero(&rc, sizeof(llarp_rc));
// fill our address list // fill our address list
rc.addrs = llarp_ai_list_new(); 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; llarp_ai addr;
link->get_our_address(link, &addr); link->get_our_address(link, &addr);
llarp_ai_list_pushback(rc.addrs, &addr); llarp_ai_list_pushback(rc.addrs, &addr);
@ -461,8 +481,9 @@ llarp_router::Run()
llarp_dht_context_start(dht, ourPubkey); llarp_dht_context_start(dht, ourPubkey);
// start links // start links
for(auto link : links) for(auto &item : links)
{ {
auto link = item.first;
int result = link->start_link(link, logic); int result = link->start_link(link, logic);
if(result == -1) if(result == -1)
llarp::Warn("Link ", link->name(), " failed to start"); 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 #ifdef TESTNET
router->disk = tp; router->disk = tp;
#else #else
router->disk = llarp_init_threadpool("llarp-diskio", 1); router->disk = llarp_init_threadpool(1, "llarp-diskio");
#endif #endif
llarp_crypto_libsodium_init(&router->crypto); 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; llarp_ai addr;
if(llarp_ai_list_index(remote->addrs, 0, &addr)) if(llarp_ai_list_index(remote->addrs, 0, &addr))
{ {
llarp_router_iterate_links(router, for(auto &item : router->links)
{&addr, &llarp_router::iter_try_connect}); {
return true; 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; return false;
} }
@ -666,9 +698,10 @@ void
llarp_router_iterate_links(struct llarp_router *router, llarp_router_iterate_links(struct llarp_router *router,
struct llarp_router_link_iter i) struct llarp_router_link_iter i)
{ {
for(auto link : router->links) for(auto item : router->links)
if(!i.visit(&i, router, link)) if(item.second)
return; if(!i.visit(&i, router, item.first))
return;
} }
void void
@ -724,13 +757,10 @@ namespace llarp
iwp_link_init(link, args); iwp_link_init(link, args);
if(llarp_link_initialized(link)) if(llarp_link_initialized(link))
{ {
llarp::Debug("link ", key, " initialized"); llarp::Info("link ", key, " initialized");
if(link->configure(link, self->netloop, key, af, proto)) if(link->configure(link, self->netloop, key, af, proto))
{ {
llarp_ai ai; self->AddLink(link, llarp::StrEq(key, "*"));
link->get_our_address(link, &ai);
llarp::Addr addr = ai;
self->AddLink(link);
return; return;
} }
if(af == AF_INET6) if(af == AF_INET6)
@ -744,7 +774,7 @@ namespace llarp
llarp_ai ai; llarp_ai ai;
link->get_our_address(link, &ai); link->get_our_address(link, &ai);
llarp::Addr addr = ai; llarp::Addr addr = ai;
self->AddLink(link); self->AddLink(link, llarp::StrEq(key, "*"));
return; return;
} }
} }

@ -68,7 +68,7 @@ struct llarp_router
llarp::InboundMessageParser inbound_msg_parser; llarp::InboundMessageParser inbound_msg_parser;
std::list< llarp_link * > links; std::list< std::pair< llarp_link *, bool > > links;
typedef std::queue< llarp::ILinkMessage * > MessageQueue; typedef std::queue< llarp::ILinkMessage * > MessageQueue;
@ -86,7 +86,7 @@ struct llarp_router
HandleRecvLinkMessage(struct llarp_link_session *from, llarp_buffer_t msg); HandleRecvLinkMessage(struct llarp_link_session *from, llarp_buffer_t msg);
void void
AddLink(struct llarp_link *link); AddLink(struct llarp_link *link, bool isOutbound);
void void
Close(); Close();

Loading…
Cancel
Save