Add ReplaceConnectionId to QuicPeerIssuedConnectionId manager to support connection ID replacement via long packet header. PiperOrigin-RevId: 354348409 Change-Id: I67ce0cdd7345e6dd704fd3f036f3dd7dd41b1088
diff --git a/quic/core/quic_connection_id_manager.cc b/quic/core/quic_connection_id_manager.cc index c12ecbd..a4166ef 100644 --- a/quic/core/quic_connection_id_manager.cc +++ b/quic/core/quic_connection_id_manager.cc
@@ -48,6 +48,15 @@ }); } +std::vector<QuicConnectionIdData>::iterator FindConnectionIdData( + std::vector<QuicConnectionIdData>* cid_data_vector, + const QuicConnectionId& cid) { + return std::find_if(cid_data_vector->begin(), cid_data_vector->end(), + [&cid](const QuicConnectionIdData& cid_data) { + return cid == cid_data.connection_id; + }); +} + } // namespace QuicPeerIssuedConnectionIdManager::QuicPeerIssuedConnectionIdManager( @@ -206,6 +215,22 @@ return result; } +void QuicPeerIssuedConnectionIdManager::ReplaceConnectionId( + const QuicConnectionId& old_connection_id, + const QuicConnectionId& new_connection_id) { + auto it1 = + FindConnectionIdData(&active_connection_id_data_, old_connection_id); + if (it1 != active_connection_id_data_.end()) { + it1->connection_id = new_connection_id; + return; + } + auto it2 = FindConnectionIdData(&to_be_retired_connection_id_data_, + old_connection_id); + if (it2 != to_be_retired_connection_id_data_.end()) { + it2->connection_id = new_connection_id; + } +} + namespace { class RetireSelfIssuedConnectionIdAlarmDelegate : public QuicAlarm::Delegate {
diff --git a/quic/core/quic_connection_id_manager.h b/quic/core/quic_connection_id_manager.h index bb31da9..493a78e 100644 --- a/quic/core/quic_connection_id_manager.h +++ b/quic/core/quic_connection_id_manager.h
@@ -77,6 +77,11 @@ // it is safe to retires these Ids. std::vector<uint64_t> ConsumeToBeRetiredConnectionIdSequenceNumbers(); + // If old_connection_id is still tracked by QuicPeerIssuedConnectionIdManager, + // replace it with new_connection_id. Otherwise, this is a no-op. + void ReplaceConnectionId(const QuicConnectionId& old_connection_id, + const QuicConnectionId& new_connection_id); + private: friend class QuicConnectionIdManagerPeer;
diff --git a/quic/core/quic_connection_id_manager_test.cc b/quic/core/quic_connection_id_manager_test.cc index fe87f05..b9ca45f 100644 --- a/quic/core/quic_connection_id_manager_test.cc +++ b/quic/core/quic_connection_id_manager_test.cc
@@ -517,6 +517,17 @@ IsError(IETF_QUIC_PROTOCOL_VIOLATION)); } +TEST_F(QuicPeerIssuedConnectionIdManagerTest, ReplaceConnectionId) { + ASSERT_TRUE( + peer_issued_cid_manager_.IsConnectionIdActive(initial_connection_id_)); + peer_issued_cid_manager_.ReplaceConnectionId(initial_connection_id_, + TestConnectionId(1)); + EXPECT_FALSE( + peer_issued_cid_manager_.IsConnectionIdActive(initial_connection_id_)); + EXPECT_TRUE( + peer_issued_cid_manager_.IsConnectionIdActive(TestConnectionId(1))); +} + class TestSelfIssuedConnectionIdManagerVisitor : public QuicConnectionIdManagerVisitorInterface { public: