1*6777b538SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_NQE_SOCKET_WATCHER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_NQE_SOCKET_WATCHER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <optional> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/nqe/network_quality_estimator_util.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_performance_watcher.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_performance_watcher_factory.h" 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker namespace base { 22*6777b538SAndroid Build Coastguard Worker class SingleThreadTaskRunner; 23*6777b538SAndroid Build Coastguard Worker class TickClock; 24*6777b538SAndroid Build Coastguard Worker class TimeDelta; 25*6777b538SAndroid Build Coastguard Worker } // namespace base 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker namespace net { 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker class IPAddress; 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker namespace { 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker typedef base::RepeatingCallback<void( 34*6777b538SAndroid Build Coastguard Worker SocketPerformanceWatcherFactory::Protocol protocol, 35*6777b538SAndroid Build Coastguard Worker const base::TimeDelta& rtt, 36*6777b538SAndroid Build Coastguard Worker const std::optional<nqe::internal::IPHash>& host)> 37*6777b538SAndroid Build Coastguard Worker OnUpdatedRTTAvailableCallback; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker typedef base::RepeatingCallback<bool(base::TimeTicks)> ShouldNotifyRTTCallback; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker } // namespace 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker namespace nqe::internal { 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // SocketWatcher implements SocketPerformanceWatcher, and is not thread-safe. 46*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SocketWatcher : public SocketPerformanceWatcher { 47*6777b538SAndroid Build Coastguard Worker public: 48*6777b538SAndroid Build Coastguard Worker // Creates a SocketWatcher which can be used to watch a socket that uses 49*6777b538SAndroid Build Coastguard Worker // |protocol| as the transport layer protocol. The socket watcher will call 50*6777b538SAndroid Build Coastguard Worker // |updated_rtt_observation_callback| on |task_runner| every time a new RTT 51*6777b538SAndroid Build Coastguard Worker // observation is available. |address| is the IPAddress that the socket may 52*6777b538SAndroid Build Coastguard Worker // connect to. |min_notification_interval| is the minimum interval between 53*6777b538SAndroid Build Coastguard Worker // consecutive notifications to this socket watcher. 54*6777b538SAndroid Build Coastguard Worker // |allow_rtt_private_address| is true if |updated_rtt_observation_callback| 55*6777b538SAndroid Build Coastguard Worker // should be called when RTT observation from a socket connected to private 56*6777b538SAndroid Build Coastguard Worker // address is received. |tick_clock| is guaranteed to be non-null. 57*6777b538SAndroid Build Coastguard Worker // |should_notify_rtt_callback| callback should be called back on 58*6777b538SAndroid Build Coastguard Worker // |task_runner| by the created socket watchers to check if RTT observation 59*6777b538SAndroid Build Coastguard Worker // should be taken and notified. 60*6777b538SAndroid Build Coastguard Worker SocketWatcher(SocketPerformanceWatcherFactory::Protocol protocol, 61*6777b538SAndroid Build Coastguard Worker const IPAddress& address, 62*6777b538SAndroid Build Coastguard Worker base::TimeDelta min_notification_interval, 63*6777b538SAndroid Build Coastguard Worker bool allow_rtt_private_address, 64*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SingleThreadTaskRunner> task_runner, 65*6777b538SAndroid Build Coastguard Worker OnUpdatedRTTAvailableCallback updated_rtt_observation_callback, 66*6777b538SAndroid Build Coastguard Worker ShouldNotifyRTTCallback should_notify_rtt_callback, 67*6777b538SAndroid Build Coastguard Worker const base::TickClock* tick_clock); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker SocketWatcher(const SocketWatcher&) = delete; 70*6777b538SAndroid Build Coastguard Worker SocketWatcher& operator=(const SocketWatcher&) = delete; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker ~SocketWatcher() override; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // SocketPerformanceWatcher implementation: 75*6777b538SAndroid Build Coastguard Worker bool ShouldNotifyUpdatedRTT() const override; 76*6777b538SAndroid Build Coastguard Worker void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override; 77*6777b538SAndroid Build Coastguard Worker void OnConnectionChanged() override; 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker private: 80*6777b538SAndroid Build Coastguard Worker // Transport layer protocol used by the socket that |this| is watching. 81*6777b538SAndroid Build Coastguard Worker const SocketPerformanceWatcherFactory::Protocol protocol_; 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Called every time a new RTT observation is available. 86*6777b538SAndroid Build Coastguard Worker OnUpdatedRTTAvailableCallback updated_rtt_observation_callback_; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker // Called to determine if the RTT notification should be notified using 89*6777b538SAndroid Build Coastguard Worker // |updated_rtt_observation_callback_|. 90*6777b538SAndroid Build Coastguard Worker ShouldNotifyRTTCallback should_notify_rtt_callback_; 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker // Minimum interval betweeen consecutive incoming notifications. 93*6777b538SAndroid Build Coastguard Worker const base::TimeDelta rtt_notifications_minimum_interval_; 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker // True if socket watchers constructed by this factory can use the RTT from 96*6777b538SAndroid Build Coastguard Worker // the sockets that are connected to the private addresses. 97*6777b538SAndroid Build Coastguard Worker const bool allow_rtt_private_address_; 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker // True if the RTT observations from this socket can be notified using 100*6777b538SAndroid Build Coastguard Worker // |updated_rtt_observation_callback_|. 101*6777b538SAndroid Build Coastguard Worker const bool run_rtt_callback_; 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Time when this was last notified of updated RTT. 104*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_rtt_notification_; 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker raw_ptr<const base::TickClock> tick_clock_; 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker // True if the first RTT notification from the QUIC connection has been 111*6777b538SAndroid Build Coastguard Worker // received. 112*6777b538SAndroid Build Coastguard Worker bool first_quic_rtt_notification_received_ = false; 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker // A unique identifier for the remote host that this socket connects to. 115*6777b538SAndroid Build Coastguard Worker const std::optional<IPHash> host_; 116*6777b538SAndroid Build Coastguard Worker }; 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker } // namespace nqe::internal 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker } // namespace net 121*6777b538SAndroid Build Coastguard Worker 122*6777b538SAndroid Build Coastguard Worker #endif // NET_NQE_SOCKET_WATCHER_H_ 123