blob: c9970aa658a1d92b0c8899188eb3f331c4e8a4bb [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// 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 "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.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"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace base {
class SingleThreadTaskRunner;
class TickClock;
class TimeDelta;
} // namespace base
namespace net {
class IPAddress;
namespace {
typedef base::RepeatingCallback<void(
SocketPerformanceWatcherFactory::Protocol protocol,
const base::TimeDelta& rtt,
const absl::optional<nqe::internal::IPHash>& host)>
OnUpdatedRTTAvailableCallback;
typedef base::RepeatingCallback<bool(base::TimeTicks)> ShouldNotifyRTTCallback;
} // namespace
namespace nqe::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| is the IPAddress that the socket may
// connect to. |min_notification_interval| is the minimum interval between
// 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 IPAddress& address,
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(const SocketWatcher&) = delete;
SocketWatcher& operator=(const SocketWatcher&) = delete;
~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_;
raw_ptr<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_ = false;
// A unique identifier for the remote host that this socket connects to.
const absl::optional<IPHash> host_;
};
} // namespace nqe::internal
} // namespace net
#endif // NET_NQE_SOCKET_WATCHER_H_