Chromium Code Reviews| Index: net/base/net_util.cc |
| diff --git a/net/base/net_util.cc b/net/base/net_util.cc |
| index 56e779a6ae87dc2ee3095b6af6340b9042568ee3..9d356e7579c4406e187fae9af44276536bc1f7f3 100644 |
| --- a/net/base/net_util.cc |
| +++ b/net/base/net_util.cc |
| @@ -2216,6 +2216,13 @@ bool ParseIPLiteralToNumber(const std::string& ip_literal, |
| return family == url_canon::CanonHostInfo::IPV4; |
| } |
| +namespace { |
| + |
| +const unsigned char kIPv4MappedPrefix[] = |
| + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }; |
| + |
| +} |
| + |
| IPAddressNumber ConvertIPv4NumberToIPv6Number( |
| const IPAddressNumber& ipv4_number) { |
| DCHECK(ipv4_number.size() == 4); |
| @@ -2224,13 +2231,28 @@ IPAddressNumber ConvertIPv4NumberToIPv6Number( |
| // <80 bits of zeros> + <16 bits of ones> + <32-bit IPv4 address>. |
| IPAddressNumber ipv6_number; |
| ipv6_number.reserve(16); |
| - ipv6_number.insert(ipv6_number.end(), 10, 0); |
| - ipv6_number.push_back(0xFF); |
| - ipv6_number.push_back(0xFF); |
| + ipv6_number.insert(ipv6_number.end(), |
| + kIPv4MappedPrefix, |
| + kIPv4MappedPrefix + arraysize(kIPv4MappedPrefix)); |
| ipv6_number.insert(ipv6_number.end(), ipv4_number.begin(), ipv4_number.end()); |
| return ipv6_number; |
| } |
| +bool IsIPv4Mapped(const IPAddressNumber& address) { |
| + if (address.size() != kIPv6AddressSize) |
| + return false; |
| + return std::equal(address.begin(), |
| + address.begin() + arraysize(kIPv4MappedPrefix), |
| + kIPv4MappedPrefix); |
| +} |
| + |
| +IPAddressNumber ConvertIPv4MappedToIPv4(const IPAddressNumber& address) { |
| + DCHECK(IsIPv4Mapped(address)); |
| + return IPAddressNumber(address.begin() + arraysize(kIPv4MappedPrefix), |
| + address.end()); |
| +} |
| + |
| + |
|
mmenke
2012/08/13 20:11:50
nit: Remove extra linbreak.
|
| bool ParseCIDRBlock(const std::string& cidr_literal, |
| IPAddressNumber* ip_number, |
| size_t* prefix_length_in_bits) { |