xref: /aosp_15_r20/external/cronet/net/nqe/socket_watcher.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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