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 <ostream> | 9 #include <ostream> |
10 #include <string> | 10 #include <string> |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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, DoNotRetransmitPendingPadding) { |
363 QuicFrame frame; | 363 QuicFrame frame; |
364 QuicIOVector io_vector(MakeIOVectorFromStringPiece("fake message data")); | 364 QuicIOVector io_vector(MakeIOVectorFromStringPiece("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 QuicPendingRetransmission 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 { |
| 385 InSequence s; |
| 386 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 387 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 388 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 389 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
| 390 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 391 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 392 // Pending paddings are not retransmitted. |
| 393 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0); |
| 394 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 395 } |
| 396 ProcessPacket(serialized_packet_); |
| 397 |
384 const int kNumPaddingBytes2 = 44; | 398 const int kNumPaddingBytes2 = 44; |
385 QuicFrames frames; | 399 QuicFrames frames; |
386 frames.push_back(frame); | 400 frames.push_back(frame); |
387 char buffer[kMaxPacketSize]; | 401 char buffer[kMaxPacketSize]; |
388 QuicPendingRetransmission retransmission(CreateRetransmission( | 402 QuicPendingRetransmission retransmission(CreateRetransmission( |
389 frames, false /* has_crypto_handshake */, | 403 frames, false /* has_crypto_handshake */, |
390 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_NONE, | 404 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_NONE, |
391 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); | 405 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
392 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 406 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
393 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 407 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
394 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 408 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
395 | 409 |
396 EXPECT_EQ(packet_size + kNumPaddingBytes2 - kNumPaddingBytes1, | 410 EXPECT_EQ(packet_size, serialized_packet_.encrypted_length); |
397 serialized_packet_.encrypted_length); | |
398 delete frame.stream_frame; | 411 delete frame.stream_frame; |
399 } | 412 } |
400 | 413 |
401 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { | 414 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { |
402 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + | 415 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + |
403 GetEncryptionOverhead() + GetStreamFrameOverhead(); | 416 GetEncryptionOverhead() + GetStreamFrameOverhead(); |
404 size_t capacity = kDefaultMaxPacketSize - overhead; | 417 size_t capacity = kDefaultMaxPacketSize - overhead; |
405 for (int delta = -5; delta <= 0; ++delta) { | 418 for (int delta = -5; delta <= 0; ++delta) { |
406 string data(capacity + delta, 'A'); | 419 string data(capacity + delta, 'A'); |
407 size_t bytes_free = 0 - delta; | 420 size_t bytes_free = 0 - delta; |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 QuicIOVector data_iovec(MakeIOVector( | 859 QuicIOVector data_iovec(MakeIOVector( |
847 QuicStringPiece(message_data->data(), message_data->length()), &iov)); | 860 QuicStringPiece(message_data->data(), message_data->length()), &iov)); |
848 QuicFrame frame; | 861 QuicFrame frame; |
849 EXPECT_CALL(delegate_, | 862 EXPECT_CALL(delegate_, |
850 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _)); | 863 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _)); |
851 EXPECT_QUIC_BUG(creator_.ConsumeData(kCryptoStreamId, data_iovec, 0u, 0u, | 864 EXPECT_QUIC_BUG(creator_.ConsumeData(kCryptoStreamId, data_iovec, 0u, 0u, |
852 false, false, &frame), | 865 false, false, &frame), |
853 "Client hello won't fit in a single packet."); | 866 "Client hello won't fit in a single packet."); |
854 } | 867 } |
855 | 868 |
| 869 TEST_P(QuicPacketCreatorTest, PendingPadding) { |
| 870 EXPECT_EQ(0u, creator_.pending_padding_bytes()); |
| 871 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10); |
| 872 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes()); |
| 873 |
| 874 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 875 .WillRepeatedly( |
| 876 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 877 // Flush all paddings. |
| 878 while (creator_.pending_padding_bytes() > 0) { |
| 879 creator_.Flush(); |
| 880 { |
| 881 InSequence s; |
| 882 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 883 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 884 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 885 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
| 886 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 887 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)); |
| 888 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 889 } |
| 890 // Packet only contains padding. |
| 891 ProcessPacket(serialized_packet_); |
| 892 } |
| 893 EXPECT_EQ(0u, creator_.pending_padding_bytes()); |
| 894 } |
| 895 |
| 896 TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) { |
| 897 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes); |
| 898 QuicFrame frame; |
| 899 QuicIOVector io_vector(MakeIOVectorFromStringPiece("test")); |
| 900 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
| 901 /*needs_full_padding=*/true, &frame)); |
| 902 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 903 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 904 creator_.Flush(); |
| 905 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes()); |
| 906 } |
| 907 |
| 908 TEST_P(QuicPacketCreatorTest, SendPendingPaddingInRetransmission) { |
| 909 QuicStreamFrame* stream_frame = new QuicStreamFrame( |
| 910 kCryptoStreamId, /*fin=*/false, 0u, QuicStringPiece()); |
| 911 QuicFrames frames; |
| 912 frames.push_back(QuicFrame(stream_frame)); |
| 913 char buffer[kMaxPacketSize]; |
| 914 QuicPendingRetransmission retransmission( |
| 915 CreateRetransmission(frames, true, /*num_padding_bytes=*/0, |
| 916 ENCRYPTION_NONE, PACKET_1BYTE_PACKET_NUMBER)); |
| 917 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 918 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 919 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes); |
| 920 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 921 EXPECT_EQ(0u, creator_.pending_padding_bytes()); |
| 922 { |
| 923 InSequence s; |
| 924 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 925 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 926 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 927 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
| 928 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 929 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 930 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)); |
| 931 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 932 } |
| 933 ProcessPacket(serialized_packet_); |
| 934 delete stream_frame; |
| 935 } |
| 936 |
| 937 TEST_P(QuicPacketCreatorTest, SendPacketAfterFullPaddingRetransmission) { |
| 938 // Making sure needs_full_padding gets reset after a full padding |
| 939 // retransmission. |
| 940 EXPECT_EQ(0u, creator_.pending_padding_bytes()); |
| 941 QuicFrame frame; |
| 942 QuicIOVector io_vector( |
| 943 MakeIOVectorFromStringPiece("fake handshake message data")); |
| 944 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, |
| 945 io_vector, 0u, 0u, false, &frame); |
| 946 QuicFrames frames; |
| 947 frames.push_back(frame); |
| 948 char buffer[kMaxPacketSize]; |
| 949 QuicPendingRetransmission retransmission(CreateRetransmission( |
| 950 frames, true, /*num_padding_bytes=*/-1, ENCRYPTION_NONE, |
| 951 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_))); |
| 952 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 953 .WillRepeatedly( |
| 954 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 955 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
| 956 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); |
| 957 { |
| 958 InSequence s; |
| 959 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 960 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 961 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 962 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
| 963 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 964 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 965 // Full padding. |
| 966 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)); |
| 967 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 968 } |
| 969 ProcessPacket(serialized_packet_); |
| 970 delete frame.stream_frame; |
| 971 |
| 972 creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, false, |
| 973 &frame); |
| 974 creator_.Flush(); |
| 975 { |
| 976 InSequence s; |
| 977 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 978 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 979 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 980 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
| 981 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 982 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 983 // needs_full_padding gets reset. |
| 984 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0); |
| 985 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 986 } |
| 987 ProcessPacket(serialized_packet_); |
| 988 } |
| 989 |
| 990 TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) { |
| 991 const QuicByteCount kStreamFramePayloadSize = 100u; |
| 992 // Set the packet size be enough for one stream frame with 0 stream offset + |
| 993 // 1. |
| 994 size_t length = GetPacketHeaderOverhead(client_framer_.version()) + |
| 995 GetEncryptionOverhead() + |
| 996 QuicFramer::GetMinStreamFrameSize( |
| 997 kCryptoStreamId, 0, /*last_frame_in_packet=*/false) + |
| 998 kStreamFramePayloadSize + 1; |
| 999 creator_.SetMaxPacketLength(length); |
| 1000 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes); |
| 1001 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes(); |
| 1002 QuicFrame frame; |
| 1003 char buf[kStreamFramePayloadSize + 1] = {}; |
| 1004 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1005 .WillRepeatedly( |
| 1006 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
| 1007 // Send stream frame of size kStreamFramePayloadSize. |
| 1008 creator_.ConsumeData(kCryptoStreamId, |
| 1009 MakeIOVectorFromStringPiece( |
| 1010 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 1011 0u, 0u, false, false, &frame); |
| 1012 creator_.Flush(); |
| 1013 delete frame.stream_frame; |
| 1014 // 1 byte padding is sent. |
| 1015 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes()); |
| 1016 // Send stream frame of size kStreamFramePayloadSize + 1. |
| 1017 creator_.ConsumeData(kCryptoStreamId, |
| 1018 MakeIOVectorFromStringPiece( |
| 1019 QuicStringPiece(buf, kStreamFramePayloadSize + 1)), |
| 1020 0u, 0u, false, false, &frame); |
| 1021 // No padding is sent. |
| 1022 creator_.Flush(); |
| 1023 delete frame.stream_frame; |
| 1024 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes()); |
| 1025 // Flush all paddings. |
| 1026 while (creator_.pending_padding_bytes() > 0) { |
| 1027 creator_.Flush(); |
| 1028 } |
| 1029 EXPECT_EQ(0u, creator_.pending_padding_bytes()); |
| 1030 } |
| 1031 |
856 } // namespace | 1032 } // namespace |
857 } // namespace test | 1033 } // namespace test |
858 } // namespace net | 1034 } // namespace net |
OLD | NEW |