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 |