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 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 const uint8_t kQuicStreamDataLengthShift = 1; | 84 const uint8_t kQuicStreamDataLengthShift = 1; |
85 const uint8_t kQuicStreamDataLengthMask = 0x01; | 85 const uint8_t kQuicStreamDataLengthMask = 0x01; |
86 | 86 |
87 // Fin bit may be set or not. | 87 // Fin bit may be set or not. |
88 const uint8_t kQuicStreamFinShift = 1; | 88 const uint8_t kQuicStreamFinShift = 1; |
89 const uint8_t kQuicStreamFinMask = 0x01; | 89 const uint8_t kQuicStreamFinMask = 0x01; |
90 | 90 |
91 // packet number size shift used in AckFrames. | 91 // packet number size shift used in AckFrames. |
92 const uint8_t kQuicSequenceNumberLengthShift = 2; | 92 const uint8_t kQuicSequenceNumberLengthShift = 2; |
93 | 93 |
94 // Acks may be truncated. | |
95 const uint8_t kQuicAckTruncatedShift = 1; | |
96 const uint8_t kQuicAckTruncatedMask = 0x01; | |
97 | |
98 // Acks may not have any nacks. | |
99 const uint8_t kQuicHasNacksMask = 0x01; | |
100 // Acks may have only one ack block. | 94 // Acks may have only one ack block. |
101 const uint8_t kQuicHasMultipleAckBlocksMask = 0x01; | 95 const uint8_t kQuicHasMultipleAckBlocksMask = 0x01; |
102 const uint8_t kQuicHasMultipleAckBlocksShift = 1; | 96 const uint8_t kQuicHasMultipleAckBlocksShift = 1; |
103 | 97 |
104 // Returns the absolute value of the difference between |a| and |b|. | 98 // Returns the absolute value of the difference between |a| and |b|. |
105 QuicPacketNumber Delta(QuicPacketNumber a, QuicPacketNumber b) { | 99 QuicPacketNumber Delta(QuicPacketNumber a, QuicPacketNumber b) { |
106 // Since these are unsigned numbers, we can't just return abs(a - b) | 100 // Since these are unsigned numbers, we can't just return abs(a - b) |
107 if (a < b) { | 101 if (a < b) { |
108 return b - a; | 102 return b - a; |
109 } | 103 } |
(...skipping 21 matching lines...) Expand all Loading... |
131 return PACKET_6BYTE_PACKET_NUMBER; | 125 return PACKET_6BYTE_PACKET_NUMBER; |
132 } | 126 } |
133 } | 127 } |
134 | 128 |
135 } // namespace | 129 } // namespace |
136 | 130 |
137 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 131 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
138 QuicTime creation_time, | 132 QuicTime creation_time, |
139 Perspective perspective) | 133 Perspective perspective) |
140 : visitor_(nullptr), | 134 : visitor_(nullptr), |
141 entropy_calculator_(nullptr), | |
142 error_(QUIC_NO_ERROR), | 135 error_(QUIC_NO_ERROR), |
143 last_packet_number_(0), | 136 last_packet_number_(0), |
144 largest_packet_number_(0), | 137 largest_packet_number_(0), |
145 last_path_id_(kInvalidPathId), | 138 last_path_id_(kInvalidPathId), |
146 last_serialized_connection_id_(0), | 139 last_serialized_connection_id_(0), |
147 supported_versions_(supported_versions), | 140 supported_versions_(supported_versions), |
148 decrypter_level_(ENCRYPTION_NONE), | 141 decrypter_level_(ENCRYPTION_NONE), |
149 alternative_decrypter_level_(ENCRYPTION_NONE), | 142 alternative_decrypter_level_(ENCRYPTION_NONE), |
150 alternative_decrypter_latch_(false), | 143 alternative_decrypter_latch_(false), |
151 perspective_(perspective), | 144 perspective_(perspective), |
(...skipping 16 matching lines...) Expand all Loading... |
168 GetStreamOffsetSize(offset) + | 161 GetStreamOffsetSize(offset) + |
169 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize); | 162 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize); |
170 } | 163 } |
171 | 164 |
172 // static | 165 // static |
173 size_t QuicFramer::GetMinAckFrameSize( | 166 size_t QuicFramer::GetMinAckFrameSize( |
174 QuicVersion version, | 167 QuicVersion version, |
175 QuicPacketNumberLength largest_observed_length) { | 168 QuicPacketNumberLength largest_observed_length) { |
176 size_t min_size = kQuicFrameTypeSize + largest_observed_length + | 169 size_t min_size = kQuicFrameTypeSize + largest_observed_length + |
177 kQuicDeltaTimeLargestObservedSize; | 170 kQuicDeltaTimeLargestObservedSize; |
178 if (version <= QUIC_VERSION_33) { | |
179 return min_size + kQuicEntropyHashSize; | |
180 } | |
181 return min_size + kQuicNumTimestampsSize; | 171 return min_size + kQuicNumTimestampsSize; |
182 } | 172 } |
183 | 173 |
184 // static | 174 // static |
185 size_t QuicFramer::GetStopWaitingFrameSize( | 175 size_t QuicFramer::GetStopWaitingFrameSize( |
186 QuicVersion version, | 176 QuicVersion version, |
187 QuicPacketNumberLength packet_number_length) { | 177 QuicPacketNumberLength packet_number_length) { |
188 size_t min_size = kQuicFrameTypeSize + packet_number_length; | 178 size_t min_size = kQuicFrameTypeSize + packet_number_length; |
189 if (version <= QUIC_VERSION_33) { | |
190 return min_size + kQuicEntropyHashSize; | |
191 } | |
192 return min_size; | 179 return min_size; |
193 } | 180 } |
194 | 181 |
195 // static | 182 // static |
196 size_t QuicFramer::GetRstStreamFrameSize() { | 183 size_t QuicFramer::GetRstStreamFrameSize() { |
197 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + | 184 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + |
198 kQuicErrorCodeSize; | 185 kQuicErrorCodeSize; |
199 } | 186 } |
200 | 187 |
201 // static | 188 // static |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER); | 304 GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER); |
318 if (can_truncate) { | 305 if (can_truncate) { |
319 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 306 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
320 // Note that we may not use every byte of the writer in this case. | 307 // Note that we may not use every byte of the writer in this case. |
321 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; | 308 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; |
322 return free_bytes; | 309 return free_bytes; |
323 } | 310 } |
324 return 0; | 311 return 0; |
325 } | 312 } |
326 | 313 |
327 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} | |
328 | |
329 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; | |
330 | |
331 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | |
332 | |
333 QuicFramer::AckBlock::AckBlock(uint8_t gap, QuicPacketNumber length) | |
334 : gap(gap), length(length) {} | |
335 | |
336 QuicFramer::AckBlock::AckBlock(const AckBlock& other) = default; | |
337 | |
338 QuicFramer::AckBlock::~AckBlock() {} | |
339 | |
340 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() | 314 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() |
341 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} | 315 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
342 | 316 |
343 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = | 317 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = |
344 default; | 318 default; |
345 | 319 |
346 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} | 320 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} |
347 | 321 |
348 // static | |
349 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | |
350 const QuicPacketHeader& header) { | |
351 return header.entropy_flag << (header.packet_number % 8); | |
352 } | |
353 | |
354 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 322 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
355 const QuicFrames& frames, | 323 const QuicFrames& frames, |
356 char* buffer, | 324 char* buffer, |
357 size_t packet_length) { | 325 size_t packet_length) { |
358 QuicDataWriter writer(packet_length, buffer); | 326 QuicDataWriter writer(packet_length, buffer); |
359 if (!AppendPacketHeader(header, &writer)) { | 327 if (!AppendPacketHeader(header, &writer)) { |
360 QUIC_BUG << "AppendPacketHeader failed"; | 328 QUIC_BUG << "AppendPacketHeader failed"; |
361 return 0; | 329 return 0; |
362 } | 330 } |
363 | 331 |
(...skipping 11 matching lines...) Expand all Loading... |
375 writer.WritePadding(); | 343 writer.WritePadding(); |
376 break; | 344 break; |
377 case STREAM_FRAME: | 345 case STREAM_FRAME: |
378 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 346 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
379 &writer)) { | 347 &writer)) { |
380 QUIC_BUG << "AppendStreamFrame failed"; | 348 QUIC_BUG << "AppendStreamFrame failed"; |
381 return 0; | 349 return 0; |
382 } | 350 } |
383 break; | 351 break; |
384 case ACK_FRAME: | 352 case ACK_FRAME: |
385 if (quic_version_ <= QUIC_VERSION_33) { | 353 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { |
386 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { | 354 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; |
387 QUIC_BUG << "AppendAckFrameAndTypeByte failed" | 355 return 0; |
388 << " header: " << header | |
389 << " ack_fame: " << *frame.ack_frame; | |
390 return 0; | |
391 } | |
392 } else { | |
393 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { | |
394 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; | |
395 return 0; | |
396 } | |
397 } | 356 } |
398 break; | 357 break; |
399 case STOP_WAITING_FRAME: | 358 case STOP_WAITING_FRAME: |
400 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, | 359 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, |
401 &writer)) { | 360 &writer)) { |
402 QUIC_BUG << "AppendStopWaitingFrame failed"; | 361 QUIC_BUG << "AppendStopWaitingFrame failed"; |
403 return 0; | 362 return 0; |
404 } | 363 } |
405 break; | 364 break; |
406 case MTU_DISCOVERY_FRAME: | 365 case MTU_DISCOVERY_FRAME: |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 } | 573 } |
615 | 574 |
616 size_t decrypted_length = 0; | 575 size_t decrypted_length = 0; |
617 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 576 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
618 buffer_length, &decrypted_length)) { | 577 buffer_length, &decrypted_length)) { |
619 set_detailed_error("Unable to decrypt payload."); | 578 set_detailed_error("Unable to decrypt payload."); |
620 return RaiseError(QUIC_DECRYPTION_FAILURE); | 579 return RaiseError(QUIC_DECRYPTION_FAILURE); |
621 } | 580 } |
622 | 581 |
623 QuicDataReader reader(decrypted_buffer, decrypted_length); | 582 QuicDataReader reader(decrypted_buffer, decrypted_length); |
624 if (quic_version_ <= QUIC_VERSION_33) { | |
625 if (!ProcessAuthenticatedHeader(&reader, &header)) { | |
626 DVLOG(1) << "Unable to process packet header. Stopping parsing."; | |
627 return false; | |
628 } | |
629 } | |
630 | 583 |
631 // Set the last packet number after we have decrypted the packet | 584 // Set the last packet number after we have decrypted the packet |
632 // so we are confident is not attacker controlled. | 585 // so we are confident is not attacker controlled. |
633 SetLastPacketNumber(header); | 586 SetLastPacketNumber(header); |
634 | 587 |
635 if (!visitor_->OnPacketHeader(header)) { | 588 if (!visitor_->OnPacketHeader(header)) { |
636 // The visitor suppresses further processing of the packet. | 589 // The visitor suppresses further processing of the packet. |
637 return true; | 590 return true; |
638 } | 591 } |
639 | 592 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 } | 666 } |
714 | 667 |
715 switch (header.public_header.connection_id_length) { | 668 switch (header.public_header.connection_id_length) { |
716 case PACKET_0BYTE_CONNECTION_ID: | 669 case PACKET_0BYTE_CONNECTION_ID: |
717 if (!writer->WriteUInt8(public_flags | | 670 if (!writer->WriteUInt8(public_flags | |
718 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { | 671 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { |
719 return false; | 672 return false; |
720 } | 673 } |
721 break; | 674 break; |
722 case PACKET_8BYTE_CONNECTION_ID: | 675 case PACKET_8BYTE_CONNECTION_ID: |
723 if (quic_version_ > QUIC_VERSION_32) { | 676 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID; |
724 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID; | 677 if (!FLAGS_quic_remove_v33_hacks2 && |
725 if (!FLAGS_quic_remove_v33_hacks2 && | 678 perspective_ == Perspective::IS_CLIENT) { |
726 perspective_ == Perspective::IS_CLIENT) { | |
727 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD; | |
728 } | |
729 | |
730 } else { | |
731 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD; | 679 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD; |
732 } | 680 } |
733 if (!writer->WriteUInt8(public_flags) || | 681 if (!writer->WriteUInt8(public_flags) || |
734 !writer->WriteUInt64(header.public_header.connection_id)) { | 682 !writer->WriteUInt64(header.public_header.connection_id)) { |
735 return false; | 683 return false; |
736 } | 684 } |
737 break; | 685 break; |
738 } | 686 } |
739 last_serialized_connection_id_ = header.public_header.connection_id; | 687 last_serialized_connection_id_ = header.public_header.connection_id; |
740 | 688 |
(...skipping 13 matching lines...) Expand all Loading... |
754 if (header.public_header.nonce != nullptr && | 702 if (header.public_header.nonce != nullptr && |
755 !writer->WriteBytes(header.public_header.nonce, | 703 !writer->WriteBytes(header.public_header.nonce, |
756 kDiversificationNonceSize)) { | 704 kDiversificationNonceSize)) { |
757 return false; | 705 return false; |
758 } | 706 } |
759 | 707 |
760 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 708 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, |
761 header.packet_number, writer)) { | 709 header.packet_number, writer)) { |
762 return false; | 710 return false; |
763 } | 711 } |
764 if (quic_version_ > QUIC_VERSION_33) { | |
765 return true; | |
766 } | |
767 | |
768 uint8_t private_flags = 0; | |
769 if (header.entropy_flag) { | |
770 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; | |
771 } | |
772 if (!writer->WriteUInt8(private_flags)) { | |
773 return false; | |
774 } | |
775 | 712 |
776 return true; | 713 return true; |
777 } | 714 } |
778 | 715 |
779 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 716 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
780 uint32_t time_delta_us) { | 717 uint32_t time_delta_us) { |
781 // The new time_delta might have wrapped to the next epoch, or it | 718 // The new time_delta might have wrapped to the next epoch, or it |
782 // might have reverse wrapped to the previous epoch, or it might | 719 // might have reverse wrapped to the previous epoch, or it might |
783 // remain in the same epoch. Select the time closest to the previous | 720 // remain in the same epoch. Select the time closest to the previous |
784 // time. | 721 // time. |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 last_version_tag_ = version_tag; | 856 last_version_tag_ = version_tag; |
920 QuicVersion version = QuicTagToQuicVersion(version_tag); | 857 QuicVersion version = QuicTagToQuicVersion(version_tag); |
921 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 858 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
922 set_detailed_error("Illegal public flags value."); | 859 set_detailed_error("Illegal public flags value."); |
923 return false; | 860 return false; |
924 } | 861 } |
925 public_header->versions.push_back(version); | 862 public_header->versions.push_back(version); |
926 } | 863 } |
927 | 864 |
928 // A nonce should only be present in packets from the server to the client, | 865 // A nonce should only be present in packets from the server to the client, |
929 // which are neither version negotiation nor public reset packets | 866 // which are neither version negotiation nor public reset packets. |
930 // and only for versions after QUIC_VERSION_32. Earlier versions will | 867 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE && |
931 // set this bit when indicating an 8-byte connection ID, which should | |
932 // not be interpreted as indicating a nonce is present. | |
933 if (quic_version_ > QUIC_VERSION_32 && | |
934 public_flags & PACKET_PUBLIC_FLAGS_NONCE && | |
935 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && | 868 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && |
936 !(public_flags & PACKET_PUBLIC_FLAGS_RST) && | 869 !(public_flags & PACKET_PUBLIC_FLAGS_RST) && |
937 // The nonce flag from a client is ignored and is assumed to be an older | 870 // The nonce flag from a client is ignored and is assumed to be an older |
938 // client indicating an eight-byte connection ID. | 871 // client indicating an eight-byte connection ID. |
939 perspective_ == Perspective::IS_CLIENT) { | 872 perspective_ == Perspective::IS_CLIENT) { |
940 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()), | 873 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()), |
941 last_nonce_.size())) { | 874 last_nonce_.size())) { |
942 set_detailed_error("Unable to read nonce."); | 875 set_detailed_error("Unable to read nonce."); |
943 return false; | 876 return false; |
944 } | 877 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 return PACKET_FLAGS_4BYTE_PACKET; | 909 return PACKET_FLAGS_4BYTE_PACKET; |
977 case PACKET_6BYTE_PACKET_NUMBER: | 910 case PACKET_6BYTE_PACKET_NUMBER: |
978 return PACKET_FLAGS_6BYTE_PACKET; | 911 return PACKET_FLAGS_6BYTE_PACKET; |
979 default: | 912 default: |
980 QUIC_BUG << "Unreachable case statement."; | 913 QUIC_BUG << "Unreachable case statement."; |
981 return PACKET_FLAGS_6BYTE_PACKET; | 914 return PACKET_FLAGS_6BYTE_PACKET; |
982 } | 915 } |
983 } | 916 } |
984 | 917 |
985 // static | 918 // static |
986 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | |
987 const QuicAckFrame& frame) { | |
988 AckFrameInfo ack_info; | |
989 if (frame.packets.Empty()) { | |
990 return ack_info; | |
991 } | |
992 DCHECK_GE(frame.largest_observed, frame.packets.Max()); | |
993 QuicPacketNumber last_largest_missing = 0; | |
994 for (const Interval<QuicPacketNumber>& interval : frame.packets) { | |
995 for (QuicPacketNumber interval_start = interval.min(); | |
996 interval_start < interval.max(); | |
997 interval_start += (1ull + std::numeric_limits<uint8_t>::max())) { | |
998 uint8_t cur_range_length = | |
999 interval.max() - interval_start > std::numeric_limits<uint8_t>::max() | |
1000 ? std::numeric_limits<uint8_t>::max() | |
1001 : (interval.max() - interval_start) - 1; | |
1002 ack_info.nack_ranges[interval_start] = cur_range_length; | |
1003 } | |
1004 ack_info.max_delta = | |
1005 max(ack_info.max_delta, last_largest_missing == 0 | |
1006 ? QuicPacketNumber{0} | |
1007 : (interval.min() - last_largest_missing)); | |
1008 last_largest_missing = interval.max() - 1; | |
1009 } | |
1010 // Include the range to the largest observed. | |
1011 ack_info.max_delta = | |
1012 max(ack_info.max_delta, frame.largest_observed - last_largest_missing); | |
1013 return ack_info; | |
1014 } | |
1015 | |
1016 // static | |
1017 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( | 919 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( |
1018 const QuicAckFrame& frame) { | 920 const QuicAckFrame& frame) { |
1019 NewAckFrameInfo new_ack_info; | 921 NewAckFrameInfo new_ack_info; |
1020 if (frame.packets.Empty()) { | 922 if (frame.packets.Empty()) { |
1021 return new_ack_info; | 923 return new_ack_info; |
1022 } | 924 } |
1023 // The first block is the last interval. It isn't encoded with the gap-length | 925 // The first block is the last interval. It isn't encoded with the gap-length |
1024 // encoding, so skip it. | 926 // encoding, so skip it. |
1025 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); | 927 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); |
1026 auto itr = frame.packets.rbegin(); | 928 auto itr = frame.packets.rbegin(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 set_detailed_error("packet numbers cannot be 0."); | 973 set_detailed_error("packet numbers cannot be 0."); |
1072 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 974 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
1073 } | 975 } |
1074 | 976 |
1075 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 977 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
1076 return false; | 978 return false; |
1077 } | 979 } |
1078 return true; | 980 return true; |
1079 } | 981 } |
1080 | 982 |
1081 bool QuicFramer::ProcessAuthenticatedHeader(QuicDataReader* reader, | |
1082 QuicPacketHeader* header) { | |
1083 uint8_t private_flags; | |
1084 if (!reader->ReadBytes(&private_flags, 1)) { | |
1085 set_detailed_error("Unable to read private flags."); | |
1086 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
1087 } | |
1088 | |
1089 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { | |
1090 set_detailed_error("Illegal private flags value."); | |
1091 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
1092 } | |
1093 | |
1094 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; | |
1095 header->entropy_hash = GetPacketEntropyHash(*header); | |
1096 return true; | |
1097 } | |
1098 | |
1099 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { | 983 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { |
1100 if (!reader->ReadBytes(path_id, 1)) { | 984 if (!reader->ReadBytes(path_id, 1)) { |
1101 return false; | 985 return false; |
1102 } | 986 } |
1103 | 987 |
1104 return true; | 988 return true; |
1105 } | 989 } |
1106 | 990 |
1107 bool QuicFramer::ProcessPacketSequenceNumber( | 991 bool QuicFramer::ProcessPacketSequenceNumber( |
1108 QuicDataReader* reader, | 992 QuicDataReader* reader, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 DVLOG(1) << "Visitor asked to stop further processing."; | 1029 DVLOG(1) << "Visitor asked to stop further processing."; |
1146 // Returning true since there was no parsing error. | 1030 // Returning true since there was no parsing error. |
1147 return true; | 1031 return true; |
1148 } | 1032 } |
1149 continue; | 1033 continue; |
1150 } | 1034 } |
1151 | 1035 |
1152 // Ack Frame | 1036 // Ack Frame |
1153 if (frame_type & kQuicFrameTypeAckMask) { | 1037 if (frame_type & kQuicFrameTypeAckMask) { |
1154 QuicAckFrame frame; | 1038 QuicAckFrame frame; |
1155 if (quic_version_ <= QUIC_VERSION_33) { | 1039 if (!ProcessNewAckFrame(reader, frame_type, &frame)) { |
1156 if (!ProcessAckFrame(reader, frame_type, &frame)) { | 1040 return RaiseError(QUIC_INVALID_ACK_DATA); |
1157 return RaiseError(QUIC_INVALID_ACK_DATA); | |
1158 } | |
1159 } else { | |
1160 if (!ProcessNewAckFrame(reader, frame_type, &frame)) { | |
1161 return RaiseError(QUIC_INVALID_ACK_DATA); | |
1162 } | |
1163 } | 1041 } |
1164 if (!visitor_->OnAckFrame(frame)) { | 1042 if (!visitor_->OnAckFrame(frame)) { |
1165 DVLOG(1) << "Visitor asked to stop further processing."; | 1043 DVLOG(1) << "Visitor asked to stop further processing."; |
1166 // Returning true since there was no parsing error. | 1044 // Returning true since there was no parsing error. |
1167 return true; | 1045 return true; |
1168 } | 1046 } |
1169 continue; | 1047 continue; |
1170 } | 1048 } |
1171 | 1049 |
1172 // This was a special frame type that did not match any | 1050 // This was a special frame type that did not match any |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 set_detailed_error("Unable to read frame data."); | 1223 set_detailed_error("Unable to read frame data."); |
1346 return false; | 1224 return false; |
1347 } | 1225 } |
1348 } | 1226 } |
1349 frame->data_buffer = data.data(); | 1227 frame->data_buffer = data.data(); |
1350 frame->data_length = static_cast<uint16_t>(data.length()); | 1228 frame->data_length = static_cast<uint16_t>(data.length()); |
1351 | 1229 |
1352 return true; | 1230 return true; |
1353 } | 1231 } |
1354 | 1232 |
1355 bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, | |
1356 uint8_t frame_type, | |
1357 QuicAckFrame* ack_frame) { | |
1358 // Determine the three lengths from the frame type: largest observed length, | |
1359 // missing packet number length, and missing range length. | |
1360 const QuicPacketNumberLength missing_packet_number_length = | |
1361 ReadSequenceNumberLength(frame_type); | |
1362 frame_type >>= kQuicSequenceNumberLengthShift; | |
1363 const QuicPacketNumberLength largest_observed_packet_number_length = | |
1364 ReadSequenceNumberLength(frame_type); | |
1365 frame_type >>= kQuicSequenceNumberLengthShift; | |
1366 ack_frame->is_truncated = frame_type & kQuicAckTruncatedMask; | |
1367 frame_type >>= kQuicAckTruncatedShift; | |
1368 bool has_nacks = frame_type & kQuicHasNacksMask; | |
1369 | |
1370 if (!reader->ReadBytes(&ack_frame->entropy_hash, 1)) { | |
1371 set_detailed_error("Unable to read entropy hash for received packets."); | |
1372 return false; | |
1373 } | |
1374 | |
1375 if (!reader->ReadBytes(&ack_frame->largest_observed, | |
1376 largest_observed_packet_number_length)) { | |
1377 set_detailed_error("Unable to read largest observed."); | |
1378 return false; | |
1379 } | |
1380 | |
1381 uint64_t ack_delay_time_us; | |
1382 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | |
1383 set_detailed_error("Unable to read ack delay time."); | |
1384 return false; | |
1385 } | |
1386 | |
1387 if (ack_delay_time_us == kUFloat16MaxValue) { | |
1388 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | |
1389 } else { | |
1390 ack_frame->ack_delay_time = | |
1391 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); | |
1392 } | |
1393 | |
1394 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | |
1395 return false; | |
1396 } | |
1397 | |
1398 if (!has_nacks) { | |
1399 return true; | |
1400 } | |
1401 | |
1402 uint8_t num_missing_ranges; | |
1403 if (!reader->ReadBytes(&num_missing_ranges, 1)) { | |
1404 set_detailed_error("Unable to read num missing packet ranges."); | |
1405 return false; | |
1406 } | |
1407 | |
1408 QuicPacketNumber last_packet_number = ack_frame->largest_observed; | |
1409 for (size_t i = 0; i < num_missing_ranges; ++i) { | |
1410 QuicPacketNumber missing_delta = 0; | |
1411 if (!reader->ReadBytes(&missing_delta, missing_packet_number_length)) { | |
1412 set_detailed_error("Unable to read missing packet number delta."); | |
1413 return false; | |
1414 } | |
1415 last_packet_number -= missing_delta; | |
1416 QuicPacketNumber range_length = 0; | |
1417 if (!reader->ReadBytes(&range_length, PACKET_1BYTE_PACKET_NUMBER)) { | |
1418 set_detailed_error("Unable to read missing packet number range."); | |
1419 return false; | |
1420 } | |
1421 ack_frame->packets.Add(last_packet_number - range_length, | |
1422 last_packet_number + 1); | |
1423 // Subtract an extra 1 to ensure ranges are represented efficiently and | |
1424 // can't overlap by 1 packet number. This allows a missing_delta of 0 | |
1425 // to represent an adjacent nack range. | |
1426 last_packet_number -= (range_length + 1); | |
1427 } | |
1428 | |
1429 return true; | |
1430 } | |
1431 | |
1432 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, | 1233 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, |
1433 uint8_t frame_type, | 1234 uint8_t frame_type, |
1434 QuicAckFrame* ack_frame) { | 1235 QuicAckFrame* ack_frame) { |
1435 // Determine the two lengths from the frame type: largest acked length, | 1236 // Determine the two lengths from the frame type: largest acked length, |
1436 // ack block length. | 1237 // ack block length. |
1437 const QuicPacketNumberLength ack_block_length = | 1238 const QuicPacketNumberLength ack_block_length = |
1438 ReadSequenceNumberLength(frame_type); | 1239 ReadSequenceNumberLength(frame_type); |
1439 frame_type >>= kQuicSequenceNumberLengthShift; | 1240 frame_type >>= kQuicSequenceNumberLengthShift; |
1440 const QuicPacketNumberLength largest_acked_length = | 1241 const QuicPacketNumberLength largest_acked_length = |
1441 ReadSequenceNumberLength(frame_type); | 1242 ReadSequenceNumberLength(frame_type); |
1442 frame_type >>= kQuicSequenceNumberLengthShift; | 1243 frame_type >>= kQuicSequenceNumberLengthShift; |
1443 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1244 frame_type >>= kQuicHasMultipleAckBlocksShift; |
1444 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1245 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
1445 ack_frame->missing = false; | |
1446 | 1246 |
1447 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { | 1247 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { |
1448 set_detailed_error("Unable to read largest acked."); | 1248 set_detailed_error("Unable to read largest acked."); |
1449 return false; | 1249 return false; |
1450 } | 1250 } |
1451 | 1251 |
1452 uint64_t ack_delay_time_us; | 1252 uint64_t ack_delay_time_us; |
1453 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | 1253 if (!reader->ReadUFloat16(&ack_delay_time_us)) { |
1454 set_detailed_error("Unable to read ack delay time."); | 1254 set_detailed_error("Unable to read ack delay time."); |
1455 return false; | 1255 return false; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1501 | 1301 |
1502 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | 1302 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { |
1503 return false; | 1303 return false; |
1504 } | 1304 } |
1505 | 1305 |
1506 return true; | 1306 return true; |
1507 } | 1307 } |
1508 | 1308 |
1509 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1309 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
1510 QuicAckFrame* ack_frame) { | 1310 QuicAckFrame* ack_frame) { |
1511 if (ack_frame->is_truncated) { | |
1512 return true; | |
1513 } | |
1514 uint8_t num_received_packets; | 1311 uint8_t num_received_packets; |
1515 if (!reader->ReadBytes(&num_received_packets, 1)) { | 1312 if (!reader->ReadBytes(&num_received_packets, 1)) { |
1516 set_detailed_error("Unable to read num received packets."); | 1313 set_detailed_error("Unable to read num received packets."); |
1517 return false; | 1314 return false; |
1518 } | 1315 } |
1519 | 1316 |
1520 if (num_received_packets > 0) { | 1317 if (num_received_packets > 0) { |
1521 uint8_t delta_from_largest_observed; | 1318 uint8_t delta_from_largest_observed; |
1522 if (!reader->ReadBytes(&delta_from_largest_observed, | 1319 if (!reader->ReadBytes(&delta_from_largest_observed, |
1523 PACKET_1BYTE_PACKET_NUMBER)) { | 1320 PACKET_1BYTE_PACKET_NUMBER)) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1562 ack_frame->received_packet_times.push_back( | 1359 ack_frame->received_packet_times.push_back( |
1563 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1360 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
1564 } | 1361 } |
1565 } | 1362 } |
1566 return true; | 1363 return true; |
1567 } | 1364 } |
1568 | 1365 |
1569 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, | 1366 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, |
1570 const QuicPacketHeader& header, | 1367 const QuicPacketHeader& header, |
1571 QuicStopWaitingFrame* stop_waiting) { | 1368 QuicStopWaitingFrame* stop_waiting) { |
1572 if (quic_version_ <= QUIC_VERSION_33) { | |
1573 if (!reader->ReadBytes(&stop_waiting->entropy_hash, 1)) { | |
1574 set_detailed_error("Unable to read entropy hash for sent packets."); | |
1575 return false; | |
1576 } | |
1577 } | |
1578 | |
1579 QuicPacketNumber least_unacked_delta = 0; | 1369 QuicPacketNumber least_unacked_delta = 0; |
1580 if (!reader->ReadBytes(&least_unacked_delta, | 1370 if (!reader->ReadBytes(&least_unacked_delta, |
1581 header.public_header.packet_number_length)) { | 1371 header.public_header.packet_number_length)) { |
1582 set_detailed_error("Unable to read least unacked delta."); | 1372 set_detailed_error("Unable to read least unacked delta."); |
1583 return false; | 1373 return false; |
1584 } | 1374 } |
1585 DCHECK_GE(header.packet_number, least_unacked_delta); | 1375 DCHECK_GE(header.packet_number, least_unacked_delta); |
1586 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; | 1376 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; |
1587 | 1377 |
1588 return true; | 1378 return true; |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1836 if (success) { | 1626 if (success) { |
1837 visitor_->OnDecryptedPacket(decrypter_level_); | 1627 visitor_->OnDecryptedPacket(decrypter_level_); |
1838 } else if (alternative_decrypter_.get() != nullptr) { | 1628 } else if (alternative_decrypter_.get() != nullptr) { |
1839 if (header.public_header.nonce != nullptr) { | 1629 if (header.public_header.nonce != nullptr) { |
1840 DCHECK_EQ(perspective_, Perspective::IS_CLIENT); | 1630 DCHECK_EQ(perspective_, Perspective::IS_CLIENT); |
1841 alternative_decrypter_->SetDiversificationNonce( | 1631 alternative_decrypter_->SetDiversificationNonce( |
1842 *header.public_header.nonce); | 1632 *header.public_header.nonce); |
1843 } | 1633 } |
1844 bool try_alternative_decryption = true; | 1634 bool try_alternative_decryption = true; |
1845 if (alternative_decrypter_level_ == ENCRYPTION_INITIAL) { | 1635 if (alternative_decrypter_level_ == ENCRYPTION_INITIAL) { |
1846 if (perspective_ == Perspective::IS_CLIENT && | 1636 if (perspective_ == Perspective::IS_CLIENT) { |
1847 quic_version_ > QUIC_VERSION_32) { | |
1848 if (header.public_header.nonce == nullptr) { | 1637 if (header.public_header.nonce == nullptr) { |
1849 // Can not use INITIAL decryption without a diversification nonce. | 1638 // Can not use INITIAL decryption without a diversification nonce. |
1850 try_alternative_decryption = false; | 1639 try_alternative_decryption = false; |
1851 } | 1640 } |
1852 } else { | 1641 } else { |
1853 DCHECK(header.public_header.nonce == nullptr); | 1642 DCHECK(header.public_header.nonce == nullptr); |
1854 } | 1643 } |
1855 } | 1644 } |
1856 | 1645 |
1857 if (try_alternative_decryption) { | 1646 if (try_alternative_decryption) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 return 0; | 1680 return 0; |
1892 } | 1681 } |
1893 | 1682 |
1894 return 5 + 3 * (ack.received_packet_times.size() - 1); | 1683 return 5 + 3 * (ack.received_packet_times.size() - 1); |
1895 } | 1684 } |
1896 | 1685 |
1897 size_t QuicFramer::GetAckFrameSize( | 1686 size_t QuicFramer::GetAckFrameSize( |
1898 const QuicAckFrame& ack, | 1687 const QuicAckFrame& ack, |
1899 QuicPacketNumberLength packet_number_length) { | 1688 QuicPacketNumberLength packet_number_length) { |
1900 size_t ack_size = 0; | 1689 size_t ack_size = 0; |
1901 if (quic_version_ <= QUIC_VERSION_33) { | |
1902 AckFrameInfo ack_info = GetAckFrameInfo(ack); | |
1903 QuicPacketNumberLength largest_observed_length = | |
1904 GetMinSequenceNumberLength(ack.largest_observed); | |
1905 QuicPacketNumberLength missing_packet_number_length = | |
1906 GetMinSequenceNumberLength(ack_info.max_delta); | |
1907 | |
1908 ack_size = GetMinAckFrameSize(quic_version_, largest_observed_length); | |
1909 if (!ack_info.nack_ranges.empty()) { | |
1910 ack_size += kNumberOfNackRangesSize; | |
1911 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | |
1912 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | |
1913 } | |
1914 | |
1915 // In version 23, if the ack will be truncated due to too many nack ranges, | |
1916 // then do not include the number of timestamps (1 byte). | |
1917 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { | |
1918 // 1 byte for the number of timestamps. | |
1919 ack_size += 1; | |
1920 ack_size += GetAckFrameTimeStampSize(ack); | |
1921 } | |
1922 | |
1923 return ack_size; | |
1924 } | |
1925 | 1690 |
1926 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); | 1691 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); |
1927 QuicPacketNumberLength largest_acked_length = | 1692 QuicPacketNumberLength largest_acked_length = |
1928 GetMinSequenceNumberLength(ack.largest_observed); | 1693 GetMinSequenceNumberLength(ack.largest_observed); |
1929 QuicPacketNumberLength ack_block_length = | 1694 QuicPacketNumberLength ack_block_length = |
1930 GetMinSequenceNumberLength(ack_info.max_block_length); | 1695 GetMinSequenceNumberLength(ack_info.max_block_length); |
1931 | 1696 |
1932 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1697 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
1933 // First ack block length. | 1698 // First ack block length. |
1934 ack_size += ack_block_length; | 1699 ack_size += ack_block_length; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2094 return false; | 1859 return false; |
2095 } | 1860 } |
2096 return true; | 1861 return true; |
2097 } | 1862 } |
2098 | 1863 |
2099 void QuicFramer::set_version(const QuicVersion version) { | 1864 void QuicFramer::set_version(const QuicVersion version) { |
2100 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1865 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
2101 quic_version_ = version; | 1866 quic_version_ = version; |
2102 } | 1867 } |
2103 | 1868 |
2104 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicPacketHeader& header, | |
2105 const QuicAckFrame& frame, | |
2106 QuicDataWriter* writer) { | |
2107 AckFrameInfo ack_info = GetAckFrameInfo(frame); | |
2108 QuicPacketNumber ack_largest_observed = frame.largest_observed; | |
2109 QuicPacketNumberLength largest_observed_length = | |
2110 GetMinSequenceNumberLength(ack_largest_observed); | |
2111 QuicPacketNumberLength missing_packet_number_length = | |
2112 GetMinSequenceNumberLength(ack_info.max_delta); | |
2113 // Determine whether we need to truncate ranges. | |
2114 size_t available_range_bytes = | |
2115 writer->capacity() - writer->length() - kNumberOfNackRangesSize - | |
2116 GetMinAckFrameSize(quic_version_, largest_observed_length); | |
2117 size_t max_num_ranges = | |
2118 available_range_bytes / | |
2119 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | |
2120 max_num_ranges = min(kMaxNackRanges, max_num_ranges); | |
2121 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | |
2122 DVLOG_IF(1, truncated) << "Truncating ack from " | |
2123 << ack_info.nack_ranges.size() << " ranges to " | |
2124 << max_num_ranges; | |
2125 // Write out the type byte by setting the low order bits and doing shifts | |
2126 // to make room for the next bit flags to be set. | |
2127 // Whether there are any nacks. | |
2128 uint8_t type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask; | |
2129 | |
2130 // truncating bit. | |
2131 type_byte <<= kQuicAckTruncatedShift; | |
2132 type_byte |= truncated ? kQuicAckTruncatedMask : 0; | |
2133 | |
2134 // Largest observed packet number length. | |
2135 type_byte <<= kQuicSequenceNumberLengthShift; | |
2136 type_byte |= GetSequenceNumberFlags(largest_observed_length); | |
2137 | |
2138 // Missing packet number length. | |
2139 type_byte <<= kQuicSequenceNumberLengthShift; | |
2140 type_byte |= GetSequenceNumberFlags(missing_packet_number_length); | |
2141 | |
2142 type_byte |= kQuicFrameTypeAckMask; | |
2143 | |
2144 if (!writer->WriteUInt8(type_byte)) { | |
2145 QUIC_BUG << "type byte failed"; | |
2146 return false; | |
2147 } | |
2148 | |
2149 QuicPacketEntropyHash ack_entropy_hash = frame.entropy_hash; | |
2150 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | |
2151 if (truncated) { | |
2152 // Skip the nack ranges which the truncated ack won't include and set | |
2153 // a correct largest observed for the truncated ack. | |
2154 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | |
2155 ++i) { | |
2156 ++ack_iter; | |
2157 } | |
2158 // If the last range is followed by acks, include them. | |
2159 // If the last range is followed by another range, specify the end of the | |
2160 // range as the largest_observed. | |
2161 ack_largest_observed = ack_iter->first - 1; | |
2162 // Also update the entropy so it matches the largest observed. | |
2163 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); | |
2164 ++ack_iter; | |
2165 } | |
2166 | |
2167 if (!writer->WriteUInt8(ack_entropy_hash)) { | |
2168 QUIC_BUG << "hash failed."; | |
2169 return false; | |
2170 } | |
2171 | |
2172 if (!AppendPacketSequenceNumber(largest_observed_length, ack_largest_observed, | |
2173 writer)) { | |
2174 QUIC_BUG << "AppendPacketSequenceNumber failed. " | |
2175 << "largest_observed_length: " << largest_observed_length | |
2176 << " ack_largest_observed: " << ack_largest_observed; | |
2177 return false; | |
2178 } | |
2179 | |
2180 uint64_t ack_delay_time_us = kUFloat16MaxValue; | |
2181 if (!frame.ack_delay_time.IsInfinite()) { | |
2182 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | |
2183 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | |
2184 } | |
2185 | |
2186 if (!writer->WriteUFloat16(ack_delay_time_us)) { | |
2187 QUIC_BUG << "ack delay time failed."; | |
2188 return false; | |
2189 } | |
2190 | |
2191 // Timestamp goes at the end of the required fields. | |
2192 if (!truncated) { | |
2193 if (!AppendTimestampToAckFrame(frame, writer)) { | |
2194 QUIC_BUG << "AppendTimestampToAckFrame failed"; | |
2195 return false; | |
2196 } | |
2197 } | |
2198 | |
2199 if (ack_info.nack_ranges.empty()) { | |
2200 return true; | |
2201 } | |
2202 | |
2203 const uint8_t num_missing_ranges = | |
2204 static_cast<uint8_t>(min(ack_info.nack_ranges.size(), max_num_ranges)); | |
2205 if (!writer->WriteBytes(&num_missing_ranges, 1)) { | |
2206 QUIC_BUG << "num_missing_ranges failed: " | |
2207 << static_cast<uint32_t>(num_missing_ranges); | |
2208 return false; | |
2209 } | |
2210 | |
2211 int num_ranges_written = 0; | |
2212 QuicPacketNumber last_sequence_written = ack_largest_observed; | |
2213 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { | |
2214 // Calculate the delta to the last number in the range. | |
2215 QuicPacketNumber missing_delta = | |
2216 last_sequence_written - (ack_iter->first + ack_iter->second); | |
2217 if (!AppendPacketSequenceNumber(missing_packet_number_length, missing_delta, | |
2218 writer)) { | |
2219 QUIC_BUG << "AppendPacketSequenceNumber failed: " | |
2220 << "missing_packet_number_length: " | |
2221 << missing_packet_number_length << " missing_delta " | |
2222 << missing_delta; | |
2223 return false; | |
2224 } | |
2225 if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, | |
2226 ack_iter->second, writer)) { | |
2227 QUIC_BUG << "AppendPacketSequenceNumber failed"; | |
2228 return false; | |
2229 } | |
2230 // Subtract 1 so a missing_delta of 0 means an adjacent range. | |
2231 last_sequence_written = ack_iter->first - 1; | |
2232 ++num_ranges_written; | |
2233 } | |
2234 DCHECK_EQ(num_missing_ranges, num_ranges_written); | |
2235 | |
2236 return true; | |
2237 } | |
2238 | |
2239 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 1869 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, |
2240 QuicDataWriter* writer) { | 1870 QuicDataWriter* writer) { |
2241 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 1871 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); |
2242 QuicPacketNumber largest_acked = frame.largest_observed; | 1872 QuicPacketNumber largest_acked = frame.largest_observed; |
2243 QuicPacketNumberLength largest_acked_length = | 1873 QuicPacketNumberLength largest_acked_length = |
2244 GetMinSequenceNumberLength(largest_acked); | 1874 GetMinSequenceNumberLength(largest_acked); |
2245 QuicPacketNumberLength ack_block_length = | 1875 QuicPacketNumberLength ack_block_length = |
2246 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1876 GetMinSequenceNumberLength(new_ack_info.max_block_length); |
2247 // Calculate available bytes for timestamps and ack blocks. | 1877 // Calculate available bytes for timestamps and ack blocks. |
2248 int32_t available_timestamp_and_ack_block_bytes = | 1878 int32_t available_timestamp_and_ack_block_bytes = |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2450 } | 2080 } |
2451 | 2081 |
2452 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, | 2082 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, |
2453 const QuicStopWaitingFrame& frame, | 2083 const QuicStopWaitingFrame& frame, |
2454 QuicDataWriter* writer) { | 2084 QuicDataWriter* writer) { |
2455 DCHECK_GE(header.packet_number, frame.least_unacked); | 2085 DCHECK_GE(header.packet_number, frame.least_unacked); |
2456 const QuicPacketNumber least_unacked_delta = | 2086 const QuicPacketNumber least_unacked_delta = |
2457 header.packet_number - frame.least_unacked; | 2087 header.packet_number - frame.least_unacked; |
2458 const QuicPacketNumber length_shift = | 2088 const QuicPacketNumber length_shift = |
2459 header.public_header.packet_number_length * 8; | 2089 header.public_header.packet_number_length * 8; |
2460 if (quic_version_ <= QUIC_VERSION_33) { | |
2461 if (!writer->WriteUInt8(frame.entropy_hash)) { | |
2462 QUIC_BUG << " hash failed"; | |
2463 return false; | |
2464 } | |
2465 } | |
2466 | 2090 |
2467 if (least_unacked_delta >> length_shift > 0) { | 2091 if (least_unacked_delta >> length_shift > 0) { |
2468 QUIC_BUG << "packet_number_length " | 2092 QUIC_BUG << "packet_number_length " |
2469 << header.public_header.packet_number_length | 2093 << header.public_header.packet_number_length |
2470 << " is too small for least_unacked_delta: " << least_unacked_delta | 2094 << " is too small for least_unacked_delta: " << least_unacked_delta |
2471 << " packet_number:" << header.packet_number | 2095 << " packet_number:" << header.packet_number |
2472 << " least_unacked:" << frame.least_unacked | 2096 << " least_unacked:" << frame.least_unacked |
2473 << " version:" << quic_version_; | 2097 << " version:" << quic_version_; |
2474 return false; | 2098 return false; |
2475 } | 2099 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2561 | 2185 |
2562 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2186 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2563 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2187 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2564 << " detail: " << detailed_error_; | 2188 << " detail: " << detailed_error_; |
2565 set_error(error); | 2189 set_error(error); |
2566 visitor_->OnError(this); | 2190 visitor_->OnError(this); |
2567 return false; | 2191 return false; |
2568 } | 2192 } |
2569 | 2193 |
2570 } // namespace net | 2194 } // namespace net |
OLD | NEW |