Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(578)

Side by Side Diff: net/base/net_util.cc

Issue 10442098: [net/dns] Resolve AF_UNSPEC on dual-stacked systems. Sort addresses according to RFC3484. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Replace WaitableEvent with TestCompletionCallback. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698