ipv4 fixes

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

@ -24,7 +24,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
set(EXE llarpd)
set(EXE_SRC daemon/main.cpp)
set(LIBS sodium pthread stdc++fs)
set(SODIUM_LIB sodium)
set(LIBS ${SODIUM_LIB} pthread stdc++fs)
set(LIB llarp)
set(SHARED_LIB ${LIB})

@ -1,7 +1,7 @@
[router]
worker-threads=8
net-threads=2
contact-file=other.signed
contact-file=router.signed
ident-privkey=server-ident.key
[netdb]

@ -50,6 +50,7 @@ namespace llarp
default:
return -1;
}
llarp::Debug(__FILE__, "send ", sz, " bytes");
ssize_t sent = ::sendto(fd, data, sz, SOCK_NONBLOCK, to, slen);
if(sent == -1)
perror("sendto()");

@ -23,6 +23,7 @@
#include "mem.hpp"
#include "net.hpp"
#include "router.hpp"
#include "str.hpp"
namespace iwp
{
@ -651,6 +652,7 @@ namespace iwp
void
send_LIM()
{
llarp::Debug(__FILE__, "send LIM");
llarp_shorthash_t digest;
// 64 bytes overhead for link message
byte_t tmp[MAX_RC_SIZE + 64];
@ -910,12 +912,19 @@ namespace iwp
session *link = static_cast< session * >(i->user);
if(i->buf)
{
llarp_ev_udp_sendto(link->udp, link->addr, i->buf, i->sz);
llarp::Debug(__FILE__, "send introack");
if(llarp_ev_udp_sendto(link->udp, link->addr, i->buf, i->sz) == -1)
{
llarp::Warn(__FILE__, "sendto failed");
return;
}
llarp::Debug(__FILE__, "sent");
link->EnterState(eIntroAckSent);
}
else
{
// failed to generate?
llarp::Warn(__FILE__, "failed to generate introack");
}
}
@ -1006,9 +1015,14 @@ namespace iwp
session *link = static_cast< session * >(i->user);
if(i->buf)
{
llarp::Debug(__FILE__, "send intro");
llarp_ev_udp_sendto(link->udp, link->addr, i->buf, i->sz);
link->EnterState(eIntroSent);
}
else
{
llarp::Warn(__FILE__, "failed to generate intro");
}
}
static void
@ -1029,7 +1043,6 @@ namespace iwp
self->establish_job->session = nullptr;
}
self->establish_job->result(self->establish_job);
delete self->establish_job;
self->establish_job = nullptr;
}
}
@ -1410,6 +1423,8 @@ namespace iwp
return false;
}
llarp::Debug(__FILE__, "configure link ifname=", ifname, " af=", af,
" port=", port);
// bind
sockaddr_in ip4addr;
sockaddr_in6 ip6addr;
@ -1417,23 +1432,28 @@ namespace iwp
switch(af)
{
case AF_INET:
addr = (sockaddr *)&ip4addr;
ip4addr.sin_port = htons(port);
addr = (sockaddr *)&ip4addr;
llarp::Zero(addr, sizeof(ip4addr));
break;
case AF_INET6:
addr = (sockaddr *)&ip6addr;
ip6addr.sin6_port = htons(port);
addr = (sockaddr *)&ip6addr;
llarp::Zero(addr, sizeof(ip6addr));
break;
// TODO: AF_PACKET
default:
return false;
}
if(!llarp_getifaddr(ifname, af, addr))
addr->sa_family = af;
if(!llarp::StrEq(ifname, "*"))
{
llarp::Error(__FILE__, "failed to get address of network interface ",
ifname);
return false;
if(!llarp_getifaddr(ifname, af, addr))
{
llarp::Error(__FILE__, "failed to get address of network interface ",
ifname);
return false;
}
}
switch(af)
@ -1454,7 +1474,12 @@ namespace iwp
link->udp.recvfrom = &server::handle_recvfrom;
link->udp.user = link;
llarp::Debug(__FILE__, "bind IWP link to ", link->addr.to_string());
return llarp_ev_add_udp(link->netloop, &link->udp, link->addr) != -1;
if(llarp_ev_add_udp(link->netloop, &link->udp, link->addr) == -1)
{
llarp::Error(__FILE__, "failed to bind to ", link->addr.to_string());
return false;
}
return true;
}
bool

