| // 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/dns_session.h" |
| |
| #include "base/basictypes.h" |
| #include "base/bind.h" |
| #include "base/time.h" |
| #include "net/base/ip_endpoint.h" |
| #include "net/dns/dns_config_service.h" |
| #include "net/socket/client_socket_factory.h" |
| |
| namespace net { |
| |
| DnsSession::DnsSession(const DnsConfig& config, |
| ClientSocketFactory* factory, |
| const RandIntCallback& rand_int_callback, |
| NetLog* net_log) |
| : config_(config), |
| socket_factory_(factory), |
| rand_callback_(base::Bind(rand_int_callback, 0, kuint16max)), |
| net_log_(net_log), |
| server_index_(0) { |
| } |
| |
| int DnsSession::NextQueryId() const { |
| return rand_callback_.Run(); |
| } |
| |
| int DnsSession::NextFirstServerIndex() { |
| int index = server_index_; |
| if (config_.rotate) |
| server_index_ = (server_index_ + 1) % config_.nameservers.size(); |
| return index; |
| } |
| |
| base::TimeDelta DnsSession::NextTimeout(int attempt) { |
| // The timeout doubles every full round (each nameserver once). |
| // TODO(szym): Adapt timeout to observed RTT. http://crbug.com/110197 |
| return config_.timeout * (1 << (attempt / config_.nameservers.size())); |
| } |
| |
| DnsSession::~DnsSession() {} |
| |
| } // namespace net |
| |