Chromium Code Reviews| Index: ppapi/shared_impl/private/net_address_private_impl.cc |
| diff --git a/ppapi/shared_impl/private/net_address_private_impl.cc b/ppapi/shared_impl/private/net_address_private_impl.cc |
| index 6cd87b8195f28928d87deb6ff8bcc1dbeccf7a35..6f831c9c5926605866841309247f6b74282ae87a 100644 |
| --- a/ppapi/shared_impl/private/net_address_private_impl.cc |
| +++ b/ppapi/shared_impl/private/net_address_private_impl.cc |
| @@ -54,7 +54,15 @@ namespace { |
| // Define our own net-host-net conversion, rather than reuse the one in |
| // base/sys_byteorder.h, to simplify the NaCl port. NaCl has no byte swap |
| // primitives. |
| -uint16 ConvertNetEndian16(uint16 x) { |
| +uint16 ConvertFromNetEndian16(uint16 x) { |
| +#if defined(ARCH_CPU_LITTLE_ENDIAN) |
| + return (x << 8) | (x >> 8); |
| +#else |
| + return x; |
| +#endif |
| +} |
| + |
| +uint16 ConvertToNetEndian16(uint16 x) { |
|
bbudge
2013/06/06 19:01:10
Since the functions are identical, why create this
yzshen1
2013/06/06 20:57:15
I think it is clearer to have two different names.
|
| #if defined(ARCH_CPU_LITTLE_ENDIAN) |
| return (x << 8) | (x >> 8); |
| #else |
| @@ -261,7 +269,7 @@ std::string ConvertIPv6AddressToString(const NetAddress* net_addr, |
| need_sep = false; |
| i += longest_length; |
| } else { |
| - uint16_t v = ConvertNetEndian16(address16[i]); |
| + uint16_t v = ConvertFromNetEndian16(address16[i]); |
| base::StringAppendF(&description, need_sep ? ":%x" : "%x", v); |
| need_sep = true; |
| i++; |
| @@ -419,7 +427,7 @@ bool NetAddressPrivateImpl::SockaddrToNetAddress( |
| reinterpret_cast<const struct sockaddr_in*>(sa); |
| net_addr->is_valid = true; |
| net_addr->is_ipv6 = false; |
| - net_addr->port = ConvertNetEndian16(addr4->sin_port); |
| + net_addr->port = ConvertFromNetEndian16(addr4->sin_port); |
| memcpy(net_addr->address, &addr4->sin_addr.s_addr, kIPv4AddressSize); |
| break; |
| } |
| @@ -428,7 +436,7 @@ bool NetAddressPrivateImpl::SockaddrToNetAddress( |
| reinterpret_cast<const struct sockaddr_in6*>(sa); |
| net_addr->is_valid = true; |
| net_addr->is_ipv6 = true; |
| - net_addr->port = ConvertNetEndian16(addr6->sin6_port); |
| + net_addr->port = ConvertFromNetEndian16(addr6->sin6_port); |
| net_addr->flow_info = addr6->sin6_flowinfo; |
| net_addr->scope_id = addr6->sin6_scope_id; |
| memcpy(net_addr->address, addr6->sin6_addr.s6_addr, kIPv6AddressSize); |
| @@ -509,4 +517,72 @@ std::string NetAddressPrivateImpl::DescribeNetAddress( |
| return ConvertIPv4AddressToString(net_addr, include_port); |
| } |
| +// static |
| +void NetAddressPrivateImpl::CreateNetAddressPrivateFromIPv4Address( |
| + const PP_NetAddress_IPv4_Dev& ipv4_addr, |
| + PP_NetAddress_Private* addr) { |
| + CreateFromIPv4Address(ipv4_addr.addr, ConvertFromNetEndian16(ipv4_addr.port), |
| + addr); |
| +} |
| + |
| +// static |
| +void NetAddressPrivateImpl::CreateNetAddressPrivateFromIPv6Address( |
| + const PP_NetAddress_IPv6_Dev& ipv6_addr, |
| + PP_NetAddress_Private* addr) { |
| + CreateFromIPv6Address(ipv6_addr.addr, 0, |
| + ConvertFromNetEndian16(ipv6_addr.port), addr); |
| +} |
| + |
| +// static |
| +PP_NetAddress_Family_Dev NetAddressPrivateImpl::GetFamilyFromNetAddressPrivate( |
| + const PP_NetAddress_Private& addr) { |
| + const NetAddress* net_addr = ToNetAddress(&addr); |
| + if (!IsValid(net_addr)) |
| + return PP_NETADDRESS_FAMILY_UNSPECIFIED; |
| + return net_addr->is_ipv6 ? PP_NETADDRESS_FAMILY_IPV6 : |
| + PP_NETADDRESS_FAMILY_IPV4; |
| +} |
| + |
| +// static |
| +bool NetAddressPrivateImpl::DescribeNetAddressPrivateAsIPv4Address( |
| + const PP_NetAddress_Private& addr, |
| + PP_NetAddress_IPv4_Dev* ipv4_addr) { |
| + if (!ipv4_addr) |
| + return false; |
| + |
| + const NetAddress* net_addr = ToNetAddress(&addr); |
| + if (!IsValid(net_addr) || net_addr->is_ipv6) |
| + return false; |
| + |
| + ipv4_addr->port = ConvertToNetEndian16(net_addr->port); |
| + |
| + COMPILE_ASSERT(sizeof(ipv4_addr->addr) == kIPv4AddressSize, |
| + mismatched_IPv4_address_size); |
| + memcpy(ipv4_addr->addr, net_addr->address, kIPv4AddressSize); |
| + |
| + ipv4_addr->unused_padding = 0; |
| + return true; |
| +} |
| + |
| +// static |
| +bool NetAddressPrivateImpl::DescribeNetAddressPrivateAsIPv6Address( |
| + const PP_NetAddress_Private& addr, |
| + PP_NetAddress_IPv6_Dev* ipv6_addr) { |
| + if (!ipv6_addr) |
| + return false; |
| + |
| + const NetAddress* net_addr = ToNetAddress(&addr); |
| + if (!IsValid(net_addr) || !net_addr->is_ipv6) |
| + return false; |
| + |
| + ipv6_addr->port = ConvertToNetEndian16(net_addr->port); |
| + |
| + COMPILE_ASSERT(sizeof(ipv6_addr->addr) == kIPv6AddressSize, |
| + mismatched_IPv6_address_size); |
| + memcpy(ipv6_addr->addr, net_addr->address, kIPv6AddressSize); |
| + |
| + ipv6_addr->unused_padding = 0; |
| + return true; |
| +} |
| + |
| } // namespace ppapi |