mirror of https://github.com/oxen-io/lokinet
more shadow stuff
This commit is contained in:
parent
dc01aabafa
commit
a0f1d548f8
2
Makefile
2
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)?$$')
|
||||
|
|
|
@ -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…
Reference in New Issue