Commit b1ac778b authored by Jakob Otto's avatar Jakob Otto

Rework conversion functions

parent 969ef9ba
...@@ -24,13 +24,9 @@ ...@@ -24,13 +24,9 @@
namespace caf { namespace caf {
namespace detail { namespace detail {
sockaddr_in6 to_sockaddr(const ipv6_endpoint& ep); sockaddr_storage to_sockaddr(const ip_endpoint& ep);
ipv6_endpoint to_ip_endpoint(const sockaddr_in6& addr); ip_endpoint to_ip_endpoint(const sockaddr_storage& addr);
sockaddr_in to_sockaddr(const ipv4_endpoint& ep);
ipv4_endpoint to_ip_endpoint(const sockaddr_in& addr);
} // namespace detail } // namespace detail
} // namespace caf } // namespace caf
...@@ -19,42 +19,41 @@ ...@@ -19,42 +19,41 @@
#include "caf/detail/convert_ip_endpoint.hpp" #include "caf/detail/convert_ip_endpoint.hpp"
#include "caf/ipv4_endpoint.hpp" #include "caf/ipv4_endpoint.hpp"
#include "caf/ipv6_endpoint.hpp" #include "caf/ipv6_endpoint.hpp"
#include <iostream>
namespace caf { namespace caf {
namespace detail { namespace detail {
sockaddr_in6 to_sockaddr(const ipv6_endpoint& ep) { sockaddr_storage to_sockaddr(const ip_endpoint& ep) {
sockaddr_in6 addr = {}; sockaddr_storage sockaddr = {};
addr.sin6_family = AF_INET6; if (ep.address().embeds_v4()) {
addr.sin6_port = ntohs(ep.port()); auto sockaddr4 = reinterpret_cast<sockaddr_in*>(&sockaddr);
memcpy(&addr.sin6_addr, ep.address().bytes().data(), ep.address().size()); sockaddr4->sin_family = AF_INET;
return addr; sockaddr4->sin_port = ntohs(ep.port());
sockaddr4->sin_addr.s_addr = ep.address().embedded_v4().bits();
} else {
auto sockaddr6 = reinterpret_cast<sockaddr_in6*>(&sockaddr);
sockaddr6->sin6_family = AF_INET6;
sockaddr6->sin6_port = ntohs(ep.port());
memcpy(&sockaddr6->sin6_addr, ep.address().bytes().data(),
ep.address().bytes().size());
}
return sockaddr;
} }
ipv6_endpoint to_ip_endpoint(const sockaddr_in6& addr) { ip_endpoint to_ip_endpoint(const sockaddr_storage& addr) {
ip_endpoint ep; if (addr.ss_family == AF_INET) {
ep.port(htons(addr.sin6_port)); auto sockaddr4 = reinterpret_cast<const sockaddr_in*>(&addr);
ipv6_address ip_addr; ipv4_address ipv4_addr;
memcpy(ip_addr.bytes().data(), &addr.sin6_addr, ip_addr.size()); memcpy(ipv4_addr.data().data(), &sockaddr4->sin_addr, ipv4_addr.size());
ep.address(ip_addr); return {ipv4_addr, htons(sockaddr4->sin_port)};
return ep; } else {
} auto sockaddr6 = reinterpret_cast<const sockaddr_in6*>(&addr);
ipv6_address ipv6_addr;
sockaddr_in to_sockaddr(const ipv4_endpoint& ep) { memcpy(ipv6_addr.bytes().data(), &sockaddr6->sin6_addr,
sockaddr_in addr = {}; ipv6_addr.bytes().size());
addr.sin_family = AF_INET; return {ipv6_addr, htons(sockaddr6->sin6_port)};
addr.sin_port = ntohs(ep.port()); }
memcpy(&addr.sin_addr, ep.address().bytes().data(), ep.address().size());
return addr;
}
ipv4_endpoint to_ip_endpoint(const sockaddr_in& addr) {
ipv4_endpoint ep;
ep.port(htons(addr.sin_port));
ipv4_address ip_addr;
memcpy(ip_addr.bytes().data(), &addr.sin_addr, ip_addr.size());
ep.address(ip_addr);
return ep;
} }
} // namespace detail } // namespace detail
......
...@@ -36,7 +36,7 @@ CAF_TEST(sockaddr_in6 roundtrip) { ...@@ -36,7 +36,7 @@ CAF_TEST(sockaddr_in6 roundtrip) {
source_addr.sin6_family = AF_INET6; source_addr.sin6_family = AF_INET6;
source_addr.sin6_port = htons(23); source_addr.sin6_port = htons(23);
source_addr.sin6_addr = in6addr_loopback; source_addr.sin6_addr = in6addr_loopback;
auto ep = to_ip_endpoint(source_addr); auto ep = to_ip_endpoint(reinterpret_cast<sockaddr_storage&>(source_addr));
auto dest_addr = to_sockaddr(ep); auto dest_addr = to_sockaddr(ep);
CAF_CHECK_EQUAL(memcmp(&source_addr, &dest_addr, sizeof(sockaddr_in6)), 0); CAF_CHECK_EQUAL(memcmp(&source_addr, &dest_addr, sizeof(sockaddr_in6)), 0);
} }
...@@ -55,13 +55,13 @@ CAF_TEST(sockaddr_in4 roundtrip) { ...@@ -55,13 +55,13 @@ CAF_TEST(sockaddr_in4 roundtrip) {
source_addr.sin_family = AF_INET; source_addr.sin_family = AF_INET;
source_addr.sin_port = htons(23); source_addr.sin_port = htons(23);
source_addr.sin_addr.s_addr = INADDR_LOOPBACK; source_addr.sin_addr.s_addr = INADDR_LOOPBACK;
auto ep = to_ip_endpoint(source_addr); auto ep = to_ip_endpoint(reinterpret_cast<sockaddr_storage&>(source_addr));
auto dest_addr = to_sockaddr(ep); auto dest_addr = to_sockaddr(ep);
CAF_CHECK_EQUAL(memcmp(&source_addr, &dest_addr, sizeof(sockaddr_in)), 0); CAF_CHECK_EQUAL(memcmp(&source_addr, &dest_addr, sizeof(sockaddr_in)), 0);
} }
CAF_TEST(ipv4_endpoint roundtrip) { CAF_TEST(ipv4_endpoint roundtrip) {
ipv4_endpoint source_ep; ipv6_endpoint source_ep;
if (auto err = detail::parse("127.0.0.1:55555", source_ep)) if (auto err = detail::parse("127.0.0.1:55555", source_ep))
CAF_FAIL("unable to parse input: " << err); CAF_FAIL("unable to parse input: " << err);
auto addr = to_sockaddr(source_ep); auto addr = to_sockaddr(source_ep);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment