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 } |
| 2225 |
2219 IPAddressNumber ConvertIPv4NumberToIPv6Number( | 2226 IPAddressNumber ConvertIPv4NumberToIPv6Number( |
2220 const IPAddressNumber& ipv4_number) { | 2227 const IPAddressNumber& ipv4_number) { |
2221 DCHECK(ipv4_number.size() == 4); | 2228 DCHECK(ipv4_number.size() == 4); |
2222 | 2229 |
2223 // IPv4-mapped addresses are formed by: | 2230 // IPv4-mapped addresses are formed by: |
2224 // <80 bits of zeros> + <16 bits of ones> + <32-bit IPv4 address>. | 2231 // <80 bits of zeros> + <16 bits of ones> + <32-bit IPv4 address>. |
2225 IPAddressNumber ipv6_number; | 2232 IPAddressNumber ipv6_number; |
2226 ipv6_number.reserve(16); | 2233 ipv6_number.reserve(16); |
2227 ipv6_number.insert(ipv6_number.end(), 10, 0); | 2234 ipv6_number.insert(ipv6_number.end(), |
2228 ipv6_number.push_back(0xFF); | 2235 kIPv4MappedPrefix, |
2229 ipv6_number.push_back(0xFF); | 2236 kIPv4MappedPrefix + arraysize(kIPv4MappedPrefix)); |
2230 ipv6_number.insert(ipv6_number.end(), ipv4_number.begin(), ipv4_number.end()); | 2237 ipv6_number.insert(ipv6_number.end(), ipv4_number.begin(), ipv4_number.end()); |
2231 return ipv6_number; | 2238 return ipv6_number; |
2232 } | 2239 } |
2233 | 2240 |
| 2241 bool IsIPv4Mapped(const IPAddressNumber& address) { |
| 2242 if (address.size() != kIPv6AddressSize) |
| 2243 return false; |
| 2244 return std::equal(address.begin(), |
| 2245 address.begin() + arraysize(kIPv4MappedPrefix), |
| 2246 kIPv4MappedPrefix); |
| 2247 } |
| 2248 |
| 2249 IPAddressNumber ConvertIPv4MappedToIPv4(const IPAddressNumber& address) { |
| 2250 DCHECK(IsIPv4Mapped(address)); |
| 2251 return IPAddressNumber(address.begin() + arraysize(kIPv4MappedPrefix), |
| 2252 address.end()); |
| 2253 } |
| 2254 |
| 2255 |
2234 bool ParseCIDRBlock(const std::string& cidr_literal, | 2256 bool ParseCIDRBlock(const std::string& cidr_literal, |
2235 IPAddressNumber* ip_number, | 2257 IPAddressNumber* ip_number, |
2236 size_t* prefix_length_in_bits) { | 2258 size_t* prefix_length_in_bits) { |
2237 // We expect CIDR notation to match one of these two templates: | 2259 // We expect CIDR notation to match one of these two templates: |
2238 // <IPv4-literal> "/" <number of bits> | 2260 // <IPv4-literal> "/" <number of bits> |
2239 // <IPv6-literal> "/" <number of bits> | 2261 // <IPv6-literal> "/" <number of bits> |
2240 | 2262 |
2241 std::vector<std::string> parts; | 2263 std::vector<std::string> parts; |
2242 base::SplitString(cidr_literal, '/', &parts); | 2264 base::SplitString(cidr_literal, '/', &parts); |
2243 if (parts.size() != 2) | 2265 if (parts.size() != 2) |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2368 | 2390 |
2369 NetworkInterface::NetworkInterface(const std::string& name, | 2391 NetworkInterface::NetworkInterface(const std::string& name, |
2370 const IPAddressNumber& address) | 2392 const IPAddressNumber& address) |
2371 : name(name), address(address) { | 2393 : name(name), address(address) { |
2372 } | 2394 } |
2373 | 2395 |
2374 NetworkInterface::~NetworkInterface() { | 2396 NetworkInterface::~NetworkInterface() { |
2375 } | 2397 } |
2376 | 2398 |
2377 } // namespace net | 2399 } // namespace net |
OLD | NEW |