@ -19,7 +19,7 @@ namespace llarp
struct Addr
{
sockaddr_in6 _addr;
sockaddr_in _addr4;
~Addr(){};
Addr(){};
@ -55,9 +55,22 @@ namespace llarp
Addr(const llarp_ai& other)
{
_addr.sin6_family = AF_INET6;
memcpy(addr6(), other.ip.s6_addr, 16);
_addr.sin6_port = htons(other.port);
auto ptr = &_addr.sin6_addr.s6_addr[0];
// TODO: detect SIIT better
if(ptr[11] == 0xff && ptr[10] == 0xff && ptr[9] == 0 && ptr[9] == 0
&& ptr[8] == 0 && ptr[7] == 0 && ptr[6] == 0 && ptr[5] == 0
&& ptr[4] == 0 && ptr[3] == 0 && ptr[2] == 0 && ptr[1] == 0
&& ptr[0] == 0)
{
_addr4.sin_family = AF_INET;
_addr4.sin_port = htons(other.port);
_addr.sin6_family = AF_INET;
memcpy(&_addr4.sin_addr.s_addr, addr4(), sizeof(in_addr));
}
else
_addr.sin6_family = AF_INET6;
}
Addr(const sockaddr& other)
@ -72,9 +85,12 @@ namespace llarp
// SIIT
memcpy(12 + addrptr, &((const sockaddr_in*)(&other))->sin_addr,
sizeof(in_addr));
addrptr[11] = 0xff;
addrptr[10] = 0xff;
*port = ((sockaddr_in*)(&other))->sin_port;
addrptr[11] = 0xff;
addrptr[10] = 0xff;
*port = ((sockaddr_in*)(&other))->sin_port;
_addr4.sin_family = AF_INET;
_addr4.sin_port = *port;
memcpy(&_addr4.sin_addr.s_addr, addr4(), sizeof(in_addr));
break;
case AF_INET6:
memcpy(addrptr, &((const sockaddr_in6*)(&other))->sin6_addr.s6_addr,
@ -117,7 +133,10 @@ namespace llarp
operator const sockaddr*() const
{
return (const sockaddr*)&_addr;
if(af() == AF_INET)
return (const sockaddr*)&_addr4;
else
return (const sockaddr*)&_addr;
}
void

@ -41,7 +41,9 @@ struct llarp_nodedb
for(const char &ch : skiplist_subdirs)
{
fs::path sub = path / std::string(ch, 1);
std::string p;
p += ch;
fs::path sub = path / p;
for(auto &f : fs::directory_iterator(sub))
{
ssize_t l = loadSubdir(f);
@ -139,7 +141,9 @@ llarp_nodedb_ensure_dir(const char *dir)
for(const char &ch : skiplist_subdirs)
{
fs::path sub = path / std::string(ch, 1);
std::string p;
p += ch;
fs::path sub = path / p;
fs::create_directory(sub, ec);
if(ec)
return false;

@ -156,12 +156,12 @@ llarp_router::Close()
void
llarp_router::on_try_connect_result(llarp_link_establish_job *job)
{
llarp_router *router = static_cast< llarp_router * >(job->user);
if(job->session)
{
llarp_rc *remote = job->session->get_remote_router(job->session);
if(remote)
{
llarp_router *router = static_cast< llarp_router * >(job->user);
llarp::pubkey pubkey;
memcpy(&pubkey[0], remote->pubkey, 32);
char tmp[68] = {0};
@ -184,10 +184,12 @@ llarp_router::on_try_connect_result(llarp_link_establish_job *job)
}
router->pendingMessages.erase(itr);
}
delete job;
return;
}
}
llarp::Info(__FILE__, "session not established");
job->link->try_establish(job->link, job);
}
void
@ -253,7 +255,7 @@ llarp_router::iter_try_connect(llarp_router_link_iter *iter,
return true;
llarp_ai *ai = static_cast< llarp_ai * >(iter->user);
llarp_ai_copy(&job->ai, ai);
job->timeout = 5000;
job->timeout = 1000;
job->result = &llarp_router::on_try_connect_result;
// give router as user pointer
job->user = router;
@ -448,7 +450,7 @@ namespace llarp
}
else
{
af = AF_INET6;
af = AF_INET;
proto = std::atoi(val);
}

Loading…
Cancel
Save