blob: 3003444b17b513b804dc86b3e48fe518de592bec [file] [log] [blame]
// 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 <set>
#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<int, size_t>;
// 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<quic::QuicErrorCode, size_t>;
// 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<raw_ptr<QuicChromiumClientSession, SetExperimental>>
degrading_sessions_;
// Sessions that are currently active on the |default_network_|.
std::set<raw_ptr<QuicChromiumClientSession, SetExperimental>>
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<base::ClampedNumeric<int>>
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<int> 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<QuicConnectivityMonitor> weak_factory_{this};
};
} // namespace net
#endif // NET_QUIC_QUIC_CONNECTIVITY_MONITOR_H_