gfe-relnote: In QUIC, add QuicPacketNumber::UpdateMax function. No functional change expected. Not protected.
UpdateMax updates packet number to be new_value if it is greater.
PiperOrigin-RevId: 239268272
Change-Id: I07be6cc28cb77dc57bb4205e4052ca8a7b68d995
diff --git a/quic/core/congestion_control/tcp_cubic_sender_bytes.cc b/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
index 2ddf769..fde8d75 100644
--- a/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
+++ b/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
@@ -148,12 +148,7 @@
QuicByteCount acked_bytes,
QuicByteCount prior_in_flight,
QuicTime event_time) {
- if (largest_acked_packet_number_.IsInitialized()) {
- largest_acked_packet_number_ =
- std::max(acked_packet_number, largest_acked_packet_number_);
- } else {
- largest_acked_packet_number_ = acked_packet_number;
- }
+ largest_acked_packet_number_.UpdateMax(acked_packet_number);
if (InRecovery()) {
if (!no_prr_) {
// PRR is used when in recovery.
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index 2d1e665..08c0121 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -1850,12 +1850,7 @@
// Update the largest packet number after we have decrypted the packet
// so we are confident is not attacker controlled.
- if (largest_packet_number_.IsInitialized()) {
- largest_packet_number_ =
- std::max(header->packet_number, largest_packet_number_);
- } else {
- largest_packet_number_ = header->packet_number;
- }
+ largest_packet_number_.UpdateMax(header->packet_number);
if (!visitor_->OnPacketHeader(*header)) {
RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
@@ -1928,12 +1923,7 @@
// Update the largest packet number after we have decrypted the packet
// so we are confident is not attacker controlled.
- if (largest_packet_number_.IsInitialized()) {
- largest_packet_number_ =
- std::max(header->packet_number, largest_packet_number_);
- } else {
- largest_packet_number_ = header->packet_number;
- }
+ largest_packet_number_.UpdateMax(header->packet_number);
if (!visitor_->OnPacketHeader(*header)) {
// The visitor suppresses further processing of the packet.
diff --git a/quic/core/quic_packet_number.cc b/quic/core/quic_packet_number.cc
index 8a799c1..3996993 100644
--- a/quic/core/quic_packet_number.cc
+++ b/quic/core/quic_packet_number.cc
@@ -19,6 +19,17 @@
packet_number_ = UninitializedPacketNumber();
}
+void QuicPacketNumber::UpdateMax(QuicPacketNumber new_value) {
+ if (!new_value.IsInitialized()) {
+ return;
+ }
+ if (!IsInitialized()) {
+ packet_number_ = new_value.ToUint64();
+ } else {
+ packet_number_ = std::max(packet_number_, new_value.ToUint64());
+ }
+}
+
uint64_t QuicPacketNumber::Hash() const {
DCHECK(IsInitialized());
return packet_number_;
diff --git a/quic/core/quic_packet_number.h b/quic/core/quic_packet_number.h
index e32d0c3..a6559d9 100644
--- a/quic/core/quic_packet_number.h
+++ b/quic/core/quic_packet_number.h
@@ -30,6 +30,10 @@
// Packet number becomes uninitialized after calling this function.
void Clear();
+ // Updates this packet number to be |new_value| if it is greater than current
+ // value.
+ void UpdateMax(QuicPacketNumber new_value);
+
// REQUIRES: IsInitialized() == true.
uint64_t Hash() const;
diff --git a/quic/core/quic_packet_number_test.cc b/quic/core/quic_packet_number_test.cc
index 5e32b8c..9c0b6d8 100644
--- a/quic/core/quic_packet_number_test.cc
+++ b/quic/core/quic_packet_number_test.cc
@@ -21,8 +21,16 @@
EXPECT_TRUE(num2.IsInitialized());
EXPECT_EQ(10u, num2.ToUint64());
EXPECT_EQ(10u, num2.Hash());
+ num2.UpdateMax(num);
+ EXPECT_EQ(10u, num2.ToUint64());
+ num2.UpdateMax(QuicPacketNumber(9));
+ EXPECT_EQ(10u, num2.ToUint64());
+ num2.UpdateMax(QuicPacketNumber(11));
+ EXPECT_EQ(11u, num2.ToUint64());
num2.Clear();
EXPECT_FALSE(num2.IsInitialized());
+ num2.UpdateMax(QuicPacketNumber(9));
+ EXPECT_EQ(9u, num2.ToUint64());
if (!GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
QuicPacketNumber num3(std::numeric_limits<uint64_t>::max());
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index efe0ab6..b1ba487 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -1146,14 +1146,7 @@
QUIC_DVLOG(1) << ENDPOINT << "Got an ack for packet "
<< acked_packet.packet_number;
last_ack_frame_.packets.Add(acked_packet.packet_number);
- if (info->largest_acked.IsInitialized()) {
- if (largest_packet_peer_knows_is_acked_.IsInitialized()) {
- largest_packet_peer_knows_is_acked_ =
- std::max(largest_packet_peer_knows_is_acked_, info->largest_acked);
- } else {
- largest_packet_peer_knows_is_acked_ = info->largest_acked;
- }
- }
+ largest_packet_peer_knows_is_acked_.UpdateMax(info->largest_acked);
// If data is associated with the most recent transmission of this
// packet, then inform the caller.
if (info->in_flight) {
diff --git a/quic/core/quic_unacked_packet_map.cc b/quic/core/quic_unacked_packet_map.cc
index fcd5308..0f5fa49 100644
--- a/quic/core/quic_unacked_packet_map.cc
+++ b/quic/core/quic_unacked_packet_map.cc
@@ -68,12 +68,7 @@
packet->encryption_level, packet->packet_number_length, transmission_type,
sent_time, bytes_sent, has_crypto_handshake, packet->num_padding_bytes);
info.largest_acked = packet->largest_acked;
- if (packet->largest_acked.IsInitialized()) {
- largest_sent_largest_acked_ =
- largest_sent_largest_acked_.IsInitialized()
- ? std::max(largest_sent_largest_acked_, packet->largest_acked)
- : packet->largest_acked;
- }
+ largest_sent_largest_acked_.UpdateMax(packet->largest_acked);
if (old_packet_number.IsInitialized()) {
TransferRetransmissionInfo(old_packet_number, packet_number,
transmission_type, &info);
@@ -234,12 +229,7 @@
DCHECK(use_uber_loss_algorithm_);
const PacketNumberSpace packet_number_space =
GetPacketNumberSpace(encryption_level);
- if (!largest_acked_packets_[packet_number_space].IsInitialized()) {
- largest_acked_packets_[packet_number_space] = packet_number;
- } else {
- largest_acked_packets_[packet_number_space] =
- std::max(largest_acked_packets_[packet_number_space], packet_number);
- }
+ largest_acked_packets_[packet_number_space].UpdateMax(packet_number);
}
bool QuicUnackedPacketMap::IsPacketUsefulForMeasuringRtt(