| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/net_util.h" | 5 #include "net/base/net_util.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| (...skipping 2198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2209 | 2209 |
| 2210 // Otherwise the string is an IPv4 address. | 2210 // Otherwise the string is an IPv4 address. |
| 2211 ip_number->resize(4); // 32 bits. | 2211 ip_number->resize(4); // 32 bits. |
| 2212 url_parse::Component host_comp(0, ip_literal.size()); | 2212 url_parse::Component host_comp(0, ip_literal.size()); |
| 2213 int num_components; | 2213 int num_components; |
| 2214 url_canon::CanonHostInfo::Family family = url_canon::IPv4AddressToNumber( | 2214 url_canon::CanonHostInfo::Family family = url_canon::IPv4AddressToNumber( |
| 2215 ip_literal.data(), host_comp, &(*ip_number)[0], &num_components); | 2215 ip_literal.data(), host_comp, &(*ip_number)[0], &num_components); |
| 2216 return family == url_canon::CanonHostInfo::IPV4; | 2216 return family == url_canon::CanonHostInfo::IPV4; |
| 2217 } | 2217 } |
| 2218 | 2218 |
| 2219 namespace { |
| 2220 |
| 2221 const unsigned char kIPv4MappedPrefix[] = |
| 2222 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }; |
| 2223 } |
| 2224 |
| 2219 IPAddressNumber ConvertIPv4NumberToIPv6Number( | 2225 IPAddressNumber ConvertIPv4NumberToIPv6Number( |
| 2220 const IPAddressNumber& ipv4_number) { | 2226 const IPAddressNumber& ipv4_number) { |
| 2221 DCHECK(ipv4_number.size() == 4); | 2227 DCHECK(ipv4_number.size() == 4); |
| 2222 | 2228 |
| 2223 // IPv4-mapped addresses are formed by: | 2229 // IPv4-mapped addresses are formed by: |
| 2224 // <80 bits of zeros> + <16 bits of ones> + <32-bit IPv4 address>. | 2230 // <80 bits of zeros> + <16 bits of ones> + <32-bit IPv4 address>. |
| 2225 IPAddressNumber ipv6_number; | 2231 IPAddressNumber ipv6_number; |
| 2226 ipv6_number.reserve(16); | 2232 ipv6_number.reserve(16); |
| 2227 ipv6_number.insert(ipv6_number.end(), 10, 0); | 2233 ipv6_number.insert(ipv6_number.end(), |
| 2228 ipv6_number.push_back(0xFF); | 2234 kIPv4MappedPrefix, |
| 2229 ipv6_number.push_back(0xFF); | 2235 kIPv4MappedPrefix + arraysize(kIPv4MappedPrefix)); |
| 2230 ipv6_number.insert(ipv6_number.end(), ipv4_number.begin(), ipv4_number.end()); | 2236 ipv6_number.insert(ipv6_number.end(), ipv4_number.begin(), ipv4_number.end()); |
| 2231 return ipv6_number; | 2237 return ipv6_number; |
| 2232 } | 2238 } |
| 2233 | 2239 |
| 2240 bool IsIPv4Mapped(const IPAddressNumber& address) { |
| 2241 if (address.size() != kIPv6AddressSize) |
| 2242 return false; |
| 2243 return std::equal(address.begin(), |
| 2244 address.begin() + arraysize(kIPv4MappedPrefix), |
| 2245 kIPv4MappedPrefix); |
| 2246 } |
| 2247 |
| 2248 IPAddressNumber ConvertIPv4MappedToIPv4(const IPAddressNumber& address) { |
| 2249 DCHECK(IsIPv4Mapped(address)); |
| 2250 return IPAddressNumber(address.begin() + arraysize(kIPv4MappedPrefix), |
| 2251 address.end()); |
| 2252 } |
| 2253 |
| 2234 bool ParseCIDRBlock(const std::string& cidr_literal, | 2254 bool ParseCIDRBlock(const std::string& cidr_literal, |
| 2235 IPAddressNumber* ip_number, | 2255 IPAddressNumber* ip_number, |
| 2236 size_t* prefix_length_in_bits) { | 2256 size_t* prefix_length_in_bits) { |
| 2237 // We expect CIDR notation to match one of these two templates: | 2257 // We expect CIDR notation to match one of these two templates: |
| 2238 // <IPv4-literal> "/" <number of bits> | 2258 // <IPv4-literal> "/" <number of bits> |
| 2239 // <IPv6-literal> "/" <number of bits> | 2259 // <IPv6-literal> "/" <number of bits> |
| 2240 | 2260 |
| 2241 std::vector<std::string> parts; | 2261 std::vector<std::string> parts; |
| 2242 base::SplitString(cidr_literal, '/', &parts); | 2262 base::SplitString(cidr_literal, '/', &parts); |
| 2243 if (parts.size() != 2) | 2263 if (parts.size() != 2) |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2368 | 2388 |
| 2369 NetworkInterface::NetworkInterface(const std::string& name, | 2389 NetworkInterface::NetworkInterface(const std::string& name, |
| 2370 const IPAddressNumber& address) | 2390 const IPAddressNumber& address) |
| 2371 : name(name), address(address) { | 2391 : name(name), address(address) { |
| 2372 } | 2392 } |
| 2373 | 2393 |
| 2374 NetworkInterface::~NetworkInterface() { | 2394 NetworkInterface::~NetworkInterface() { |
| 2375 } | 2395 } |
| 2376 | 2396 |
| 2377 } // namespace net | 2397 } // namespace net |
| OLD | NEW |