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_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
6 | 6 |
7 #include <cstdint> | 7 #include <cstdint> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 | 29 |
30 using std::string; | 30 using std::string; |
31 | 31 |
32 namespace net { | 32 namespace net { |
33 | 33 |
34 namespace { | 34 namespace { |
35 | 35 |
36 #define ENDPOINT \ | 36 #define ENDPOINT \ |
37 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") | 37 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") |
38 | 38 |
39 // Mask to select the lowest 48 bits of a packet number. | |
40 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF); | |
41 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF); | |
42 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF); | |
43 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF); | |
44 | |
45 // Number of bits the packet number length bits are shifted from the right | 39 // Number of bits the packet number length bits are shifted from the right |
46 // edge of the public header. | 40 // edge of the public header. |
47 const uint8_t kPublicHeaderSequenceNumberShift = 4; | 41 const uint8_t kPublicHeaderSequenceNumberShift = 4; |
48 | 42 |
49 // New Frame Types, QUIC v. >= 10: | 43 // New Frame Types, QUIC v. >= 10: |
50 // There are two interpretations for the Frame Type byte in the QUIC protocol, | 44 // There are two interpretations for the Frame Type byte in the QUIC protocol, |
51 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. | 45 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. |
52 // | 46 // |
53 // Regular Frame Types use the Frame Type byte simply. Currently defined | 47 // Regular Frame Types use the Frame Type byte simply. Currently defined |
54 // Regular Frame Types are: | 48 // Regular Frame Types are: |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} | 306 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
313 | 307 |
314 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; | 308 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; |
315 | 309 |
316 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
317 | 311 |
318 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 312 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
319 const QuicFrames& frames, | 313 const QuicFrames& frames, |
320 char* buffer, | 314 char* buffer, |
321 size_t packet_length) { | 315 size_t packet_length) { |
322 QuicDataWriter writer(packet_length, buffer, perspective_); | 316 QuicDataWriter writer(packet_length, buffer, perspective_, endianness()); |
323 if (!AppendPacketHeader(header, &writer)) { | 317 if (!AppendPacketHeader(header, &writer)) { |
324 QUIC_BUG << "AppendPacketHeader failed"; | 318 QUIC_BUG << "AppendPacketHeader failed"; |
325 return 0; | 319 return 0; |
326 } | 320 } |
327 | 321 |
328 size_t i = 0; | 322 size_t i = 0; |
329 for (const QuicFrame& frame : frames) { | 323 for (const QuicFrame& frame : frames) { |
330 // Determine if we should write stream frame length in header. | 324 // Determine if we should write stream frame length in header. |
331 const bool no_stream_frame_length = i == frames.size() - 1; | 325 const bool no_stream_frame_length = i == frames.size() - 1; |
332 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | 326 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 } | 404 } |
411 | 405 |
412 // static | 406 // static |
413 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket( | 407 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket( |
414 const QuicPublicResetPacket& packet) { | 408 const QuicPublicResetPacket& packet) { |
415 DCHECK(packet.public_header.reset_flag); | 409 DCHECK(packet.public_header.reset_flag); |
416 | 410 |
417 CryptoHandshakeMessage reset; | 411 CryptoHandshakeMessage reset; |
418 reset.set_tag(kPRST); | 412 reset.set_tag(kPRST); |
419 reset.SetValue(kRNON, packet.nonce_proof); | 413 reset.SetValue(kRNON, packet.nonce_proof); |
420 if (!FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) { | |
421 reset.SetValue(kRSEQ, packet.rejected_packet_number); | |
422 } | |
423 if (packet.client_address.host().address_family() != | 414 if (packet.client_address.host().address_family() != |
424 IpAddressFamily::IP_UNSPEC) { | 415 IpAddressFamily::IP_UNSPEC) { |
425 // packet.client_address is non-empty. | 416 // packet.client_address is non-empty. |
426 QuicSocketAddressCoder address_coder(packet.client_address); | 417 QuicSocketAddressCoder address_coder(packet.client_address); |
427 string serialized_address = address_coder.Encode(); | 418 string serialized_address = address_coder.Encode(); |
428 if (serialized_address.empty()) { | 419 if (serialized_address.empty()) { |
429 return nullptr; | 420 return nullptr; |
430 } | 421 } |
431 reset.SetStringPiece(kCADR, serialized_address); | 422 reset.SetStringPiece(kCADR, serialized_address); |
432 } | 423 } |
433 const QuicData& reset_serialized = | 424 const QuicData& reset_serialized = |
434 reset.GetSerialized(Perspective::IS_SERVER); | 425 reset.GetSerialized(Perspective::IS_SERVER); |
435 | 426 |
436 size_t len = | 427 size_t len = |
437 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | 428 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
438 std::unique_ptr<char[]> buffer(new char[len]); | 429 std::unique_ptr<char[]> buffer(new char[len]); |
439 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 430 // Endianness is not a concern here, as writer is not going to write integers |
| 431 // or floating numbers. |
| 432 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 433 NETWORK_BYTE_ORDER); |
440 | 434 |
441 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | | 435 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | |
442 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 436 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
443 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { | 437 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { |
444 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 438 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
445 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 439 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
446 } | 440 } |
447 if (!writer.WriteUInt8(flags)) { | 441 if (!writer.WriteUInt8(flags)) { |
448 return nullptr; | 442 return nullptr; |
449 } | 443 } |
450 | 444 |
451 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { | 445 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { |
452 return nullptr; | 446 return nullptr; |
453 } | 447 } |
454 | 448 |
455 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 449 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
456 return nullptr; | 450 return nullptr; |
457 } | 451 } |
458 | 452 |
459 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 453 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
460 } | 454 } |
461 | 455 |
462 // static | 456 // static |
463 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( | 457 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( |
464 QuicConnectionId connection_id, | 458 QuicConnectionId connection_id, |
465 const QuicVersionVector& versions) { | 459 const QuicVersionVector& versions) { |
466 DCHECK(!versions.empty()); | 460 DCHECK(!versions.empty()); |
467 size_t len = GetVersionNegotiationPacketSize(versions.size()); | 461 size_t len = GetVersionNegotiationPacketSize(versions.size()); |
468 std::unique_ptr<char[]> buffer(new char[len]); | 462 std::unique_ptr<char[]> buffer(new char[len]); |
469 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 463 // Endianness is not a concern here, version negotiation packet does not have |
| 464 // integers or floating numbers. |
| 465 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 466 NETWORK_BYTE_ORDER); |
470 | 467 |
471 uint8_t flags = static_cast<uint8_t>( | 468 uint8_t flags = static_cast<uint8_t>( |
472 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | | 469 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | |
473 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 470 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
474 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
475 if (!writer.WriteUInt8(flags)) { | 472 if (!writer.WriteUInt8(flags)) { |
476 return nullptr; | 473 return nullptr; |
477 } | 474 } |
478 | 475 |
479 if (!writer.WriteConnectionId(connection_id)) { | 476 if (!writer.WriteConnectionId(connection_id)) { |
480 return nullptr; | 477 return nullptr; |
481 } | 478 } |
482 | 479 |
483 for (QuicVersion version : versions) { | 480 for (QuicVersion version : versions) { |
484 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { | 481 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { |
485 return nullptr; | 482 return nullptr; |
486 } | 483 } |
487 } | 484 } |
488 | 485 |
489 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 486 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
490 } | 487 } |
491 | 488 |
492 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 489 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
493 QuicDataReader reader(packet.data(), packet.length(), perspective_); | 490 QuicDataReader reader(packet.data(), packet.length(), perspective_, |
| 491 endianness()); |
494 | 492 |
495 visitor_->OnPacket(); | 493 visitor_->OnPacket(); |
496 | 494 |
497 // First parse the public header. | 495 // First parse the public header. |
498 QuicPacketPublicHeader public_header; | 496 QuicPacketPublicHeader public_header; |
499 if (!ProcessPublicHeader(&reader, &public_header)) { | 497 if (!ProcessPublicHeader(&reader, &public_header)) { |
500 DCHECK_NE("", detailed_error_); | 498 DCHECK_NE("", detailed_error_); |
501 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " | 499 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " |
502 << detailed_error_; | 500 << detailed_error_; |
503 DCHECK_NE("", detailed_error_); | 501 DCHECK_NE("", detailed_error_); |
504 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 502 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
505 } | 503 } |
506 | 504 |
507 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | 505 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
508 // The visitor suppresses further processing of the packet. | 506 // The visitor suppresses further processing of the packet. |
509 return true; | 507 return true; |
510 } | 508 } |
511 | 509 |
512 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && | 510 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && |
513 public_header.versions[0] != quic_version_) { | 511 public_header.versions[0] != quic_version_) { |
514 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { | 512 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { |
515 return true; | 513 return true; |
516 } | 514 } |
517 } | 515 } |
518 | 516 |
| 517 // framer's version may change, reset reader's endianness. |
| 518 reader.set_endianness(endianness()); |
| 519 |
519 bool rv; | 520 bool rv; |
520 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { | 521 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { |
521 rv = ProcessVersionNegotiationPacket(&reader, &public_header); | 522 rv = ProcessVersionNegotiationPacket(&reader, &public_header); |
522 } else if (public_header.reset_flag) { | 523 } else if (public_header.reset_flag) { |
523 rv = ProcessPublicResetPacket(&reader, public_header); | 524 rv = ProcessPublicResetPacket(&reader, public_header); |
524 } else if (packet.length() <= kMaxPacketSize) { | 525 } else if (packet.length() <= kMaxPacketSize) { |
525 // The optimized decryption algorithm implementations run faster when | 526 // The optimized decryption algorithm implementations run faster when |
526 // operating on aligned memory. | 527 // operating on aligned memory. |
527 QUIC_CACHELINE_ALIGNED char buffer[kMaxPacketSize]; | 528 QUIC_CACHELINE_ALIGNED char buffer[kMaxPacketSize]; |
528 rv = ProcessDataPacket(&reader, public_header, packet, buffer, | 529 rv = ProcessDataPacket(&reader, public_header, packet, buffer, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 return false; | 572 return false; |
572 } | 573 } |
573 | 574 |
574 size_t decrypted_length = 0; | 575 size_t decrypted_length = 0; |
575 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 576 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
576 buffer_length, &decrypted_length)) { | 577 buffer_length, &decrypted_length)) { |
577 set_detailed_error("Unable to decrypt payload."); | 578 set_detailed_error("Unable to decrypt payload."); |
578 return RaiseError(QUIC_DECRYPTION_FAILURE); | 579 return RaiseError(QUIC_DECRYPTION_FAILURE); |
579 } | 580 } |
580 | 581 |
581 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_); | 582 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_, |
| 583 endianness()); |
582 | 584 |
583 // Set the last packet number after we have decrypted the packet | 585 // Set the last packet number after we have decrypted the packet |
584 // so we are confident is not attacker controlled. | 586 // so we are confident is not attacker controlled. |
585 SetLastPacketNumber(header); | 587 SetLastPacketNumber(header); |
586 | 588 |
587 if (!visitor_->OnPacketHeader(header)) { | 589 if (!visitor_->OnPacketHeader(header)) { |
588 // The visitor suppresses further processing of the packet. | 590 // The visitor suppresses further processing of the packet. |
589 return true; | 591 return true; |
590 } | 592 } |
591 | 593 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 653 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
652 } | 654 } |
653 if (header.public_header.version_flag) { | 655 if (header.public_header.version_flag) { |
654 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 656 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
655 } | 657 } |
656 if (header.public_header.multipath_flag) { | 658 if (header.public_header.multipath_flag) { |
657 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; | 659 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; |
658 } | 660 } |
659 | 661 |
660 public_flags |= | 662 public_flags |= |
661 GetSequenceNumberFlags(header.public_header.packet_number_length) | 663 GetPacketNumberFlags(header.public_header.packet_number_length) |
662 << kPublicHeaderSequenceNumberShift; | 664 << kPublicHeaderSequenceNumberShift; |
663 | 665 |
664 if (header.public_header.nonce != nullptr) { | 666 if (header.public_header.nonce != nullptr) { |
665 DCHECK_EQ(Perspective::IS_SERVER, perspective_); | 667 DCHECK_EQ(Perspective::IS_SERVER, perspective_); |
666 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; | 668 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; |
667 } | 669 } |
668 | 670 |
669 switch (header.public_header.connection_id_length) { | 671 switch (header.public_header.connection_id_length) { |
670 case PACKET_0BYTE_CONNECTION_ID: | 672 case PACKET_0BYTE_CONNECTION_ID: |
671 if (!writer->WriteUInt8(public_flags | | 673 if (!writer->WriteUInt8(public_flags | |
(...skipping 24 matching lines...) Expand all Loading... |
696 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" | 698 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" |
697 << QuicTagToString(tag) << "'"; | 699 << QuicTagToString(tag) << "'"; |
698 } | 700 } |
699 | 701 |
700 if (header.public_header.nonce != nullptr && | 702 if (header.public_header.nonce != nullptr && |
701 !writer->WriteBytes(header.public_header.nonce, | 703 !writer->WriteBytes(header.public_header.nonce, |
702 kDiversificationNonceSize)) { | 704 kDiversificationNonceSize)) { |
703 return false; | 705 return false; |
704 } | 706 } |
705 | 707 |
706 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 708 if (!AppendPacketNumber(header.public_header.packet_number_length, |
707 header.packet_number, writer)) { | 709 header.packet_number, writer)) { |
708 return false; | 710 return false; |
709 } | 711 } |
710 | 712 |
711 return true; | 713 return true; |
712 } | 714 } |
713 | 715 |
714 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 716 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
715 uint32_t time_delta_us) { | 717 uint32_t time_delta_us) { |
716 // The new time_delta might have wrapped to the next epoch, or it | 718 // The new time_delta might have wrapped to the next epoch, or it |
717 // might have reverse wrapped to the previous epoch, or it might | 719 // might have reverse wrapped to the previous epoch, or it might |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
853 } | 855 } |
854 public_header->nonce = &last_nonce_; | 856 public_header->nonce = &last_nonce_; |
855 } else { | 857 } else { |
856 public_header->nonce = nullptr; | 858 public_header->nonce = nullptr; |
857 } | 859 } |
858 | 860 |
859 return true; | 861 return true; |
860 } | 862 } |
861 | 863 |
862 // static | 864 // static |
863 QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength( | 865 QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength( |
864 QuicPacketNumber packet_number) { | 866 QuicPacketNumber packet_number) { |
865 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { | 867 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { |
866 return PACKET_1BYTE_PACKET_NUMBER; | 868 return PACKET_1BYTE_PACKET_NUMBER; |
867 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { | 869 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { |
868 return PACKET_2BYTE_PACKET_NUMBER; | 870 return PACKET_2BYTE_PACKET_NUMBER; |
869 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { | 871 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { |
870 return PACKET_4BYTE_PACKET_NUMBER; | 872 return PACKET_4BYTE_PACKET_NUMBER; |
871 } else { | 873 } else { |
872 return PACKET_6BYTE_PACKET_NUMBER; | 874 return PACKET_6BYTE_PACKET_NUMBER; |
873 } | 875 } |
874 } | 876 } |
875 | 877 |
876 // static | 878 // static |
877 uint8_t QuicFramer::GetSequenceNumberFlags( | 879 uint8_t QuicFramer::GetPacketNumberFlags( |
878 QuicPacketNumberLength packet_number_length) { | 880 QuicPacketNumberLength packet_number_length) { |
879 switch (packet_number_length) { | 881 switch (packet_number_length) { |
880 case PACKET_1BYTE_PACKET_NUMBER: | 882 case PACKET_1BYTE_PACKET_NUMBER: |
881 return PACKET_FLAGS_1BYTE_PACKET; | 883 return PACKET_FLAGS_1BYTE_PACKET; |
882 case PACKET_2BYTE_PACKET_NUMBER: | 884 case PACKET_2BYTE_PACKET_NUMBER: |
883 return PACKET_FLAGS_2BYTE_PACKET; | 885 return PACKET_FLAGS_2BYTE_PACKET; |
884 case PACKET_4BYTE_PACKET_NUMBER: | 886 case PACKET_4BYTE_PACKET_NUMBER: |
885 return PACKET_FLAGS_4BYTE_PACKET; | 887 return PACKET_FLAGS_4BYTE_PACKET; |
886 case PACKET_6BYTE_PACKET_NUMBER: | 888 case PACKET_6BYTE_PACKET_NUMBER: |
887 return PACKET_FLAGS_6BYTE_PACKET; | 889 return PACKET_FLAGS_6BYTE_PACKET; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 new_ack_info.max_block_length = | 921 new_ack_info.max_block_length = |
920 std::max(new_ack_info.max_block_length, interval.Length()); | 922 std::max(new_ack_info.max_block_length, interval.Length()); |
921 } | 923 } |
922 return new_ack_info; | 924 return new_ack_info; |
923 } | 925 } |
924 | 926 |
925 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 927 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
926 QuicPacketHeader* header) { | 928 QuicPacketHeader* header) { |
927 QuicPacketNumber base_packet_number = largest_packet_number_; | 929 QuicPacketNumber base_packet_number = largest_packet_number_; |
928 | 930 |
929 if (!ProcessPacketSequenceNumber( | 931 if (!ProcessAndCalculatePacketNumber( |
930 encrypted_reader, header->public_header.packet_number_length, | 932 encrypted_reader, header->public_header.packet_number_length, |
931 base_packet_number, &header->packet_number)) { | 933 base_packet_number, &header->packet_number)) { |
932 set_detailed_error("Unable to read packet number."); | 934 set_detailed_error("Unable to read packet number."); |
933 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 935 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
934 } | 936 } |
935 | 937 |
936 if (header->packet_number == 0u) { | 938 if (header->packet_number == 0u) { |
937 set_detailed_error("packet numbers cannot be 0."); | 939 set_detailed_error("packet numbers cannot be 0."); |
938 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 940 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
939 } | 941 } |
940 | 942 |
941 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 943 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
942 set_detailed_error( | 944 set_detailed_error( |
943 "Visitor asked to stop processing of unauthenticated header."); | 945 "Visitor asked to stop processing of unauthenticated header."); |
944 return false; | 946 return false; |
945 } | 947 } |
946 return true; | 948 return true; |
947 } | 949 } |
948 | 950 |
949 bool QuicFramer::ProcessPacketSequenceNumber( | 951 bool QuicFramer::ProcessAndCalculatePacketNumber( |
950 QuicDataReader* reader, | 952 QuicDataReader* reader, |
951 QuicPacketNumberLength packet_number_length, | 953 QuicPacketNumberLength packet_number_length, |
952 QuicPacketNumber base_packet_number, | 954 QuicPacketNumber base_packet_number, |
953 QuicPacketNumber* packet_number) { | 955 QuicPacketNumber* packet_number) { |
954 QuicPacketNumber wire_packet_number = 0u; | 956 QuicPacketNumber wire_packet_number = 0u; |
955 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { | 957 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) { |
956 return false; | 958 return false; |
957 } | 959 } |
958 | 960 |
959 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers | 961 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers |
960 // in case the first guess is incorrect. | 962 // in case the first guess is incorrect. |
961 *packet_number = CalculatePacketNumberFromWire( | 963 *packet_number = CalculatePacketNumberFromWire( |
962 packet_number_length, base_packet_number, wire_packet_number); | 964 packet_number_length, base_packet_number, wire_packet_number); |
963 return true; | 965 return true; |
964 } | 966 } |
965 | 967 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 offset_length += 1; | 1152 offset_length += 1; |
1151 } | 1153 } |
1152 stream_flags >>= kQuicStreamOffsetShift; | 1154 stream_flags >>= kQuicStreamOffsetShift; |
1153 | 1155 |
1154 bool has_data_length = | 1156 bool has_data_length = |
1155 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; | 1157 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; |
1156 stream_flags >>= kQuicStreamDataLengthShift; | 1158 stream_flags >>= kQuicStreamDataLengthShift; |
1157 | 1159 |
1158 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; | 1160 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; |
1159 | 1161 |
1160 frame->stream_id = 0; | 1162 uint64_t stream_id = 0; |
1161 if (!reader->ReadBytes(&frame->stream_id, stream_id_length)) { | 1163 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) { |
1162 set_detailed_error("Unable to read stream_id."); | 1164 set_detailed_error("Unable to read stream_id."); |
1163 return false; | 1165 return false; |
1164 } | 1166 } |
| 1167 frame->stream_id = static_cast<QuicStreamId>(stream_id); |
1165 | 1168 |
1166 frame->offset = 0; | 1169 frame->offset = 0; |
1167 if (!reader->ReadBytes(&frame->offset, offset_length)) { | 1170 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) { |
1168 set_detailed_error("Unable to read offset."); | 1171 set_detailed_error("Unable to read offset."); |
1169 return false; | 1172 return false; |
1170 } | 1173 } |
1171 | 1174 |
1172 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. | 1175 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. |
1173 QuicStringPiece data; | 1176 QuicStringPiece data; |
1174 if (has_data_length) { | 1177 if (has_data_length) { |
1175 if (!reader->ReadStringPiece16(&data)) { | 1178 if (!reader->ReadStringPiece16(&data)) { |
1176 set_detailed_error("Unable to read frame data."); | 1179 set_detailed_error("Unable to read frame data."); |
1177 return false; | 1180 return false; |
(...skipping 17 matching lines...) Expand all Loading... |
1195 // ack block length. | 1198 // ack block length. |
1196 const QuicPacketNumberLength ack_block_length = | 1199 const QuicPacketNumberLength ack_block_length = |
1197 ReadSequenceNumberLength(frame_type); | 1200 ReadSequenceNumberLength(frame_type); |
1198 frame_type >>= kQuicSequenceNumberLengthShift; | 1201 frame_type >>= kQuicSequenceNumberLengthShift; |
1199 const QuicPacketNumberLength largest_acked_length = | 1202 const QuicPacketNumberLength largest_acked_length = |
1200 ReadSequenceNumberLength(frame_type); | 1203 ReadSequenceNumberLength(frame_type); |
1201 frame_type >>= kQuicSequenceNumberLengthShift; | 1204 frame_type >>= kQuicSequenceNumberLengthShift; |
1202 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1205 frame_type >>= kQuicHasMultipleAckBlocksShift; |
1203 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1206 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
1204 | 1207 |
1205 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { | 1208 if (!reader->ReadBytesToUInt64(largest_acked_length, |
| 1209 &ack_frame->largest_observed)) { |
1206 set_detailed_error("Unable to read largest acked."); | 1210 set_detailed_error("Unable to read largest acked."); |
1207 return false; | 1211 return false; |
1208 } | 1212 } |
1209 | 1213 |
1210 uint64_t ack_delay_time_us; | 1214 uint64_t ack_delay_time_us; |
1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | 1215 if (!reader->ReadUFloat16(&ack_delay_time_us)) { |
1212 set_detailed_error("Unable to read ack delay time."); | 1216 set_detailed_error("Unable to read ack delay time."); |
1213 return false; | 1217 return false; |
1214 } | 1218 } |
1215 | 1219 |
1216 if (ack_delay_time_us == kUFloat16MaxValue) { | 1220 if (ack_delay_time_us == kUFloat16MaxValue) { |
1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | 1221 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); |
1218 } else { | 1222 } else { |
1219 ack_frame->ack_delay_time = | 1223 ack_frame->ack_delay_time = |
1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); | 1224 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); |
1221 } | 1225 } |
1222 | 1226 |
1223 uint8_t num_ack_blocks = 0; | 1227 uint8_t num_ack_blocks = 0; |
1224 if (has_ack_blocks) { | 1228 if (has_ack_blocks) { |
1225 if (!reader->ReadBytes(&num_ack_blocks, 1)) { | 1229 if (!reader->ReadUInt8(&num_ack_blocks)) { |
1226 set_detailed_error("Unable to read num of ack blocks."); | 1230 set_detailed_error("Unable to read num of ack blocks."); |
1227 return false; | 1231 return false; |
1228 } | 1232 } |
1229 } | 1233 } |
1230 | 1234 |
1231 size_t first_block_length = 0; | 1235 uint64_t first_block_length = 0; |
1232 if (!reader->ReadBytes(&first_block_length, ack_block_length)) { | 1236 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) { |
1233 set_detailed_error("Unable to read first ack block length."); | 1237 set_detailed_error("Unable to read first ack block length."); |
1234 return false; | 1238 return false; |
1235 } | 1239 } |
1236 QuicPacketNumber first_received = | 1240 QuicPacketNumber first_received = |
1237 ack_frame->largest_observed + 1 - first_block_length; | 1241 ack_frame->largest_observed + 1 - first_block_length; |
1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); | 1242 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); |
1239 | 1243 |
1240 if (num_ack_blocks > 0) { | 1244 if (num_ack_blocks > 0) { |
1241 for (size_t i = 0; i < num_ack_blocks; ++i) { | 1245 for (size_t i = 0; i < num_ack_blocks; ++i) { |
1242 size_t gap = 0; | 1246 uint8_t gap = 0; |
1243 if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) { | 1247 if (!reader->ReadUInt8(&gap)) { |
1244 set_detailed_error("Unable to read gap to next ack block."); | 1248 set_detailed_error("Unable to read gap to next ack block."); |
1245 return false; | 1249 return false; |
1246 } | 1250 } |
1247 size_t current_block_length = 0; | 1251 uint64_t current_block_length = 0; |
1248 if (!reader->ReadBytes(¤t_block_length, ack_block_length)) { | 1252 if (!reader->ReadBytesToUInt64(ack_block_length, ¤t_block_length)) { |
1249 set_detailed_error("Unable to ack block length."); | 1253 set_detailed_error("Unable to ack block length."); |
1250 return false; | 1254 return false; |
1251 } | 1255 } |
1252 first_received -= (gap + current_block_length); | 1256 first_received -= (gap + current_block_length); |
1253 if (current_block_length > 0) { | 1257 if (current_block_length > 0) { |
1254 ack_frame->packets.Add(first_received, | 1258 ack_frame->packets.Add(first_received, |
1255 first_received + current_block_length); | 1259 first_received + current_block_length); |
1256 } | 1260 } |
1257 } | 1261 } |
1258 } | 1262 } |
1259 | 1263 |
1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | 1264 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { |
1261 return false; | 1265 return false; |
1262 } | 1266 } |
1263 | 1267 |
1264 return true; | 1268 return true; |
1265 } | 1269 } |
1266 | 1270 |
1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1271 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
1268 QuicAckFrame* ack_frame) { | 1272 QuicAckFrame* ack_frame) { |
1269 uint8_t num_received_packets; | 1273 uint8_t num_received_packets; |
1270 if (!reader->ReadBytes(&num_received_packets, 1)) { | 1274 if (!reader->ReadUInt8(&num_received_packets)) { |
1271 set_detailed_error("Unable to read num received packets."); | 1275 set_detailed_error("Unable to read num received packets."); |
1272 return false; | 1276 return false; |
1273 } | 1277 } |
1274 | 1278 |
1275 if (num_received_packets > 0) { | 1279 if (num_received_packets > 0) { |
1276 uint8_t delta_from_largest_observed; | 1280 uint8_t delta_from_largest_observed; |
1277 if (!reader->ReadBytes(&delta_from_largest_observed, | 1281 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
1278 PACKET_1BYTE_PACKET_NUMBER)) { | |
1279 set_detailed_error("Unable to read sequence delta in received packets."); | 1282 set_detailed_error("Unable to read sequence delta in received packets."); |
1280 return false; | 1283 return false; |
1281 } | 1284 } |
1282 QuicPacketNumber seq_num = | 1285 QuicPacketNumber seq_num = |
1283 ack_frame->largest_observed - delta_from_largest_observed; | 1286 ack_frame->largest_observed - delta_from_largest_observed; |
1284 | 1287 |
1285 // Time delta from the framer creation. | 1288 // Time delta from the framer creation. |
1286 uint32_t time_delta_us; | 1289 uint32_t time_delta_us; |
1287 if (!reader->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | 1290 if (!reader->ReadUInt32(&time_delta_us)) { |
1288 set_detailed_error("Unable to read time delta in received packets."); | 1291 set_detailed_error("Unable to read time delta in received packets."); |
1289 return false; | 1292 return false; |
1290 } | 1293 } |
1291 | 1294 |
1292 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); | 1295 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); |
1293 | 1296 |
1294 ack_frame->received_packet_times.reserve(num_received_packets); | 1297 ack_frame->received_packet_times.reserve(num_received_packets); |
1295 ack_frame->received_packet_times.push_back( | 1298 ack_frame->received_packet_times.push_back( |
1296 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1299 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
1297 | 1300 |
1298 for (uint8_t i = 1; i < num_received_packets; ++i) { | 1301 for (uint8_t i = 1; i < num_received_packets; ++i) { |
1299 if (!reader->ReadBytes(&delta_from_largest_observed, | 1302 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
1300 PACKET_1BYTE_PACKET_NUMBER)) { | |
1301 set_detailed_error( | 1303 set_detailed_error( |
1302 "Unable to read sequence delta in received packets."); | 1304 "Unable to read sequence delta in received packets."); |
1303 return false; | 1305 return false; |
1304 } | 1306 } |
1305 seq_num = ack_frame->largest_observed - delta_from_largest_observed; | 1307 seq_num = ack_frame->largest_observed - delta_from_largest_observed; |
1306 | 1308 |
1307 // Time delta from the previous timestamp. | 1309 // Time delta from the previous timestamp. |
1308 uint64_t incremental_time_delta_us; | 1310 uint64_t incremental_time_delta_us; |
1309 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { | 1311 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { |
1310 set_detailed_error( | 1312 set_detailed_error( |
1311 "Unable to read incremental time delta in received packets."); | 1313 "Unable to read incremental time delta in received packets."); |
1312 return false; | 1314 return false; |
1313 } | 1315 } |
1314 | 1316 |
1315 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( | 1317 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( |
1316 incremental_time_delta_us); | 1318 incremental_time_delta_us); |
1317 ack_frame->received_packet_times.push_back( | 1319 ack_frame->received_packet_times.push_back( |
1318 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1320 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
1319 } | 1321 } |
1320 } | 1322 } |
1321 return true; | 1323 return true; |
1322 } | 1324 } |
1323 | 1325 |
1324 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, | 1326 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, |
1325 const QuicPacketHeader& header, | 1327 const QuicPacketHeader& header, |
1326 QuicStopWaitingFrame* stop_waiting) { | 1328 QuicStopWaitingFrame* stop_waiting) { |
1327 QuicPacketNumber least_unacked_delta = 0; | 1329 QuicPacketNumber least_unacked_delta = 0; |
1328 if (!reader->ReadBytes(&least_unacked_delta, | 1330 if (!reader->ReadBytesToUInt64(header.public_header.packet_number_length, |
1329 header.public_header.packet_number_length)) { | 1331 &least_unacked_delta)) { |
1330 set_detailed_error("Unable to read least unacked delta."); | 1332 set_detailed_error("Unable to read least unacked delta."); |
1331 return false; | 1333 return false; |
1332 } | 1334 } |
1333 DCHECK_GE(header.packet_number, least_unacked_delta); | 1335 DCHECK_GE(header.packet_number, least_unacked_delta); |
1334 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; | 1336 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; |
1335 | 1337 |
1336 return true; | 1338 return true; |
1337 } | 1339 } |
1338 | 1340 |
1339 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, | 1341 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1644 return 5 + 3 * (ack.received_packet_times.size() - 1); | 1646 return 5 + 3 * (ack.received_packet_times.size() - 1); |
1645 } | 1647 } |
1646 | 1648 |
1647 size_t QuicFramer::GetAckFrameSize( | 1649 size_t QuicFramer::GetAckFrameSize( |
1648 const QuicAckFrame& ack, | 1650 const QuicAckFrame& ack, |
1649 QuicPacketNumberLength packet_number_length) { | 1651 QuicPacketNumberLength packet_number_length) { |
1650 size_t ack_size = 0; | 1652 size_t ack_size = 0; |
1651 | 1653 |
1652 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1654 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
1653 QuicPacketNumberLength largest_acked_length = | 1655 QuicPacketNumberLength largest_acked_length = |
1654 GetMinSequenceNumberLength(ack.largest_observed); | 1656 GetMinPacketNumberLength(ack.largest_observed); |
1655 QuicPacketNumberLength ack_block_length = | 1657 QuicPacketNumberLength ack_block_length = |
1656 GetMinSequenceNumberLength(ack_info.max_block_length); | 1658 GetMinPacketNumberLength(ack_info.max_block_length); |
1657 | 1659 |
1658 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1660 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
1659 // First ack block length. | 1661 // First ack block length. |
1660 ack_size += ack_block_length; | 1662 ack_size += ack_block_length; |
1661 if (ack_info.num_ack_blocks != 0) { | 1663 if (ack_info.num_ack_blocks != 0) { |
1662 ack_size += kNumberOfAckBlocksSize; | 1664 ack_size += kNumberOfAckBlocksSize; |
1663 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * | 1665 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * |
1664 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); | 1666 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); |
1665 } | 1667 } |
1666 | 1668 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1750 break; | 1752 break; |
1751 default: | 1753 default: |
1752 type_byte = static_cast<uint8_t>(frame.type); | 1754 type_byte = static_cast<uint8_t>(frame.type); |
1753 break; | 1755 break; |
1754 } | 1756 } |
1755 | 1757 |
1756 return writer->WriteUInt8(type_byte); | 1758 return writer->WriteUInt8(type_byte); |
1757 } | 1759 } |
1758 | 1760 |
1759 // static | 1761 // static |
1760 bool QuicFramer::AppendPacketSequenceNumber( | 1762 bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length, |
1761 QuicPacketNumberLength packet_number_length, | 1763 QuicPacketNumber packet_number, |
1762 QuicPacketNumber packet_number, | 1764 QuicDataWriter* writer) { |
1763 QuicDataWriter* writer) { | 1765 size_t length = packet_number_length; |
1764 // Ensure the entire packet number can be written. | 1766 if (length != 1 && length != 2 && length != 4 && length != 6) { |
1765 if (writer->capacity() - writer->length() < | 1767 QUIC_BUG << "Invalid packet_number_length: " << length; |
1766 static_cast<size_t>(packet_number_length)) { | |
1767 return false; | 1768 return false; |
1768 } | 1769 } |
1769 switch (packet_number_length) { | 1770 return writer->WriteBytesToUInt64(packet_number_length, packet_number); |
1770 case PACKET_1BYTE_PACKET_NUMBER: | |
1771 return writer->WriteUInt8(packet_number & k1ByteSequenceNumberMask); | |
1772 break; | |
1773 case PACKET_2BYTE_PACKET_NUMBER: | |
1774 return writer->WriteUInt16(packet_number & k2ByteSequenceNumberMask); | |
1775 break; | |
1776 case PACKET_4BYTE_PACKET_NUMBER: | |
1777 return writer->WriteUInt32(packet_number & k4ByteSequenceNumberMask); | |
1778 break; | |
1779 case PACKET_6BYTE_PACKET_NUMBER: | |
1780 return writer->WriteUInt48(packet_number & k6ByteSequenceNumberMask); | |
1781 break; | |
1782 default: | |
1783 DCHECK(false) << "packet_number_length: " << packet_number_length; | |
1784 return false; | |
1785 } | |
1786 } | 1771 } |
1787 | 1772 |
1788 // static | 1773 // static |
| 1774 bool QuicFramer::AppendStreamId(size_t stream_id_length, |
| 1775 QuicStreamId stream_id, |
| 1776 QuicDataWriter* writer) { |
| 1777 if (stream_id_length == 0 || stream_id_length > 4) { |
| 1778 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length; |
| 1779 return false; |
| 1780 } |
| 1781 return writer->WriteBytesToUInt64(stream_id_length, stream_id); |
| 1782 } |
| 1783 |
| 1784 // static |
| 1785 bool QuicFramer::AppendStreamOffset(size_t offset_length, |
| 1786 QuicStreamOffset offset, |
| 1787 QuicDataWriter* writer) { |
| 1788 if (offset_length == 1 || offset_length > 8) { |
| 1789 QUIC_BUG << "Invalid stream_offset_length: " << offset_length; |
| 1790 return false; |
| 1791 } |
| 1792 |
| 1793 return writer->WriteBytesToUInt64(offset_length, offset); |
| 1794 } |
| 1795 |
| 1796 // static |
1789 bool QuicFramer::AppendAckBlock(uint8_t gap, | 1797 bool QuicFramer::AppendAckBlock(uint8_t gap, |
1790 QuicPacketNumberLength length_length, | 1798 QuicPacketNumberLength length_length, |
1791 QuicPacketNumber length, | 1799 QuicPacketNumber length, |
1792 QuicDataWriter* writer) { | 1800 QuicDataWriter* writer) { |
1793 return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) && | 1801 return writer->WriteUInt8(gap) && |
1794 AppendPacketSequenceNumber(length_length, length, writer); | 1802 AppendPacketNumber(length_length, length, writer); |
1795 } | 1803 } |
1796 | 1804 |
1797 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 1805 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
1798 bool no_stream_frame_length, | 1806 bool no_stream_frame_length, |
1799 QuicDataWriter* writer) { | 1807 QuicDataWriter* writer) { |
1800 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1808 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id, |
| 1809 writer)) { |
1801 QUIC_BUG << "Writing stream id size failed."; | 1810 QUIC_BUG << "Writing stream id size failed."; |
1802 return false; | 1811 return false; |
1803 } | 1812 } |
1804 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1813 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset, |
| 1814 writer)) { |
1805 QUIC_BUG << "Writing offset size failed."; | 1815 QUIC_BUG << "Writing offset size failed."; |
1806 return false; | 1816 return false; |
1807 } | 1817 } |
1808 if (!no_stream_frame_length) { | 1818 if (!no_stream_frame_length) { |
1809 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || | 1819 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || |
1810 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { | 1820 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { |
1811 QUIC_BUG << "Writing stream frame length failed"; | 1821 QUIC_BUG << "Writing stream frame length failed"; |
1812 return false; | 1822 return false; |
1813 } | 1823 } |
1814 } | 1824 } |
1815 | 1825 |
1816 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { | 1826 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { |
1817 QUIC_BUG << "Writing frame data failed."; | 1827 QUIC_BUG << "Writing frame data failed."; |
1818 return false; | 1828 return false; |
1819 } | 1829 } |
1820 return true; | 1830 return true; |
1821 } | 1831 } |
1822 | 1832 |
1823 void QuicFramer::set_version(const QuicVersion version) { | 1833 void QuicFramer::set_version(const QuicVersion version) { |
1824 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1834 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
1825 quic_version_ = version; | 1835 quic_version_ = version; |
1826 } | 1836 } |
1827 | 1837 |
1828 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, | 1838 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, |
1829 QuicDataWriter* writer) { | 1839 QuicDataWriter* writer) { |
1830 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); | 1840 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); |
1831 QuicPacketNumber largest_acked = frame.largest_observed; | 1841 QuicPacketNumber largest_acked = frame.largest_observed; |
1832 QuicPacketNumberLength largest_acked_length = | 1842 QuicPacketNumberLength largest_acked_length = |
1833 GetMinSequenceNumberLength(largest_acked); | 1843 GetMinPacketNumberLength(largest_acked); |
1834 QuicPacketNumberLength ack_block_length = | 1844 QuicPacketNumberLength ack_block_length = |
1835 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1845 GetMinPacketNumberLength(new_ack_info.max_block_length); |
1836 // Calculate available bytes for timestamps and ack blocks. | 1846 // Calculate available bytes for timestamps and ack blocks. |
1837 int32_t available_timestamp_and_ack_block_bytes = | 1847 int32_t available_timestamp_and_ack_block_bytes = |
1838 writer->capacity() - writer->length() - ack_block_length - | 1848 writer->capacity() - writer->length() - ack_block_length - |
1839 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 1849 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
1840 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); | 1850 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
1841 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); | 1851 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); |
1842 | 1852 |
1843 // Write out the type byte by setting the low order bits and doing shifts | 1853 // Write out the type byte by setting the low order bits and doing shifts |
1844 // to make room for the next bit flags to be set. | 1854 // to make room for the next bit flags to be set. |
1845 // Whether there are multiple ack blocks. | 1855 // Whether there are multiple ack blocks. |
1846 uint8_t type_byte = | 1856 uint8_t type_byte = |
1847 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; | 1857 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; |
1848 type_byte <<= kQuicHasMultipleAckBlocksShift; | 1858 type_byte <<= kQuicHasMultipleAckBlocksShift; |
1849 | 1859 |
1850 // Largest acked length. | 1860 // Largest acked length. |
1851 type_byte <<= kQuicSequenceNumberLengthShift; | 1861 type_byte <<= kQuicSequenceNumberLengthShift; |
1852 type_byte |= GetSequenceNumberFlags(largest_acked_length); | 1862 type_byte |= GetPacketNumberFlags(largest_acked_length); |
1853 | 1863 |
1854 // Ack block length. | 1864 // Ack block length. |
1855 type_byte <<= kQuicSequenceNumberLengthShift; | 1865 type_byte <<= kQuicSequenceNumberLengthShift; |
1856 type_byte |= GetSequenceNumberFlags(ack_block_length); | 1866 type_byte |= GetPacketNumberFlags(ack_block_length); |
1857 | 1867 |
1858 type_byte |= kQuicFrameTypeAckMask; | 1868 type_byte |= kQuicFrameTypeAckMask; |
1859 | 1869 |
1860 if (!writer->WriteUInt8(type_byte)) { | 1870 if (!writer->WriteUInt8(type_byte)) { |
1861 return false; | 1871 return false; |
1862 } | 1872 } |
1863 | 1873 |
1864 // Largest acked. | 1874 // Largest acked. |
1865 if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked, | 1875 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) { |
1866 writer)) { | |
1867 return false; | 1876 return false; |
1868 } | 1877 } |
1869 | 1878 |
1870 // Largest acked delta time. | 1879 // Largest acked delta time. |
1871 uint64_t ack_delay_time_us = kUFloat16MaxValue; | 1880 uint64_t ack_delay_time_us = kUFloat16MaxValue; |
1872 if (!frame.ack_delay_time.IsInfinite()) { | 1881 if (!frame.ack_delay_time.IsInfinite()) { |
1873 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | 1882 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); |
1874 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | 1883 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); |
1875 } | 1884 } |
1876 if (!writer->WriteUFloat16(ack_delay_time_us)) { | 1885 if (!writer->WriteUFloat16(ack_delay_time_us)) { |
(...skipping 10 matching lines...) Expand all Loading... |
1887 num_ack_blocks = std::numeric_limits<uint8_t>::max(); | 1896 num_ack_blocks = std::numeric_limits<uint8_t>::max(); |
1888 } | 1897 } |
1889 | 1898 |
1890 if (num_ack_blocks > 0) { | 1899 if (num_ack_blocks > 0) { |
1891 if (!writer->WriteBytes(&num_ack_blocks, 1)) { | 1900 if (!writer->WriteBytes(&num_ack_blocks, 1)) { |
1892 return false; | 1901 return false; |
1893 } | 1902 } |
1894 } | 1903 } |
1895 | 1904 |
1896 // First ack block length. | 1905 // First ack block length. |
1897 if (!AppendPacketSequenceNumber(ack_block_length, | 1906 if (!AppendPacketNumber(ack_block_length, new_ack_info.first_block_length, |
1898 new_ack_info.first_block_length, writer)) { | 1907 writer)) { |
1899 return false; | 1908 return false; |
1900 } | 1909 } |
1901 | 1910 |
1902 // Ack blocks. | 1911 // Ack blocks. |
1903 if (num_ack_blocks > 0) { | 1912 if (num_ack_blocks > 0) { |
1904 size_t num_ack_blocks_written = 0; | 1913 size_t num_ack_blocks_written = 0; |
1905 // Append, in descending order from the largest ACKed packet, a series of | 1914 // Append, in descending order from the largest ACKed packet, a series of |
1906 // ACK blocks that represents the successfully acknoweldged packets. Each | 1915 // ACK blocks that represents the successfully acknoweldged packets. Each |
1907 // appended gap/block length represents a descending delta from the previous | 1916 // appended gap/block length represents a descending delta from the previous |
1908 // block. i.e.: | 1917 // block. i.e.: |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1994 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); | 2003 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); |
1995 QuicPacketNumber packet_number = it->first; | 2004 QuicPacketNumber packet_number = it->first; |
1996 QuicPacketNumber delta_from_largest_observed = | 2005 QuicPacketNumber delta_from_largest_observed = |
1997 frame.largest_observed - packet_number; | 2006 frame.largest_observed - packet_number; |
1998 | 2007 |
1999 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); | 2008 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); |
2000 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2009 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
2001 return false; | 2010 return false; |
2002 } | 2011 } |
2003 | 2012 |
2004 if (!writer->WriteUInt8(delta_from_largest_observed & | 2013 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
2005 k1ByteSequenceNumberMask)) { | |
2006 return false; | 2014 return false; |
2007 } | 2015 } |
2008 | 2016 |
2009 // Use the lowest 4 bytes of the time delta from the creation_time_. | 2017 // Use the lowest 4 bytes of the time delta from the creation_time_. |
2010 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; | 2018 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; |
2011 uint32_t time_delta_us = | 2019 uint32_t time_delta_us = |
2012 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & | 2020 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & |
2013 (time_epoch_delta_us - 1)); | 2021 (time_epoch_delta_us - 1)); |
2014 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | 2022 if (!writer->WriteUInt32(time_delta_us)) { |
2015 return false; | 2023 return false; |
2016 } | 2024 } |
2017 | 2025 |
2018 QuicTime prev_time = it->second; | 2026 QuicTime prev_time = it->second; |
2019 | 2027 |
2020 for (++it; it != frame.received_packet_times.end(); ++it) { | 2028 for (++it; it != frame.received_packet_times.end(); ++it) { |
2021 packet_number = it->first; | 2029 packet_number = it->first; |
2022 delta_from_largest_observed = frame.largest_observed - packet_number; | 2030 delta_from_largest_observed = frame.largest_observed - packet_number; |
2023 | 2031 |
2024 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2032 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
2025 return false; | 2033 return false; |
2026 } | 2034 } |
2027 | 2035 |
2028 if (!writer->WriteUInt8(delta_from_largest_observed & | 2036 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
2029 k1ByteSequenceNumberMask)) { | |
2030 return false; | 2037 return false; |
2031 } | 2038 } |
2032 | 2039 |
2033 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); | 2040 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); |
2034 prev_time = it->second; | 2041 prev_time = it->second; |
2035 if (!writer->WriteUFloat16(frame_time_delta_us)) { | 2042 if (!writer->WriteUFloat16(frame_time_delta_us)) { |
2036 return false; | 2043 return false; |
2037 } | 2044 } |
2038 } | 2045 } |
2039 return true; | 2046 return true; |
(...skipping 10 matching lines...) Expand all Loading... |
2050 | 2057 |
2051 if (least_unacked_delta >> length_shift > 0) { | 2058 if (least_unacked_delta >> length_shift > 0) { |
2052 QUIC_BUG << "packet_number_length " | 2059 QUIC_BUG << "packet_number_length " |
2053 << header.public_header.packet_number_length | 2060 << header.public_header.packet_number_length |
2054 << " is too small for least_unacked_delta: " << least_unacked_delta | 2061 << " is too small for least_unacked_delta: " << least_unacked_delta |
2055 << " packet_number:" << header.packet_number | 2062 << " packet_number:" << header.packet_number |
2056 << " least_unacked:" << frame.least_unacked | 2063 << " least_unacked:" << frame.least_unacked |
2057 << " version:" << quic_version_; | 2064 << " version:" << quic_version_; |
2058 return false; | 2065 return false; |
2059 } | 2066 } |
2060 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 2067 if (!AppendPacketNumber(header.public_header.packet_number_length, |
2061 least_unacked_delta, writer)) { | 2068 least_unacked_delta, writer)) { |
2062 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; | 2069 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; |
2063 return false; | 2070 return false; |
2064 } | 2071 } |
2065 | 2072 |
2066 return true; | 2073 return true; |
2067 } | 2074 } |
2068 | 2075 |
2069 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, | 2076 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, |
2070 QuicDataWriter* writer) { | 2077 QuicDataWriter* writer) { |
2071 if (!writer->WriteUInt32(frame.stream_id)) { | 2078 if (!writer->WriteUInt32(frame.stream_id)) { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2154 } | 2161 } |
2155 | 2162 |
2156 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2163 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2157 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2164 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
2158 << " detail: " << detailed_error_; | 2165 << " detail: " << detailed_error_; |
2159 set_error(error); | 2166 set_error(error); |
2160 visitor_->OnError(this); | 2167 visitor_->OnError(this); |
2161 return false; | 2168 return false; |
2162 } | 2169 } |
2163 | 2170 |
| 2171 Endianness QuicFramer::endianness() const { |
| 2172 return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER; |
| 2173 } |
| 2174 |
2164 } // namespace net | 2175 } // namespace net |
OLD | NEW |