Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: net/quic/core/quic_framer.cc

Issue 2847753002: Some changes to prepare for endian change for QUIC: 1) Make data reader/write be able to read/write… (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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(&current_block_length, ack_block_length)) { 1248 if (!reader->ReadBytesToUInt64(ack_block_length, &current_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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698