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