Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions quiche/quic/core/deterministic_connection_id_generator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,13 @@
namespace quic {

DeterministicConnectionIdGenerator::DeterministicConnectionIdGenerator(
uint8_t expected_connection_id_length)
: expected_connection_id_length_(expected_connection_id_length) {
uint8_t expected_connection_id_length) {
set_expected_connection_id_length(expected_connection_id_length);
}

void DeterministicConnectionIdGenerator::set_expected_connection_id_length(
uint8_t expected_connection_id_length) {
expected_connection_id_length_ = expected_connection_id_length;
if (expected_connection_id_length_ >
kQuicMaxConnectionIdWithLengthPrefixLength) {
QUIC_BUG(quic_bug_465151159_01)
Expand Down
8 changes: 6 additions & 2 deletions quiche/quic/core/deterministic_connection_id_generator.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@ namespace quic {
class QUICHE_EXPORT DeterministicConnectionIdGenerator
: public ConnectionIdGeneratorInterface {
public:
DeterministicConnectionIdGenerator(uint8_t expected_connection_id_length);
explicit DeterministicConnectionIdGenerator(
uint8_t expected_connection_id_length);

// Sets the length of the connection IDs generated from now on.
void set_expected_connection_id_length(uint8_t expected_connection_id_length);

// Hashes |original| to create a new connection ID.
std::optional<QuicConnectionId> GenerateNextConnectionId(
Expand All @@ -32,7 +36,7 @@ class QUICHE_EXPORT DeterministicConnectionIdGenerator
}

private:
const uint8_t expected_connection_id_length_;
uint8_t expected_connection_id_length_;
};

} // namespace quic
Expand Down
17 changes: 16 additions & 1 deletion quiche/quic/core/http/end_to_end_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1141,6 +1141,9 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
void TestMultiPacketChaosProtection(int num_packets, bool drop_first_packet,
bool kyber = false);

void ConnectionMigrationNonZeroConnectionIDClientIPChange(
uint8_t client_connection_id_length);

quiche::test::ScopedEnvironmentForThreads environment_;
bool initialized_;
// If true, the Initialize() function will create |client_| and starts to
Expand Down Expand Up @@ -3613,12 +3616,24 @@ TEST_P(EndToEndTest, IetfConnectionMigrationClientIPChangedMultipleTimes) {

TEST_P(EndToEndTest,
ConnectionMigrationWithNonZeroConnectionIDClientIPChangedMultipleTimes) {
ConnectionMigrationNonZeroConnectionIDClientIPChange(
kQuicDefaultConnectionIdLength);
}

TEST_P(EndToEndTest,
ConnectionMigrationWithMaxConnectionIDClientIPChangedMultipleTimes) {
ConnectionMigrationNonZeroConnectionIDClientIPChange(
kQuicMaxConnectionIdWithLengthPrefixLength);
}

void EndToEndTest::ConnectionMigrationNonZeroConnectionIDClientIPChange(
uint8_t client_connection_id_length) {
if (!version_.IsIetfQuic() ||
GetQuicFlag(quic_enforce_strict_amplification_factor)) {
ASSERT_TRUE(Initialize());
return;
}
override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
override_client_connection_id_length_ = client_connection_id_length;
ASSERT_TRUE(Initialize());
SendSynchronousFooRequestAndCheckResponse();

Expand Down
22 changes: 2 additions & 20 deletions quiche/quic/test_tools/quic_test_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,7 @@ MockableQuicClient::MockableQuicClient(
std::make_unique<MockableQuicClientDefaultNetworkHelper>(event_loop,
this),
std::make_unique<RecordingProofVerifier>(std::move(proof_verifier)),
std::move(session_cache)),
override_client_connection_id_(EmptyQuicConnectionId()),
client_connection_id_overridden_(false) {}
std::move(session_cache)) {}

MockableQuicClient::~MockableQuicClient() {
if (connected()) {
Expand All @@ -245,29 +243,13 @@ MockableQuicClient::mockable_network_helper() const {
default_network_helper());
}

QuicConnectionId MockableQuicClient::GetClientConnectionId() {
if (client_connection_id_overridden_) {
return override_client_connection_id_;
}
if (override_client_connection_id_length_ >= 0) {
return QuicUtils::CreateRandomConnectionId(
override_client_connection_id_length_);
}
return QuicDefaultClient::GetClientConnectionId();
}

std::unique_ptr<QuicMigrationHelper>
MockableQuicClient::CreateQuicMigrationHelper() {
auto migration_helper = std::make_unique<QuicTestMigrationHelper>(*this);
migration_helper_ = migration_helper.get();
return migration_helper;
}

void MockableQuicClient::UseClientConnectionIdLength(
int client_connection_id_length) {
override_client_connection_id_length_ = client_connection_id_length;
}

void MockableQuicClient::UseWriter(QuicPacketWriterWrapper* writer) {
mockable_network_helper()->UseWriter(writer);
}
Expand Down Expand Up @@ -785,7 +767,7 @@ void QuicTestClient::UseConnectionIdLength(
void QuicTestClient::UseClientConnectionIdLength(
uint8_t client_connection_id_length) {
QUICHE_DCHECK(!connected());
client_->UseClientConnectionIdLength(client_connection_id_length);
client_->set_client_connection_id_length(client_connection_id_length);
}

bool QuicTestClient::MigrateSocket(const QuicIpAddress& new_host) {
Expand Down
10 changes: 0 additions & 10 deletions quiche/quic/test_tools/quic_test_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,7 @@ class MockableQuicClient : public QuicDefaultClient {
enable_web_transport());
}

QuicConnectionId GetClientConnectionId() override;
std::unique_ptr<QuicMigrationHelper> CreateQuicMigrationHelper() override;
void UseClientConnectionIdLength(int client_connection_id_length);

void UseWriter(QuicPacketWriterWrapper* writer);
void set_peer_address(const QuicSocketAddress& address);
Expand All @@ -208,11 +206,6 @@ class MockableQuicClient : public QuicDefaultClient {
}

private:
// Client connection ID to use, if client_connection_id_overridden_.
// TODO(wub): Move client_connection_id_(length_) overrides to QuicClientBase.
QuicConnectionId override_client_connection_id_;
bool client_connection_id_overridden_;
int override_client_connection_id_length_ = -1;
CachedNetworkParameters cached_network_paramaters_;
// Owned by the base class.
QuicTestMigrationHelper* migration_helper_ = nullptr;
Expand Down Expand Up @@ -375,9 +368,6 @@ class QuicTestClient : public QuicSpdyStream::Visitor {
// Configures client_ to use a specific server connection ID length instead
// of the default of kQuicDefaultConnectionIdLength.
void UseConnectionIdLength(uint8_t server_connection_id_length);
// Configures client_ to use a specific client connection ID instead of an
// empty one.
void UseClientConnectionId(QuicConnectionId client_connection_id);
// Configures client_ to use a specific client connection ID length instead
// of the default of zero.
void UseClientConnectionIdLength(uint8_t client_connection_id_length);
Expand Down
8 changes: 8 additions & 0 deletions quiche/quic/tools/quic_client_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,14 @@ QuicConnectionId QuicClientBase::GetClientConnectionId() {
return QuicUtils::CreateRandomConnectionId(client_connection_id_length_);
}

void QuicClientBase::set_client_connection_id_length(
uint8_t client_connection_id_length) {
QUICHE_DCHECK(!connected());
client_connection_id_length_ = client_connection_id_length;
connection_id_generator_.set_expected_connection_id_length(
client_connection_id_length);
}

bool QuicClientBase::CanReconnectWithDifferentVersion(
ParsedQuicVersion* version) const {
if (session_ == nullptr || session_->connection() == nullptr ||
Expand Down
7 changes: 4 additions & 3 deletions quiche/quic/tools/quic_client_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,10 @@ class QuicClientBase : public QuicSession::Visitor {
server_connection_id_length_ = server_connection_id_length;
}

void set_client_connection_id_length(uint8_t client_connection_id_length) {
client_connection_id_length_ = client_connection_id_length;
}
// Sets the length of the client connection IDs this client generates,
// including the ones self-issued after the handshake. Must be called before
// the connection is created.
void set_client_connection_id_length(uint8_t client_connection_id_length);

bool HasPendingPathValidation();

Expand Down