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
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)?$$')

@ -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

@ -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

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

@ -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
}
}

@ -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;
}
}

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

@ -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;

@ -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];

@ -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,

@ -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();
}
};
}

@ -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;
}
}

@ -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();

Loading…
Cancel
Save