mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-05 03:36:08 +03:00
127 lines
5.3 KiB
C++
127 lines
5.3 KiB
C++
// 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_
|