2018-07-30 04:38:14 +00:00
|
|
|
#ifndef _WIN32
|
2018-04-05 14:43:16 +00:00
|
|
|
#include <arpa/inet.h>
|
2018-07-30 04:38:14 +00:00
|
|
|
#endif
|
|
|
|
|
2019-01-14 21:46:07 +00:00
|
|
|
#include <net/exit_info.hpp>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <util/bencode.h>
|
|
|
|
#include <util/mem.h>
|
2018-12-12 02:52:51 +00:00
|
|
|
|
2018-05-28 13:49:44 +00:00
|
|
|
#include <list>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <string.h>
|
2018-05-10 23:32:46 +00:00
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
namespace llarp
|
2018-05-22 15:54:19 +00:00
|
|
|
{
|
2018-08-31 12:46:54 +00:00
|
|
|
ExitInfo::~ExitInfo()
|
2018-05-22 15:54:19 +00:00
|
|
|
{
|
2018-05-10 23:32:46 +00:00
|
|
|
}
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2018-08-31 13:51:24 +00:00
|
|
|
ExitInfo&
|
|
|
|
ExitInfo::operator=(const ExitInfo& other)
|
|
|
|
{
|
|
|
|
memcpy(address.s6_addr, other.address.s6_addr, 16);
|
|
|
|
memcpy(netmask.s6_addr, other.netmask.s6_addr, 16);
|
|
|
|
pubkey = other.pubkey;
|
|
|
|
version = other.version;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
bool
|
|
|
|
ExitInfo::BEncode(llarp_buffer_t* buf) const
|
2018-05-22 15:54:19 +00:00
|
|
|
{
|
2018-08-31 12:46:54 +00:00
|
|
|
char tmp[128] = {0};
|
|
|
|
if(!bencode_start_dict(buf))
|
2018-05-22 15:54:19 +00:00
|
|
|
return false;
|
|
|
|
|
2018-11-09 14:48:43 +00:00
|
|
|
if(!inet_ntop(AF_INET6, (void*)&address, tmp, sizeof(tmp)))
|
2018-05-22 15:54:19 +00:00
|
|
|
return false;
|
2018-08-31 12:46:54 +00:00
|
|
|
if(!BEncodeWriteDictString("a", std::string(tmp), buf))
|
2018-05-22 15:54:19 +00:00
|
|
|
return false;
|
|
|
|
|
2018-11-09 14:48:43 +00:00
|
|
|
if(!inet_ntop(AF_INET6, (void*)&netmask, tmp, sizeof(tmp)))
|
2018-05-22 15:54:19 +00:00
|
|
|
return false;
|
2018-08-31 12:46:54 +00:00
|
|
|
if(!BEncodeWriteDictString("b", std::string(tmp), buf))
|
2018-05-22 15:54:19 +00:00
|
|
|
return false;
|
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
if(!BEncodeWriteDictEntry("k", pubkey, buf))
|
2018-05-22 15:54:19 +00:00
|
|
|
return false;
|
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
if(!BEncodeWriteDictInt("v", version, buf))
|
|
|
|
return false;
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
return bencode_end(buf);
|
|
|
|
}
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2019-01-17 15:11:17 +00:00
|
|
|
static bool
|
|
|
|
bdecode_ip_string(llarp_buffer_t* buf, in6_addr& ip)
|
|
|
|
{
|
|
|
|
char tmp[128] = {0};
|
|
|
|
llarp_buffer_t strbuf;
|
|
|
|
if(!bencode_read_string(buf, &strbuf))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if(strbuf.sz >= sizeof(tmp))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
memcpy(tmp, strbuf.base, strbuf.sz);
|
|
|
|
tmp[strbuf.sz] = 0;
|
|
|
|
return inet_pton(AF_INET6, tmp, &ip.s6_addr[0]) == 1;
|
|
|
|
}
|
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
bool
|
2019-01-17 15:11:17 +00:00
|
|
|
ExitInfo::DecodeKey(llarp_buffer_t k, llarp_buffer_t* buf)
|
2018-08-31 12:46:54 +00:00
|
|
|
{
|
|
|
|
bool read = false;
|
2019-01-17 15:11:17 +00:00
|
|
|
if(!BEncodeMaybeReadDictEntry("k", pubkey, read, k, buf))
|
|
|
|
return false;
|
|
|
|
if(!BEncodeMaybeReadDictInt("v", version, read, k, buf))
|
|
|
|
return false;
|
|
|
|
if(llarp_buffer_eq(k, "a"))
|
|
|
|
return bdecode_ip_string(buf, address);
|
|
|
|
if(llarp_buffer_eq(k, "b"))
|
|
|
|
return bdecode_ip_string(buf, netmask);
|
2018-08-31 12:46:54 +00:00
|
|
|
return read;
|
|
|
|
}
|
2018-05-30 20:56:47 +00:00
|
|
|
|
2018-08-31 12:46:54 +00:00
|
|
|
} // namespace llarp
|