| // 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/threading/thread_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_; | 
 |  | 
 |   base::ThreadChecker thread_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_ |