getSockAddr(), findFreePrivateRange(), findFreeLokiTunIfName()

pull/19/head
Ryan Tharp 6 years ago
parent 50a87f605e
commit 48d9a38534

@ -55,7 +55,7 @@ namespace llarp
{
// network order
sockaddr_in6 _addr;
sockaddr_in _addr4;
sockaddr_in _addr4; // why do we even have this?
~Addr(){};
Addr(){};
@ -141,6 +141,7 @@ namespace llarp
return false;
}
// put it in _addr4
struct in_addr* addr = &_addr4.sin_addr;
if(inet_aton(str, addr) == 0)
{
@ -160,6 +161,7 @@ namespace llarp
addrptr[10] = 0xff;
memcpy(12 + addrptr, &addr->s_addr, sizeof(in_addr));
freeaddrinfo(res);
return true;
}
@ -193,6 +195,8 @@ namespace llarp
addrptr[11] = 0xff;
addrptr[10] = 0xff;
memcpy(12 + addrptr, &addr->s_addr, sizeof(in_addr));
// copy ipv6 SIIT into _addr4
memcpy(&_addr4.sin_addr.s_addr, addr4(), sizeof(in_addr));
return true;
}
@ -442,6 +446,12 @@ namespace llarp
return addr4()->s_addr;
}
sockaddr*
getSockAddr()
{
return (struct sockaddr*)&_addr4;
}
bool
sameAddr(const Addr& other) const
{
@ -531,6 +541,14 @@ namespace llarp
bool
GetBestNetIF(std::string& ifname, int af = AF_INET);
/// look at adapter ranges and find a free one
std::string
findFreePrivateRange();
/// look at adapter names and find a free one
std::string
findFreeLokiTunIfName();
/// get network interface address for network interface with ifname
bool
GetIFAddr(const std::string& ifname, Addr& addr, int af = AF_INET);

@ -42,7 +42,14 @@ namespace llarp
sockaddr* addr = (sockaddr*)&src;
ssize_t ret = ::recvfrom(fd, buf, sz, 0, addr, &slen);
if(ret == -1)
{
llarp::LogWarn("recvfrom failed");
return -1;
}
if (addr)
{
llarp::LogWarn("no source addr");
}
// Addr is the source
udp->recvfrom(udp, addr, buf, ret);
return 0;
@ -203,7 +210,14 @@ struct llarp_kqueue_loop : public llarp_ev_loop
while(idx < result)
{
llarp::ev_io* ev = static_cast< llarp::ev_io* >(events[idx].udata);
ev->read(readbuf, sizeof(readbuf));
if (ev)
{
ev->read(readbuf, sizeof(readbuf));
}
else
{
llarp::LogWarn("event[", idx,"] udata is not an ev_io");
}
++idx;
}
}
@ -292,7 +306,7 @@ struct llarp_kqueue_loop : public llarp_ev_loop
}
}
llarp::Addr a(*addr);
llarp::LogInfo("bind to ", a);
llarp::LogDebug("bind to ", a);
// FreeBSD handbook said to do this
if(addr->sa_family == AF_INET && INADDR_ANY)
a._addr4.sin_addr.s_addr = htonl(INADDR_ANY);

@ -887,6 +887,61 @@ namespace llarp
return found;
}
std::string
findFreePrivateRange()
{
// pick ip
struct privatesInUse ifsInUse = llarp_getPrivateIfs();
std::string ip = "";
if(!ifsInUse.ten)
{
ip = "10.200.0.1/24";
}
else if(!ifsInUse.oneSeven)
{
ip = "172.16.10.1/24";
}
else if(!ifsInUse.oneNine)
{
ip = "192.168.10.1/24";
}
else
{
llarp::LogError(
"Couldn't easily detect a private range to map lokinet onto");
return "";
}
llarp::LogDebug("Detected " + ip
+ " is available for use, configuring as such");
return ip;
}
std::string
findFreeLokiTunIfName()
{
uint8_t num = 0;
while(num < 255)
{
std::string iftestname = "lokitun" + std::to_string(num);
struct sockaddr addr;
bool found = llarp_getifaddr(iftestname.c_str(), AF_INET, &addr);
if(!found)
{
llarp::LogDebug("Detected " + iftestname
+ " is available for use, configuring as such");
break;
}
num++;
}
if(num == 255)
{
// llarp::LogError("Could not find any free lokitun interface names");
return "";
}
// include lokitun prefix to communicate result is valid
return "lokitun" + std::to_string(num);
}
bool
GetIFAddr(const std::string& ifname, Addr& addr, int af)
{

Loading…
Cancel
Save