Rename QuicConnection::AlternativePathState and refactor QuicConnection to store the default path information into a path object.
PiperOrigin-RevId: 357989368
Change-Id: I44008e203940e78cc2ca049caf5d8be4593de10b
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 4d16aa4..f351299 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -278,9 +278,9 @@
server_connection_id_(server_connection_id),
client_connection_id_(EmptyQuicConnectionId()),
client_connection_id_is_set_(false),
- self_address_(initial_self_address),
peer_address_(initial_peer_address),
direct_peer_address_(initial_peer_address),
+ default_path_(initial_self_address, QuicSocketAddress()),
active_effective_peer_migration_type_(NO_CHANGE),
support_key_update_for_connection_(false),
last_packet_decrypted_(false),
@@ -357,9 +357,6 @@
processing_ack_frame_(false),
supports_release_time_(false),
release_time_into_future_(QuicTime::Delta::Zero()),
- bytes_received_before_address_validation_(0),
- bytes_sent_before_address_validation_(0),
- address_validated_(false),
blackhole_detector_(this, &arena_, alarm_factory_),
idle_network_detector_(this,
clock_->ApproximateNow(),
@@ -376,7 +373,7 @@
QUIC_BUG_IF(!start_peer_migration_earlier_ && send_path_response_);
QUICHE_DCHECK(perspective_ == Perspective::IS_CLIENT ||
- self_address_.IsInitialized());
+ default_path_.self_address.IsInitialized());
if (use_encryption_level_context_) {
QUIC_RELOADABLE_FLAG_COUNT(quic_use_encryption_level_context);
@@ -1098,7 +1095,8 @@
// probing, restart the path degrading and blackhole detection.
OnForwardProgressMade();
}
- if (IsAlternativePath(self_address_, effective_peer_address_)) {
+ if (IsAlternativePath(default_path_.self_address,
+ default_path_.peer_address)) {
// Reset alternative path state even if it is still under validation.
alternative_path_.Clear();
}
@@ -1154,7 +1152,7 @@
last_decrypted_packet_level_ == ENCRYPTION_FORWARD_SECURE)) {
// Address is validated by successfully processing a HANDSHAKE or 1-RTT
// packet.
- address_validated_ = true;
+ default_path_.validated = true;
stats_.address_validated_via_decrypting_packet = true;
}
idle_network_detector_.OnPacketReceived(time_of_last_received_packet_);
@@ -1197,7 +1195,7 @@
// TODO(fayang): only change peer addresses in application data packet
// number space.
UpdatePeerAddress(last_packet_source_address_);
- effective_peer_address_ = GetEffectivePeerAddressFromCurrentPacket();
+ default_path_.peer_address = GetEffectivePeerAddressFromCurrentPacket();
}
} else {
// At server, remember the address change type of effective_peer_address
@@ -1213,12 +1211,12 @@
// even if there is an active migration underway.
current_effective_peer_migration_type_ =
QuicUtils::DetermineAddressChangeType(
- effective_peer_address_,
+ default_path_.peer_address,
GetEffectivePeerAddressFromCurrentPacket());
QUIC_DLOG_IF(INFO, current_effective_peer_migration_type_ != NO_CHANGE)
<< ENDPOINT << "Effective peer's ip:port changed from "
- << effective_peer_address_.ToString() << " to "
+ << default_path_.peer_address.ToString() << " to "
<< GetEffectivePeerAddressFromCurrentPacket().ToString()
<< ", active_effective_peer_migration_type is "
<< active_effective_peer_migration_type_;
@@ -1244,7 +1242,7 @@
visitor_->ValidateToken(header.retry_token)) {
QUIC_DLOG(INFO) << ENDPOINT << "Address validated via token.";
QUIC_CODE_COUNT(quic_address_validated_via_token);
- address_validated_ = true;
+ default_path_.validated = true;
stats_.address_validated_via_token = true;
}
}
@@ -2498,38 +2496,38 @@
last_packet_destination_address_ = self_address;
last_packet_source_address_ = peer_address;
- if (!self_address_.IsInitialized()) {
- self_address_ = last_packet_destination_address_;
+ if (!default_path_.self_address.IsInitialized()) {
+ default_path_.self_address = last_packet_destination_address_;
}
if (!direct_peer_address_.IsInitialized()) {
UpdatePeerAddress(last_packet_source_address_);
}
- if (!effective_peer_address_.IsInitialized()) {
+ if (!default_path_.peer_address.IsInitialized()) {
const QuicSocketAddress effective_peer_addr =
GetEffectivePeerAddressFromCurrentPacket();
// effective_peer_address_ must be initialized at the beginning of the
// first packet processed(here). If effective_peer_addr is uninitialized,
// just set effective_peer_address_ to the direct peer address.
- effective_peer_address_ = effective_peer_addr.IsInitialized()
- ? effective_peer_addr
- : direct_peer_address_;
+ default_path_.peer_address = effective_peer_addr.IsInitialized()
+ ? effective_peer_addr
+ : direct_peer_address_;
}
stats_.bytes_received += packet.length();
++stats_.packets_received;
if (!count_bytes_on_alternative_path_separately_) {
if (EnforceAntiAmplificationLimit()) {
- bytes_received_before_address_validation_ += last_size_;
+ default_path_.bytes_received_before_address_validation += last_size_;
}
} else if (IsDefaultPath(last_packet_destination_address_,
last_packet_source_address_) &&
EnforceAntiAmplificationLimit()) {
QUIC_CODE_COUNT_N(quic_count_bytes_on_alternative_path_seperately, 1, 5);
current_incoming_packet_received_bytes_counted_ = true;
- bytes_received_before_address_validation_ += last_size_;
+ default_path_.bytes_received_before_address_validation += last_size_;
}
// Ensure the time coming from the packet reader is within 2 minutes of now.
@@ -2672,12 +2670,14 @@
}
bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) {
- if (perspective_ == Perspective::IS_SERVER && self_address_.IsInitialized() &&
+ if (perspective_ == Perspective::IS_SERVER &&
+ default_path_.self_address.IsInitialized() &&
last_packet_destination_address_.IsInitialized() &&
- self_address_ != last_packet_destination_address_) {
+ default_path_.self_address != last_packet_destination_address_) {
// Allow change between pure IPv4 and equivalent mapped IPv4 address.
- if (self_address_.port() != last_packet_destination_address_.port() ||
- self_address_.host().Normalized() !=
+ if (default_path_.self_address.port() !=
+ last_packet_destination_address_.port() ||
+ default_path_.self_address.host().Normalized() !=
last_packet_destination_address_.host().Normalized()) {
if (!visitor_->AllowSelfAddressChange()) {
CloseConnection(
@@ -2687,7 +2687,7 @@
return false;
}
}
- self_address_ = last_packet_destination_address_;
+ default_path_.self_address = last_packet_destination_address_;
}
if (PacketCanReplaceConnectionId(header, perspective_) &&
@@ -2841,7 +2841,8 @@
return CanWrite(retransmittable);
}
QUIC_CODE_COUNT_N(quic_count_bytes_on_alternative_path_seperately, 4, 5);
- if (IsDefaultPath(self_address_, packet_creator_.peer_address())) {
+ if (IsDefaultPath(default_path_.self_address,
+ packet_creator_.peer_address())) {
return CanWrite(retransmittable);
}
// This is checking on the alternative path with a different peer address. The
@@ -3239,14 +3240,14 @@
if (!count_bytes_on_alternative_path_separately_) {
if (EnforceAntiAmplificationLimit()) {
// Include bytes sent even if they are not in flight.
- bytes_sent_before_address_validation_ += encrypted_length;
+ default_path_.bytes_sent_before_address_validation += encrypted_length;
}
} else {
QUIC_CODE_COUNT_N(quic_count_bytes_on_alternative_path_seperately, 2, 5);
- if (IsDefaultPath(self_address_, send_to_address)) {
+ if (IsDefaultPath(default_path_.self_address, send_to_address)) {
if (EnforceAntiAmplificationLimit()) {
// Include bytes sent even if they are not in flight.
- bytes_sent_before_address_validation_ += encrypted_length;
+ default_path_.bytes_sent_before_address_validation += encrypted_length;
}
} else {
MaybeUpdateBytesSentToAlternativeAddress(send_to_address,
@@ -4728,14 +4729,14 @@
return;
}
QUIC_DLOG(INFO) << ENDPOINT << "Effective peer's ip:port changed from "
- << effective_peer_address_.ToString() << " to "
+ << default_path_.peer_address.ToString() << " to "
<< GetEffectivePeerAddressFromCurrentPacket().ToString()
<< ", address change type is " << type
<< ", migrating connection.";
highest_packet_sent_before_effective_peer_migration_ =
sent_packet_manager_.GetLargestSentPacket();
- effective_peer_address_ = GetEffectivePeerAddressFromCurrentPacket();
+ default_path_.peer_address = GetEffectivePeerAddressFromCurrentPacket();
active_effective_peer_migration_type_ = type;
// TODO(wub): Move these calls to OnEffectivePeerMigrationValidated.
@@ -4865,8 +4866,8 @@
<< "The peer is probing a new path with effective peer address "
<< current_effective_peer_address << ", self address "
<< last_packet_destination_address_;
- alternative_path_ = AlternativePathState(last_packet_destination_address_,
- current_effective_peer_address);
+ alternative_path_ = PathState(last_packet_destination_address_,
+ current_effective_peer_address);
}
MaybeUpdateBytesReceivedFromAlternativeAddress(last_size_);
return !update_packet_content_returns_connected_ || connected_;
@@ -4906,7 +4907,7 @@
} else {
is_current_packet_connectivity_probing_ =
(last_packet_source_address_ != peer_address_) ||
- (last_packet_destination_address_ != self_address_);
+ (last_packet_destination_address_ != default_path_.self_address);
QUIC_DLOG_IF(INFO, is_current_packet_connectivity_probing_)
<< ENDPOINT
<< "Detected connectivity probing packet. "
@@ -4914,7 +4915,7 @@
<< last_packet_source_address_ << ", peer_address_:" << peer_address_
<< ", last_packet_destination_address_:"
<< last_packet_destination_address_
- << ", self_address_:" << self_address_;
+ << ", self_address_:" << default_path_.self_address;
}
return !update_packet_content_returns_connected_ || connected_;
}
@@ -4943,7 +4944,7 @@
!IsHandshakeConfirmed()) {
QUIC_LOG_EVERY_N_SEC(INFO, 60)
<< ENDPOINT << "Effective peer's ip:port changed from "
- << effective_peer_address_.ToString() << " to "
+ << default_path_.peer_address.ToString() << " to "
<< GetEffectivePeerAddressFromCurrentPacket().ToString()
<< " before handshake confirmed, "
"current_effective_peer_migration_type_: "
@@ -5328,7 +5329,7 @@
size_t padding_size = length - coalesced_packet_.length();
if (!count_bytes_on_alternative_path_separately_) {
if (EnforceAntiAmplificationLimit()) {
- bytes_sent_before_address_validation_ += padding_size;
+ default_path_.bytes_sent_before_address_validation += padding_size;
}
} else {
QUIC_CODE_COUNT_N(quic_count_bytes_on_alternative_path_seperately, 5, 5);
@@ -5336,7 +5337,7 @@
coalesced_packet_.peer_address())) {
if (EnforceAntiAmplificationLimit()) {
// Include bytes sent even if they are not in flight.
- bytes_sent_before_address_validation_ += padding_size;
+ default_path_.bytes_sent_before_address_validation += padding_size;
}
} else {
MaybeUpdateBytesSentToAlternativeAddress(
@@ -5423,14 +5424,16 @@
bool QuicConnection::EnforceAntiAmplificationLimit() const {
return version().SupportsAntiAmplificationLimit() &&
- perspective_ == Perspective::IS_SERVER && !address_validated_;
+ perspective_ == Perspective::IS_SERVER && !default_path_.validated;
}
+// TODO(danzh) Pass in path object or its reference of some sort to use this
+// method to check anti-amplification limit on non-default path.
bool QuicConnection::LimitedByAmplificationFactor() const {
return EnforceAntiAmplificationLimit() &&
- bytes_sent_before_address_validation_ >=
+ default_path_.bytes_sent_before_address_validation >=
anti_amplification_factor_ *
- bytes_received_before_address_validation_;
+ default_path_.bytes_received_before_address_validation;
}
SerializedPacketFate QuicConnection::GetSerializedPacketFate(
@@ -5694,7 +5697,7 @@
if (perspective_ == Perspective::IS_CLIENT &&
!IsDefaultPath(context->self_address(), context->peer_address())) {
alternative_path_ =
- AlternativePathState(context->self_address(), context->peer_address());
+ PathState(context->self_address(), context->peer_address());
}
if (path_validator_.HasPendingPathValidation()) {
// Cancel and fail any earlier validation.
@@ -5712,7 +5715,7 @@
QuicPacketCreator::ScopedPeerAddressContext context(&packet_creator_,
peer_address_to_send);
QUIC_DVLOG(1) << ENDPOINT << "Send PATH_RESPONSE to " << peer_address_to_send;
- if (self_address_ == last_packet_destination_address_) {
+ if (default_path_.self_address == last_packet_destination_address_) {
// The PATH_CHALLENGE is received on the default socket. Respond on the same
// socket.
return packet_creator_.AddPathResponseFrame(data_buffer);
@@ -5809,8 +5812,8 @@
perspective_ != Perspective::IS_SERVER) {
return;
}
- QUICHE_DCHECK(!IsDefaultPath(self_address_, peer_address));
- if (!IsAlternativePath(self_address_, peer_address)) {
+ QUICHE_DCHECK(!IsDefaultPath(default_path_.self_address, peer_address));
+ if (!IsAlternativePath(default_path_.self_address, peer_address)) {
QUIC_DLOG(INFO) << "Wrote to uninteresting peer address: " << peer_address
<< " default direct_peer_address_ " << direct_peer_address_
<< " alternative path peer address "
@@ -5857,7 +5860,8 @@
bool QuicConnection::IsDefaultPath(
const QuicSocketAddress& self_address,
const QuicSocketAddress& peer_address) const {
- return direct_peer_address_ == peer_address && self_address_ == self_address;
+ return direct_peer_address_ == peer_address &&
+ default_path_.self_address == self_address;
}
bool QuicConnection::IsAlternativePath(
@@ -5867,7 +5871,7 @@
alternative_path_.self_address == self_address;
}
-void QuicConnection::AlternativePathState::Clear() {
+void QuicConnection::PathState::Clear() {
self_address = QuicSocketAddress();
peer_address = QuicSocketAddress();
validated = false;
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 318e88c..890b4af 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -591,7 +591,9 @@
}
// Set self address.
- void SetSelfAddress(QuicSocketAddress address) { self_address_ = address; }
+ void SetSelfAddress(QuicSocketAddress address) {
+ default_path_.self_address = address;
+ }
// The version of the protocol this connection is using.
QuicTransportVersion transport_version() const {
@@ -736,10 +738,12 @@
void set_creator_debug_delegate(QuicPacketCreator::DebugDelegate* visitor) {
packet_creator_.set_debug_delegate(visitor);
}
- const QuicSocketAddress& self_address() const { return self_address_; }
+ 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 effective_peer_address_;
+ return default_path_.peer_address;
}
QuicConnectionId connection_id() const { return server_connection_id_; }
QuicConnectionId client_connection_id() const {
@@ -1271,7 +1275,7 @@
bool EnforceAntiAmplificationLimit() const;
void AddBytesReceivedBeforeAddressValidation(size_t length) {
- bytes_received_before_address_validation_ += length;
+ default_path_.bytes_received_before_address_validation += length;
}
private:
@@ -1282,9 +1286,9 @@
QuicSocketAddress peer_address;
};
- struct QUIC_EXPORT_PRIVATE AlternativePathState {
- AlternativePathState(const QuicSocketAddress& alternative_self_address,
- const QuicSocketAddress& alternative_peer_address)
+ struct QUIC_EXPORT_PRIVATE PathState {
+ PathState(const QuicSocketAddress& alternative_self_address,
+ const QuicSocketAddress& alternative_peer_address)
: self_address(alternative_self_address),
peer_address(alternative_peer_address) {}
@@ -1294,6 +1298,10 @@
QuicSocketAddress self_address;
// The actual peer address behind the proxy if there is any.
QuicSocketAddress peer_address;
+ // 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.
@@ -1656,19 +1664,15 @@
bool client_connection_id_is_set_;
// Address on the last successfully processed packet received from the
// direct peer.
- QuicSocketAddress self_address_;
QuicSocketAddress peer_address_;
// Other than initialization, do not modify it directly, use
// UpdatePeerAddress() instead.
QuicSocketAddress direct_peer_address_;
- // Address of the endpoint behind the proxy if the connection is proxied.
- // Otherwise it is the same as |peer_address_|.
- // NOTE: Currently |effective_peer_address_| and |peer_address_| are always
- // the same(the address of the direct peer), but soon we'll change
- // |effective_peer_address_| to be the address of the endpoint behind the
- // proxy if the connection is proxied.
- QuicSocketAddress effective_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.
@@ -1944,20 +1948,6 @@
// the source connection ID from that packet.
absl::optional<QuicConnectionId> retry_source_connection_id_;
- // Bytes received before address validation. Only used when
- // EnforceAntiAmplificationLimit returns true.
- size_t bytes_received_before_address_validation_;
-
- // Bytes sent before address validation. Only used when
- // EnforceAntiAmplificationLimit returns true.
- size_t bytes_sent_before_address_validation_;
-
- // True if peer address has been validated. Address is considered validated
- // when 1) an address token is received and validated, or 2) a HANDSHAKE
- // packet has been successfully processed. Only used when
- // EnforceAntiAmplificationLimit returns true.
- bool address_validated_;
-
// 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
@@ -2042,7 +2032,7 @@
// the path validation fails or replaced by a newer path of interest. On the
// server side, alternative_path gets created when server receives
// PATH_CHALLENGE on non-default path.
- AlternativePathState alternative_path_;
+ PathState alternative_path_;
// This field is used to debug b/177312785.
QuicFrameType most_recent_frame_type_;
diff --git a/quic/test_tools/quic_connection_peer.cc b/quic/test_tools/quic_connection_peer.cc
index a3dc946..a6b119c 100644
--- a/quic/test_tools/quic_connection_peer.cc
+++ b/quic/test_tools/quic_connection_peer.cc
@@ -65,7 +65,7 @@
// static
void QuicConnectionPeer::SetSelfAddress(QuicConnection* connection,
const QuicSocketAddress& self_address) {
- connection->self_address_ = self_address;
+ connection->default_path_.self_address = self_address;
}
// static
@@ -85,7 +85,7 @@
void QuicConnectionPeer::SetEffectivePeerAddress(
QuicConnection* connection,
const QuicSocketAddress& effective_peer_address) {
- connection->effective_peer_address_ = effective_peer_address;
+ connection->default_path_.peer_address = effective_peer_address;
}
// static
@@ -294,13 +294,14 @@
void QuicConnectionPeer::AddBytesReceived(QuicConnection* connection,
size_t length) {
if (connection->EnforceAntiAmplificationLimit()) {
- connection->bytes_received_before_address_validation_ += length;
+ connection->default_path_.bytes_received_before_address_validation +=
+ length;
}
}
// static
void QuicConnectionPeer::SetAddressValidated(QuicConnection* connection) {
- connection->address_validated_ = true;
+ connection->default_path_.validated = true;
}
// static