| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/quic_packet_creator.h" | 5 #include "net/quic/core/quic_packet_creator.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 // frame, assuming it is the last frame in the packet | 190 // frame, assuming it is the last frame in the packet |
| 191 size_t GetStreamFrameOverhead() { | 191 size_t GetStreamFrameOverhead() { |
| 192 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset, | 192 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset, |
| 193 true); | 193 true); |
| 194 } | 194 } |
| 195 | 195 |
| 196 QuicIOVector MakeIOVector(StringPiece s) { | 196 QuicIOVector MakeIOVector(StringPiece s) { |
| 197 return ::net::test::MakeIOVector(s, &iov_); | 197 return ::net::test::MakeIOVector(s, &iov_); |
| 198 } | 198 } |
| 199 | 199 |
| 200 PendingRetransmission CreateRetransmission( | 200 QuicPendingRetransmission CreateRetransmission( |
| 201 const QuicFrames& retransmittable_frames, | 201 const QuicFrames& retransmittable_frames, |
| 202 bool has_crypto_handshake, | 202 bool has_crypto_handshake, |
| 203 int num_padding_bytes, | 203 int num_padding_bytes, |
| 204 EncryptionLevel encryption_level, | 204 EncryptionLevel encryption_level, |
| 205 QuicPacketNumberLength packet_number_length) { | 205 QuicPacketNumberLength packet_number_length) { |
| 206 return PendingRetransmission(1u, 1u, NOT_RETRANSMISSION, | 206 return QuicPendingRetransmission(1u, 1u, NOT_RETRANSMISSION, |
| 207 retransmittable_frames, has_crypto_handshake, | 207 retransmittable_frames, |
| 208 num_padding_bytes, encryption_level, | 208 has_crypto_handshake, num_padding_bytes, |
| 209 packet_number_length); | 209 encryption_level, packet_number_length); |
| 210 } | 210 } |
| 211 | 211 |
| 212 static const QuicStreamOffset kOffset = 1u; | 212 static const QuicStreamOffset kOffset = 1u; |
| 213 | 213 |
| 214 QuicFlagSaver flags_; // Save/restore all QUIC flag values. | 214 QuicFlagSaver flags_; // Save/restore all QUIC flag values. |
| 215 char buffer_[kMaxPacketSize]; | 215 char buffer_[kMaxPacketSize]; |
| 216 QuicFrames frames_; | 216 QuicFrames frames_; |
| 217 QuicFramer server_framer_; | 217 QuicFramer server_framer_; |
| 218 QuicFramer client_framer_; | 218 QuicFramer client_framer_; |
| 219 StrictMock<MockFramerVisitor> framer_visitor_; | 219 StrictMock<MockFramerVisitor> framer_visitor_; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 // If the original packet number length, the current packet number | 269 // If the original packet number length, the current packet number |
| 270 // length, and the configured send packet number length are different, the | 270 // length, and the configured send packet number length are different, the |
| 271 // retransmit must sent with the original length and the others do not change. | 271 // retransmit must sent with the original length and the others do not change. |
| 272 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_, | 272 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_, |
| 273 PACKET_2BYTE_PACKET_NUMBER); | 273 PACKET_2BYTE_PACKET_NUMBER); |
| 274 QuicStreamFrame* stream_frame = | 274 QuicStreamFrame* stream_frame = |
| 275 new QuicStreamFrame(kCryptoStreamId, /*fin=*/false, 0u, StringPiece()); | 275 new QuicStreamFrame(kCryptoStreamId, /*fin=*/false, 0u, StringPiece()); |
| 276 QuicFrames frames; | 276 QuicFrames frames; |
| 277 frames.push_back(QuicFrame(stream_frame)); | 277 frames.push_back(QuicFrame(stream_frame)); |
| 278 char buffer[kMaxPacketSize]; | 278 char buffer[kMaxPacketSize]; |
| 279 PendingRetransmission retransmission(CreateRetransmission( | 279 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 280 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, | 280 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, |
| 281 ENCRYPTION_NONE, PACKET_1BYTE_PACKET_NUMBER)); | 281 ENCRYPTION_NONE, PACKET_1BYTE_PACKET_NUMBER)); |
| 282 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 282 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 283 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 283 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 284 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 284 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 285 // The packet number length is updated after every packet is sent, | 285 // The packet number length is updated after every packet is sent, |
| 286 // so there is no need to restore the old length after sending. | 286 // so there is no need to restore the old length after sending. |
| 287 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 287 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| 288 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 288 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
| 289 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 289 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 304 delete stream_frame; | 304 delete stream_frame; |
| 305 } | 305 } |
| 306 | 306 |
| 307 TEST_P(QuicPacketCreatorTest, ReserializeCryptoFrameWithForwardSecurity) { | 307 TEST_P(QuicPacketCreatorTest, ReserializeCryptoFrameWithForwardSecurity) { |
| 308 QuicStreamFrame* stream_frame = | 308 QuicStreamFrame* stream_frame = |
| 309 new QuicStreamFrame(kCryptoStreamId, /*fin=*/false, 0u, StringPiece()); | 309 new QuicStreamFrame(kCryptoStreamId, /*fin=*/false, 0u, StringPiece()); |
| 310 QuicFrames frames; | 310 QuicFrames frames; |
| 311 frames.push_back(QuicFrame(stream_frame)); | 311 frames.push_back(QuicFrame(stream_frame)); |
| 312 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); | 312 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
| 313 char buffer[kMaxPacketSize]; | 313 char buffer[kMaxPacketSize]; |
| 314 PendingRetransmission retransmission(CreateRetransmission( | 314 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 315 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, | 315 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, |
| 316 ENCRYPTION_NONE, | 316 ENCRYPTION_NONE, |
| 317 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 317 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 318 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 318 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 319 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 319 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 320 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 320 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 321 EXPECT_EQ(ENCRYPTION_NONE, serialized_packet_.encryption_level); | 321 EXPECT_EQ(ENCRYPTION_NONE, serialized_packet_.encryption_level); |
| 322 delete stream_frame; | 322 delete stream_frame; |
| 323 } | 323 } |
| 324 | 324 |
| 325 TEST_P(QuicPacketCreatorTest, ReserializeFrameWithForwardSecurity) { | 325 TEST_P(QuicPacketCreatorTest, ReserializeFrameWithForwardSecurity) { |
| 326 QuicStreamFrame* stream_frame = | 326 QuicStreamFrame* stream_frame = |
| 327 new QuicStreamFrame(0u, /*fin=*/false, 0u, StringPiece()); | 327 new QuicStreamFrame(0u, /*fin=*/false, 0u, StringPiece()); |
| 328 QuicFrames frames; | 328 QuicFrames frames; |
| 329 frames.push_back(QuicFrame(stream_frame)); | 329 frames.push_back(QuicFrame(stream_frame)); |
| 330 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); | 330 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
| 331 char buffer[kMaxPacketSize]; | 331 char buffer[kMaxPacketSize]; |
| 332 PendingRetransmission retransmission(CreateRetransmission( | 332 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 333 frames, false /* has_crypto_handshake */, 0 /* no padding */, | 333 frames, false /* has_crypto_handshake */, 0 /* no padding */, |
| 334 ENCRYPTION_NONE, | 334 ENCRYPTION_NONE, |
| 335 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 335 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 336 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 336 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 337 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 337 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 338 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 338 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 339 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, serialized_packet_.encryption_level); | 339 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, serialized_packet_.encryption_level); |
| 340 delete stream_frame; | 340 delete stream_frame; |
| 341 } | 341 } |
| 342 | 342 |
| 343 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPadding) { | 343 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPadding) { |
| 344 QuicFrame frame; | 344 QuicFrame frame; |
| 345 QuicIOVector io_vector(MakeIOVector("fake handshake message data")); | 345 QuicIOVector io_vector(MakeIOVector("fake handshake message data")); |
| 346 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, | 346 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, |
| 347 io_vector, 0u, 0u, false, &frame); | 347 io_vector, 0u, 0u, false, &frame); |
| 348 QuicFrames frames; | 348 QuicFrames frames; |
| 349 frames.push_back(frame); | 349 frames.push_back(frame); |
| 350 char buffer[kMaxPacketSize]; | 350 char buffer[kMaxPacketSize]; |
| 351 PendingRetransmission retransmission(CreateRetransmission( | 351 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 352 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, | 352 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, |
| 353 ENCRYPTION_NONE, | 353 ENCRYPTION_NONE, |
| 354 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 354 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 355 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 355 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 356 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 356 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 357 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 357 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 358 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); | 358 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); |
| 359 delete frame.stream_frame; | 359 delete frame.stream_frame; |
| 360 } | 360 } |
| 361 | 361 |
| 362 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSpecifiedPadding) { | 362 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSpecifiedPadding) { |
| 363 QuicFrame frame; | 363 QuicFrame frame; |
| 364 QuicIOVector io_vector(MakeIOVector("fake message data")); | 364 QuicIOVector io_vector(MakeIOVector("fake message data")); |
| 365 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, | 365 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, |
| 366 io_vector, 0u, 0u, false, &frame); | 366 io_vector, 0u, 0u, false, &frame); |
| 367 | 367 |
| 368 const int kNumPaddingBytes1 = 4; | 368 const int kNumPaddingBytes1 = 4; |
| 369 int packet_size = 0; | 369 int packet_size = 0; |
| 370 { | 370 { |
| 371 QuicFrames frames; | 371 QuicFrames frames; |
| 372 frames.push_back(frame); | 372 frames.push_back(frame); |
| 373 char buffer[kMaxPacketSize]; | 373 char buffer[kMaxPacketSize]; |
| 374 PendingRetransmission retransmission(CreateRetransmission( | 374 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 375 frames, false /* has_crypto_handshake */, | 375 frames, false /* has_crypto_handshake */, |
| 376 kNumPaddingBytes1 /* padding bytes */, ENCRYPTION_NONE, | 376 kNumPaddingBytes1 /* padding bytes */, ENCRYPTION_NONE, |
| 377 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 377 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 378 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 378 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 379 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 379 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 380 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 380 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 381 packet_size = serialized_packet_.encrypted_length; | 381 packet_size = serialized_packet_.encrypted_length; |
| 382 } | 382 } |
| 383 | 383 |
| 384 const int kNumPaddingBytes2 = 44; | 384 const int kNumPaddingBytes2 = 44; |
| 385 QuicFrames frames; | 385 QuicFrames frames; |
| 386 frames.push_back(frame); | 386 frames.push_back(frame); |
| 387 char buffer[kMaxPacketSize]; | 387 char buffer[kMaxPacketSize]; |
| 388 PendingRetransmission retransmission(CreateRetransmission( | 388 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 389 frames, false /* has_crypto_handshake */, | 389 frames, false /* has_crypto_handshake */, |
| 390 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_NONE, | 390 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_NONE, |
| 391 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 391 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 392 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 392 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 393 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 393 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 394 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 394 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 395 | 395 |
| 396 EXPECT_EQ(packet_size + kNumPaddingBytes2 - kNumPaddingBytes1, | 396 EXPECT_EQ(packet_size + kNumPaddingBytes2 - kNumPaddingBytes1, |
| 397 serialized_packet_.encrypted_length); | 397 serialized_packet_.encrypted_length); |
| 398 delete frame.stream_frame; | 398 delete frame.stream_frame; |
| 399 } | 399 } |
| 400 | 400 |
| 401 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { | 401 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { |
| 402 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + | 402 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + |
| 403 GetEncryptionOverhead() + GetStreamFrameOverhead(); | 403 GetEncryptionOverhead() + GetStreamFrameOverhead(); |
| 404 size_t capacity = kDefaultMaxPacketSize - overhead; | 404 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 405 for (int delta = -5; delta <= 0; ++delta) { | 405 for (int delta = -5; delta <= 0; ++delta) { |
| 406 string data(capacity + delta, 'A'); | 406 string data(capacity + delta, 'A'); |
| 407 size_t bytes_free = 0 - delta; | 407 size_t bytes_free = 0 - delta; |
| 408 | 408 |
| 409 QuicFrame frame; | 409 QuicFrame frame; |
| 410 QuicIOVector io_vector(MakeIOVector(data)); | 410 QuicIOVector io_vector(MakeIOVector(data)); |
| 411 QuicPacketCreatorPeer::CreateStreamFrame( | 411 QuicPacketCreatorPeer::CreateStreamFrame( |
| 412 &creator_, kCryptoStreamId, io_vector, 0, kOffset, false, &frame); | 412 &creator_, kCryptoStreamId, io_vector, 0, kOffset, false, &frame); |
| 413 QuicFrames frames; | 413 QuicFrames frames; |
| 414 frames.push_back(frame); | 414 frames.push_back(frame); |
| 415 char buffer[kMaxPacketSize]; | 415 char buffer[kMaxPacketSize]; |
| 416 PendingRetransmission retransmission(CreateRetransmission( | 416 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 417 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, | 417 frames, true /* has_crypto_handshake */, -1 /* needs full padding */, |
| 418 ENCRYPTION_NONE, | 418 ENCRYPTION_NONE, |
| 419 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 419 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 420 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 420 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 421 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 421 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 422 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 422 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 423 | 423 |
| 424 // If there is not enough space in the packet to fit a padding frame | 424 // If there is not enough space in the packet to fit a padding frame |
| 425 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 425 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
| 426 // will not be padded. | 426 // will not be padded. |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 EXPECT_CALL(delegate_, | 950 EXPECT_CALL(delegate_, |
| 951 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _)); | 951 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _)); |
| 952 EXPECT_QUIC_BUG(creator_.ConsumeData(kCryptoStreamId, data_iovec, 0u, 0u, | 952 EXPECT_QUIC_BUG(creator_.ConsumeData(kCryptoStreamId, data_iovec, 0u, 0u, |
| 953 false, false, &frame), | 953 false, false, &frame), |
| 954 "Client hello won't fit in a single packet."); | 954 "Client hello won't fit in a single packet."); |
| 955 } | 955 } |
| 956 | 956 |
| 957 } // namespace | 957 } // namespace |
| 958 } // namespace test | 958 } // namespace test |
| 959 } // namespace net | 959 } // namespace net |
| OLD | NEW |