blob: a4bf0415ba04e638cab3be8c66fa4ab45d8fe07a [file] [log] [blame]
// Copyright 2016 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.
#ifndef NET_NQE_SOCKET_WATCHER_H_
#define NET_NQE_SOCKET_WATCHER_H_
#include <memory>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/nqe/network_quality_estimator_util.h"
#include "net/socket/socket_performance_watcher.h"
#include "net/socket/socket_performance_watcher_factory.h"
namespace base {
class SingleThreadTaskRunner;
class TickClock;
class TimeDelta;
} // namespace base
namespace net {
class AddressList;
namespace {
typedef base::Callback<void(SocketPerformanceWatcherFactory::Protocol protocol,
const base::TimeDelta& rtt,
const base::Optional<nqe::internal::IPHash>& host)>
OnUpdatedRTTAvailableCallback;
typedef base::Callback<bool(base::TimeTicks)> ShouldNotifyRTTCallback;
} // namespace
namespace nqe {
namespace internal {
// SocketWatcher implements SocketPerformanceWatcher, and is not thread-safe.
class NET_EXPORT_PRIVATE SocketWatcher : public SocketPerformanceWatcher {
public:
// Creates a SocketWatcher which can be used to watch a socket that uses
// |protocol| as the transport layer protocol. The socket watcher will call
// |updated_rtt_observation_callback| on |task_runner| every time a new RTT
// observation is available. |address_list| is the list of addresses that
// the socket may connect to. |min_notification_interval| is the minimum
// interval betweeen consecutive notifications to this socket watcher.
// |allow_rtt_private_address| is true if |updated_rtt_observation_callback|
// should be called when RTT observation from a socket connected to private
// address is received. |tick_clock| is guaranteed to be non-null.
// |should_notify_rtt_callback| callback should be called back on
// |task_runner| by the created socket watchers to check if RTT observation
// should be taken and notified.
SocketWatcher(SocketPerformanceWatcherFactory::Protocol protocol,
const AddressList& address_list,
base::TimeDelta min_notification_interval,
bool allow_rtt_private_address,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
OnUpdatedRTTAvailableCallback updated_rtt_observation_callback,
ShouldNotifyRTTCallback should_notify_rtt_callback,
const base::TickClock* tick_clock);
~SocketWatcher() override;
// SocketPerformanceWatcher implementation:
bool ShouldNotifyUpdatedRTT() const override;
void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override;
void OnConnectionChanged() override;
private:
// Transport layer protocol used by the socket that |this| is watching.
const SocketPerformanceWatcherFactory::Protocol protocol_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
// Called every time a new RTT observation is available.
OnUpdatedRTTAvailableCallback updated_rtt_observation_callback_;
// Called to determine if the RTT notification should be notified using
// |updated_rtt_observation_callback_|.
ShouldNotifyRTTCallback should_notify_rtt_callback_;
// Minimum interval betweeen consecutive incoming notifications.
const base::TimeDelta rtt_notifications_minimum_interval_;
// True if the RTT observations from this socket can be notified using
// |updated_rtt_observation_callback_|.
const bool run_rtt_callback_;
// Time when this was last notified of updated RTT.
base::TimeTicks last_rtt_notification_;
const base::TickClock* tick_clock_;
SEQUENCE_CHECKER(sequence_checker_);
// True if the first RTT notification from the QUIC connection has been
// received.
bool first_quic_rtt_notification_received_;
// A unique identifier for the remote host that this socket connects to.
const base::Optional<IPHash> host_;
DISALLOW_COPY_AND_ASSIGN(SocketWatcher);
};
} // namespace internal
} // namespace nqe
} // namespace net
#endif // NET_NQE_SOCKET_WATCHER_H_