// Copyright 2020 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_QUIC_QUIC_CONNECTIVITY_MONITOR_H_ #define NET_QUIC_QUIC_CONNECTIVITY_MONITOR_H_ #include #include "base/memory/raw_ptr.h" #include "base/numerics/clamped_math.h" #include "net/base/network_handle.h" #include "net/quic/quic_chromium_client_session.h" namespace net { // Responsible for monitoring path degrading detection/recovery events on the // default network interface. // Reset all raw observations (reported by sessions) when the default network // is changed, which happens either: // - via OnDefaultNetworkUpdated if handles::NetworkHandle is supported on the // platform; // - via OnIPAddressChanged otherwise. class NET_EXPORT_PRIVATE QuicConnectivityMonitor : public QuicChromiumClientSession::ConnectivityObserver { public: explicit QuicConnectivityMonitor(handles::NetworkHandle default_network); QuicConnectivityMonitor(const QuicConnectivityMonitor&) = delete; QuicConnectivityMonitor& operator=(const QuicConnectivityMonitor&) = delete; ~QuicConnectivityMonitor() override; // Records connectivity related stats to histograms. void RecordConnectivityStatsToHistograms( const std::string& platform_notification, handles::NetworkHandle affected_network) const; // Returns the number of sessions that are currently degrading on the default // network interface. size_t GetNumDegradingSessions() const; // Returns the number of reports received for |write_error_code| on // |default_network|. size_t GetCountForWriteErrorCode(int write_error_code) const; // Called to set up the initial default network, which happens when the // default network tracking is lost upon |this| creation. void SetInitialDefaultNetwork(handles::NetworkHandle default_network); // Called when handles::NetworkHandle is supported and the default network // interface used by the platform is updated. void OnDefaultNetworkUpdated(handles::NetworkHandle default_network); // Called when handles::NetworkHandle is NOT supported and the IP address of // the primary interface changes. This includes when the primary interface // itself changes. void OnIPAddressChanged(); // Called when |session| is marked as going away due to IP address change. void OnSessionGoingAwayOnIPAddressChange(QuicChromiumClientSession* session); // QuicChromiumClientSession::ConnectivityObserver implementation. void OnSessionPathDegrading(QuicChromiumClientSession* session, handles::NetworkHandle network) override; void OnSessionResumedPostPathDegrading( QuicChromiumClientSession* session, handles::NetworkHandle network) override; void OnSessionEncounteringWriteError(QuicChromiumClientSession* session, handles::NetworkHandle network, int error_code) override; void OnSessionClosedAfterHandshake(QuicChromiumClientSession* session, handles::NetworkHandle network, quic::ConnectionCloseSource source, quic::QuicErrorCode error_code) override; void OnSessionRegistered(QuicChromiumClientSession* session, handles::NetworkHandle network) override; void OnSessionRemoved(QuicChromiumClientSession* session) override; private: // Size chosen per net.QuicSession.WriteError histogram. using WriteErrorMap = base::flat_map; // The most common QuicErrorCode cared by this monitor is: // QUIC_PUBLIC_RESET by the peer, or // QUIC_PACKET_WRITE_ERROR/QUIC_TOO_MANY_RTOS by self. using QuicErrorCodeMap = base::flat_map; // If handles::NetworkHandle is not supported, always set to // handles::kInvalidNetworkHandle. handles::NetworkHandle default_network_; // Sessions that are currently degrading on the |default_network_|. std::set> degrading_sessions_; // Sessions that are currently active on the |default_network_|. std::set> active_sessions_; // Number of sessions that have been active or created during the period of // a speculative connectivity failure. // The period of a speculative connectivity failure // - starts by the earliest detection of path degradation or a connectivity // related packet write error, // - ends immediately by the detection of path recovery or a network change. // Use clamped math to cap number of sessions at INT_MAX. std::optional> num_sessions_active_during_current_speculative_connectivity_failure_; // Total number of sessions that has been degraded before any recovery, // including no longer active sessions. // Use clamped math to cap number of sessions at INT_MAX. base::ClampedNumeric num_all_degraded_sessions_{0}; // Map from the write error code to the corresponding number of reports. WriteErrorMap write_error_map_; QuicErrorCodeMap quic_error_map_; base::WeakPtrFactory weak_factory_{this}; }; } // namespace net #endif // NET_QUIC_QUIC_CONNECTIVITY_MONITOR_H_