123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // 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 "base/callback.h"
- #include "base/memory/raw_ptr.h"
- #include "base/memory/ref_counted.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 AddressList;
- 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_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(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_
|