Attempt to get this SockAddr refactor up and running

pull/1261/head
Stephen Shelton 4 years ago
parent 174c9ec740
commit cd44caccaf
No known key found for this signature in database
GPG Key ID: EE4BADACCE8B631C

@ -16,16 +16,17 @@ namespace llarp
bool bool
ExitInfo::BEncode(llarp_buffer_t* buf) const ExitInfo::BEncode(llarp_buffer_t* buf) const
{ {
// TODO: derive these from ipAdress SockAddr addr = ipAddress.createSockAddr();
throw std::runtime_error("FIXME: need in6_addr and netmask from IpAddress"); const sockaddr_in6* addr6 = addr;
in6_addr address;
in6_addr netmask; in6_addr netmask;
memset(netmask.s6_addr, 0xff, 16);
char tmp[128] = {0}; char tmp[128] = {0};
if (!bencode_start_dict(buf)) if (!bencode_start_dict(buf))
return false; return false;
if (!inet_ntop(AF_INET6, address.s6_addr, tmp, sizeof(tmp))) if (!inet_ntop(AF_INET6, &addr6->sin6_addr, tmp, sizeof(tmp)))
return false; return false;
if (!BEncodeWriteDictString("a", std::string(tmp), buf)) if (!BEncodeWriteDictString("a", std::string(tmp), buf))
return false; return false;
@ -63,26 +64,31 @@ namespace llarp
bool bool
ExitInfo::DecodeKey(const llarp_buffer_t& k, llarp_buffer_t* buf) ExitInfo::DecodeKey(const llarp_buffer_t& k, llarp_buffer_t* buf)
{ {
// TODO: derive these from ipAdress
throw std::runtime_error("FIXME: need in6_addr and netmask from IpAddress");
in6_addr address;
in6_addr netmask;
bool read = false; bool read = false;
if (!BEncodeMaybeReadDictEntry("k", pubkey, read, k, buf)) if (!BEncodeMaybeReadDictEntry("k", pubkey, read, k, buf))
return false; return false;
if (!BEncodeMaybeReadDictInt("v", version, read, k, buf)) if (!BEncodeMaybeReadDictInt("v", version, read, k, buf))
return false; return false;
if (k == "a") if (k == "a")
return bdecode_ip_string(buf, address); {
// TODO: read into ipAddress
in6_addr tmp;
return bdecode_ip_string(buf, tmp);
}
if (k == "b") if (k == "b")
{
// TODO: we don't use this currently, but we shoudn't drop it on the floor
// it appears that all clients should be advertising 0xff..ff for netmask
in6_addr netmask;
return bdecode_ip_string(buf, netmask); return bdecode_ip_string(buf, netmask);
}
return read; return read;
} }
std::ostream& std::ostream&
ExitInfo::print(std::ostream& stream, int level, int spaces) const ExitInfo::print(std::ostream& stream, int level, int spaces) const
{ {
/*
// TODO: derive these from ipAdress // TODO: derive these from ipAdress
throw std::runtime_error("FIXME: need in6_addr and netmask from IpAddress"); throw std::runtime_error("FIXME: need in6_addr and netmask from IpAddress");
in6_addr address; in6_addr address;
@ -105,6 +111,8 @@ namespace llarp
ss << std::to_string(llarp::bits::count_array_bits(netmask.s6_addr)); ss << std::to_string(llarp::bits::count_array_bits(netmask.s6_addr));
#endif #endif
printer.printValue(ss.str()); printer.printValue(ss.str());
*/
stream << ipAddress.toString();
return stream; return stream;
} }

@ -1,50 +1,72 @@
#include <net/ip_address.hpp> #include <net/ip_address.hpp>
#include <net/net.hpp>
namespace llarp namespace llarp
{ {
IpAddress::IpAddress(std::string_view str) IpAddress::IpAddress(std::string_view str)
{ {
throw std::runtime_error("FIXME"); setAddress(str);
} }
IpAddress::IpAddress(std::string_view str, std::optional<uint16_t> port) IpAddress::IpAddress(std::string_view str, std::optional<uint16_t> port)
{ {
throw std::runtime_error("FIXME"); setAddress(str, port);
} }
IpAddress::IpAddress(const SockAddr& addr) IpAddress::IpAddress(const SockAddr& addr)
{ {
throw std::runtime_error("FIXME"); m_ipAddress = addr.toString();
uint16_t port = addr.getPort();
if (port > 0)
m_port = port;
} }
SockAddr& IpAddress&
IpAddress::operator=(const sockaddr& other) IpAddress::operator=(const sockaddr& other)
{ {
throw std::runtime_error("FIXME"); SockAddr addr(other);
m_ipAddress = addr.toString();
uint16_t port = addr.getPort();
if (port > 0)
m_port = port;
return *this;
} }
std::optional<uint16_t> std::optional<uint16_t>
IpAddress::getPort() const IpAddress::getPort() const
{ {
throw std::runtime_error("FIXME"); return m_port;
} }
void void
IpAddress::setPort(std::optional<uint16_t> port) IpAddress::setPort(std::optional<uint16_t> port)
{ {
throw std::runtime_error("FIXME"); m_port = port;
} }
void void
IpAddress::setAddress(std::string_view str) IpAddress::setAddress(std::string_view str)
{ {
throw std::runtime_error("FIXME"); SockAddr addr;
addr.fromString(str);
m_ipAddress = std::string(str);
uint16_t port = addr.getPort();
if (port > 0)
m_port = port;
} }
void void
IpAddress::setAddress(std::string_view str, std::optional<uint16_t> port) IpAddress::setAddress(std::string_view str, std::optional<uint16_t> port)
{ {
throw std::runtime_error("FIXME"); SockAddr addr;
addr.fromString(str);
m_ipAddress = std::string(str);
m_port = port;
} }
bool bool
@ -62,19 +84,26 @@ namespace llarp
SockAddr SockAddr
IpAddress::createSockAddr() const IpAddress::createSockAddr() const
{ {
throw std::runtime_error("FIXME"); SockAddr addr(m_ipAddress);
if (m_port)
addr.setPort(m_port.value());
return addr;
} }
bool bool
IpAddress::isBogon() const IpAddress::isBogon() const
{ {
throw std::runtime_error("FIXME"); SockAddr addr(m_ipAddress);
const sockaddr_in6* addr6 = addr;
uint8_t* raw = addr6->sin6_addr.s6_addr;
return IsIPv4Bogon(ipaddr_ipv4_bits(raw[12], raw[13], raw[14], raw[15]));
} }
std::string std::string
IpAddress::toString() const IpAddress::toString() const
{ {
throw std::runtime_error("FIXME"); return m_ipAddress; // TODO: port
} }
bool bool
@ -92,7 +121,7 @@ namespace llarp
std::ostream& std::ostream&
operator<<(std::ostream& out, const IpAddress& address) operator<<(std::ostream& out, const IpAddress& address)
{ {
throw std::runtime_error("FIXME"); out << address.toString();
} }
} // namespace llarp } // namespace llarp

@ -48,7 +48,7 @@ namespace llarp
/// @param addr is an SockAddr to initialize from. /// @param addr is an SockAddr to initialize from.
IpAddress(const SockAddr& addr); IpAddress(const SockAddr& addr);
SockAddr& IpAddress&
operator=(const sockaddr& other); operator=(const sockaddr& other);
/// Return the port. Returns -1 if no port has been provided. /// Return the port. Returns -1 if no port has been provided.

@ -428,17 +428,14 @@ namespace llarp
{ {
if (i->ifa_addr->sa_family == af) if (i->ifa_addr->sa_family == af)
{ {
/* TODO: why the fuck does'n this work? llarp::SockAddr a(i->ifa_addr);
// llarp::SockAddr a(i->ifa_addr); llarp::IpAddress ip(a);
// llarp::IpAddress ip(a);
if (!ip.isBogon()) if (!ip.isBogon())
{ {
ifname = i->ifa_name; ifname = i->ifa_name;
found = true; found = true;
} }
*/
throw std::runtime_error("WTF");
} }
} }
}); });
@ -544,10 +541,8 @@ namespace llarp
sockaddr* sptr = (sockaddr*)&s; sockaddr* sptr = (sockaddr*)&s;
if (!llarp_getifaddr(ifname.c_str(), af, sptr)) if (!llarp_getifaddr(ifname.c_str(), af, sptr))
return std::nullopt; return std::nullopt;
// TODO: why the fuck does this not compile? llarp::SockAddr saddr = SockAddr(*sptr);
// llarp::SockAddr saddr = SockAddr(*sptr); return llarp::IpAddress(saddr);
// return llarp::IpAddress(saddr);
throw std::runtime_error("WTF");
} }
bool bool
@ -559,10 +554,8 @@ namespace llarp
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(0); addr.sin_port = htons(0);
// TODO: why the fuck doesn't this work? SockAddr saddr = SockAddr(addr);
// SockAddr saddr = SockAddr(addr); result = IpAddress(saddr);
// result = IpAddress(saddr);
throw std::runtime_error("WTF");
return true; return true;
} }
if (af == AF_INET6) if (af == AF_INET6)

@ -125,11 +125,20 @@ namespace llarp
return (sockaddr*)&m_addr; return (sockaddr*)&m_addr;
} }
SockAddr::operator const sockaddr_in6*() const
{
return &m_addr;
}
void void
SockAddr::fromString(std::string_view str) SockAddr::fromString(std::string_view str)
{ {
if (str.empty()) if (str.empty())
throw std::invalid_argument("cannot construct IPv4 from empty string"); {
init();
m_empty = true;
return;
}
// NOTE: this potentially involves multiple memory allocations, // NOTE: this potentially involves multiple memory allocations,
// reimplement without split() if it is performance bottleneck // reimplement without split() if it is performance bottleneck

@ -33,6 +33,7 @@ namespace llarp
operator=(const sockaddr_in6& addr); operator=(const sockaddr_in6& addr);
operator const sockaddr*() const; operator const sockaddr*() const;
operator const sockaddr_in6*() const;
void void
fromString(std::string_view str); fromString(std::string_view str);

Loading…
Cancel
Save