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_, HOST_BYTE_ORDER); |
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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 return nullptr; | 423 return nullptr; |
430 } | 424 } |
431 reset.SetStringPiece(kCADR, serialized_address); | 425 reset.SetStringPiece(kCADR, serialized_address); |
432 } | 426 } |
433 const QuicData& reset_serialized = | 427 const QuicData& reset_serialized = |
434 reset.GetSerialized(Perspective::IS_SERVER); | 428 reset.GetSerialized(Perspective::IS_SERVER); |
435 | 429 |
436 size_t len = | 430 size_t len = |
437 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | 431 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
438 std::unique_ptr<char[]> buffer(new char[len]); | 432 std::unique_ptr<char[]> buffer(new char[len]); |
439 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 433 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 434 HOST_BYTE_ORDER); |
440 | 435 |
441 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | | 436 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | |
442 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 437 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
443 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { | 438 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { |
444 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 439 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
445 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 440 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
446 } | 441 } |
447 if (!writer.WriteUInt8(flags)) { | 442 if (!writer.WriteUInt8(flags)) { |
448 return nullptr; | 443 return nullptr; |
449 } | 444 } |
450 | 445 |
451 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { | 446 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { |
452 return nullptr; | 447 return nullptr; |
453 } | 448 } |
454 | 449 |
455 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 450 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
456 return nullptr; | 451 return nullptr; |
457 } | 452 } |
458 | 453 |
459 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 454 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
460 } | 455 } |
461 | 456 |
462 // static | 457 // static |
463 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( | 458 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( |
464 QuicConnectionId connection_id, | 459 QuicConnectionId connection_id, |
465 const QuicVersionVector& versions) { | 460 const QuicVersionVector& versions) { |
466 DCHECK(!versions.empty()); | 461 DCHECK(!versions.empty()); |
467 size_t len = GetVersionNegotiationPacketSize(versions.size()); | 462 size_t len = GetVersionNegotiationPacketSize(versions.size()); |
468 std::unique_ptr<char[]> buffer(new char[len]); | 463 std::unique_ptr<char[]> buffer(new char[len]); |
469 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 464 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 465 HOST_BYTE_ORDER); |
470 | 466 |
471 uint8_t flags = static_cast<uint8_t>( | 467 uint8_t flags = static_cast<uint8_t>( |
472 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | | 468 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | |
473 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 469 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
474 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 470 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
475 if (!writer.WriteUInt8(flags)) { | 471 if (!writer.WriteUInt8(flags)) { |
476 return nullptr; | 472 return nullptr; |
477 } | 473 } |
478 | 474 |
479 if (!writer.WriteConnectionId(connection_id)) { | 475 if (!writer.WriteConnectionId(connection_id)) { |
480 return nullptr; | 476 return nullptr; |
481 } | 477 } |
482 | 478 |
483 for (QuicVersion version : versions) { | 479 for (QuicVersion version : versions) { |
484 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { | 480 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { |
485 return nullptr; | 481 return nullptr; |
486 } | 482 } |
487 } | 483 } |
488 | 484 |
489 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 485 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
490 } | 486 } |
491 | 487 |
492 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 488 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
493 QuicDataReader reader(packet.data(), packet.length(), perspective_); | 489 QuicDataReader reader(packet.data(), packet.length(), perspective_, |
| 490 HOST_BYTE_ORDER); |
494 | 491 |
495 visitor_->OnPacket(); | 492 visitor_->OnPacket(); |
496 | 493 |
497 // First parse the public header. | 494 // First parse the public header. |
498 QuicPacketPublicHeader public_header; | 495 QuicPacketPublicHeader public_header; |
499 if (!ProcessPublicHeader(&reader, &public_header)) { | 496 if (!ProcessPublicHeader(&reader, &public_header)) { |
500 DCHECK_NE("", detailed_error_); | 497 DCHECK_NE("", detailed_error_); |
501 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " | 498 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " |
502 << detailed_error_; | 499 << detailed_error_; |
503 DCHECK_NE("", detailed_error_); | 500 DCHECK_NE("", detailed_error_); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 return false; | 568 return false; |
572 } | 569 } |
573 | 570 |
574 size_t decrypted_length = 0; | 571 size_t decrypted_length = 0; |
575 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 572 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
576 buffer_length, &decrypted_length)) { | 573 buffer_length, &decrypted_length)) { |
577 set_detailed_error("Unable to decrypt payload."); | 574 set_detailed_error("Unable to decrypt payload."); |
578 return RaiseError(QUIC_DECRYPTION_FAILURE); | 575 return RaiseError(QUIC_DECRYPTION_FAILURE); |
579 } | 576 } |
580 | 577 |
581 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_); | 578 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_, |
| 579 HOST_BYTE_ORDER); |
582 | 580 |
583 // Set the last packet number after we have decrypted the packet | 581 // Set the last packet number after we have decrypted the packet |
584 // so we are confident is not attacker controlled. | 582 // so we are confident is not attacker controlled. |
585 SetLastPacketNumber(header); | 583 SetLastPacketNumber(header); |
586 | 584 |
587 if (!visitor_->OnPacketHeader(header)) { | 585 if (!visitor_->OnPacketHeader(header)) { |
588 // The visitor suppresses further processing of the packet. | 586 // The visitor suppresses further processing of the packet. |
589 return true; | 587 return true; |
590 } | 588 } |
591 | 589 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 649 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
652 } | 650 } |
653 if (header.public_header.version_flag) { | 651 if (header.public_header.version_flag) { |
654 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 652 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
655 } | 653 } |
656 if (header.public_header.multipath_flag) { | 654 if (header.public_header.multipath_flag) { |
657 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; | 655 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; |
658 } | 656 } |
659 | 657 |
660 public_flags |= | 658 public_flags |= |
661 GetSequenceNumberFlags(header.public_header.packet_number_length) | 659 GetPacketNumberFlags(header.public_header.packet_number_length) |
662 << kPublicHeaderSequenceNumberShift; | 660 << kPublicHeaderSequenceNumberShift; |
663 | 661 |
664 if (header.public_header.nonce != nullptr) { | 662 if (header.public_header.nonce != nullptr) { |
665 DCHECK_EQ(Perspective::IS_SERVER, perspective_); | 663 DCHECK_EQ(Perspective::IS_SERVER, perspective_); |
666 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; | 664 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; |
667 } | 665 } |
668 | 666 |
669 switch (header.public_header.connection_id_length) { | 667 switch (header.public_header.connection_id_length) { |
670 case PACKET_0BYTE_CONNECTION_ID: | 668 case PACKET_0BYTE_CONNECTION_ID: |
671 if (!writer->WriteUInt8(public_flags | | 669 if (!writer->WriteUInt8(public_flags | |
(...skipping 24 matching lines...) Expand all Loading... |
696 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" | 694 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" |
697 << QuicTagToString(tag) << "'"; | 695 << QuicTagToString(tag) << "'"; |
698 } | 696 } |
699 | 697 |
700 if (header.public_header.nonce != nullptr && | 698 if (header.public_header.nonce != nullptr && |
701 !writer->WriteBytes(header.public_header.nonce, | 699 !writer->WriteBytes(header.public_header.nonce, |
702 kDiversificationNonceSize)) { | 700 kDiversificationNonceSize)) { |
703 return false; | 701 return false; |
704 } | 702 } |
705 | 703 |
706 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 704 if (!AppendPacketNumber(header.public_header.packet_number_length, |
707 header.packet_number, writer)) { | 705 header.packet_number, writer)) { |
708 return false; | 706 return false; |
709 } | 707 } |
710 | 708 |
711 return true; | 709 return true; |
712 } | 710 } |
713 | 711 |
714 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 712 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
715 uint32_t time_delta_us) { | 713 uint32_t time_delta_us) { |
716 // The new time_delta might have wrapped to the next epoch, or it | 714 // 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 | 715 // 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 } | 851 } |
854 public_header->nonce = &last_nonce_; | 852 public_header->nonce = &last_nonce_; |
855 } else { | 853 } else { |
856 public_header->nonce = nullptr; | 854 public_header->nonce = nullptr; |
857 } | 855 } |
858 | 856 |
859 return true; | 857 return true; |
860 } | 858 } |
861 | 859 |
862 // static | 860 // static |
863 QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength( | 861 QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength( |
864 QuicPacketNumber packet_number) { | 862 QuicPacketNumber packet_number) { |
865 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { | 863 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { |
866 return PACKET_1BYTE_PACKET_NUMBER; | 864 return PACKET_1BYTE_PACKET_NUMBER; |
867 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { | 865 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { |
868 return PACKET_2BYTE_PACKET_NUMBER; | 866 return PACKET_2BYTE_PACKET_NUMBER; |
869 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { | 867 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { |
870 return PACKET_4BYTE_PACKET_NUMBER; | 868 return PACKET_4BYTE_PACKET_NUMBER; |
871 } else { | 869 } else { |
872 return PACKET_6BYTE_PACKET_NUMBER; | 870 return PACKET_6BYTE_PACKET_NUMBER; |
873 } | 871 } |
874 } | 872 } |
875 | 873 |
876 // static | 874 // static |
877 uint8_t QuicFramer::GetSequenceNumberFlags( | 875 uint8_t QuicFramer::GetPacketNumberFlags( |
878 QuicPacketNumberLength packet_number_length) { | 876 QuicPacketNumberLength packet_number_length) { |
879 switch (packet_number_length) { | 877 switch (packet_number_length) { |
880 case PACKET_1BYTE_PACKET_NUMBER: | 878 case PACKET_1BYTE_PACKET_NUMBER: |
881 return PACKET_FLAGS_1BYTE_PACKET; | 879 return PACKET_FLAGS_1BYTE_PACKET; |
882 case PACKET_2BYTE_PACKET_NUMBER: | 880 case PACKET_2BYTE_PACKET_NUMBER: |
883 return PACKET_FLAGS_2BYTE_PACKET; | 881 return PACKET_FLAGS_2BYTE_PACKET; |
884 case PACKET_4BYTE_PACKET_NUMBER: | 882 case PACKET_4BYTE_PACKET_NUMBER: |
885 return PACKET_FLAGS_4BYTE_PACKET; | 883 return PACKET_FLAGS_4BYTE_PACKET; |
886 case PACKET_6BYTE_PACKET_NUMBER: | 884 case PACKET_6BYTE_PACKET_NUMBER: |
887 return PACKET_FLAGS_6BYTE_PACKET; | 885 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 = | 917 new_ack_info.max_block_length = |
920 std::max(new_ack_info.max_block_length, interval.Length()); | 918 std::max(new_ack_info.max_block_length, interval.Length()); |
921 } | 919 } |
922 return new_ack_info; | 920 return new_ack_info; |
923 } | 921 } |
924 | 922 |
925 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 923 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
926 QuicPacketHeader* header) { | 924 QuicPacketHeader* header) { |
927 QuicPacketNumber base_packet_number = largest_packet_number_; | 925 QuicPacketNumber base_packet_number = largest_packet_number_; |
928 | 926 |
929 if (!ProcessPacketSequenceNumber( | 927 if (!ProcessAndCalculatePacketNumber( |
930 encrypted_reader, header->public_header.packet_number_length, | 928 encrypted_reader, header->public_header.packet_number_length, |
931 base_packet_number, &header->packet_number)) { | 929 base_packet_number, &header->packet_number)) { |
932 set_detailed_error("Unable to read packet number."); | 930 set_detailed_error("Unable to read packet number."); |
933 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 931 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
934 } | 932 } |
935 | 933 |
936 if (header->packet_number == 0u) { | 934 if (header->packet_number == 0u) { |
937 set_detailed_error("packet numbers cannot be 0."); | 935 set_detailed_error("packet numbers cannot be 0."); |
938 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 936 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
939 } | 937 } |
940 | 938 |
941 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 939 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
942 set_detailed_error( | 940 set_detailed_error( |
943 "Visitor asked to stop processing of unauthenticated header."); | 941 "Visitor asked to stop processing of unauthenticated header."); |
944 return false; | 942 return false; |
945 } | 943 } |
946 return true; | 944 return true; |
947 } | 945 } |
948 | 946 |
949 bool QuicFramer::ProcessPacketSequenceNumber( | 947 bool QuicFramer::ProcessAndCalculatePacketNumber( |
950 QuicDataReader* reader, | 948 QuicDataReader* reader, |
951 QuicPacketNumberLength packet_number_length, | 949 QuicPacketNumberLength packet_number_length, |
952 QuicPacketNumber base_packet_number, | 950 QuicPacketNumber base_packet_number, |
953 QuicPacketNumber* packet_number) { | 951 QuicPacketNumber* packet_number) { |
954 QuicPacketNumber wire_packet_number = 0u; | 952 QuicPacketNumber wire_packet_number = 0u; |
955 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { | 953 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) { |
956 return false; | 954 return false; |
957 } | 955 } |
958 | 956 |
959 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers | 957 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers |
960 // in case the first guess is incorrect. | 958 // in case the first guess is incorrect. |
961 *packet_number = CalculatePacketNumberFromWire( | 959 *packet_number = CalculatePacketNumberFromWire( |
962 packet_number_length, base_packet_number, wire_packet_number); | 960 packet_number_length, base_packet_number, wire_packet_number); |
963 return true; | 961 return true; |
964 } | 962 } |
965 | 963 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 offset_length += 1; | 1148 offset_length += 1; |
1151 } | 1149 } |
1152 stream_flags >>= kQuicStreamOffsetShift; | 1150 stream_flags >>= kQuicStreamOffsetShift; |
1153 | 1151 |
1154 bool has_data_length = | 1152 bool has_data_length = |
1155 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; | 1153 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; |
1156 stream_flags >>= kQuicStreamDataLengthShift; | 1154 stream_flags >>= kQuicStreamDataLengthShift; |
1157 | 1155 |
1158 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; | 1156 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; |
1159 | 1157 |
1160 frame->stream_id = 0; | 1158 uint64_t stream_id = 0; |
1161 if (!reader->ReadBytes(&frame->stream_id, stream_id_length)) { | 1159 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) { |
1162 set_detailed_error("Unable to read stream_id."); | 1160 set_detailed_error("Unable to read stream_id."); |
1163 return false; | 1161 return false; |
1164 } | 1162 } |
| 1163 frame->stream_id = static_cast<QuicStreamId>(stream_id); |
1165 | 1164 |
1166 frame->offset = 0; | 1165 frame->offset = 0; |
1167 if (!reader->ReadBytes(&frame->offset, offset_length)) { | 1166 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) { |
1168 set_detailed_error("Unable to read offset."); | 1167 set_detailed_error("Unable to read offset."); |
1169 return false; | 1168 return false; |
1170 } | 1169 } |
1171 | 1170 |
1172 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. | 1171 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. |
1173 QuicStringPiece data; | 1172 QuicStringPiece data; |
1174 if (has_data_length) { | 1173 if (has_data_length) { |
1175 if (!reader->ReadStringPiece16(&data)) { | 1174 if (!reader->ReadStringPiece16(&data)) { |
1176 set_detailed_error("Unable to read frame data."); | 1175 set_detailed_error("Unable to read frame data."); |
1177 return false; | 1176 return false; |
(...skipping 17 matching lines...) Expand all Loading... |
1195 // ack block length. | 1194 // ack block length. |
1196 const QuicPacketNumberLength ack_block_length = | 1195 const QuicPacketNumberLength ack_block_length = |
1197 ReadSequenceNumberLength(frame_type); | 1196 ReadSequenceNumberLength(frame_type); |
1198 frame_type >>= kQuicSequenceNumberLengthShift; | 1197 frame_type >>= kQuicSequenceNumberLengthShift; |
1199 const QuicPacketNumberLength largest_acked_length = | 1198 const QuicPacketNumberLength largest_acked_length = |
1200 ReadSequenceNumberLength(frame_type); | 1199 ReadSequenceNumberLength(frame_type); |
1201 frame_type >>= kQuicSequenceNumberLengthShift; | 1200 frame_type >>= kQuicSequenceNumberLengthShift; |
1202 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1201 frame_type >>= kQuicHasMultipleAckBlocksShift; |
1203 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1202 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
1204 | 1203 |
1205 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { | 1204 if (!reader->ReadBytesToUInt64(largest_acked_length, |
| 1205 &ack_frame->largest_observed)) { |
1206 set_detailed_error("Unable to read largest acked."); | 1206 set_detailed_error("Unable to read largest acked."); |
1207 return false; | 1207 return false; |
1208 } | 1208 } |
1209 | 1209 |
1210 uint64_t ack_delay_time_us; | 1210 uint64_t ack_delay_time_us; |
1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | 1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { |
1212 set_detailed_error("Unable to read ack delay time."); | 1212 set_detailed_error("Unable to read ack delay time."); |
1213 return false; | 1213 return false; |
1214 } | 1214 } |
1215 | 1215 |
1216 if (ack_delay_time_us == kUFloat16MaxValue) { | 1216 if (ack_delay_time_us == kUFloat16MaxValue) { |
1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | 1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); |
1218 } else { | 1218 } else { |
1219 ack_frame->ack_delay_time = | 1219 ack_frame->ack_delay_time = |
1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); | 1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); |
1221 } | 1221 } |
1222 | 1222 |
1223 uint8_t num_ack_blocks = 0; | 1223 uint8_t num_ack_blocks = 0; |
1224 if (has_ack_blocks) { | 1224 if (has_ack_blocks) { |
1225 if (!reader->ReadBytes(&num_ack_blocks, 1)) { | 1225 if (!reader->ReadUInt8(&num_ack_blocks)) { |
1226 set_detailed_error("Unable to read num of ack blocks."); | 1226 set_detailed_error("Unable to read num of ack blocks."); |
1227 return false; | 1227 return false; |
1228 } | 1228 } |
1229 } | 1229 } |
1230 | 1230 |
1231 size_t first_block_length = 0; | 1231 uint64_t first_block_length = 0; |
1232 if (!reader->ReadBytes(&first_block_length, ack_block_length)) { | 1232 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) { |
1233 set_detailed_error("Unable to read first ack block length."); | 1233 set_detailed_error("Unable to read first ack block length."); |
1234 return false; | 1234 return false; |
1235 } | 1235 } |
1236 QuicPacketNumber first_received = | 1236 QuicPacketNumber first_received = |
1237 ack_frame->largest_observed + 1 - first_block_length; | 1237 ack_frame->largest_observed + 1 - first_block_length; |
1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); | 1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); |
1239 | 1239 |
1240 if (num_ack_blocks > 0) { | 1240 if (num_ack_blocks > 0) { |
1241 for (size_t i = 0; i < num_ack_blocks; ++i) { | 1241 for (size_t i = 0; i < num_ack_blocks; ++i) { |
1242 size_t gap = 0; | 1242 uint8_t gap = 0; |
1243 if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) { | 1243 if (!reader->ReadUInt8(&gap)) { |
1244 set_detailed_error("Unable to read gap to next ack block."); | 1244 set_detailed_error("Unable to read gap to next ack block."); |
1245 return false; | 1245 return false; |
1246 } | 1246 } |
1247 size_t current_block_length = 0; | 1247 uint64_t current_block_length = 0; |
1248 if (!reader->ReadBytes(¤t_block_length, ack_block_length)) { | 1248 if (!reader->ReadBytesToUInt64(ack_block_length, ¤t_block_length)) { |
1249 set_detailed_error("Unable to ack block length."); | 1249 set_detailed_error("Unable to ack block length."); |
1250 return false; | 1250 return false; |
1251 } | 1251 } |
1252 first_received -= (gap + current_block_length); | 1252 first_received -= (gap + current_block_length); |
1253 if (current_block_length > 0) { | 1253 if (current_block_length > 0) { |
1254 ack_frame->packets.Add(first_received, | 1254 ack_frame->packets.Add(first_received, |
1255 first_received + current_block_length); | 1255 first_received + current_block_length); |
1256 } | 1256 } |
1257 } | 1257 } |
1258 } | 1258 } |
1259 | 1259 |
1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | 1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { |
1261 return false; | 1261 return false; |
1262 } | 1262 } |
1263 | 1263 |
1264 return true; | 1264 return true; |
1265 } | 1265 } |
1266 | 1266 |
1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
1268 QuicAckFrame* ack_frame) { | 1268 QuicAckFrame* ack_frame) { |
1269 uint8_t num_received_packets; | 1269 uint8_t num_received_packets; |
1270 if (!reader->ReadBytes(&num_received_packets, 1)) { | 1270 if (!reader->ReadUInt8(&num_received_packets)) { |
1271 set_detailed_error("Unable to read num received packets."); | 1271 set_detailed_error("Unable to read num received packets."); |
1272 return false; | 1272 return false; |
1273 } | 1273 } |
1274 | 1274 |
1275 if (num_received_packets > 0) { | 1275 if (num_received_packets > 0) { |
1276 uint8_t delta_from_largest_observed; | 1276 uint8_t delta_from_largest_observed; |
1277 if (!reader->ReadBytes(&delta_from_largest_observed, | 1277 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
1278 PACKET_1BYTE_PACKET_NUMBER)) { | |
1279 set_detailed_error("Unable to read sequence delta in received packets."); | 1278 set_detailed_error("Unable to read sequence delta in received packets."); |
1280 return false; | 1279 return false; |
1281 } | 1280 } |
1282 QuicPacketNumber seq_num = | 1281 QuicPacketNumber seq_num = |
1283 ack_frame->largest_observed - delta_from_largest_observed; | 1282 ack_frame->largest_observed - delta_from_largest_observed; |
1284 | 1283 |
1285 // Time delta from the framer creation. | 1284 // Time delta from the framer creation. |
1286 uint32_t time_delta_us; | 1285 uint32_t time_delta_us; |
1287 if (!reader->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | 1286 if (!reader->ReadUInt32(&time_delta_us)) { |
1288 set_detailed_error("Unable to read time delta in received packets."); | 1287 set_detailed_error("Unable to read time delta in received packets."); |
1289 return false; | 1288 return false; |
1290 } | 1289 } |
1291 | 1290 |
1292 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); | 1291 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); |
1293 | 1292 |
1294 ack_frame->received_packet_times.reserve(num_received_packets); | 1293 ack_frame->received_packet_times.reserve(num_received_packets); |
1295 ack_frame->received_packet_times.push_back( | 1294 ack_frame->received_packet_times.push_back( |
1296 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1295 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
1297 | 1296 |
1298 for (uint8_t i = 1; i < num_received_packets; ++i) { | 1297 for (uint8_t i = 1; i < num_received_packets; ++i) { |
1299 if (!reader->ReadBytes(&delta_from_largest_observed, | 1298 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
1300 PACKET_1BYTE_PACKET_NUMBER)) { | |
1301 set_detailed_error( | 1299 set_detailed_error( |
1302 "Unable to read sequence delta in received packets."); | 1300 "Unable to read sequence delta in received packets."); |
1303 return false; | 1301 return false; |
1304 } | 1302 } |
1305 seq_num = ack_frame->largest_observed - delta_from_largest_observed; | 1303 seq_num = ack_frame->largest_observed - delta_from_largest_observed; |
1306 | 1304 |
1307 // Time delta from the previous timestamp. | 1305 // Time delta from the previous timestamp. |
1308 uint64_t incremental_time_delta_us; | 1306 uint64_t incremental_time_delta_us; |
1309 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { | 1307 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { |
1310 set_detailed_error( | 1308 set_detailed_error( |
1311 "Unable to read incremental time delta in received packets."); | 1309 "Unable to read incremental time delta in received packets."); |
1312 return false; | 1310 return false; |
1313 } | 1311 } |
1314 | 1312 |
1315 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( | 1313 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( |
1316 incremental_time_delta_us); | 1314 incremental_time_delta_us); |
1317 ack_frame->received_packet_times.push_back( | 1315 ack_frame->received_packet_times.push_back( |
1318 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1316 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
1319 } | 1317 } |
1320 } | 1318 } |
1321 return true; | 1319 return true; |
1322 } | 1320 } |
1323 | 1321 |
1324 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, | 1322 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, |
1325 const QuicPacketHeader& header, | 1323 const QuicPacketHeader& header, |
1326 QuicStopWaitingFrame* stop_waiting) { | 1324 QuicStopWaitingFrame* stop_waiting) { |
1327 QuicPacketNumber least_unacked_delta = 0; | 1325 QuicPacketNumber least_unacked_delta = 0; |
1328 if (!reader->ReadBytes(&least_unacked_delta, | 1326 if (!reader->ReadBytesToUInt64(header.public_header.packet_number_length, |
1329 header.public_header.packet_number_length)) { | 1327 &least_unacked_delta)) { |
1330 set_detailed_error("Unable to read least unacked delta."); | 1328 set_detailed_error("Unable to read least unacked delta."); |
1331 return false; | 1329 return false; |
1332 } | 1330 } |
1333 DCHECK_GE(header.packet_number, least_unacked_delta); | 1331 DCHECK_GE(header.packet_number, least_unacked_delta); |
1334 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; | 1332 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; |
1335 | 1333 |
1336 return true; | 1334 return true; |
1337 } | 1335 } |
1338 | 1336 |
1339 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, | 1337 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); | 1642 return 5 + 3 * (ack.received_packet_times.size() - 1); |
1645 } | 1643 } |
1646 | 1644 |
1647 size_t QuicFramer::GetAckFrameSize( | 1645 size_t QuicFramer::GetAckFrameSize( |
1648 const QuicAckFrame& ack, | 1646 const QuicAckFrame& ack, |
1649 QuicPacketNumberLength packet_number_length) { | 1647 QuicPacketNumberLength packet_number_length) { |
1650 size_t ack_size = 0; | 1648 size_t ack_size = 0; |
1651 | 1649 |
1652 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1650 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
1653 QuicPacketNumberLength largest_acked_length = | 1651 QuicPacketNumberLength largest_acked_length = |
1654 GetMinSequenceNumberLength(ack.largest_observed); | 1652 GetMinPacketNumberLength(ack.largest_observed); |
1655 QuicPacketNumberLength ack_block_length = | 1653 QuicPacketNumberLength ack_block_length = |
1656 GetMinSequenceNumberLength(ack_info.max_block_length); | 1654 GetMinPacketNumberLength(ack_info.max_block_length); |
1657 | 1655 |
1658 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1656 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
1659 // First ack block length. | 1657 // First ack block length. |
1660 ack_size += ack_block_length; | 1658 ack_size += ack_block_length; |
1661 if (ack_info.num_ack_blocks != 0) { | 1659 if (ack_info.num_ack_blocks != 0) { |
1662 ack_size += kNumberOfAckBlocksSize; | 1660 ack_size += kNumberOfAckBlocksSize; |
1663 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * | 1661 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * |
1664 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); | 1662 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); |
1665 } | 1663 } |
1666 | 1664 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1750 break; | 1748 break; |
1751 default: | 1749 default: |
1752 type_byte = static_cast<uint8_t>(frame.type); | 1750 type_byte = static_cast<uint8_t>(frame.type); |
1753 break; | 1751 break; |
1754 } | 1752 } |
1755 | 1753 |
1756 return writer->WriteUInt8(type_byte); | 1754 return writer->WriteUInt8(type_byte); |
1757 } | 1755 } |
1758 | 1756 |
1759 // static | 1757 // static |
1760 bool QuicFramer::AppendPacketSequenceNumber( | 1758 bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length, |
1761 QuicPacketNumberLength packet_number_length, | 1759 QuicPacketNumber packet_number, |
1762 QuicPacketNumber packet_number, | 1760 QuicDataWriter* writer) { |
1763 QuicDataWriter* writer) { | 1761 size_t length = packet_number_length; |
1764 // Ensure the entire packet number can be written. | 1762 if (length != 1 && length != 2 && length != 4 && length != 6) { |
1765 if (writer->capacity() - writer->length() < | 1763 QUIC_BUG << "Invalid packet_number_length: " << length; |
1766 static_cast<size_t>(packet_number_length)) { | |
1767 return false; | 1764 return false; |
1768 } | 1765 } |
1769 switch (packet_number_length) { | 1766 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 } | 1767 } |
1787 | 1768 |
1788 // static | 1769 // static |
| 1770 bool QuicFramer::AppendStreamId(size_t stream_id_length, |
| 1771 QuicStreamId stream_id, |
| 1772 QuicDataWriter* writer) { |
| 1773 if (stream_id_length == 0 || stream_id_length > 4) { |
| 1774 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length; |
| 1775 return false; |
| 1776 } |
| 1777 return writer->WriteBytesToUInt64(stream_id_length, stream_id); |
| 1778 } |
| 1779 |
| 1780 // static |
| 1781 bool QuicFramer::AppendStreamOffset(size_t offset_length, |
| 1782 QuicStreamOffset offset, |
| 1783 QuicDataWriter* writer) { |
| 1784 if (offset_length == 1 || offset_length > 8) { |
| 1785 QUIC_BUG << "Invalid stream_offset_length: " << offset_length; |
| 1786 return false; |
| 1787 } |
| 1788 |
| 1789 return writer->WriteBytesToUInt64(offset_length, offset); |
| 1790 } |
| 1791 |
| 1792 // static |
1789 bool QuicFramer::AppendAckBlock(uint8_t gap, | 1793 bool QuicFramer::AppendAckBlock(uint8_t gap, |
1790 QuicPacketNumberLength length_length, | 1794 QuicPacketNumberLength length_length, |
1791 QuicPacketNumber length, | 1795 QuicPacketNumber length, |
1792 QuicDataWriter* writer) { | 1796 QuicDataWriter* writer) { |
1793 return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) && | 1797 return writer->WriteUInt8(gap) && |
1794 AppendPacketSequenceNumber(length_length, length, writer); | 1798 AppendPacketNumber(length_length, length, writer); |
1795 } | 1799 } |
1796 | 1800 |
1797 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 1801 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
1798 bool no_stream_frame_length, | 1802 bool no_stream_frame_length, |
1799 QuicDataWriter* writer) { | 1803 QuicDataWriter* writer) { |
1800 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1804 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id, |
| 1805 writer)) { |
1801 QUIC_BUG << "Writing stream id size failed."; | 1806 QUIC_BUG << "Writing stream id size failed."; |
1802 return false; | 1807 return false; |
1803 } | 1808 } |
1804 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1809 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset, |
| 1810 writer)) { |
1805 QUIC_BUG << "Writing offset size failed."; | 1811 QUIC_BUG << "Writing offset size failed."; |
1806 return false; | 1812 return false; |
1807 } | 1813 } |
1808 if (!no_stream_frame_length) { | 1814 if (!no_stream_frame_length) { |
1809 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || | 1815 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || |
1810 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { | 1816 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { |
1811 QUIC_BUG << "Writing stream frame length failed"; | 1817 QUIC_BUG << "Writing stream frame length failed"; |
1812 return false; | 1818 return false; |
1813 } | 1819 } |
1814 } | 1820 } |
1815 | 1821 |
1816 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { | 1822 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { |
1817 QUIC_BUG << "Writing frame data failed."; | 1823 QUIC_BUG << "Writing frame data failed."; |
1818 return false; | 1824 return false; |
1819 } | 1825 } |
1820 return true; | 1826 return true; |
1821 } | 1827 } |
1822 | 1828 |
1823 void QuicFramer::set_version(const QuicVersion version) { | 1829 void QuicFramer::set_version(const QuicVersion version) { |
1824 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1830 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
1825 quic_version_ = version; | 1831 quic_version_ = version; |
1826 } | 1832 } |
1827 | 1833 |
1828 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, | 1834 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, |
1829 QuicDataWriter* writer) { | 1835 QuicDataWriter* writer) { |
1830 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); | 1836 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); |
1831 QuicPacketNumber largest_acked = frame.largest_observed; | 1837 QuicPacketNumber largest_acked = frame.largest_observed; |
1832 QuicPacketNumberLength largest_acked_length = | 1838 QuicPacketNumberLength largest_acked_length = |
1833 GetMinSequenceNumberLength(largest_acked); | 1839 GetMinPacketNumberLength(largest_acked); |
1834 QuicPacketNumberLength ack_block_length = | 1840 QuicPacketNumberLength ack_block_length = |
1835 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1841 GetMinPacketNumberLength(new_ack_info.max_block_length); |
1836 // Calculate available bytes for timestamps and ack blocks. | 1842 // Calculate available bytes for timestamps and ack blocks. |
1837 int32_t available_timestamp_and_ack_block_bytes = | 1843 int32_t available_timestamp_and_ack_block_bytes = |
1838 writer->capacity() - writer->length() - ack_block_length - | 1844 writer->capacity() - writer->length() - ack_block_length - |
1839 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 1845 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
1840 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); | 1846 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
1841 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); | 1847 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); |
1842 | 1848 |
1843 // Write out the type byte by setting the low order bits and doing shifts | 1849 // 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. | 1850 // to make room for the next bit flags to be set. |
1845 // Whether there are multiple ack blocks. | 1851 // Whether there are multiple ack blocks. |
1846 uint8_t type_byte = | 1852 uint8_t type_byte = |
1847 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; | 1853 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; |
1848 type_byte <<= kQuicHasMultipleAckBlocksShift; | 1854 type_byte <<= kQuicHasMultipleAckBlocksShift; |
1849 | 1855 |
1850 // Largest acked length. | 1856 // Largest acked length. |
1851 type_byte <<= kQuicSequenceNumberLengthShift; | 1857 type_byte <<= kQuicSequenceNumberLengthShift; |
1852 type_byte |= GetSequenceNumberFlags(largest_acked_length); | 1858 type_byte |= GetPacketNumberFlags(largest_acked_length); |
1853 | 1859 |
1854 // Ack block length. | 1860 // Ack block length. |
1855 type_byte <<= kQuicSequenceNumberLengthShift; | 1861 type_byte <<= kQuicSequenceNumberLengthShift; |
1856 type_byte |= GetSequenceNumberFlags(ack_block_length); | 1862 type_byte |= GetPacketNumberFlags(ack_block_length); |
1857 | 1863 |
1858 type_byte |= kQuicFrameTypeAckMask; | 1864 type_byte |= kQuicFrameTypeAckMask; |
1859 | 1865 |
1860 if (!writer->WriteUInt8(type_byte)) { | 1866 if (!writer->WriteUInt8(type_byte)) { |
1861 return false; | 1867 return false; |
1862 } | 1868 } |
1863 | 1869 |
1864 // Largest acked. | 1870 // Largest acked. |
1865 if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked, | 1871 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) { |
1866 writer)) { | |
1867 return false; | 1872 return false; |
1868 } | 1873 } |
1869 | 1874 |
1870 // Largest acked delta time. | 1875 // Largest acked delta time. |
1871 uint64_t ack_delay_time_us = kUFloat16MaxValue; | 1876 uint64_t ack_delay_time_us = kUFloat16MaxValue; |
1872 if (!frame.ack_delay_time.IsInfinite()) { | 1877 if (!frame.ack_delay_time.IsInfinite()) { |
1873 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | 1878 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); |
1874 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | 1879 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); |
1875 } | 1880 } |
1876 if (!writer->WriteUFloat16(ack_delay_time_us)) { | 1881 if (!writer->WriteUFloat16(ack_delay_time_us)) { |
(...skipping 10 matching lines...) Expand all Loading... |
1887 num_ack_blocks = std::numeric_limits<uint8_t>::max(); | 1892 num_ack_blocks = std::numeric_limits<uint8_t>::max(); |
1888 } | 1893 } |
1889 | 1894 |
1890 if (num_ack_blocks > 0) { | 1895 if (num_ack_blocks > 0) { |
1891 if (!writer->WriteBytes(&num_ack_blocks, 1)) { | 1896 if (!writer->WriteBytes(&num_ack_blocks, 1)) { |
1892 return false; | 1897 return false; |
1893 } | 1898 } |
1894 } | 1899 } |
1895 | 1900 |
1896 // First ack block length. | 1901 // First ack block length. |
1897 if (!AppendPacketSequenceNumber(ack_block_length, | 1902 if (!AppendPacketNumber(ack_block_length, new_ack_info.first_block_length, |
1898 new_ack_info.first_block_length, writer)) { | 1903 writer)) { |
1899 return false; | 1904 return false; |
1900 } | 1905 } |
1901 | 1906 |
1902 // Ack blocks. | 1907 // Ack blocks. |
1903 if (num_ack_blocks > 0) { | 1908 if (num_ack_blocks > 0) { |
1904 size_t num_ack_blocks_written = 0; | 1909 size_t num_ack_blocks_written = 0; |
1905 // Append, in descending order from the largest ACKed packet, a series of | 1910 // Append, in descending order from the largest ACKed packet, a series of |
1906 // ACK blocks that represents the successfully acknoweldged packets. Each | 1911 // ACK blocks that represents the successfully acknoweldged packets. Each |
1907 // appended gap/block length represents a descending delta from the previous | 1912 // appended gap/block length represents a descending delta from the previous |
1908 // block. i.e.: | 1913 // 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(); | 1999 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); |
1995 QuicPacketNumber packet_number = it->first; | 2000 QuicPacketNumber packet_number = it->first; |
1996 QuicPacketNumber delta_from_largest_observed = | 2001 QuicPacketNumber delta_from_largest_observed = |
1997 frame.largest_observed - packet_number; | 2002 frame.largest_observed - packet_number; |
1998 | 2003 |
1999 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); | 2004 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); |
2000 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2005 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
2001 return false; | 2006 return false; |
2002 } | 2007 } |
2003 | 2008 |
2004 if (!writer->WriteUInt8(delta_from_largest_observed & | 2009 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
2005 k1ByteSequenceNumberMask)) { | |
2006 return false; | 2010 return false; |
2007 } | 2011 } |
2008 | 2012 |
2009 // Use the lowest 4 bytes of the time delta from the creation_time_. | 2013 // 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; | 2014 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; |
2011 uint32_t time_delta_us = | 2015 uint32_t time_delta_us = |
2012 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & | 2016 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & |
2013 (time_epoch_delta_us - 1)); | 2017 (time_epoch_delta_us - 1)); |
2014 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | 2018 if (!writer->WriteUInt32(time_delta_us)) { |
2015 return false; | 2019 return false; |
2016 } | 2020 } |
2017 | 2021 |
2018 QuicTime prev_time = it->second; | 2022 QuicTime prev_time = it->second; |
2019 | 2023 |
2020 for (++it; it != frame.received_packet_times.end(); ++it) { | 2024 for (++it; it != frame.received_packet_times.end(); ++it) { |
2021 packet_number = it->first; | 2025 packet_number = it->first; |
2022 delta_from_largest_observed = frame.largest_observed - packet_number; | 2026 delta_from_largest_observed = frame.largest_observed - packet_number; |
2023 | 2027 |
2024 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2028 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
2025 return false; | 2029 return false; |
2026 } | 2030 } |
2027 | 2031 |
2028 if (!writer->WriteUInt8(delta_from_largest_observed & | 2032 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
2029 k1ByteSequenceNumberMask)) { | |
2030 return false; | 2033 return false; |
2031 } | 2034 } |
2032 | 2035 |
2033 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); | 2036 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); |
2034 prev_time = it->second; | 2037 prev_time = it->second; |
2035 if (!writer->WriteUFloat16(frame_time_delta_us)) { | 2038 if (!writer->WriteUFloat16(frame_time_delta_us)) { |
2036 return false; | 2039 return false; |
2037 } | 2040 } |
2038 } | 2041 } |
2039 return true; | 2042 return true; |
(...skipping 10 matching lines...) Expand all Loading... |
2050 | 2053 |
2051 if (least_unacked_delta >> length_shift > 0) { | 2054 if (least_unacked_delta >> length_shift > 0) { |
2052 QUIC_BUG << "packet_number_length " | 2055 QUIC_BUG << "packet_number_length " |
2053 << header.public_header.packet_number_length | 2056 << header.public_header.packet_number_length |
2054 << " is too small for least_unacked_delta: " << least_unacked_delta | 2057 << " is too small for least_unacked_delta: " << least_unacked_delta |
2055 << " packet_number:" << header.packet_number | 2058 << " packet_number:" << header.packet_number |
2056 << " least_unacked:" << frame.least_unacked | 2059 << " least_unacked:" << frame.least_unacked |
2057 << " version:" << quic_version_; | 2060 << " version:" << quic_version_; |
2058 return false; | 2061 return false; |
2059 } | 2062 } |
2060 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 2063 if (!AppendPacketNumber(header.public_header.packet_number_length, |
2061 least_unacked_delta, writer)) { | 2064 least_unacked_delta, writer)) { |
2062 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; | 2065 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; |
2063 return false; | 2066 return false; |
2064 } | 2067 } |
2065 | 2068 |
2066 return true; | 2069 return true; |
2067 } | 2070 } |
2068 | 2071 |
2069 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, | 2072 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, |
2070 QuicDataWriter* writer) { | 2073 QuicDataWriter* writer) { |
2071 if (!writer->WriteUInt32(frame.stream_id)) { | 2074 if (!writer->WriteUInt32(frame.stream_id)) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2155 | 2158 |
2156 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2159 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2157 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2160 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
2158 << " detail: " << detailed_error_; | 2161 << " detail: " << detailed_error_; |
2159 set_error(error); | 2162 set_error(error); |
2160 visitor_->OnError(this); | 2163 visitor_->OnError(this); |
2161 return false; | 2164 return false; |
2162 } | 2165 } |
2163 | 2166 |
2164 } // namespace net | 2167 } // namespace net |
OLD | NEW |