summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quic/core/quic_connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/quic_connection.h')
-rw-r--r--chromium/net/third_party/quiche/src/quic/core/quic_connection.h2297
1 files changed, 0 insertions, 2297 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/quic_connection.h b/chromium/net/third_party/quiche/src/quic/core/quic_connection.h
deleted file mode 100644
index 954eb6a6d0f..00000000000
--- a/chromium/net/third_party/quiche/src/quic/core/quic_connection.h
+++ /dev/null
@@ -1,2297 +0,0 @@
-// Copyright (c) 2012 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.
-
-// The entity that handles framing writes for a Quic client or server.
-// Each QuicSession will have a connection associated with it.
-//
-// On the server side, the Dispatcher handles the raw reads, and hands off
-// packets via ProcessUdpPacket for framing and processing.
-//
-// On the client side, the Connection handles the raw reads, as well as the
-// processing.
-//
-// Note: this class is not thread-safe.
-
-#ifndef QUICHE_QUIC_CORE_QUIC_CONNECTION_H_
-#define QUICHE_QUIC_CORE_QUIC_CONNECTION_H_
-
-#include <cstddef>
-#include <cstdint>
-#include <list>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "absl/strings/string_view.h"
-#include "absl/types/optional.h"
-#include "quic/core/crypto/quic_decrypter.h"
-#include "quic/core/crypto/quic_encrypter.h"
-#include "quic/core/crypto/transport_parameters.h"
-#include "quic/core/frames/quic_ack_frequency_frame.h"
-#include "quic/core/frames/quic_max_streams_frame.h"
-#include "quic/core/frames/quic_new_connection_id_frame.h"
-#include "quic/core/proto/cached_network_parameters_proto.h"
-#include "quic/core/quic_alarm.h"
-#include "quic/core/quic_alarm_factory.h"
-#include "quic/core/quic_blocked_writer_interface.h"
-#include "quic/core/quic_connection_context.h"
-#include "quic/core/quic_connection_id.h"
-#include "quic/core/quic_connection_id_manager.h"
-#include "quic/core/quic_connection_stats.h"
-#include "quic/core/quic_constants.h"
-#include "quic/core/quic_framer.h"
-#include "quic/core/quic_idle_network_detector.h"
-#include "quic/core/quic_mtu_discovery.h"
-#include "quic/core/quic_network_blackhole_detector.h"
-#include "quic/core/quic_one_block_arena.h"
-#include "quic/core/quic_packet_creator.h"
-#include "quic/core/quic_packet_writer.h"
-#include "quic/core/quic_packets.h"
-#include "quic/core/quic_path_validator.h"
-#include "quic/core/quic_sent_packet_manager.h"
-#include "quic/core/quic_time.h"
-#include "quic/core/quic_types.h"
-#include "quic/core/uber_received_packet_manager.h"
-#include "quic/platform/api/quic_containers.h"
-#include "quic/platform/api/quic_export.h"
-#include "quic/platform/api/quic_flags.h"
-#include "quic/platform/api/quic_socket_address.h"
-#include "common/quiche_circular_deque.h"
-
-namespace quic {
-
-class QuicClock;
-class QuicConfig;
-class QuicConnection;
-class QuicRandom;
-
-namespace test {
-class QuicConnectionPeer;
-} // namespace test
-
-// Class that receives callbacks from the connection when frames are received
-// and when other interesting events happen.
-class QUIC_EXPORT_PRIVATE QuicConnectionVisitorInterface {
- public:
- virtual ~QuicConnectionVisitorInterface() {}
-
- // A simple visitor interface for dealing with a data frame.
- virtual void OnStreamFrame(const QuicStreamFrame& frame) = 0;
-
- // Called when a CRYPTO frame containing handshake data is received.
- virtual void OnCryptoFrame(const QuicCryptoFrame& frame) = 0;
-
- // The session should process the WINDOW_UPDATE frame, adjusting both stream
- // and connection level flow control windows.
- virtual void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) = 0;
-
- // A BLOCKED frame indicates the peer is flow control blocked
- // on a specified stream.
- virtual void OnBlockedFrame(const QuicBlockedFrame& frame) = 0;
-
- // Called when the stream is reset by the peer.
- virtual void OnRstStream(const QuicRstStreamFrame& frame) = 0;
-
- // Called when the connection is going away according to the peer.
- virtual void OnGoAway(const QuicGoAwayFrame& frame) = 0;
-
- // Called when |message| has been received.
- virtual void OnMessageReceived(absl::string_view message) = 0;
-
- // Called when a HANDSHAKE_DONE frame has been received.
- virtual void OnHandshakeDoneReceived() = 0;
-
- // Called when a NEW_TOKEN frame has been received.
- virtual void OnNewTokenReceived(absl::string_view token) = 0;
-
- // Called when a MAX_STREAMS frame has been received from the peer.
- virtual bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) = 0;
-
- // Called when a STREAMS_BLOCKED frame has been received from the peer.
- virtual bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) = 0;
-
- // Called when the connection is closed either locally by the framer, or
- // remotely by the peer.
- virtual void OnConnectionClosed(const QuicConnectionCloseFrame& frame,
- ConnectionCloseSource source) = 0;
-
- // Called when the connection failed to write because the socket was blocked.
- virtual void OnWriteBlocked() = 0;
-
- // Called once a specific QUIC version is agreed by both endpoints.
- virtual void OnSuccessfulVersionNegotiation(
- const ParsedQuicVersion& version) = 0;
-
- // Called when a packet has been received by the connection, after being
- // validated and parsed. Only called when the client receives a valid packet
- // or the server receives a connectivity probing packet.
- // |is_connectivity_probe| is true if the received packet is a connectivity
- // probe.
- virtual void OnPacketReceived(const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address,
- bool is_connectivity_probe) = 0;
-
- // Called when a blocked socket becomes writable.
- virtual void OnCanWrite() = 0;
-
- // Called when the connection needs more data to probe for additional
- // bandwidth. Returns true if data was sent, false otherwise.
- virtual bool SendProbingData() = 0;
-
- // Called when stateless reset packet is received. Returns true if the
- // connection needs to be closed.
- virtual bool ValidateStatelessReset(
- const quic::QuicSocketAddress& self_address,
- const quic::QuicSocketAddress& peer_address) = 0;
-
- // Called when the connection experiences a change in congestion window.
- virtual void OnCongestionWindowChange(QuicTime now) = 0;
-
- // Called when the connection receives a packet from a migrated client.
- virtual void OnConnectionMigration(AddressChangeType type) = 0;
-
- // Called when the peer seems unreachable over the current path.
- virtual void OnPathDegrading() = 0;
-
- // Called when forward progress made after path degrading.
- virtual void OnForwardProgressMadeAfterPathDegrading() = 0;
-
- // Called when the connection sends ack after
- // max_consecutive_num_packets_with_no_retransmittable_frames_ consecutive not
- // retransmittable packets sent. To instigate an ack from peer, a
- // retransmittable frame needs to be added.
- virtual void OnAckNeedsRetransmittableFrame() = 0;
-
- // Called when an AckFrequency frame need to be sent.
- virtual void SendAckFrequency(const QuicAckFrequencyFrame& frame) = 0;
-
- // Called to send a NEW_CONNECTION_ID frame.
- virtual void SendNewConnectionId(const QuicNewConnectionIdFrame& frame) = 0;
-
- // Called to send a RETIRE_CONNECTION_ID frame.
- virtual void SendRetireConnectionId(uint64_t sequence_number) = 0;
-
- // Called when server starts to use a server issued connection ID.
- virtual void OnServerConnectionIdIssued(
- const QuicConnectionId& server_connection_id) = 0;
-
- // Called when server stops to use a server issued connection ID.
- virtual void OnServerConnectionIdRetired(
- const QuicConnectionId& server_connection_id) = 0;
-
- // Called to ask if the visitor wants to schedule write resumption as it both
- // has pending data to write, and is able to write (e.g. based on flow control
- // limits).
- // Writes may be pending because they were write-blocked, congestion-throttled
- // or yielded to other connections.
- virtual bool WillingAndAbleToWrite() const = 0;
-
- // Called to ask if the connection should be kept alive and prevented
- // from timing out, for example if there are outstanding application
- // transactions expecting a response.
- virtual bool ShouldKeepConnectionAlive() const = 0;
-
- // Called to retrieve streams information for logging purpose.
- virtual std::string GetStreamsInfoForLogging() const = 0;
-
- // Called when a self address change is observed. Returns true if self address
- // change is allowed.
- virtual bool AllowSelfAddressChange() const = 0;
-
- // Called to get current handshake state.
- virtual HandshakeState GetHandshakeState() const = 0;
-
- // Called when a STOP_SENDING frame has been received.
- virtual void OnStopSendingFrame(const QuicStopSendingFrame& frame) = 0;
-
- // Called when a packet of encryption |level| has been successfully decrypted.
- virtual void OnPacketDecrypted(EncryptionLevel level) = 0;
-
- // Called when a 1RTT packet has been acknowledged.
- virtual void OnOneRttPacketAcknowledged() = 0;
-
- // Called when a packet of ENCRYPTION_HANDSHAKE gets sent.
- virtual void OnHandshakePacketSent() = 0;
-
- // Called when a key update has occurred.
- virtual void OnKeyUpdate(KeyUpdateReason reason) = 0;
-
- // Called to generate a decrypter for the next key phase. Each call should
- // generate the key for phase n+1.
- virtual std::unique_ptr<QuicDecrypter>
- AdvanceKeysAndCreateCurrentOneRttDecrypter() = 0;
-
- // Called to generate an encrypter for the same key phase of the last
- // decrypter returned by AdvanceKeysAndCreateCurrentOneRttDecrypter().
- virtual std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() = 0;
-
- // Called when connection is being closed right before a CONNECTION_CLOSE
- // frame is serialized, but only on the server and only if forward secure
- // encryption has already been established.
- virtual void BeforeConnectionCloseSent() = 0;
-
- // Called by the server to validate |token| in received INITIAL packets.
- // Consider the client address gets validated (and therefore remove
- // amplification factor) once the |token| gets successfully validated.
- virtual bool ValidateToken(absl::string_view token) = 0;
-
- // Called by the server to send another token.
- // Return false if the crypto stream fail to generate one.
- virtual bool MaybeSendAddressToken() = 0;
-
- // Whether the server address is known to the connection.
- virtual bool IsKnownServerAddress(const QuicSocketAddress& address) const = 0;
-};
-
-// Interface which gets callbacks from the QuicConnection at interesting
-// points. Implementations must not mutate the state of the connection
-// as a result of these callbacks.
-class QUIC_EXPORT_PRIVATE QuicConnectionDebugVisitor
- : public QuicSentPacketManager::DebugDelegate {
- public:
- ~QuicConnectionDebugVisitor() override {}
-
- // Called when a packet has been sent.
- virtual void OnPacketSent(QuicPacketNumber /*packet_number*/,
- QuicPacketLength /*packet_length*/,
- bool /*has_crypto_handshake*/,
- TransmissionType /*transmission_type*/,
- EncryptionLevel /*encryption_level*/,
- const QuicFrames& /*retransmittable_frames*/,
- const QuicFrames& /*nonretransmittable_frames*/,
- QuicTime /*sent_time*/) {}
-
- // Called when a coalesced packet is successfully serialized.
- virtual void OnCoalescedPacketSent(
- const QuicCoalescedPacket& /*coalesced_packet*/, size_t /*length*/) {}
-
- // Called when a PING frame has been sent.
- virtual void OnPingSent() {}
-
- // Called when a packet has been received, but before it is
- // validated or parsed.
- virtual void OnPacketReceived(const QuicSocketAddress& /*self_address*/,
- const QuicSocketAddress& /*peer_address*/,
- const QuicEncryptedPacket& /*packet*/) {}
-
- // Called when the unauthenticated portion of the header has been parsed.
- virtual void OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) {}
-
- // Called when a packet is received with a connection id that does not
- // match the ID of this connection.
- virtual void OnIncorrectConnectionId(QuicConnectionId /*connection_id*/) {}
-
- // Called when an undecryptable packet has been received. If |dropped| is
- // true, the packet has been dropped. Otherwise, the packet will be queued and
- // connection will attempt to process it later.
- virtual void OnUndecryptablePacket(EncryptionLevel /*decryption_level*/,
- bool /*dropped*/) {}
-
- // Called when attempting to process a previously undecryptable packet.
- virtual void OnAttemptingToProcessUndecryptablePacket(
- EncryptionLevel /*decryption_level*/) {}
-
- // Called when a duplicate packet has been received.
- virtual void OnDuplicatePacket(QuicPacketNumber /*packet_number*/) {}
-
- // Called when the protocol version on the received packet doensn't match
- // current protocol version of the connection.
- virtual void OnProtocolVersionMismatch(ParsedQuicVersion /*version*/) {}
-
- // Called when the complete header of a packet has been parsed.
- virtual void OnPacketHeader(const QuicPacketHeader& /*header*/,
- QuicTime /*receive_time*/,
- EncryptionLevel /*level*/) {}
-
- // Called when a StreamFrame has been parsed.
- virtual void OnStreamFrame(const QuicStreamFrame& /*frame*/) {}
-
- // Called when a CRYPTO frame containing handshake data is received.
- virtual void OnCryptoFrame(const QuicCryptoFrame& /*frame*/) {}
-
- // Called when a StopWaitingFrame has been parsed.
- virtual void OnStopWaitingFrame(const QuicStopWaitingFrame& /*frame*/) {}
-
- // Called when a QuicPaddingFrame has been parsed.
- virtual void OnPaddingFrame(const QuicPaddingFrame& /*frame*/) {}
-
- // Called when a Ping has been parsed.
- virtual void OnPingFrame(const QuicPingFrame& /*frame*/,
- QuicTime::Delta /*ping_received_delay*/) {}
-
- // Called when a GoAway has been parsed.
- virtual void OnGoAwayFrame(const QuicGoAwayFrame& /*frame*/) {}
-
- // Called when a RstStreamFrame has been parsed.
- virtual void OnRstStreamFrame(const QuicRstStreamFrame& /*frame*/) {}
-
- // Called when a ConnectionCloseFrame has been parsed. All forms
- // of CONNECTION CLOSE are handled, Google QUIC, IETF QUIC
- // CONNECTION CLOSE/Transport and IETF QUIC CONNECTION CLOSE/Application
- virtual void OnConnectionCloseFrame(
- const QuicConnectionCloseFrame& /*frame*/) {}
-
- // Called when a WindowUpdate has been parsed.
- virtual void OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/,
- const QuicTime& /*receive_time*/) {}
-
- // Called when a BlockedFrame has been parsed.
- virtual void OnBlockedFrame(const QuicBlockedFrame& /*frame*/) {}
-
- // Called when a NewConnectionIdFrame has been parsed.
- virtual void OnNewConnectionIdFrame(
- const QuicNewConnectionIdFrame& /*frame*/) {}
-
- // Called when a RetireConnectionIdFrame has been parsed.
- virtual void OnRetireConnectionIdFrame(
- const QuicRetireConnectionIdFrame& /*frame*/) {}
-
- // Called when a NewTokenFrame has been parsed.
- virtual void OnNewTokenFrame(const QuicNewTokenFrame& /*frame*/) {}
-
- // Called when a MessageFrame has been parsed.
- virtual void OnMessageFrame(const QuicMessageFrame& /*frame*/) {}
-
- // Called when a HandshakeDoneFrame has been parsed.
- virtual void OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& /*frame*/) {}
-
- // Called when a public reset packet has been received.
- virtual void OnPublicResetPacket(const QuicPublicResetPacket& /*packet*/) {}
-
- // Called when a version negotiation packet has been received.
- virtual void OnVersionNegotiationPacket(
- const QuicVersionNegotiationPacket& /*packet*/) {}
-
- // Called when the connection is closed.
- virtual void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/,
- ConnectionCloseSource /*source*/) {}
-
- // Called when the version negotiation is successful.
- virtual void OnSuccessfulVersionNegotiation(
- const ParsedQuicVersion& /*version*/) {}
-
- // Called when a CachedNetworkParameters is sent to the client.
- virtual void OnSendConnectionState(
- const CachedNetworkParameters& /*cached_network_params*/) {}
-
- // Called when a CachedNetworkParameters are received from the client.
- virtual void OnReceiveConnectionState(
- const CachedNetworkParameters& /*cached_network_params*/) {}
-
- // Called when the connection parameters are set from the supplied
- // |config|.
- virtual void OnSetFromConfig(const QuicConfig& /*config*/) {}
-
- // Called when RTT may have changed, including when an RTT is read from
- // the config.
- virtual void OnRttChanged(QuicTime::Delta /*rtt*/) const {}
-
- // Called when a StopSendingFrame has been parsed.
- virtual void OnStopSendingFrame(const QuicStopSendingFrame& /*frame*/) {}
-
- // Called when a PathChallengeFrame has been parsed.
- virtual void OnPathChallengeFrame(const QuicPathChallengeFrame& /*frame*/) {}
-
- // Called when a PathResponseFrame has been parsed.
- virtual void OnPathResponseFrame(const QuicPathResponseFrame& /*frame*/) {}
-
- // Called when a StreamsBlockedFrame has been parsed.
- virtual void OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& /*frame*/) {
- }
-
- // Called when a MaxStreamsFrame has been parsed.
- virtual void OnMaxStreamsFrame(const QuicMaxStreamsFrame& /*frame*/) {}
-
- // Called when an AckFrequencyFrame has been parsed.
- virtual void OnAckFrequencyFrame(const QuicAckFrequencyFrame& /*frame*/) {}
-
- // Called when |count| packet numbers have been skipped.
- virtual void OnNPacketNumbersSkipped(QuicPacketCount /*count*/,
- QuicTime /*now*/) {}
-
- // Called for QUIC+TLS versions when we send transport parameters.
- virtual void OnTransportParametersSent(
- const TransportParameters& /*transport_parameters*/) {}
-
- // Called for QUIC+TLS versions when we receive transport parameters.
- virtual void OnTransportParametersReceived(
- const TransportParameters& /*transport_parameters*/) {}
-
- // Called for QUIC+TLS versions when we resume cached transport parameters for
- // 0-RTT.
- virtual void OnTransportParametersResumed(
- const TransportParameters& /*transport_parameters*/) {}
-
- // Called for QUIC+TLS versions when 0-RTT is rejected.
- virtual void OnZeroRttRejected(int /*reject_reason*/) {}
-
- // Called for QUIC+TLS versions when 0-RTT packet gets acked.
- virtual void OnZeroRttPacketAcked() {}
-
- // Called on peer address change.
- virtual void OnPeerAddressChange(AddressChangeType /*type*/,
- QuicTime::Delta /*connection_time*/) {}
-
- // Called after peer migration is validated.
- virtual void OnPeerMigrationValidated(QuicTime::Delta /*connection_time*/) {}
-};
-
-class QUIC_EXPORT_PRIVATE QuicConnectionHelperInterface {
- public:
- virtual ~QuicConnectionHelperInterface() {}
-
- // Returns a QuicClock to be used for all time related functions.
- virtual const QuicClock* GetClock() const = 0;
-
- // Returns a QuicRandom to be used for all random number related functions.
- virtual QuicRandom* GetRandomGenerator() = 0;
-
- // Returns a QuicBufferAllocator to be used for stream send buffers.
- virtual QuicBufferAllocator* GetStreamSendBufferAllocator() = 0;
-};
-
-class QUIC_EXPORT_PRIVATE QuicConnection
- : public QuicFramerVisitorInterface,
- public QuicBlockedWriterInterface,
- public QuicPacketCreator::DelegateInterface,
- public QuicSentPacketManager::NetworkChangeVisitor,
- public QuicNetworkBlackholeDetector::Delegate,
- public QuicIdleNetworkDetector::Delegate,
- public QuicPathValidator::SendDelegate,
- public QuicConnectionIdManagerVisitorInterface {
- public:
- // Constructs a new QuicConnection for |connection_id| and
- // |initial_peer_address| using |writer| to write packets. |owns_writer|
- // specifies whether the connection takes ownership of |writer|. |helper| must
- // outlive this connection.
- QuicConnection(QuicConnectionId server_connection_id,
- QuicSocketAddress initial_self_address,
- QuicSocketAddress initial_peer_address,
- QuicConnectionHelperInterface* helper,
- QuicAlarmFactory* alarm_factory,
- QuicPacketWriter* writer,
- bool owns_writer,
- Perspective perspective,
- const ParsedQuicVersionVector& supported_versions);
- QuicConnection(const QuicConnection&) = delete;
- QuicConnection& operator=(const QuicConnection&) = delete;
- ~QuicConnection() override;
-
- // Sets connection parameters from the supplied |config|.
- void SetFromConfig(const QuicConfig& config);
-
- // Apply |connection_options| for this connection. Unlike SetFromConfig, this
- // can happen at anytime in the life of a connection.
- // Note there is no guarantee that all options can be applied. Components will
- // only apply cherrypicked options that make sense at the time of the call.
- void ApplyConnectionOptions(const QuicTagVector& connection_options);
-
- // Called by the session when sending connection state to the client.
- virtual void OnSendConnectionState(
- const CachedNetworkParameters& cached_network_params);
-
- // Called by the session when receiving connection state from the client.
- virtual void OnReceiveConnectionState(
- const CachedNetworkParameters& cached_network_params);
-
- // Called by the Session when the client has provided CachedNetworkParameters.
- virtual void ResumeConnectionState(
- const CachedNetworkParameters& cached_network_params,
- bool max_bandwidth_resumption);
-
- // Called by the Session when a max pacing rate for the connection is needed.
- virtual void SetMaxPacingRate(QuicBandwidth max_pacing_rate);
-
- // Allows the client to adjust network parameters based on external
- // information.
- void AdjustNetworkParameters(
- const SendAlgorithmInterface::NetworkParams& params);
- void AdjustNetworkParameters(QuicBandwidth bandwidth,
- QuicTime::Delta rtt,
- bool allow_cwnd_to_decrease);
-
- // Install a loss detection tuner. Must be called before OnConfigNegotiated.
- void SetLossDetectionTuner(
- std::unique_ptr<LossDetectionTunerInterface> tuner);
- // Called by the session when session->is_configured() becomes true.
- void OnConfigNegotiated();
-
- // Returns the max pacing rate for the connection.
- virtual QuicBandwidth MaxPacingRate() const;
-
- // Sends crypto handshake messages of length |write_length| to the peer in as
- // few packets as possible. Returns the number of bytes consumed from the
- // data.
- virtual size_t SendCryptoData(EncryptionLevel level,
- size_t write_length,
- QuicStreamOffset offset);
-
- // Send the data of length |write_length| to the peer in as few packets as
- // possible. Returns the number of bytes consumed from data, and a boolean
- // indicating if the fin bit was consumed. This does not indicate the data
- // has been sent on the wire: it may have been turned into a packet and queued
- // if the socket was unexpectedly blocked.
- virtual QuicConsumedData SendStreamData(QuicStreamId id,
- size_t write_length,
- QuicStreamOffset offset,
- StreamSendingState state);
-
- // Send |frame| to the peer. Returns true if frame is consumed, false
- // otherwise.
- virtual bool SendControlFrame(const QuicFrame& frame);
-
- // Called when stream |id| is reset because of |error|.
- virtual void OnStreamReset(QuicStreamId id, QuicRstStreamErrorCode error);
-
- // Closes the connection.
- // |connection_close_behavior| determines whether or not a connection close
- // packet is sent to the peer.
- virtual void CloseConnection(
- QuicErrorCode error,
- const std::string& details,
- ConnectionCloseBehavior connection_close_behavior);
- // Closes the connection, specifying the wire error code |ietf_error|
- // explicitly.
- virtual void CloseConnection(
- QuicErrorCode error,
- QuicIetfTransportErrorCodes ietf_error,
- const std::string& details,
- ConnectionCloseBehavior connection_close_behavior);
-
- QuicConnectionStats& mutable_stats() { return stats_; }
-
- int retransmittable_on_wire_ping_count() const {
- return retransmittable_on_wire_ping_count_;
- }
-
- // Returns statistics tracked for this connection.
- const QuicConnectionStats& GetStats();
-
- // Processes an incoming UDP packet (consisting of a QuicEncryptedPacket) from
- // the peer.
- // In a client, the packet may be "stray" and have a different connection ID
- // than that of this connection.
- virtual void ProcessUdpPacket(const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address,
- const QuicReceivedPacket& packet);
-
- // QuicBlockedWriterInterface
- // Called when the underlying connection becomes writable to allow queued
- // writes to happen.
- void OnBlockedWriterCanWrite() override;
-
- bool IsWriterBlocked() const override {
- return writer_ != nullptr && writer_->IsWriteBlocked();
- }
-
- // Called when the caller thinks it's worth a try to write.
- // TODO(fayang): consider unifying this with QuicSession::OnCanWrite.
- virtual void OnCanWrite();
-
- // Called when an error occurs while attempting to write a packet to the
- // network.
- void OnWriteError(int error_code);
-
- // Whether |result| represents a MSG TOO BIG write error.
- bool IsMsgTooBig(const WriteResult& result);
-
- // If the socket is not blocked, writes queued packets.
- void WriteIfNotBlocked();
-
- // Set the packet writer.
- void SetQuicPacketWriter(QuicPacketWriter* writer, bool owns_writer) {
- QUICHE_DCHECK(writer != nullptr);
- if (writer_ != nullptr && owns_writer_) {
- delete writer_;
- }
- writer_ = writer;
- owns_writer_ = owns_writer;
- }
-
- // Set self address.
- void SetSelfAddress(QuicSocketAddress address) {
- default_path_.self_address = address;
- }
-
- // The version of the protocol this connection is using.
- QuicTransportVersion transport_version() const {
- return framer_.transport_version();
- }
-
- ParsedQuicVersion version() const { return framer_.version(); }
-
- // The versions of the protocol that this connection supports.
- const ParsedQuicVersionVector& supported_versions() const {
- return framer_.supported_versions();
- }
-
- // Mark version negotiated for this connection. Once called, the connection
- // will ignore received version negotiation packets.
- void SetVersionNegotiated() {
- version_negotiated_ = true;
- if (perspective_ == Perspective::IS_SERVER) {
- framer_.InferPacketHeaderTypeFromVersion();
- }
- }
-
- // From QuicFramerVisitorInterface
- void OnError(QuicFramer* framer) override;
- bool OnProtocolVersionMismatch(ParsedQuicVersion received_version) override;
- void OnPacket() override;
- void OnPublicResetPacket(const QuicPublicResetPacket& packet) override;
- void OnVersionNegotiationPacket(
- const QuicVersionNegotiationPacket& packet) override;
- void OnRetryPacket(QuicConnectionId original_connection_id,
- QuicConnectionId new_connection_id,
- absl::string_view retry_token,
- absl::string_view retry_integrity_tag,
- absl::string_view retry_without_tag) override;
- bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override;
- bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override;
- void OnDecryptedPacket(size_t length, EncryptionLevel level) override;
- bool OnPacketHeader(const QuicPacketHeader& header) override;
- void OnCoalescedPacket(const QuicEncryptedPacket& packet) override;
- void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
- EncryptionLevel decryption_level,
- bool has_decryption_key) override;
- bool OnStreamFrame(const QuicStreamFrame& frame) override;
- bool OnCryptoFrame(const QuicCryptoFrame& frame) override;
- bool OnAckFrameStart(QuicPacketNumber largest_acked,
- QuicTime::Delta ack_delay_time) override;
- bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override;
- bool OnAckTimestamp(QuicPacketNumber packet_number,
- QuicTime timestamp) override;
- bool OnAckFrameEnd(QuicPacketNumber start) override;
- bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override;
- bool OnPaddingFrame(const QuicPaddingFrame& frame) override;
- bool OnPingFrame(const QuicPingFrame& frame) override;
- bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
- bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
- bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override;
- bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override;
- bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override;
- bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override;
- bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override;
- bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override;
- bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override;
- bool OnBlockedFrame(const QuicBlockedFrame& frame) override;
- bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override;
- bool OnRetireConnectionIdFrame(
- const QuicRetireConnectionIdFrame& frame) override;
- bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override;
- bool OnMessageFrame(const QuicMessageFrame& frame) override;
- bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override;
- bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override;
- void OnPacketComplete() override;
- bool IsValidStatelessResetToken(
- const StatelessResetToken& token) const override;
- void OnAuthenticatedIetfStatelessResetPacket(
- const QuicIetfStatelessResetPacket& packet) override;
- void OnKeyUpdate(KeyUpdateReason reason) override;
- void OnDecryptedFirstPacketInKeyPhase() override;
- std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
- override;
- std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override;
-
- // QuicPacketCreator::DelegateInterface
- bool ShouldGeneratePacket(HasRetransmittableData retransmittable,
- IsHandshake handshake) override;
- const QuicFrames MaybeBundleAckOpportunistically() override;
- QuicPacketBuffer GetPacketBuffer() override;
- void OnSerializedPacket(SerializedPacket packet) override;
- void OnUnrecoverableError(QuicErrorCode error,
- const std::string& error_details) override;
- SerializedPacketFate GetSerializedPacketFate(
- bool is_mtu_discovery,
- EncryptionLevel encryption_level) override;
-
- // QuicSentPacketManager::NetworkChangeVisitor
- void OnCongestionChange() override;
- void OnPathMtuIncreased(QuicPacketLength packet_size) override;
-
- // QuicNetworkBlackholeDetector::Delegate
- void OnPathDegradingDetected() override;
- void OnBlackholeDetected() override;
- void OnPathMtuReductionDetected() override;
-
- // QuicIdleNetworkDetector::Delegate
- void OnHandshakeTimeout() override;
- void OnIdleNetworkDetected() override;
-
- // QuicConnectionIdManagerVisitorInterface
- void OnPeerIssuedConnectionIdRetired() override;
- bool SendNewConnectionId(const QuicNewConnectionIdFrame& frame) override;
- void OnNewConnectionIdIssued(const QuicConnectionId& connection_id) override;
- void OnSelfIssuedConnectionIdRetired(
- const QuicConnectionId& connection_id) override;
-
- // Please note, this is not a const function. For logging purpose, please use
- // ack_frame().
- const QuicFrame GetUpdatedAckFrame();
-
- // Called to send a new connection ID to client if the # of connection ID has
- // not exceeded the active connection ID limits.
- void MaybeSendConnectionIdToClient();
-
- // Called when the handshake completes. On the client side, handshake
- // completes on receipt of SHLO. On the server side, handshake completes when
- // SHLO gets ACKed (or a forward secure packet gets decrypted successfully).
- // TODO(fayang): Add a guard that this only gets called once.
- void OnHandshakeComplete();
-
- // Accessors
- void set_visitor(QuicConnectionVisitorInterface* visitor) {
- visitor_ = visitor;
- }
- void set_debug_visitor(QuicConnectionDebugVisitor* debug_visitor) {
- debug_visitor_ = debug_visitor;
- sent_packet_manager_.SetDebugDelegate(debug_visitor);
- }
- // Used in Chromium, but not internally.
- // Must only be called before ping_alarm_ is set.
- void set_ping_timeout(QuicTime::Delta ping_timeout) {
- QUICHE_DCHECK(!ping_alarm_->IsSet());
- ping_timeout_ = ping_timeout;
- }
- const QuicTime::Delta ping_timeout() const { return ping_timeout_; }
- // Sets an initial timeout for the ping alarm when there is no retransmittable
- // data in flight, allowing for a more aggressive ping alarm in that case.
- void set_initial_retransmittable_on_wire_timeout(
- QuicTime::Delta retransmittable_on_wire_timeout) {
- QUICHE_DCHECK(!ping_alarm_->IsSet());
- initial_retransmittable_on_wire_timeout_ = retransmittable_on_wire_timeout;
- }
- const QuicTime::Delta initial_retransmittable_on_wire_timeout() const {
- return initial_retransmittable_on_wire_timeout_;
- }
- // Used in Chromium, but not internally.
- void set_creator_debug_delegate(QuicPacketCreator::DebugDelegate* visitor) {
- packet_creator_.set_debug_delegate(visitor);
- }
- const QuicSocketAddress& self_address() const {
- return default_path_.self_address;
- }
- const QuicSocketAddress& peer_address() const { return direct_peer_address_; }
- const QuicSocketAddress& effective_peer_address() const {
- return default_path_.peer_address;
- }
-
- // Returns the server connection ID used on the default path.
- const QuicConnectionId& connection_id() const {
- return default_path_.server_connection_id;
- }
-
- const QuicConnectionId& client_connection_id() const {
- return default_path_.client_connection_id;
- }
- void set_client_connection_id(QuicConnectionId client_connection_id);
- const QuicClock* clock() const { return clock_; }
- QuicRandom* random_generator() const { return random_generator_; }
- QuicByteCount max_packet_length() const;
- void SetMaxPacketLength(QuicByteCount length);
-
- size_t mtu_probe_count() const { return mtu_probe_count_; }
-
- bool connected() const { return connected_; }
-
- // Must only be called on client connections.
- const ParsedQuicVersionVector& server_supported_versions() const {
- QUICHE_DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
- return server_supported_versions_;
- }
-
- bool HasQueuedPackets() const { return !buffered_packets_.empty(); }
- // Testing only. TODO(ianswett): Use a peer instead.
- size_t NumQueuedPackets() const { return buffered_packets_.size(); }
-
- // Returns true if the connection has queued packets or frames.
- bool HasQueuedData() const;
-
- // Sets the handshake and idle state connection timeouts.
- void SetNetworkTimeouts(QuicTime::Delta handshake_timeout,
- QuicTime::Delta idle_timeout);
-
- // Called when the ping alarm fires. Causes a ping frame to be sent only
- // if the retransmission alarm is not running.
- void OnPingTimeout();
-
- // Sets up a packet with an QuicAckFrame and sends it out.
- void SendAck();
-
- // Called when an RTO fires. Resets the retransmission alarm if there are
- // remaining unacked packets.
- void OnRetransmissionTimeout();
-
- // Mark all sent 0-RTT encrypted packets for retransmission. Called when new
- // 0-RTT or 1-RTT key is available in gQUIC, or when 0-RTT is rejected in IETF
- // QUIC. |reject_reason| is used in TLS-QUIC to log why 0-RTT was rejected.
- void MarkZeroRttPacketsForRetransmission(int reject_reason);
-
- // Calls |sent_packet_manager_|'s NeuterUnencryptedPackets. Used when the
- // connection becomes forward secure and hasn't received acks for all packets.
- void NeuterUnencryptedPackets();
-
- // Changes the encrypter used for level |level| to |encrypter|.
- void SetEncrypter(EncryptionLevel level,
- std::unique_ptr<QuicEncrypter> encrypter);
-
- // Called to remove encrypter of encryption |level|.
- void RemoveEncrypter(EncryptionLevel level);
-
- // SetNonceForPublicHeader sets the nonce that will be transmitted in the
- // header of each packet encrypted at the initial encryption level decrypted.
- // This should only be called on the server side.
- void SetDiversificationNonce(const DiversificationNonce& nonce);
-
- // SetDefaultEncryptionLevel sets the encryption level that will be applied
- // to new packets.
- void SetDefaultEncryptionLevel(EncryptionLevel level);
-
- // SetDecrypter sets the primary decrypter, replacing any that already exists.
- // If an alternative decrypter is in place then the function QUICHE_DCHECKs.
- // This is intended for cases where one knows that future packets will be
- // using the new decrypter and the previous decrypter is now obsolete. |level|
- // indicates the encryption level of the new decrypter.
- void SetDecrypter(EncryptionLevel level,
- std::unique_ptr<QuicDecrypter> decrypter);
-
- // SetAlternativeDecrypter sets a decrypter that may be used to decrypt
- // future packets. |level| indicates the encryption level of the decrypter. If
- // |latch_once_used| is true, then the first time that the decrypter is
- // successful it will replace the primary decrypter. Otherwise both
- // decrypters will remain active and the primary decrypter will be the one
- // last used.
- void SetAlternativeDecrypter(EncryptionLevel level,
- std::unique_ptr<QuicDecrypter> decrypter,
- bool latch_once_used);
-
- void InstallDecrypter(EncryptionLevel level,
- std::unique_ptr<QuicDecrypter> decrypter);
- void RemoveDecrypter(EncryptionLevel level);
-
- // Discard keys for the previous key phase.
- void DiscardPreviousOneRttKeys();
-
- // Returns true if it is currently allowed to initiate a key update.
- bool IsKeyUpdateAllowed() const;
-
- // Returns true if packets have been sent in the current 1-RTT key phase but
- // none of these packets have been acked.
- bool HaveSentPacketsInCurrentKeyPhaseButNoneAcked() const;
-
- // Returns the count of packets received that appeared to attempt a key
- // update but failed decryption that have been received since the last
- // successfully decrypted packet.
- QuicPacketCount PotentialPeerKeyUpdateAttemptCount() const;
-
- // Increment the key phase. It is a bug to call this when IsKeyUpdateAllowed()
- // is false. Returns false on error.
- bool InitiateKeyUpdate(KeyUpdateReason reason);
-
- const QuicDecrypter* decrypter() const;
- const QuicDecrypter* alternative_decrypter() const;
-
- Perspective perspective() const { return perspective_; }
-
- // Allow easy overriding of truncated connection IDs.
- void set_can_truncate_connection_ids(bool can) {
- can_truncate_connection_ids_ = can;
- }
-
- // Returns the underlying sent packet manager.
- const QuicSentPacketManager& sent_packet_manager() const {
- return sent_packet_manager_;
- }
-
- // Returns the underlying sent packet manager.
- QuicSentPacketManager& sent_packet_manager() { return sent_packet_manager_; }
-
- UberReceivedPacketManager& received_packet_manager() {
- return uber_received_packet_manager_;
- }
-
- bool CanWrite(HasRetransmittableData retransmittable);
-
- // When the flusher is out of scope, only the outermost flusher will cause a
- // flush of the connection and set the retransmission alarm if there is one
- // pending. In addition, this flusher can be configured to ensure that an ACK
- // frame is included in the first packet created, if there's new ack
- // information to be sent.
- class QUIC_EXPORT_PRIVATE ScopedPacketFlusher {
- public:
- explicit ScopedPacketFlusher(QuicConnection* connection);
- ~ScopedPacketFlusher();
-
- private:
- QuicConnection* connection_;
- // If true, when this flusher goes out of scope, flush connection and set
- // retransmission alarm if there is one pending.
- bool flush_and_set_pending_retransmission_alarm_on_delete_;
- // Latched connection's handshake_packet_sent_ on creation of this flusher.
- const bool handshake_packet_sent_;
- };
-
- class QUIC_EXPORT_PRIVATE ScopedEncryptionLevelContext {
- public:
- ScopedEncryptionLevelContext(QuicConnection* connection,
- EncryptionLevel level);
- ~ScopedEncryptionLevelContext();
-
- private:
- QuicConnection* connection_;
- // Latched current write encryption level on creation of this context.
- EncryptionLevel latched_encryption_level_;
- };
-
- QuicPacketWriter* writer() { return writer_; }
- const QuicPacketWriter* writer() const { return writer_; }
-
- // Sends an MTU discovery packet of size |target_mtu|. If the packet is
- // acknowledged by the peer, the maximum packet size will be increased to
- // |target_mtu|.
- void SendMtuDiscoveryPacket(QuicByteCount target_mtu);
-
- // Sends a connectivity probing packet to |peer_address| with
- // |probing_writer|. If |probing_writer| is nullptr, will use default
- // packet writer to write the packet. Returns true if subsequent packets can
- // be written to the probing writer. If connection is V99, a padded IETF QUIC
- // PATH_CHALLENGE packet is transmitted; if not V99, a Google QUIC padded PING
- // packet is transmitted.
- virtual bool SendConnectivityProbingPacket(
- QuicPacketWriter* probing_writer,
- const QuicSocketAddress& peer_address);
-
- // Sends response to a connectivity probe. Sends either a Padded Ping
- // or an IETF PATH_RESPONSE based on the version of the connection.
- // Is the counterpart to SendConnectivityProbingPacket().
- // TODO(danzh): remove this method after deprecating
- // --gfe2_reloadable_flag_quic_send_path_response.
- virtual void SendConnectivityProbingResponsePacket(
- const QuicSocketAddress& peer_address);
-
- // Disable MTU discovery on this connection.
- void DisableMtuDiscovery();
-
- // Sends an MTU discovery packet and updates the MTU discovery alarm.
- void DiscoverMtu();
-
- // Sets the session notifier on the SentPacketManager.
- void SetSessionNotifier(SessionNotifierInterface* session_notifier);
-
- // Set data producer in framer.
- void SetDataProducer(QuicStreamFrameDataProducer* data_producer);
-
- // Set transmission type of next sending packets.
- void SetTransmissionType(TransmissionType type);
-
- // Tries to send |message| and returns the message status.
- // If |flush| is false, this will return a MESSAGE_STATUS_BLOCKED
- // when the connection is deemed unwritable.
- virtual MessageStatus SendMessage(QuicMessageId message_id,
- absl::Span<QuicMemSlice> message,
- bool flush);
-
- // Returns the largest payload that will fit into a single MESSAGE frame.
- // Because overhead can vary during a connection, this method should be
- // checked for every message.
- QuicPacketLength GetCurrentLargestMessagePayload() const;
- // Returns the largest payload that will fit into a single MESSAGE frame at
- // any point during the connection. This assumes the version and
- // connection ID lengths do not change.
- QuicPacketLength GetGuaranteedLargestMessagePayload() const;
-
- void SetUnackedMapInitialCapacity();
-
- virtual int GetUnackedMapInitialCapacity() const {
- return kDefaultUnackedPacketsInitialCapacity;
- }
-
- // Returns the id of the cipher last used for decrypting packets.
- uint32_t cipher_id() const;
-
- std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets() {
- return termination_packets_.get();
- }
-
- bool ack_frame_updated() const;
-
- QuicConnectionHelperInterface* helper() { return helper_; }
- const QuicConnectionHelperInterface* helper() const { return helper_; }
- QuicAlarmFactory* alarm_factory() { return alarm_factory_; }
-
- absl::string_view GetCurrentPacket();
-
- const QuicFramer& framer() const { return framer_; }
-
- const QuicPacketCreator& packet_creator() const { return packet_creator_; }
-
- EncryptionLevel encryption_level() const { return encryption_level_; }
- EncryptionLevel last_decrypted_level() const {
- return last_decrypted_packet_level_;
- }
-
- const QuicSocketAddress& last_packet_source_address() const {
- return last_received_packet_info_.source_address;
- }
-
- bool fill_up_link_during_probing() const {
- return fill_up_link_during_probing_;
- }
- void set_fill_up_link_during_probing(bool new_value) {
- fill_up_link_during_probing_ = new_value;
- }
-
- // This setting may be changed during the crypto handshake in order to
- // enable/disable padding of different packets in the crypto handshake.
- //
- // This setting should never be set to false in public facing endpoints. It
- // can only be set to false if there is some other mechanism of preventing
- // amplification attacks, such as ICE (plus its a non-standard quic).
- void set_fully_pad_crypto_handshake_packets(bool new_value) {
- packet_creator_.set_fully_pad_crypto_handshake_packets(new_value);
- }
-
- bool fully_pad_during_crypto_handshake() const {
- return packet_creator_.fully_pad_crypto_handshake_packets();
- }
-
- size_t min_received_before_ack_decimation() const;
- void set_min_received_before_ack_decimation(size_t new_value);
-
- // If |defer| is true, configures the connection to defer sending packets in
- // response to an ACK to the SendAlarm. If |defer| is false, packets may be
- // sent immediately after receiving an ACK.
- void set_defer_send_in_response_to_packets(bool defer) {
- defer_send_in_response_to_packets_ = defer;
- }
-
- // Sets the current per-packet options for the connection. The QuicConnection
- // does not take ownership of |options|; |options| must live for as long as
- // the QuicConnection is in use.
- void set_per_packet_options(PerPacketOptions* options) {
- per_packet_options_ = options;
- }
-
- bool IsPathDegrading() const { return is_path_degrading_; }
-
- // Attempts to process any queued undecryptable packets.
- void MaybeProcessUndecryptablePackets();
-
- // Queue a coalesced packet.
- void QueueCoalescedPacket(const QuicEncryptedPacket& packet);
-
- // Process previously queued coalesced packets. Returns true if any coalesced
- // packets have been successfully processed.
- bool MaybeProcessCoalescedPackets();
-
- enum PacketContent : uint8_t {
- NO_FRAMES_RECEIVED,
- // TODO(fkastenholz): Change name when we get rid of padded ping/
- // pre-version-99.
- // Also PATH CHALLENGE and PATH RESPONSE.
- FIRST_FRAME_IS_PING,
- SECOND_FRAME_IS_PADDING,
- NOT_PADDED_PING, // Set if the packet is not {PING, PADDING}.
- };
-
- // Whether the handshake completes from this connection's perspective.
- bool IsHandshakeComplete() const;
-
- // Whether peer completes handshake. Only used with TLS handshake.
- bool IsHandshakeConfirmed() const;
-
- // Returns the largest received packet number sent by peer.
- QuicPacketNumber GetLargestReceivedPacket() const;
-
- // Sets the original destination connection ID on the connection.
- // This is called by QuicDispatcher when it has replaced the connection ID.
- void SetOriginalDestinationConnectionId(
- const QuicConnectionId& original_destination_connection_id);
-
- // Returns the original destination connection ID used for this connection.
- QuicConnectionId GetOriginalDestinationConnectionId();
-
- // Called when ACK alarm goes off. Sends ACKs of those packet number spaces
- // which have expired ACK timeout. Only used when this connection supports
- // multiple packet number spaces.
- void SendAllPendingAcks();
-
- // Returns true if this connection supports multiple packet number spaces.
- bool SupportsMultiplePacketNumberSpaces() const;
-
- // For logging purpose.
- const QuicAckFrame& ack_frame() const;
-
- // Install encrypter and decrypter for ENCRYPTION_INITIAL using
- // |connection_id| as the first client-sent destination connection ID,
- // or the one sent after an IETF Retry.
- void InstallInitialCrypters(QuicConnectionId connection_id);
-
- // Called when version is considered negotiated.
- void OnSuccessfulVersionNegotiation();
-
- // Called when self migration succeeds after probing.
- void OnSuccessfulMigration(bool is_port_change);
-
- // Called for QUIC+TLS versions when we send transport parameters.
- void OnTransportParametersSent(
- const TransportParameters& transport_parameters) const;
-
- // Called for QUIC+TLS versions when we receive transport parameters.
- void OnTransportParametersReceived(
- const TransportParameters& transport_parameters) const;
-
- // Called for QUIC+TLS versions when we resume cached transport parameters for
- // 0-RTT.
- void OnTransportParametersResumed(
- const TransportParameters& transport_parameters) const;
-
- // Returns true if ack_alarm_ is set.
- bool HasPendingAcks() const;
-
- virtual void OnUserAgentIdKnown(const std::string& user_agent_id);
-
- // Enables Legacy Version Encapsulation using |server_name| as SNI.
- // Can only be set if this is a client connection.
- void EnableLegacyVersionEncapsulation(const std::string& server_name);
-
- bool send_path_response() const { return send_path_response_; }
-
- bool use_path_validator() const { return use_path_validator_; }
-
- // If now is close to idle timeout, returns true and sends a connectivity
- // probing packet to test the connection for liveness. Otherwise, returns
- // false.
- bool MaybeTestLiveness();
-
- // QuicPathValidator::SendDelegate
- // Send PATH_CHALLENGE using the given path information. If |writer| is the
- // default writer, PATH_CHALLENGE can be bundled with other frames, and the
- // containing packet can be buffered if the writer is blocked. Otherwise,
- // PATH_CHALLENGE will be written in an individual packet and it will be
- // dropped if write fails. |data_buffer| will be populated with the payload
- // for future validation.
- // Return false if the connection is closed thus the caller will not continue
- // the validation, otherwise return true.
- bool SendPathChallenge(const QuicPathFrameBuffer& data_buffer,
- const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address,
- const QuicSocketAddress& effective_peer_address,
- QuicPacketWriter* writer) override;
- // If |writer| is the default writer and |peer_address| is the same as
- // peer_address(), return the PTO of this connection. Otherwise, return 3 *
- // kInitialRtt.
- QuicTime GetRetryTimeout(const QuicSocketAddress& peer_address_to_use,
- QuicPacketWriter* writer_to_use) const override;
-
- // Start vaildating the path defined by |context| asynchronously and call the
- // |result_delegate| after validation finishes. If the connection is
- // validating another path, cancel and fail that validation before starting
- // this one.
- void ValidatePath(
- std::unique_ptr<QuicPathValidationContext> context,
- std::unique_ptr<QuicPathValidator::ResultDelegate> result_delegate);
-
- bool can_receive_ack_frequency_frame() const {
- return can_receive_ack_frequency_frame_;
- }
-
- void set_can_receive_ack_frequency_frame() {
- can_receive_ack_frequency_frame_ = true;
- }
-
- bool is_processing_packet() const { return framer_.is_processing_packet(); }
-
- bool HasPendingPathValidation() const;
-
- QuicPathValidationContext* GetPathValidationContext() const;
-
- void CancelPathValidation();
-
- // Returns true if the migration succeeds, otherwise returns false (e.g., no
- // available CIDs, connection disconnected, etc).
- bool MigratePath(const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address,
- QuicPacketWriter* writer,
- bool owns_writer);
-
- // Called to clear the alternative_path_ when path validation failed on the
- // client side.
- void OnPathValidationFailureAtClient();
-
- void SetSourceAddressTokenToSend(absl::string_view token);
-
- void SendPing() {
- SendPingAtLevel(framer().GetEncryptionLevelToSendApplicationData());
- }
-
- // Returns one server connection ID that associates the current session in the
- // session map.
- virtual QuicConnectionId GetOneActiveServerConnectionId() const;
-
- // Returns all server connection IDs that have not been removed from the
- // session map.
- virtual std::vector<QuicConnectionId> GetActiveServerConnectionIds() const;
-
- bool validate_client_address() const { return validate_client_addresses_; }
-
- bool connection_migration_use_new_cid() const {
- return connection_migration_use_new_cid_;
- }
-
- bool count_bytes_on_alternative_path_separately() const {
- return count_bytes_on_alternative_path_separately_;
- }
-
- // Instantiates connection ID manager.
- void CreateConnectionIdManager();
-
- QuicConnectionContext* context() { return &context_; }
- const QuicConnectionContext* context() const { return &context_; }
-
- void set_tracer(std::unique_ptr<QuicConnectionTracer> tracer) {
- context_.tracer.swap(tracer);
- }
-
- void set_bug_listener(std::unique_ptr<QuicBugListener> bug_listener) {
- context_.bug_listener.swap(bug_listener);
- }
-
- absl::optional<QuicWallTime> quic_bug_10511_43_timestamp() const {
- return quic_bug_10511_43_timestamp_;
- }
-
- const std::string& quic_bug_10511_43_error_detail() const {
- return quic_bug_10511_43_error_detail_;
- }
-
- protected:
- // Calls cancel() on all the alarms owned by this connection.
- void CancelAllAlarms();
-
- // Send a packet to the peer, and takes ownership of the packet if the packet
- // cannot be written immediately.
- virtual void SendOrQueuePacket(SerializedPacket packet);
-
- // Called after a packet is received from a new effective peer address and is
- // decrypted. Starts validation of effective peer's address change. Calls
- // OnConnectionMigration as soon as the address changed.
- void StartEffectivePeerMigration(AddressChangeType type);
-
- // Called when a effective peer address migration is validated.
- virtual void OnEffectivePeerMigrationValidated();
-
- // Get the effective peer address from the packet being processed. For proxied
- // connections, effective peer address is the address of the endpoint behind
- // the proxy. For non-proxied connections, effective peer address is the same
- // as peer address.
- //
- // Notes for implementations in subclasses:
- // - If the connection is not proxied, the overridden method should use the
- // base implementation:
- //
- // return QuicConnection::GetEffectivePeerAddressFromCurrentPacket();
- //
- // - If the connection is proxied, the overridden method may return either of
- // the following:
- // a) The address of the endpoint behind the proxy. The address is used to
- // drive effective peer migration.
- // b) An uninitialized address, meaning the effective peer address does not
- // change.
- virtual QuicSocketAddress GetEffectivePeerAddressFromCurrentPacket() const;
-
- // Selects and updates the version of the protocol being used by selecting a
- // version from |available_versions| which is also supported. Returns true if
- // such a version exists, false otherwise.
- bool SelectMutualVersion(const ParsedQuicVersionVector& available_versions);
-
- // Returns the current per-packet options for the connection.
- PerPacketOptions* per_packet_options() { return per_packet_options_; }
-
- AddressChangeType active_effective_peer_migration_type() const {
- return active_effective_peer_migration_type_;
- }
-
- // Sends a connection close packet to the peer and includes an ACK if the ACK
- // is not empty, the |error| is not PACKET_WRITE_ERROR, and it fits.
- // |ietf_error| may optionally be be used to directly specify the wire
- // error code. Otherwise if |ietf_error| is NO_IETF_QUIC_ERROR, the
- // QuicErrorCodeToTransportErrorCode mapping of |error| will be used.
- virtual void SendConnectionClosePacket(QuicErrorCode error,
- QuicIetfTransportErrorCodes ietf_error,
- const std::string& details);
-
- // Returns true if the packet should be discarded and not sent.
- virtual bool ShouldDiscardPacket(EncryptionLevel encryption_level);
-
- // Retransmits packets continuously until blocked by the congestion control.
- // If there are no packets to retransmit, does not do anything.
- void SendProbingRetransmissions();
-
- // Decides whether to send probing retransmissions, and does so if required.
- void MaybeSendProbingRetransmissions();
-
- // Notify various components(Session etc.) that this connection has been
- // migrated.
- virtual void OnConnectionMigration();
-
- // Return whether the packet being processed is a connectivity probing.
- // A packet is a connectivity probing if it is a padded ping packet with self
- // and/or peer address changes.
- bool IsCurrentPacketConnectivityProbing() const;
-
- // Return true iff the writer is blocked, if blocked, call
- // visitor_->OnWriteBlocked() to add the connection into the write blocked
- // list.
- bool HandleWriteBlocked();
-
- // Whether connection enforces anti-amplification limit.
- bool EnforceAntiAmplificationLimit() const;
-
- void AddBytesReceivedBeforeAddressValidation(size_t length) {
- default_path_.bytes_received_before_address_validation += length;
- }
-
- void set_validate_client_addresses(bool value) {
- validate_client_addresses_ = value;
- }
-
- private:
- friend class test::QuicConnectionPeer;
-
- struct QUIC_EXPORT_PRIVATE PendingPathChallenge {
- QuicPathFrameBuffer received_path_challenge;
- QuicSocketAddress peer_address;
- };
-
- struct QUIC_EXPORT_PRIVATE PathState {
- PathState() = default;
-
- PathState(const QuicSocketAddress& alternative_self_address,
- const QuicSocketAddress& alternative_peer_address,
- const QuicConnectionId& client_connection_id,
- const QuicConnectionId& server_connection_id,
- absl::optional<StatelessResetToken> stateless_reset_token)
- : self_address(alternative_self_address),
- peer_address(alternative_peer_address),
- client_connection_id(client_connection_id),
- server_connection_id(server_connection_id),
- stateless_reset_token(stateless_reset_token) {}
-
- PathState(PathState&& other);
-
- PathState& operator=(PathState&& other);
-
- // Reset all the members.
- void Clear();
-
- QuicSocketAddress self_address;
- // The actual peer address behind the proxy if there is any.
- QuicSocketAddress peer_address;
- QuicConnectionId client_connection_id;
- QuicConnectionId server_connection_id;
- absl::optional<StatelessResetToken> stateless_reset_token;
- // True if the peer address has been validated. Address is considered
- // validated when 1) an address token of the peer address is received and
- // validated, or 2) a HANDSHAKE packet has been successfully processed on
- // this path, or 3) a path validation on this path has succeeded.
- bool validated = false;
- // Used by the sever to apply anti-amplification limit after this path
- // becomes the default path if |peer_address| hasn't been validated.
- QuicByteCount bytes_received_before_address_validation = 0;
- QuicByteCount bytes_sent_before_address_validation = 0;
- // Points to the send algorithm on the old default path while connection is
- // validating migrated peer address. Nullptr otherwise.
- std::unique_ptr<SendAlgorithmInterface> send_algorithm;
- absl::optional<RttStats> rtt_stats;
- };
-
- using QueuedPacketList = std::list<SerializedPacket>;
-
- // BufferedPacket stores necessary information (encrypted buffer and self/peer
- // addresses) of those packets which are serialized but failed to send because
- // socket is blocked. From unacked packet map and send algorithm's
- // perspective, buffered packets are treated as sent.
- struct QUIC_EXPORT_PRIVATE BufferedPacket {
- BufferedPacket(const SerializedPacket& packet,
- const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address);
- BufferedPacket(char* encrypted_buffer,
- QuicPacketLength encrypted_length,
- const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address);
- BufferedPacket(const BufferedPacket& other) = delete;
- BufferedPacket(const BufferedPacket&& other) = delete;
-
- ~BufferedPacket();
-
- // encrypted_buffer is owned by buffered packet.
- absl::string_view encrypted_buffer;
- // Self and peer addresses when the packet is serialized.
- const QuicSocketAddress self_address;
- const QuicSocketAddress peer_address;
- };
-
- // ReceivedPacketInfo comprises the received packet information, which can be
- // retrieved before the packet gets successfully decrypted.
- struct QUIC_EXPORT_PRIVATE ReceivedPacketInfo {
- explicit ReceivedPacketInfo(QuicTime receipt_time)
- : received_bytes_counted(false), receipt_time(receipt_time) {}
- ReceivedPacketInfo(const QuicSocketAddress& destination_address,
- const QuicSocketAddress& source_address,
- QuicTime receipt_time)
- : received_bytes_counted(false),
- destination_address(destination_address),
- source_address(source_address),
- receipt_time(receipt_time) {}
-
- bool received_bytes_counted;
- QuicSocketAddress destination_address;
- QuicSocketAddress source_address;
- QuicTime receipt_time;
- };
-
- // UndecrytablePacket comprises a undecryptable packet and related
- // information.
- struct QUIC_EXPORT_PRIVATE UndecryptablePacket {
- UndecryptablePacket(const QuicEncryptedPacket& packet,
- EncryptionLevel encryption_level,
- const ReceivedPacketInfo& packet_info)
- : packet(packet.Clone()),
- encryption_level(encryption_level),
- packet_info(packet_info) {}
-
- std::unique_ptr<QuicEncryptedPacket> packet;
- EncryptionLevel encryption_level;
- ReceivedPacketInfo packet_info;
- };
-
- // Handles the reverse path validation result depending on connection state:
- // whether the connection is validating a migrated peer address or is
- // validating an alternative path.
- class ReversePathValidationResultDelegate
- : public QuicPathValidator::ResultDelegate {
- public:
- ReversePathValidationResultDelegate(
- QuicConnection* connection,
- const QuicSocketAddress& direct_peer_address);
-
- void OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) override;
-
- void OnPathValidationFailure(
- std::unique_ptr<QuicPathValidationContext> context) override;
-
- private:
- QuicConnection* connection_;
- QuicSocketAddress original_direct_peer_address_;
- // TODO(b/205023946) Debug-only fields, to be deprecated after the bug is
- // fixed.
- QuicSocketAddress peer_address_default_path_;
- QuicSocketAddress peer_address_alternative_path_;
- AddressChangeType active_effective_peer_migration_type_;
- };
-
- // A class which sets and clears in_on_retransmission_time_out_ when entering
- // and exiting OnRetransmissionTimeout, respectively.
- class QUIC_EXPORT_PRIVATE ScopedRetransmissionTimeoutIndicator {
- public:
- // |connection| must outlive this indicator.
- explicit ScopedRetransmissionTimeoutIndicator(QuicConnection* connection);
-
- ~ScopedRetransmissionTimeoutIndicator();
-
- private:
- QuicConnection* connection_; // Not owned.
- };
-
- // If peer uses non-empty connection ID, discards any buffered packets on path
- // change in IETF QUIC.
- void MaybeClearQueuedPacketsOnPathChange();
-
- // Notifies the visitor of the close and marks the connection as disconnected.
- // Does not send a connection close frame to the peer. It should only be
- // called by CloseConnection or OnConnectionCloseFrame, OnPublicResetPacket,
- // and OnAuthenticatedIetfStatelessResetPacket.
- // |ietf_error| may optionally be be used to directly specify the wire
- // error code. Otherwise if |ietf_error| is NO_IETF_QUIC_ERROR, the
- // QuicErrorCodeToTransportErrorCode mapping of |error| will be used.
- void TearDownLocalConnectionState(QuicErrorCode error,
- QuicIetfTransportErrorCodes ietf_error,
- const std::string& details,
- ConnectionCloseSource source);
- void TearDownLocalConnectionState(const QuicConnectionCloseFrame& frame,
- ConnectionCloseSource source);
-
- // Replace server connection ID on the client side from retry packet or
- // initial packets with a different source connection ID.
- void ReplaceInitialServerConnectionId(
- const QuicConnectionId& new_server_connection_id);
-
- // Given the server_connection_id find if there is already a corresponding
- // client connection ID used on default/alternative path. If not, find if
- // there is an unused connection ID.
- void FindMatchingOrNewClientConnectionIdOrToken(
- const PathState& default_path, const PathState& alternative_path,
- const QuicConnectionId& server_connection_id,
- QuicConnectionId* client_connection_id,
- absl::optional<StatelessResetToken>* stateless_reset_token);
-
- // Returns true and sets connection IDs if (self_address, peer_address)
- // corresponds to either the default path or alternative path. Returns false
- // otherwise.
- bool FindOnPathConnectionIds(const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address,
- QuicConnectionId* client_connection_id,
- QuicConnectionId* server_connection_id) const;
-
- // Set default_path_ to the new_path_state and update the connection IDs in
- // packet creator accordingly.
- void SetDefaultPathState(PathState new_path_state);
-
- // Returns true if header contains valid server connection ID.
- bool ValidateServerConnectionId(const QuicPacketHeader& header) const;
-
- // Update the connection IDs when client migrates with/without validation.
- // Returns false if required connection ID is not available.
- bool UpdateConnectionIdsOnClientMigration(
- const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address);
-
- // Retire active peer issued connection IDs after they are no longer used on
- // any path.
- void RetirePeerIssuedConnectionIdsNoLongerOnPath();
-
- // When path validation fails, proactively retire peer issued connection IDs
- // no longer used on any path.
- void RetirePeerIssuedConnectionIdsOnPathValidationFailure();
-
- // Writes the given packet to socket, encrypted with packet's
- // encryption_level. Returns true on successful write, and false if the writer
- // was blocked and the write needs to be tried again. Notifies the
- // SentPacketManager when the write is successful and sets
- // retransmittable frames to nullptr.
- // Saves the connection close packet for later transmission, even if the
- // writer is write blocked.
- bool WritePacket(SerializedPacket* packet);
-
- // Enforce AEAD Confidentiality limits by iniating key update or closing
- // connection if too many packets have been encrypted with the current key.
- // Returns true if the connection was closed. Should not be called for
- // termination packets.
- bool MaybeHandleAeadConfidentialityLimits(const SerializedPacket& packet);
-
- // Flush packets buffered in the writer, if any.
- void FlushPackets();
-
- // Make sure a stop waiting we got from our peer is sane.
- // Returns nullptr if the frame is valid or an error string if it was invalid.
- const char* ValidateStopWaitingFrame(
- const QuicStopWaitingFrame& stop_waiting);
-
- // Sends a version negotiation packet to the peer.
- void SendVersionNegotiationPacket(bool ietf_quic, bool has_length_prefix);
-
- // Clears any accumulated frames from the last received packet.
- void ClearLastFrames();
-
- // Deletes and clears any queued packets.
- void ClearQueuedPackets();
-
- // Closes the connection if the sent packet manager is tracking too many
- // outstanding packets.
- void CloseIfTooManyOutstandingSentPackets();
-
- // Writes as many queued packets as possible. The connection must not be
- // blocked when this is called.
- void WriteQueuedPackets();
-
- // Queues |packet| in the hopes that it can be decrypted in the
- // future, when a new key is installed.
- void QueueUndecryptablePacket(const QuicEncryptedPacket& packet,
- EncryptionLevel decryption_level);
-
- // Sends any packets which are a response to the last packet, including both
- // acks and pending writes if an ack opened the congestion window.
- void MaybeSendInResponseToPacket();
-
- // Gets the least unacked packet number, which is the next packet number to be
- // sent if there are no outstanding packets.
- QuicPacketNumber GetLeastUnacked() const;
-
- // Sets the ping alarm to the appropriate value, if any.
- void SetPingAlarm();
-
- // Sets the retransmission alarm based on SentPacketManager.
- void SetRetransmissionAlarm();
-
- // Sets the MTU discovery alarm if necessary.
- // |sent_packet_number| is the recently sent packet number.
- void MaybeSetMtuAlarm(QuicPacketNumber sent_packet_number);
-
- HasRetransmittableData IsRetransmittable(const SerializedPacket& packet);
- bool IsTerminationPacket(const SerializedPacket& packet,
- QuicErrorCode* error_code);
-
- // Set the size of the packet we are targeting while doing path MTU discovery.
- void SetMtuDiscoveryTarget(QuicByteCount target);
-
- // Returns |suggested_max_packet_size| clamped to any limits set by the
- // underlying writer, connection, or protocol.
- QuicByteCount GetLimitedMaxPacketSize(
- QuicByteCount suggested_max_packet_size);
-
- // Do any work which logically would be done in OnPacket but can not be
- // safely done until the packet is validated. Returns true if packet can be
- // handled, false otherwise.
- bool ProcessValidatedPacket(const QuicPacketHeader& header);
-
- // Returns true if received |packet_number| can be processed. Please note,
- // this is called after packet got decrypted successfully.
- bool ValidateReceivedPacketNumber(QuicPacketNumber packet_number);
-
- // Consider receiving crypto frame on non crypto stream as memory corruption.
- bool MaybeConsiderAsMemoryCorruption(const QuicStreamFrame& frame);
-
- // Check if the connection has no outstanding data to send and notify
- // congestion controller if it is the case.
- void CheckIfApplicationLimited();
-
- // Sets |current_packet_content_| to |type| if applicable. And
- // starts effective peer migration if current packet is confirmed not a
- // connectivity probe and |current_effective_peer_migration_type_| indicates
- // effective peer address change.
- // Returns true if connection is still alive.
- ABSL_MUST_USE_RESULT bool UpdatePacketContent(QuicFrameType type);
-
- // Called when last received ack frame has been processed.
- // |send_stop_waiting| indicates whether a stop waiting needs to be sent.
- // |acked_new_packet| is true if a previously-unacked packet was acked.
- void PostProcessAfterAckFrame(bool send_stop_waiting, bool acked_new_packet);
-
- // Updates the release time into the future.
- void UpdateReleaseTimeIntoFuture();
-
- // Sends generic path probe packet to the peer. If we are not IETF QUIC, will
- // always send a padded ping, regardless of whether this is a request or not.
- // TODO(danzh): remove |is_response| after deprecating
- // --gfe2_reloadable_flag_quic_send_path_response.
- bool SendGenericPathProbePacket(QuicPacketWriter* probing_writer,
- const QuicSocketAddress& peer_address,
- bool is_response);
-
- // Called when an ACK is about to send. Resets ACK related internal states,
- // e.g., cancels ack_alarm_, resets
- // num_retransmittable_packets_received_since_last_ack_sent_ etc.
- void ResetAckStates();
-
- // Returns true if the ACK frame should be bundled with ACK-eliciting frame.
- bool ShouldBundleRetransmittableFrameWithAck() const;
-
- void PopulateStopWaitingFrame(QuicStopWaitingFrame* stop_waiting);
-
- // Enables multiple packet number spaces support based on handshake protocol
- // and flags.
- void MaybeEnableMultiplePacketNumberSpacesSupport();
-
- // Called to update ACK timeout when an retransmittable frame has been parsed.
- void MaybeUpdateAckTimeout();
-
- // Tries to fill coalesced packet with data of higher packet space.
- void MaybeCoalescePacketOfHigherSpace();
-
- // Serialize and send coalesced_packet. Returns false if serialization fails
- // or the write causes errors, otherwise, returns true.
- bool FlushCoalescedPacket();
-
- // Returns the encryption level the connection close packet should be sent at,
- // which is the highest encryption level that peer can guarantee to process.
- EncryptionLevel GetConnectionCloseEncryptionLevel() const;
-
- // Called after an ACK frame is successfully processed to update largest
- // received packet number which contains an ACK frame.
- void SetLargestReceivedPacketWithAck(QuicPacketNumber new_value);
-
- // Called when new packets have been acknowledged or old keys have been
- // discarded.
- void OnForwardProgressMade();
-
- // Returns largest received packet number which contains an ACK frame.
- QuicPacketNumber GetLargestReceivedPacketWithAck() const;
-
- // Returns the largest packet number that has been sent.
- QuicPacketNumber GetLargestSentPacket() const;
-
- // Returns the largest sent packet number that has been ACKed by peer.
- QuicPacketNumber GetLargestAckedPacket() const;
-
- // Whether connection is limited by amplification factor.
- bool LimitedByAmplificationFactor() const;
-
- // Called before sending a packet to get packet send time and to set the
- // release time delay in |per_packet_options_|. Return the time when the
- // packet is scheduled to be released(a.k.a send time), which is NOW + delay.
- // Returns Now() and does not update release time delay if
- // |supports_release_time_| is false.
- QuicTime CalculatePacketSentTime();
-
- // If we have a previously validate MTU value, e.g. due to a write error,
- // revert to it and disable MTU discovery.
- // Return true iff we reverted to a previously validate MTU.
- bool MaybeRevertToPreviousMtu();
-
- QuicTime GetPathMtuReductionDeadline() const;
-
- // Returns path degrading deadline. QuicTime::Zero() means no path degrading
- // detection is needed.
- QuicTime GetPathDegradingDeadline() const;
-
- // Returns true if path degrading should be detected.
- bool ShouldDetectPathDegrading() const;
-
- // Returns network blackhole deadline. QuicTime::Zero() means no blackhole
- // detection is needed.
- QuicTime GetNetworkBlackholeDeadline() const;
-
- // Returns true if network blackhole should be detected.
- bool ShouldDetectBlackhole() const;
-
- // Returns retransmission deadline.
- QuicTime GetRetransmissionDeadline() const;
-
- // Validate connection IDs used during the handshake. Closes the connection
- // on validation failure.
- bool ValidateConfigConnectionIds(const QuicConfig& config);
-
- // Called when ACK alarm goes off. Try to bundle crypto data with ACKs.
- void MaybeBundleCryptoDataWithAcks();
-
- // Returns true if an undecryptable packet of |decryption_level| should be
- // buffered (such that connection can try to decrypt it later).
- bool ShouldEnqueueUnDecryptablePacket(EncryptionLevel decryption_level,
- bool has_decryption_key) const;
-
- // Returns string which contains undecryptable packets information.
- std::string UndecryptablePacketsInfo() const;
-
- // Sets the max packet length on the packet creator if needed.
- void MaybeUpdatePacketCreatorMaxPacketLengthAndPadding();
-
- // Sets internal state to enable or disable Legacy Version Encapsulation.
- void MaybeActivateLegacyVersionEncapsulation();
- void MaybeDisactivateLegacyVersionEncapsulation();
-
- // For Google Quic, if the current packet is connectivity probing packet, call
- // session OnPacketReceived() which eventually sends connectivity probing
- // response on server side. And no-op on client side. And for both Google Quic
- // and IETF Quic, start migration if the current packet is a non-probing
- // packet.
- // TODO(danzh) rename to MaybeRespondToPeerMigration() when Google Quic is
- // deprecated.
- void MaybeRespondToConnectivityProbingOrMigration();
-
- // Called in IETF QUIC. Start peer migration if a non-probing frame is
- // received and the current packet number is largest received so far.
- void MaybeStartIetfPeerMigration();
-
- // Send PATH_RESPONSE to the given peer address.
- bool SendPathResponse(const QuicPathFrameBuffer& data_buffer,
- const QuicSocketAddress& peer_address_to_send,
- const QuicSocketAddress& effective_peer_address);
-
- // Update both connection's and packet creator's peer address.
- void UpdatePeerAddress(QuicSocketAddress peer_address);
-
- // Send PING at encryption level.
- void SendPingAtLevel(EncryptionLevel level);
-
- // Write the given packet with |self_address| and |peer_address| using
- // |writer|.
- bool WritePacketUsingWriter(std::unique_ptr<SerializedPacket> packet,
- QuicPacketWriter* writer,
- const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address,
- bool measure_rtt);
-
- // Increment bytes sent/received on the alternative path if the current packet
- // is sent/received on that path.
- void MaybeUpdateBytesSentToAlternativeAddress(
- const QuicSocketAddress& peer_address,
- QuicByteCount sent_packet_size);
- void MaybeUpdateBytesReceivedFromAlternativeAddress(
- QuicByteCount received_packet_size);
-
- // TODO(danzh) pass in PathState of the incoming packet or the packet sent
- // once PathState is used in packet creator. Return true if the given self
- // address and peer address is the same as the self address and peer address
- // of the default path.
- bool IsDefaultPath(const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address) const;
-
- // Return true if the |self_address| and |peer_address| is the same as the
- // self address and peer address of the alternative path.
- bool IsAlternativePath(const QuicSocketAddress& self_address,
- const QuicSocketAddress& peer_address) const;
-
- // Restore connection default path and congestion control state to the last
- // validated path and its state. Called after fail to validate peer address
- // upon detecting a peer migration.
- void RestoreToLastValidatedPath(
- QuicSocketAddress original_direct_peer_address);
-
- // Return true if the current incoming packet is from a peer address that is
- // validated.
- bool IsReceivedPeerAddressValidated() const;
-
- // Called after receiving PATH_CHALLENGE. Update packet content and
- // alternative path state if the current packet is from a non-default path.
- // Return true if framer should continue processing the packet.
- bool OnPathChallengeFrameInternal(const QuicPathChallengeFrame& frame);
-
- virtual std::unique_ptr<QuicSelfIssuedConnectionIdManager>
- MakeSelfIssuedConnectionIdManager();
-
- // Called on peer IP change or restoring to previous address to reset
- // congestion window, RTT stats, retransmission timer, etc. Only used in IETF
- // QUIC.
- std::unique_ptr<SendAlgorithmInterface> OnPeerIpAddressChanged();
-
- // Process NewConnectionIdFrame either sent from peer or synsthesized from
- // preferred_address transport parameter.
- bool OnNewConnectionIdFrameInner(const QuicNewConnectionIdFrame& frame);
-
- // Called to patch missing client connection ID on default/alternative paths
- // when a new client connection ID is received.
- void OnClientConnectionIdAvailable();
-
- // Returns true if connection needs to set retransmission alarm after a packet
- // gets sent.
- bool ShouldSetRetransmissionAlarmOnPacketSent(bool in_flight,
- EncryptionLevel level) const;
-
- QuicConnectionContext context_;
-
- QuicFramer framer_;
-
- // Contents received in the current packet, especially used to identify
- // whether the current packet is a padded PING packet.
- PacketContent current_packet_content_;
- // Set to true as soon as the packet currently being processed has been
- // detected as a connectivity probing.
- // Always false outside the context of ProcessUdpPacket().
- bool is_current_packet_connectivity_probing_;
-
- bool has_path_challenge_in_current_packet_;
-
- // Caches the current effective peer migration type if a effective peer
- // migration might be initiated. As soon as the current packet is confirmed
- // not a connectivity probe, effective peer migration will start.
- AddressChangeType current_effective_peer_migration_type_;
- QuicConnectionHelperInterface* helper_; // Not owned.
- QuicAlarmFactory* alarm_factory_; // Not owned.
- PerPacketOptions* per_packet_options_; // Not owned.
- QuicPacketWriter* writer_; // Owned or not depending on |owns_writer_|.
- bool owns_writer_;
- // Encryption level for new packets. Should only be changed via
- // SetDefaultEncryptionLevel().
- EncryptionLevel encryption_level_;
- const QuicClock* clock_;
- QuicRandom* random_generator_;
-
- // On the server, the connection ID is set when receiving the first packet.
- // This variable ensures we only set it this way once.
- bool client_connection_id_is_set_;
-
- // Whether we've already replaced our server connection ID due to receiving an
- // INITIAL packet with a different source connection ID. Only used on client.
- bool server_connection_id_replaced_by_initial_ = false;
- // Address on the last successfully processed packet received from the
- // direct peer.
-
- // Other than initialization, do not modify it directly, use
- // UpdatePeerAddress() instead.
- QuicSocketAddress direct_peer_address_;
- // The default path on which the endpoint sends non-probing packets.
- // The send algorithm and RTT stats of this path are stored in
- // |sent_packet_manager_| instead of in this object.
- PathState default_path_;
-
- // Records change type when the effective peer initiates migration to a new
- // address. Reset to NO_CHANGE after effective peer migration is validated.
- AddressChangeType active_effective_peer_migration_type_;
-
- // Records highest sent packet number when effective peer migration is
- // started.
- QuicPacketNumber highest_packet_sent_before_effective_peer_migration_;
-
- // True if Key Update is supported on this connection.
- bool support_key_update_for_connection_;
-
- // Tracks the lowest packet sent in the current key phase. Will be
- // uninitialized before the first one-RTT packet has been sent or after a
- // key update but before the first packet has been sent.
- QuicPacketNumber lowest_packet_sent_in_current_key_phase_;
-
- // True if the last packet has gotten far enough in the framer to be
- // decrypted.
- bool last_packet_decrypted_;
- QuicByteCount last_size_; // Size of the last received packet.
- // TODO(rch): remove this when b/27221014 is fixed.
- const char* current_packet_data_; // UDP payload of packet currently being
- // parsed or nullptr.
- EncryptionLevel last_decrypted_packet_level_;
- QuicPacketHeader last_header_;
- bool should_last_packet_instigate_acks_;
-
- // Track some peer state so we can do less bookkeeping
- // Largest sequence sent by the peer which had an ack frame (latest ack info).
- // Do not read or write directly, use GetLargestReceivedPacketWithAck() and
- // SetLargestReceivedPacketWithAck() instead.
- QuicPacketNumber largest_seen_packet_with_ack_;
- // Largest packet number sent by the peer which had an ACK frame per packet
- // number space. Only used when this connection supports multiple packet
- // number spaces.
- QuicPacketNumber largest_seen_packets_with_ack_[NUM_PACKET_NUMBER_SPACES];
-
- // Largest packet number sent by the peer which had a stop waiting frame.
- QuicPacketNumber largest_seen_packet_with_stop_waiting_;
-
- // Collection of packets which were received before encryption was
- // established, but which could not be decrypted. We buffer these on
- // the assumption that they could not be processed because they were
- // sent with the INITIAL encryption and the CHLO message was lost.
- std::deque<UndecryptablePacket> undecryptable_packets_;
-
- // Collection of coalesced packets which were received while processing
- // the current packet.
- quiche::QuicheCircularDeque<std::unique_ptr<QuicEncryptedPacket>>
- received_coalesced_packets_;
-
- // Maximum number of undecryptable packets the connection will store.
- size_t max_undecryptable_packets_;
-
- // Maximum number of tracked packets.
- QuicPacketCount max_tracked_packets_;
-
- // Contains the connection close packets if the connection has been closed.
- std::unique_ptr<std::vector<std::unique_ptr<QuicEncryptedPacket>>>
- termination_packets_;
-
- // Determines whether or not a connection close packet is sent to the peer
- // after idle timeout due to lack of network activity. During the handshake,
- // a connection close packet is sent, but not after.
- ConnectionCloseBehavior idle_timeout_connection_close_behavior_;
-
- // When > 0, close the QUIC connection after this number of RTOs.
- size_t num_rtos_for_blackhole_detection_;
-
- // Statistics for this session.
- QuicConnectionStats stats_;
-
- UberReceivedPacketManager uber_received_packet_manager_;
-
- // Indicates how many consecutive times an ack has arrived which indicates
- // the peer needs to stop waiting for some packets.
- // TODO(fayang): remove this when deprecating Q043.
- int stop_waiting_count_;
-
- // Indicates the retransmission alarm needs to be set.
- bool pending_retransmission_alarm_;
-
- // If true, defer sending data in response to received packets to the
- // SendAlarm.
- bool defer_send_in_response_to_packets_;
-
- // The timeout for PING.
- QuicTime::Delta ping_timeout_;
-
- // Initial timeout for how long the wire can have no retransmittable packets.
- QuicTime::Delta initial_retransmittable_on_wire_timeout_;
-
- // Indicates how many retransmittable-on-wire pings have been emitted without
- // receiving any new data in between.
- int consecutive_retransmittable_on_wire_ping_count_;
-
- // Indicates how many retransmittable-on-wire pings have been emitted.
- int retransmittable_on_wire_ping_count_;
-
- // Arena to store class implementations within the QuicConnection.
- QuicConnectionArena arena_;
-
- // An alarm that fires when an ACK should be sent to the peer.
- QuicArenaScopedPtr<QuicAlarm> ack_alarm_;
- // An alarm that fires when a packet needs to be retransmitted.
- QuicArenaScopedPtr<QuicAlarm> retransmission_alarm_;
- // An alarm that is scheduled when the SentPacketManager requires a delay
- // before sending packets and fires when the packet may be sent.
- QuicArenaScopedPtr<QuicAlarm> send_alarm_;
- // An alarm that fires when a ping should be sent.
- QuicArenaScopedPtr<QuicAlarm> ping_alarm_;
- // An alarm that fires when an MTU probe should be sent.
- QuicArenaScopedPtr<QuicAlarm> mtu_discovery_alarm_;
- // An alarm that fires to process undecryptable packets when new decyrption
- // keys are available.
- QuicArenaScopedPtr<QuicAlarm> process_undecryptable_packets_alarm_;
- // An alarm that fires to discard keys for the previous key phase some time
- // after a key update has completed.
- QuicArenaScopedPtr<QuicAlarm> discard_previous_one_rtt_keys_alarm_;
- // An alarm that fires to discard 0-RTT decryption keys some time after the
- // first 1-RTT packet has been decrypted. Only used on server connections with
- // TLS handshaker.
- QuicArenaScopedPtr<QuicAlarm> discard_zero_rtt_decryption_keys_alarm_;
- // Neither visitor is owned by this class.
- QuicConnectionVisitorInterface* visitor_;
- QuicConnectionDebugVisitor* debug_visitor_;
-
- QuicPacketCreator packet_creator_;
-
- // Information about the last received QUIC packet, which may not have been
- // successfully decrypted and processed.
- ReceivedPacketInfo last_received_packet_info_;
-
- // Sent packet manager which tracks the status of packets sent by this
- // connection and contains the send and receive algorithms to determine when
- // to send packets.
- QuicSentPacketManager sent_packet_manager_;
-
- // Indicates whether connection version has been negotiated.
- // Always true for server connections.
- bool version_negotiated_;
-
- // Tracks if the connection was created by the server or the client.
- Perspective perspective_;
-
- // True by default. False if we've received or sent an explicit connection
- // close.
- bool connected_;
-
- // Destination connection ID of the last received packet. If this ID is the
- // original server connection ID chosen by client and server replaces it with
- // a different ID, last_packet_destination_connection_id_ is set to the
- // replacement connection ID on the server side.
- QuicConnectionId last_packet_destination_connection_id_;
-
- // Set to false if the connection should not send truncated connection IDs to
- // the peer, even if the peer supports it.
- bool can_truncate_connection_ids_;
-
- // If non-empty this contains the set of versions received in a
- // version negotiation packet.
- ParsedQuicVersionVector server_supported_versions_;
-
- // The number of MTU probes already sent.
- size_t mtu_probe_count_;
-
- // The value of |long_term_mtu_| prior to the last successful MTU increase.
- // 0 means either
- // - MTU discovery has never been enabled, or
- // - MTU discovery has been enabled, but the connection got a packet write
- // error with a new (successfully probed) MTU, so it reverted
- // |long_term_mtu_| to the value before the last increase.
- QuicPacketLength previous_validated_mtu_;
- // The value of the MTU regularly used by the connection. This is different
- // from the value returned by max_packet_size(), as max_packet_size() returns
- // the value of the MTU as currently used by the serializer, so if
- // serialization of an MTU probe is in progress, those two values will be
- // different.
- QuicByteCount long_term_mtu_;
-
- // The maximum UDP payload size that our peer has advertised support for.
- // Defaults to kDefaultMaxPacketSizeTransportParam until received from peer.
- QuicByteCount peer_max_packet_size_;
-
- // The size of the largest packet received from peer.
- QuicByteCount largest_received_packet_size_;
-
- // Indicates whether a write error is encountered currently. This is used to
- // avoid infinite write errors.
- bool write_error_occurred_;
-
- // Indicates not to send or process stop waiting frames.
- bool no_stop_waiting_frames_;
-
- // Consecutive number of sent packets which have no retransmittable frames.
- size_t consecutive_num_packets_with_no_retransmittable_frames_;
-
- // After this many packets sent without retransmittable frames, an artificial
- // retransmittable frame(a WINDOW_UPDATE) will be created to solicit an ack
- // from the peer. Default to kMaxConsecutiveNonRetransmittablePackets.
- size_t max_consecutive_num_packets_with_no_retransmittable_frames_;
-
- // If true, bundle an ack-eliciting frame with an ACK if the PTO or RTO alarm
- // have previously fired.
- bool bundle_retransmittable_with_pto_ack_;
-
- // If true, the connection will fill up the pipe with extra data whenever the
- // congestion controller needs it in order to make a bandwidth estimate. This
- // is useful if the application pesistently underutilizes the link, but still
- // relies on having a reasonable bandwidth estimate from the connection, e.g.
- // for real time applications.
- bool fill_up_link_during_probing_;
-
- // If true, the probing retransmission will not be started again. This is
- // used to safeguard against an accidental tail recursion in probing
- // retransmission code.
- bool probing_retransmission_pending_;
-
- // Id of latest sent control frame. 0 if no control frame has been sent.
- QuicControlFrameId last_control_frame_id_;
-
- // True if the peer is unreachable on the current path.
- bool is_path_degrading_;
-
- // True if an ack frame is being processed.
- bool processing_ack_frame_;
-
- // True if the writer supports release timestamp.
- bool supports_release_time_;
-
- std::unique_ptr<QuicPeerIssuedConnectionIdManager> peer_issued_cid_manager_;
- std::unique_ptr<QuicSelfIssuedConnectionIdManager> self_issued_cid_manager_;
-
- // Time this connection can release packets into the future.
- QuicTime::Delta release_time_into_future_;
-
- // Payload of most recently transmitted IETF QUIC connectivity
- // probe packet (the PATH_CHALLENGE payload). This implementation transmits
- // only one PATH_CHALLENGE per connectivity probe, so only one
- // QuicPathFrameBuffer is needed.
- std::unique_ptr<QuicPathFrameBuffer> transmitted_connectivity_probe_payload_;
-
- // Payloads that were received in the most recent probe. This needs to be a
- // Deque because the peer might no be using this implementation, and others
- // might send a packet with more than one PATH_CHALLENGE, so all need to be
- // saved and responded to.
- // TODO(danzh) deprecate this field when deprecating
- // --quic_send_path_response.
- quiche::QuicheCircularDeque<QuicPathFrameBuffer>
- received_path_challenge_payloads_;
-
- // When we receive a RETRY packet or some INITIAL packets, we replace
- // |server_connection_id_| with the value from that packet and save off the
- // original value of |server_connection_id_| into
- // |original_destination_connection_id_| for validation.
- absl::optional<QuicConnectionId> original_destination_connection_id_;
-
- // The connection ID that replaces original_destination_connection_id_.
- QuicConnectionId original_destination_connection_id_replacement_;
-
- // After we receive a RETRY packet, |retry_source_connection_id_| contains
- // the source connection ID from that packet.
- absl::optional<QuicConnectionId> retry_source_connection_id_;
-
- // Used to store content of packets which cannot be sent because of write
- // blocked. Packets' encrypted buffers are copied and owned by
- // buffered_packets_. From unacked_packet_map (and congestion control)'s
- // perspective, those packets are considered sent.
- std::list<BufferedPacket> buffered_packets_;
-
- // Used to coalesce packets of different encryption level into the same UDP
- // datagram. Connection stops trying to coalesce packets if a forward secure
- // packet gets acknowledged.
- QuicCoalescedPacket coalesced_packet_;
-
- QuicConnectionMtuDiscoverer mtu_discoverer_;
-
- QuicNetworkBlackholeDetector blackhole_detector_;
-
- QuicIdleNetworkDetector idle_network_detector_;
-
- bool blackhole_detection_disabled_ = false;
-
- const bool default_enable_5rto_blackhole_detection_ =
- GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2);
-
- // Whether the Legacy Version Encapsulation feature is enabled.
- bool legacy_version_encapsulation_enabled_ = false;
- // Whether we are in the middle of sending a packet using Legacy Version
- // Encapsulation.
- bool legacy_version_encapsulation_in_progress_ = false;
- // SNI to send when using Legacy Version Encapsulation.
- std::string legacy_version_encapsulation_sni_;
- // True if next packet is intended to consume remaining space in the
- // coalescer.
- bool fill_coalesced_packet_ = false;
-
- size_t anti_amplification_factor_ =
- GetQuicFlag(FLAGS_quic_anti_amplification_factor);
-
- // latch --gfe2_reloadable_flag_quic_send_path_response.
- bool send_path_response_ = GetQuicReloadableFlag(quic_send_path_response2);
-
- bool use_path_validator_ =
- send_path_response_ &&
- GetQuicReloadableFlag(quic_pass_path_response_to_validator);
-
- // True if AckFrequencyFrame is supported.
- bool can_receive_ack_frequency_frame_ = false;
-
- // Indicate whether coalescing is done.
- bool coalescing_done_ = false;
-
- // Indicate whether any ENCRYPTION_HANDSHAKE packet has been sent.
- bool handshake_packet_sent_ = false;
-
- // Indicate whether to send an AckFrequencyFrame upon handshake completion.
- // The AckFrequencyFrame sent will updates client's max_ack_delay, which if
- // chosen properly can reduce the CPU and bandwidth usage for ACK frames.
- bool send_ack_frequency_on_handshake_completion_ = false;
-
- // Indicate whether AckFrequency frame has been sent.
- bool ack_frequency_sent_ = false;
-
- // True if a 0-RTT decrypter was or is installed at some point in the
- // connection's lifetime.
- bool had_zero_rtt_decrypter_ = false;
-
- // True after the first 1-RTT packet has successfully decrypted.
- bool have_decrypted_first_one_rtt_packet_ = false;
-
- // True if we are currently processing OnRetransmissionTimeout.
- bool in_on_retransmission_time_out_ = false;
-
- QuicPathValidator path_validator_;
-
- // Stores information of a path which maybe used as default path in the
- // future. On the client side, it gets created when the client starts
- // validating a new path and gets cleared once it becomes the default path or
- // the path validation fails or replaced by a newer path of interest. On the
- // server side, alternative_path gets created when server: 1) receives
- // PATH_CHALLENGE on non-default path, or 2) switches to a not yet validated
- // default path such that it needs to store the previous validated default
- // path.
- // Note that if alternative_path_ stores a validated path information (case
- // 2), do not override it on receiving PATH_CHALLENGE (case 1).
- PathState alternative_path_;
-
- // This field is used to debug b/177312785.
- QuicFrameType most_recent_frame_type_;
-
- bool count_bytes_on_alternative_path_separately_ =
- GetQuicReloadableFlag(quic_count_bytes_on_alternative_path_seperately);
-
- // If true, upon seeing a new client address, validate the client address.
- bool validate_client_addresses_ = false;
-
- // Indicates whether we should proactively validate peer address on a
- // PATH_CHALLENGE received.
- bool should_proactively_validate_peer_address_on_path_challenge_ = false;
-
- // Enable this via reloadable flag once this feature is complete.
- bool connection_migration_use_new_cid_ = false;
-
- const bool reset_per_packet_state_for_undecryptable_packets_ =
- GetQuicReloadableFlag(
- quic_reset_per_packet_state_for_undecryptable_packets);
-
- // TODO(b/205023946) Debug-only fields, to be deprecated after the bug is
- // fixed.
- absl::optional<QuicWallTime> quic_bug_10511_43_timestamp_;
- std::string quic_bug_10511_43_error_detail_;
-};
-
-} // namespace quic
-
-#endif // QUICHE_QUIC_CORE_QUIC_CONNECTION_H_