summaryrefslogtreecommitdiffstats
path: root/net/dns/address_sorter_win.cc
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-14 23:32:29 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-14 23:32:29 +0000
commit708d0cce7d55778a3527c6c6ea60ebaac1d6ec10 (patch)
tree27f9736e21c5bb0f44f798ffd0629c157fbed0ed /net/dns/address_sorter_win.cc
parente833677d6b5a38936bcc2ce455dfe303ce8e0f8b (diff)
downloadchromium_src-708d0cce7d55778a3527c6c6ea60ebaac1d6ec10.zip
chromium_src-708d0cce7d55778a3527c6c6ea60ebaac1d6ec10.tar.gz
chromium_src-708d0cce7d55778a3527c6c6ea60ebaac1d6ec10.tar.bz2
Revert 151586 - [net/dns] Resolve AF_UNSPEC on dual-stacked systems. Sort addresses according to RFC3484.
BUG=113993 TEST=./net_unittests --gtest_filter=AddressSorter*:HostResolverImplDnsTest.DnsTaskUnspec Review URL: https://chromiumcodereview.appspot.com/10442098 TBR=szym@chromium.org Review URL: https://chromiumcodereview.appspot.com/10855163 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151603 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/dns/address_sorter_win.cc')
-rw-r--r--net/dns/address_sorter_win.cc197
1 files changed, 0 insertions, 197 deletions
diff --git a/net/dns/address_sorter_win.cc b/net/dns/address_sorter_win.cc
deleted file mode 100644
index 116834a..0000000
--- a/net/dns/address_sorter_win.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/dns/address_sorter.h"
-
-#include <winsock2.h>
-
-#include <algorithm>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/threading/worker_pool.h"
-#include "base/win/windows_version.h"
-#include "net/base/address_list.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/winsock_init.h"
-
-namespace net {
-
-namespace {
-
-class AddressSorterWin : public AddressSorter {
- public:
- AddressSorterWin() {
- EnsureWinsockInit();
- }
-
- virtual ~AddressSorterWin() {}
-
- // AddressSorter:
- virtual void Sort(const AddressList& list,
- const CallbackType& callback) const OVERRIDE {
- DCHECK(!list.empty());
- scoped_refptr<Job> job = new Job(list, callback);
- }
-
- private:
- // Executes the SIO_ADDRESS_LIST_SORT ioctl on the WorkerPool, and
- // performs the necessary conversions to/from AddressList.
- class Job : public base::RefCountedThreadSafe<Job> {
- public:
- Job(const AddressList& list, const CallbackType& callback)
- : callback_(callback),
- buffer_size_(sizeof(SOCKET_ADDRESS_LIST) +
- list.size() * (sizeof(SOCKET_ADDRESS) +
- sizeof(SOCKADDR_STORAGE))),
- input_buffer_(reinterpret_cast<SOCKET_ADDRESS_LIST*>(
- malloc(buffer_size_))),
- output_buffer_(reinterpret_cast<SOCKET_ADDRESS_LIST*>(
- malloc(buffer_size_))),
- success_(false) {
- input_buffer_->iAddressCount = list.size();
- SOCKADDR_STORAGE* storage = reinterpret_cast<SOCKADDR_STORAGE*>(
- input_buffer_->Address + input_buffer_->iAddressCount);
-
- for (size_t i = 0; i < list.size(); ++i) {
- IPEndPoint ipe = list[i];
- // Addresses must be sockaddr_in6.
- if (ipe.GetFamily() == AF_INET) {
- ipe = IPEndPoint(ConvertIPv4NumberToIPv6Number(ipe.address()),
- ipe.port());
- }
-
- struct sockaddr* addr = reinterpret_cast<struct sockaddr*>(storage + i);
- socklen_t addr_len = sizeof(SOCKADDR_STORAGE);
- bool result = ipe.ToSockAddr(addr, &addr_len);
- DCHECK(result);
- input_buffer_->Address[i].lpSockaddr = addr;
- input_buffer_->Address[i].iSockaddrLength = addr_len;
- }
-
- if (!base::WorkerPool::PostTaskAndReply(
- FROM_HERE,
- base::Bind(&Job::Run, this),
- base::Bind(&Job::OnComplete, this),
- false /* task is slow */)) {
- LOG(ERROR) << "WorkerPool::PostTaskAndReply failed";
- OnComplete();
- }
- }
-
- private:
- friend class base::RefCountedThreadSafe<Job>;
- ~Job() {}
-
- // Executed on the WorkerPool.
- void Run() {
- SOCKET sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
- DCHECK_NE(INVALID_SOCKET, sock);
- DWORD result_size = 0;
- int result = WSAIoctl(sock, SIO_ADDRESS_LIST_SORT, input_buffer_.get(),
- buffer_size_, output_buffer_.get(), buffer_size_,
- &result_size, NULL, NULL);
- if (result == SOCKET_ERROR) {
- LOG(ERROR) << "SIO_ADDRESS_LIST_SORT failed " << WSAGetLastError();
- } else {
- success_ = true;
- }
- closesocket(sock);
- }
-
- // Executed on the calling thread.
- void OnComplete() {
- AddressList list;
- if (success_) {
- list.reserve(output_buffer_->iAddressCount);
- for (int i = 0; i < output_buffer_->iAddressCount; ++i) {
- IPEndPoint ipe;
- ipe.FromSockAddr(output_buffer_->Address[i].lpSockaddr,
- output_buffer_->Address[i].iSockaddrLength);
- // Unmap V4MAPPED IPv6 addresses so that Happy Eyeballs works.
- if (IsIPv4Mapped(ipe.address())) {
- ipe = IPEndPoint(ConvertIPv4MappedToIPv4(ipe.address()),
- ipe.port());
- }
- list.push_back(ipe);
- }
- }
- callback_.Run(success_, list);
- }
-
- const CallbackType callback_;
- const size_t buffer_size_;
- scoped_ptr_malloc<SOCKET_ADDRESS_LIST> input_buffer_;
- scoped_ptr_malloc<SOCKET_ADDRESS_LIST> output_buffer_;
- bool success_;
-
- DISALLOW_COPY_AND_ASSIGN(Job);
- };
-
- DISALLOW_COPY_AND_ASSIGN(AddressSorterWin);
-};
-
-// Merges |list_ipv4| and |list_ipv6| before passing it to |callback|, but
-// only if |success| is true.
-void MergeResults(const AddressSorter::CallbackType& callback,
- const AddressList& list_ipv4,
- bool success,
- const AddressList& list_ipv6) {
- if (!success) {
- callback.Run(false, AddressList());
- return;
- }
- AddressList list;
- list.insert(list.end(), list_ipv6.begin(), list_ipv6.end());
- list.insert(list.end(), list_ipv4.begin(), list_ipv4.end());
- callback.Run(true, list);
-}
-
-// Wrapper for AddressSorterWin which does not sort IPv4 or IPv4-mapped
-// addresses but always puts them at the end of the list. Needed because the
-// SIO_ADDRESS_LIST_SORT does not support IPv4 addresses on Windows XP.
-class AddressSorterWinXP : public AddressSorter {
- public:
- AddressSorterWinXP() {}
- virtual ~AddressSorterWinXP() {}
-
- // AddressSorter:
- virtual void Sort(const AddressList& list,
- const CallbackType& callback) const OVERRIDE {
- AddressList list_ipv4;
- AddressList list_ipv6;
- for (size_t i = 0; i < list.size(); ++i) {
- const IPEndPoint& ipe = list[i];
- if (ipe.GetFamily() == AF_INET) {
- list_ipv4.push_back(ipe);
- } else {
- list_ipv6.push_back(ipe);
- }
- }
- if (!list_ipv6.empty()) {
- sorter_.Sort(list_ipv6, base::Bind(&MergeResults, callback, list_ipv4));
- } else {
- NOTREACHED() << "Should not be called with IPv4-only addresses.";
- callback.Run(true, list);
- }
- }
-
- private:
- AddressSorterWin sorter_;
-
- DISALLOW_COPY_AND_ASSIGN(AddressSorterWinXP);
-};
-
-} // namespace
-
-// static
-scoped_ptr<AddressSorter> AddressSorter::CreateAddressSorter() {
- if (base::win::GetVersion() < base::win::VERSION_VISTA)
- return scoped_ptr<AddressSorter>(new AddressSorterWinXP());
- return scoped_ptr<AddressSorter>(new AddressSorterWin());
-}
-
-} // namespace net
-