net/SocketAddress: add IsV4Mapped()
This commit is contained in:
parent
94092f1f90
commit
dfc1f6342a
@ -82,6 +82,12 @@ SocketAddress::IsV6Any() const noexcept
|
||||
return GetFamily() == AF_INET6 && IPv6Address(*this).IsAny();
|
||||
}
|
||||
|
||||
bool
|
||||
SocketAddress::IsV4Mapped() const noexcept
|
||||
{
|
||||
return GetFamily() == AF_INET6 && IPv6Address(*this).IsV4Mapped();
|
||||
}
|
||||
|
||||
unsigned
|
||||
SocketAddress::GetPort() const noexcept
|
||||
{
|
||||
|
@ -114,6 +114,12 @@ public:
|
||||
gcc_pure
|
||||
bool IsV6Any() const noexcept;
|
||||
|
||||
/**
|
||||
* Is this an IPv4 address mapped inside struct sockaddr_in6?
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsV4Mapped() const noexcept;
|
||||
|
||||
/**
|
||||
* Extract the port number. Returns 0 if not applicable.
|
||||
*/
|
||||
|
@ -81,24 +81,13 @@ LocalAddressToString(const struct sockaddr_un &s_un, size_t size) noexcept
|
||||
|
||||
#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED)
|
||||
|
||||
gcc_pure
|
||||
static bool
|
||||
IsV4Mapped(SocketAddress address) noexcept
|
||||
{
|
||||
if (address.GetFamily() != AF_INET6)
|
||||
return false;
|
||||
|
||||
const auto &a6 = *(const struct sockaddr_in6 *)address.GetAddress();
|
||||
return IN6_IS_ADDR_V4MAPPED(&a6.sin6_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert "::ffff:127.0.0.1" to "127.0.0.1".
|
||||
*/
|
||||
static SocketAddress
|
||||
UnmapV4(SocketAddress src, struct sockaddr_in &buffer) noexcept
|
||||
{
|
||||
assert(IsV4Mapped(src));
|
||||
assert(src.IsV4Mapped());
|
||||
|
||||
const auto &src6 = *(const struct sockaddr_in6 *)src.GetAddress();
|
||||
memset(&buffer, 0, sizeof(buffer));
|
||||
@ -124,7 +113,7 @@ ToString(SocketAddress address) noexcept
|
||||
|
||||
#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED)
|
||||
struct sockaddr_in in_buffer;
|
||||
if (IsV4Mapped(address))
|
||||
if (address.IsV4Mapped())
|
||||
address = UnmapV4(address, in_buffer);
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user