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/quic_framer.h" | 5 #include "net/quic/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 11 matching lines...) Expand all Loading... |
22 #include "net/quic/quic_flags.h" | 22 #include "net/quic/quic_flags.h" |
23 #include "net/quic/quic_socket_address_coder.h" | 23 #include "net/quic/quic_socket_address_coder.h" |
24 #include "net/quic/quic_utils.h" | 24 #include "net/quic/quic_utils.h" |
25 | 25 |
26 using base::StringPiece; | 26 using base::StringPiece; |
27 using std::map; | 27 using std::map; |
28 using std::max; | 28 using std::max; |
29 using std::min; | 29 using std::min; |
30 using std::numeric_limits; | 30 using std::numeric_limits; |
31 using std::string; | 31 using std::string; |
| 32 using std::vector; |
| 33 #define PREDICT_FALSE(x) (x) |
32 | 34 |
33 namespace net { | 35 namespace net { |
34 | 36 |
35 namespace { | 37 namespace { |
36 | 38 |
37 // Mask to select the lowest 48 bits of a packet number. | 39 // Mask to select the lowest 48 bits of a packet number. |
38 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF); | 40 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF); |
39 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF); | 41 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF); |
40 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF); | 42 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF); |
41 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF); | 43 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF); |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | 331 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
330 | 332 |
331 QuicFramer::AckBlock::AckBlock(uint8_t gap, QuicPacketNumber length) | 333 QuicFramer::AckBlock::AckBlock(uint8_t gap, QuicPacketNumber length) |
332 : gap(gap), length(length) {} | 334 : gap(gap), length(length) {} |
333 | 335 |
334 QuicFramer::AckBlock::AckBlock(const AckBlock& other) = default; | 336 QuicFramer::AckBlock::AckBlock(const AckBlock& other) = default; |
335 | 337 |
336 QuicFramer::AckBlock::~AckBlock() {} | 338 QuicFramer::AckBlock::~AckBlock() {} |
337 | 339 |
338 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() | 340 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() |
339 : max_block_length(0), first_block_length(0) {} | 341 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
340 | 342 |
341 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = | 343 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = |
342 default; | 344 default; |
343 | 345 |
344 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} | 346 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} |
345 | 347 |
346 // static | 348 // static |
347 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | 349 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
348 const QuicPacketHeader& header) { | 350 const QuicPacketHeader& header) { |
349 return header.entropy_flag << (header.packet_number % 8); | 351 return header.entropy_flag << (header.packet_number % 8); |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 } | 981 } |
980 | 982 |
981 // static | 983 // static |
982 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | 984 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( |
983 const QuicAckFrame& frame) { | 985 const QuicAckFrame& frame) { |
984 AckFrameInfo ack_info; | 986 AckFrameInfo ack_info; |
985 if (frame.packets.Empty()) { | 987 if (frame.packets.Empty()) { |
986 return ack_info; | 988 return ack_info; |
987 } | 989 } |
988 DCHECK_GE(frame.largest_observed, frame.packets.Max()); | 990 DCHECK_GE(frame.largest_observed, frame.packets.Max()); |
989 size_t cur_range_length = 0; | 991 if (FLAGS_quic_use_packet_number_queue_intervals) { |
990 PacketNumberQueue::const_iterator iter = frame.packets.begin(); | 992 QuicPacketNumber last_largest_missing = 0; |
991 // TODO(jdorfman): Switch this logic to use the intervals in PacketNumberQueue | 993 for (auto itr = frame.packets.begin_intervals(); |
992 // instead of reconstructing them from the sequence. | 994 itr != frame.packets.end_intervals(); ++itr) { |
993 QuicPacketNumber last_missing = *iter; | 995 const Interval<QuicPacketNumber>& interval = *itr; |
994 ++iter; | 996 for (QuicPacketNumber interval_start = interval.min(); |
995 for (; iter != frame.packets.end(); ++iter) { | 997 interval_start < interval.max(); |
996 if (cur_range_length < numeric_limits<uint8_t>::max() && | 998 interval_start += (1ull + numeric_limits<uint8_t>::max())) { |
997 *iter == (last_missing + 1)) { | 999 uint8_t cur_range_length = |
998 ++cur_range_length; | 1000 interval.max() - interval_start > numeric_limits<uint8_t>::max() |
999 } else { | 1001 ? numeric_limits<uint8_t>::max() |
1000 ack_info.nack_ranges[last_missing - cur_range_length] = | 1002 : (interval.max() - interval_start) - 1; |
1001 static_cast<uint8_t>(cur_range_length); | 1003 ack_info.nack_ranges[interval_start] = cur_range_length; |
1002 cur_range_length = 0; | 1004 } |
| 1005 ack_info.max_delta = max(ack_info.max_delta, |
| 1006 last_largest_missing == 0 |
| 1007 ? QuicPacketNumber{0} |
| 1008 : (interval.min() - last_largest_missing)); |
| 1009 last_largest_missing = interval.max() - 1; |
1003 } | 1010 } |
1004 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); | 1011 // Include the range to the largest observed. |
1005 last_missing = *iter; | 1012 ack_info.max_delta = |
| 1013 max(ack_info.max_delta, frame.largest_observed - last_largest_missing); |
| 1014 } else { |
| 1015 size_t cur_range_length = 0; |
| 1016 PacketNumberQueue::const_iterator iter = frame.packets.begin(); |
| 1017 QuicPacketNumber last_missing = *iter; |
| 1018 ++iter; |
| 1019 for (; iter != frame.packets.end(); ++iter) { |
| 1020 if (cur_range_length < numeric_limits<uint8_t>::max() && |
| 1021 *iter == (last_missing + 1)) { |
| 1022 ++cur_range_length; |
| 1023 } else { |
| 1024 ack_info.nack_ranges[last_missing - cur_range_length] = |
| 1025 static_cast<uint8_t>(cur_range_length); |
| 1026 cur_range_length = 0; |
| 1027 } |
| 1028 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); |
| 1029 last_missing = *iter; |
| 1030 } |
| 1031 // Include the last nack range. |
| 1032 ack_info.nack_ranges[last_missing - cur_range_length] = |
| 1033 static_cast<uint8_t>(cur_range_length); |
| 1034 // Include the range to the largest observed. |
| 1035 ack_info.max_delta = |
| 1036 max(ack_info.max_delta, frame.largest_observed - last_missing); |
1006 } | 1037 } |
1007 // Include the last nack range. | |
1008 ack_info.nack_ranges[last_missing - cur_range_length] = | |
1009 static_cast<uint8_t>(cur_range_length); | |
1010 // Include the range to the largest observed. | |
1011 ack_info.max_delta = | |
1012 max(ack_info.max_delta, frame.largest_observed - last_missing); | |
1013 return ack_info; | 1038 return ack_info; |
1014 } | 1039 } |
1015 | 1040 |
1016 // static | 1041 // static |
1017 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( | 1042 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( |
1018 const QuicAckFrame& frame) { | 1043 const QuicAckFrame& frame, |
| 1044 bool construct_blocks) { |
1019 NewAckFrameInfo new_ack_info; | 1045 NewAckFrameInfo new_ack_info; |
1020 if (frame.packets.Empty()) { | 1046 if (frame.packets.Empty()) { |
1021 return new_ack_info; | 1047 return new_ack_info; |
1022 } | 1048 } |
1023 uint64_t cur_range_length = 1; | 1049 if (!construct_blocks) { |
1024 PacketNumberQueue::const_iterator iter = frame.packets.begin(); | 1050 // The first block is the last interval. It isn't encoded with the |
1025 QuicPacketNumber last_received = *iter; | 1051 // gap-length encoding, so skip it. |
1026 ++iter; | 1052 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); |
1027 for (; iter != frame.packets.end(); ++iter) { | 1053 auto itr = frame.packets.rbegin_intervals(); |
1028 if (*iter == (last_received + 1)) { | 1054 QuicPacketNumber previous_start = itr->min(); |
1029 ++cur_range_length; | 1055 new_ack_info.max_block_length = itr->Length(); |
1030 } else { | 1056 ++itr; |
1031 size_t total_gap = *iter - last_received - 1; | 1057 |
1032 size_t num_blocks = static_cast<size_t>(ceil( | 1058 // Don't do any more work after getting information for 256 ACK blocks; any |
1033 static_cast<double>(total_gap) / numeric_limits<uint8_t>::max())); | 1059 // more can't be encoded anyway. |
1034 uint8_t last_gap = static_cast<uint8_t>( | 1060 for (; itr != frame.packets.rend_intervals() && |
1035 total_gap - (num_blocks - 1) * numeric_limits<uint8_t>::max()); | 1061 new_ack_info.num_ack_blocks < numeric_limits<uint8_t>::max(); |
1036 for (size_t i = 0; i < num_blocks; ++i) { | 1062 previous_start = itr->min(), ++itr) { |
1037 if (i == 0) { | 1063 const auto& interval = *itr; |
1038 new_ack_info.ack_blocks.push_back( | 1064 const QuicPacketNumber total_gap = previous_start - interval.max(); |
1039 AckBlock(last_gap, cur_range_length)); | 1065 new_ack_info.num_ack_blocks += |
1040 } else { | 1066 (total_gap + numeric_limits<uint8_t>::max() - 1) / |
1041 // Add an ack block of length 0 because there are more than 255 | 1067 numeric_limits<uint8_t>::max(); |
1042 // missing packets in a row. | 1068 new_ack_info.max_block_length = |
1043 new_ack_info.ack_blocks.push_back( | 1069 max(new_ack_info.max_block_length, interval.Length()); |
1044 AckBlock(numeric_limits<uint8_t>::max(), 0)); | 1070 } |
| 1071 } else { |
| 1072 size_t cur_range_length = 1; |
| 1073 PacketNumberQueue::const_iterator iter = frame.packets.begin(); |
| 1074 QuicPacketNumber last_received = *iter; |
| 1075 ++iter; |
| 1076 for (; iter != frame.packets.end(); ++iter) { |
| 1077 if (*iter == (last_received + 1)) { |
| 1078 ++cur_range_length; |
| 1079 } else { |
| 1080 size_t total_gap = *iter - last_received - 1; |
| 1081 size_t num_blocks = static_cast<size_t>(ceil( |
| 1082 static_cast<double>(total_gap) / numeric_limits<uint8_t>::max())); |
| 1083 uint8_t last_gap = static_cast<uint8_t>( |
| 1084 total_gap - (num_blocks - 1) * numeric_limits<uint8_t>::max()); |
| 1085 for (size_t i = 0; i < num_blocks; ++i) { |
| 1086 if (i == 0) { |
| 1087 new_ack_info.ack_blocks.push_back( |
| 1088 AckBlock(last_gap, cur_range_length)); |
| 1089 } else { |
| 1090 // Add an ack block of length 0 because there are more than 255 |
| 1091 // missing packets in a row. |
| 1092 new_ack_info.ack_blocks.push_back( |
| 1093 AckBlock(numeric_limits<uint8_t>::max(), 0)); |
| 1094 } |
1045 } | 1095 } |
| 1096 new_ack_info.max_block_length = |
| 1097 max(new_ack_info.max_block_length, cur_range_length); |
| 1098 cur_range_length = 1; |
1046 } | 1099 } |
1047 new_ack_info.max_block_length = | 1100 last_received = *iter; |
1048 max(new_ack_info.max_block_length, cur_range_length); | |
1049 cur_range_length = 1; | |
1050 } | 1101 } |
1051 last_received = *iter; | 1102 new_ack_info.first_block_length = cur_range_length; |
| 1103 new_ack_info.max_block_length = |
| 1104 max(new_ack_info.max_block_length, new_ack_info.first_block_length); |
| 1105 new_ack_info.num_ack_blocks = new_ack_info.ack_blocks.size(); |
1052 } | 1106 } |
1053 new_ack_info.first_block_length = cur_range_length; | |
1054 new_ack_info.max_block_length = | |
1055 max(new_ack_info.max_block_length, new_ack_info.first_block_length); | |
1056 return new_ack_info; | 1107 return new_ack_info; |
1057 } | 1108 } |
1058 | 1109 |
1059 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 1110 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
1060 QuicPacketHeader* header) { | 1111 QuicPacketHeader* header) { |
1061 header->path_id = kDefaultPathId; | 1112 header->path_id = kDefaultPathId; |
1062 if (header->public_header.multipath_flag && | 1113 if (header->public_header.multipath_flag && |
1063 !ProcessPathId(encrypted_reader, &header->path_id)) { | 1114 !ProcessPathId(encrypted_reader, &header->path_id)) { |
1064 set_detailed_error("Unable to read path id."); | 1115 set_detailed_error("Unable to read path id."); |
1065 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1116 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1975 // then do not include the number of timestamps (1 byte). | 2026 // then do not include the number of timestamps (1 byte). |
1976 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { | 2027 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { |
1977 // 1 byte for the number of timestamps. | 2028 // 1 byte for the number of timestamps. |
1978 ack_size += 1; | 2029 ack_size += 1; |
1979 ack_size += GetAckFrameTimeStampSize(ack); | 2030 ack_size += GetAckFrameTimeStampSize(ack); |
1980 } | 2031 } |
1981 | 2032 |
1982 return ack_size; | 2033 return ack_size; |
1983 } | 2034 } |
1984 | 2035 |
1985 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); | 2036 NewAckFrameInfo ack_info = GetNewAckFrameInfo( |
| 2037 ack, !FLAGS_quic_use_packet_number_queue_intervals); |
1986 QuicPacketNumberLength largest_acked_length = | 2038 QuicPacketNumberLength largest_acked_length = |
1987 GetMinSequenceNumberLength(ack.largest_observed); | 2039 GetMinSequenceNumberLength(ack.largest_observed); |
1988 QuicPacketNumberLength ack_block_length = | 2040 QuicPacketNumberLength ack_block_length = |
1989 GetMinSequenceNumberLength(ack_info.max_block_length); | 2041 GetMinSequenceNumberLength(ack_info.max_block_length); |
1990 | 2042 |
1991 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 2043 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
1992 // First ack block length. | 2044 // First ack block length. |
1993 ack_size += ack_block_length; | 2045 ack_size += ack_block_length; |
1994 if (!ack_info.ack_blocks.empty()) { | 2046 if (ack_info.num_ack_blocks != 0) { |
1995 ack_size += kNumberOfAckBlocksSize; | 2047 ack_size += kNumberOfAckBlocksSize; |
1996 ack_size += min(ack_info.ack_blocks.size(), kMaxAckBlocks) * | 2048 ack_size += min(ack_info.num_ack_blocks, kMaxAckBlocks) * |
1997 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); | 2049 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); |
1998 } | 2050 } |
1999 | 2051 |
2000 // Include timestamps. | 2052 // Include timestamps. |
2001 ack_size += GetAckFrameTimeStampSize(ack); | 2053 ack_size += GetAckFrameTimeStampSize(ack); |
2002 | 2054 |
2003 return ack_size; | 2055 return ack_size; |
2004 } | 2056 } |
2005 | 2057 |
2006 size_t QuicFramer::ComputeFrameLength( | 2058 size_t QuicFramer::ComputeFrameLength( |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2113 break; | 2165 break; |
2114 case PACKET_6BYTE_PACKET_NUMBER: | 2166 case PACKET_6BYTE_PACKET_NUMBER: |
2115 return writer->WriteUInt48(packet_number & k6ByteSequenceNumberMask); | 2167 return writer->WriteUInt48(packet_number & k6ByteSequenceNumberMask); |
2116 break; | 2168 break; |
2117 default: | 2169 default: |
2118 DCHECK(false) << "packet_number_length: " << packet_number_length; | 2170 DCHECK(false) << "packet_number_length: " << packet_number_length; |
2119 return false; | 2171 return false; |
2120 } | 2172 } |
2121 } | 2173 } |
2122 | 2174 |
| 2175 // static |
| 2176 bool QuicFramer::AppendAckBlock(uint8_t gap, |
| 2177 QuicPacketNumberLength length_length, |
| 2178 QuicPacketNumber length, |
| 2179 QuicDataWriter* writer) { |
| 2180 return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) && |
| 2181 AppendPacketSequenceNumber(length_length, length, writer); |
| 2182 } |
| 2183 |
2123 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 2184 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
2124 bool no_stream_frame_length, | 2185 bool no_stream_frame_length, |
2125 QuicDataWriter* writer) { | 2186 QuicDataWriter* writer) { |
2126 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 2187 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
2127 QUIC_BUG << "Writing stream id size failed."; | 2188 QUIC_BUG << "Writing stream id size failed."; |
2128 return false; | 2189 return false; |
2129 } | 2190 } |
2130 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 2191 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { |
2131 QUIC_BUG << "Writing offset size failed."; | 2192 QUIC_BUG << "Writing offset size failed."; |
2132 return false; | 2193 return false; |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2296 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2357 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
2297 QUIC_BUG << "num_revived_packets failed: " << num_revived_packets; | 2358 QUIC_BUG << "num_revived_packets failed: " << num_revived_packets; |
2298 return false; | 2359 return false; |
2299 } | 2360 } |
2300 | 2361 |
2301 return true; | 2362 return true; |
2302 } | 2363 } |
2303 | 2364 |
2304 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 2365 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, |
2305 QuicDataWriter* writer) { | 2366 QuicDataWriter* writer) { |
2306 NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 2367 const bool new_ack_info_construct_blocks = |
| 2368 !FLAGS_quic_use_packet_number_queue_intervals; |
| 2369 const NewAckFrameInfo new_ack_info = |
| 2370 GetNewAckFrameInfo(frame, new_ack_info_construct_blocks); |
2307 QuicPacketNumber largest_acked = frame.largest_observed; | 2371 QuicPacketNumber largest_acked = frame.largest_observed; |
2308 QuicPacketNumberLength largest_acked_length = | 2372 QuicPacketNumberLength largest_acked_length = |
2309 GetMinSequenceNumberLength(largest_acked); | 2373 GetMinSequenceNumberLength(largest_acked); |
2310 QuicPacketNumberLength ack_block_length = | 2374 QuicPacketNumberLength ack_block_length = |
2311 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 2375 GetMinSequenceNumberLength(new_ack_info.max_block_length); |
2312 // Calculate available bytes for timestamps and ack blocks. | 2376 // Calculate available bytes for timestamps and ack blocks. |
2313 int32_t available_timestamp_and_ack_block_bytes = | 2377 int32_t available_timestamp_and_ack_block_bytes = |
2314 writer->capacity() - writer->length() - ack_block_length - | 2378 writer->capacity() - writer->length() - ack_block_length - |
2315 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 2379 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
2316 (!new_ack_info.ack_blocks.empty() ? kNumberOfAckBlocksSize : 0); | 2380 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
2317 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); | 2381 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); |
2318 | 2382 |
2319 // Write out the type byte by setting the low order bits and doing shifts | 2383 // Write out the type byte by setting the low order bits and doing shifts |
2320 // to make room for the next bit flags to be set. | 2384 // to make room for the next bit flags to be set. |
2321 // Whether there are multiple ack blocks. | 2385 // Whether there are multiple ack blocks. |
2322 uint8_t type_byte = | 2386 uint8_t type_byte = |
2323 new_ack_info.ack_blocks.empty() ? 0 : kQuicHasMultipleAckBlocksMask; | 2387 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; |
2324 type_byte <<= kQuicHasMultipleAckBlocksShift; | 2388 type_byte <<= kQuicHasMultipleAckBlocksShift; |
2325 | 2389 |
2326 // Largest acked length. | 2390 // Largest acked length. |
2327 type_byte <<= kQuicSequenceNumberLengthShift; | 2391 type_byte <<= kQuicSequenceNumberLengthShift; |
2328 type_byte |= GetSequenceNumberFlags(largest_acked_length); | 2392 type_byte |= GetSequenceNumberFlags(largest_acked_length); |
2329 | 2393 |
2330 // Ack block length. | 2394 // Ack block length. |
2331 type_byte <<= kQuicSequenceNumberLengthShift; | 2395 type_byte <<= kQuicSequenceNumberLengthShift; |
2332 type_byte |= GetSequenceNumberFlags(ack_block_length); | 2396 type_byte |= GetSequenceNumberFlags(ack_block_length); |
2333 | 2397 |
(...skipping 16 matching lines...) Expand all Loading... |
2350 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | 2414 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); |
2351 } | 2415 } |
2352 if (!writer->WriteUFloat16(ack_delay_time_us)) { | 2416 if (!writer->WriteUFloat16(ack_delay_time_us)) { |
2353 return false; | 2417 return false; |
2354 } | 2418 } |
2355 | 2419 |
2356 size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes / | 2420 size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes / |
2357 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); | 2421 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); |
2358 | 2422 |
2359 // Number of ack blocks. | 2423 // Number of ack blocks. |
2360 size_t num_ack_blocks = | 2424 size_t num_ack_blocks = min(new_ack_info.num_ack_blocks, max_num_ack_blocks); |
2361 min(new_ack_info.ack_blocks.size(), max_num_ack_blocks); | |
2362 if (num_ack_blocks > numeric_limits<uint8_t>::max()) { | 2425 if (num_ack_blocks > numeric_limits<uint8_t>::max()) { |
2363 num_ack_blocks = numeric_limits<uint8_t>::max(); | 2426 num_ack_blocks = numeric_limits<uint8_t>::max(); |
2364 } | 2427 } |
2365 | 2428 |
2366 if (num_ack_blocks > 0) { | 2429 if (num_ack_blocks > 0) { |
2367 if (!writer->WriteBytes(&num_ack_blocks, 1)) { | 2430 if (!writer->WriteBytes(&num_ack_blocks, 1)) { |
2368 return false; | 2431 return false; |
2369 } | 2432 } |
2370 } | 2433 } |
2371 | 2434 |
2372 // First ack block length. | 2435 // First ack block length. |
2373 if (!AppendPacketSequenceNumber(ack_block_length, | 2436 if (!AppendPacketSequenceNumber(ack_block_length, |
2374 new_ack_info.first_block_length, writer)) { | 2437 new_ack_info.first_block_length, writer)) { |
2375 return false; | 2438 return false; |
2376 } | 2439 } |
2377 | 2440 |
2378 // Ack blocks. | 2441 // Ack blocks. |
2379 if (num_ack_blocks > 0) { | 2442 if (num_ack_blocks > 0) { |
2380 std::vector<AckBlock>::reverse_iterator iter = | 2443 vector<AckBlock>::const_reverse_iterator iter = |
2381 new_ack_info.ack_blocks.rbegin(); | 2444 new_ack_info.ack_blocks.rbegin(); |
2382 size_t num_ack_blocks_written = 0; | 2445 size_t num_ack_blocks_written = 0; |
2383 for (; iter != new_ack_info.ack_blocks.rend(); ++iter) { | 2446 if (!new_ack_info_construct_blocks) { |
2384 if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, iter->gap, | 2447 // Append, in descending order from the largest ACKed packet, a series of |
2385 writer)) { | 2448 // ACK blocks that represents the successfully acknoweldged packets. Each |
2386 return false; | 2449 // appended gap/block length represents a descending delta from the |
| 2450 // previous block. i.e.: |
| 2451 // |--- length ---|--- gap ---|--- length ---|--- gap ---|--- largest ---| |
| 2452 // For gaps larger than can be represented by a single encoded gap, a 0 |
| 2453 // length gap of the maximum is used, i.e.: |
| 2454 // |--- length ---|--- gap ---|- 0 -|--- gap ---|--- largest ---| |
| 2455 auto itr = frame.packets.rbegin_intervals(); |
| 2456 QuicPacketNumber previous_start = itr->min(); |
| 2457 ++itr; |
| 2458 |
| 2459 for (; itr != frame.packets.rend_intervals() && |
| 2460 num_ack_blocks_written < num_ack_blocks; |
| 2461 previous_start = itr->min(), ++itr) { |
| 2462 const auto& interval = *itr; |
| 2463 const QuicPacketNumber total_gap = previous_start - interval.max(); |
| 2464 const size_t num_encoded_gaps = |
| 2465 (total_gap + numeric_limits<uint8_t>::max() - 1) / |
| 2466 numeric_limits<uint8_t>::max(); |
| 2467 DCHECK_GT(num_encoded_gaps, 0u); |
| 2468 |
| 2469 // Append empty ACK blocks because the gap is longer than a single gap. |
| 2470 for (size_t i = 1; |
| 2471 i < num_encoded_gaps && num_ack_blocks_written < num_ack_blocks; |
| 2472 ++i) { |
| 2473 if (!AppendAckBlock(numeric_limits<uint8_t>::max(), ack_block_length, |
| 2474 0, writer)) { |
| 2475 return false; |
| 2476 } |
| 2477 ++num_ack_blocks_written; |
| 2478 } |
| 2479 if (num_ack_blocks_written >= num_ack_blocks) { |
| 2480 if (PREDICT_FALSE(num_ack_blocks_written != num_ack_blocks)) { |
| 2481 QUIC_BUG << "Wrote " << num_ack_blocks_written |
| 2482 << ", expected to write " << num_ack_blocks; |
| 2483 } |
| 2484 break; |
| 2485 } |
| 2486 |
| 2487 const uint8_t last_gap = |
| 2488 total_gap - (num_encoded_gaps - 1) * numeric_limits<uint8_t>::max(); |
| 2489 // Append the final ACK block with a non-empty size. |
| 2490 if (!AppendAckBlock(last_gap, ack_block_length, interval.Length(), |
| 2491 writer)) { |
| 2492 return false; |
| 2493 } |
| 2494 ++num_ack_blocks_written; |
2387 } | 2495 } |
2388 if (!AppendPacketSequenceNumber(ack_block_length, iter->length, writer)) { | 2496 } else { |
2389 return false; | 2497 DCHECK_EQ(new_ack_info.num_ack_blocks, new_ack_info.ack_blocks.size()); |
2390 } | 2498 vector<AckBlock>::const_reverse_iterator iter = |
2391 if (++num_ack_blocks_written == num_ack_blocks) { | 2499 new_ack_info.ack_blocks.rbegin(); |
2392 break; | 2500 for (; iter != new_ack_info.ack_blocks.rend(); ++iter) { |
| 2501 if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, iter->gap, |
| 2502 writer)) { |
| 2503 return false; |
| 2504 } |
| 2505 if (!AppendPacketSequenceNumber(ack_block_length, iter->length, |
| 2506 writer)) { |
| 2507 return false; |
| 2508 } |
| 2509 if (++num_ack_blocks_written == num_ack_blocks) { |
| 2510 break; |
| 2511 } |
2393 } | 2512 } |
2394 } | 2513 } |
2395 DCHECK_EQ(num_ack_blocks, num_ack_blocks_written); | 2514 DCHECK_EQ(num_ack_blocks, num_ack_blocks_written); |
2396 } | 2515 } |
2397 | 2516 |
2398 // Timestamps. | 2517 // Timestamps. |
2399 // If we don't have enough available space to append all the timestamps, don't | 2518 // If we don't have enough available space to append all the timestamps, don't |
2400 // append any of them. | 2519 // append any of them. |
2401 if (writer->capacity() - writer->length() >= | 2520 if (writer->capacity() - writer->length() >= |
2402 GetAckFrameTimeStampSize(frame)) { | 2521 GetAckFrameTimeStampSize(frame)) { |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2589 | 2708 |
2590 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2709 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2591 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2710 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2592 << " detail: " << detailed_error_; | 2711 << " detail: " << detailed_error_; |
2593 set_error(error); | 2712 set_error(error); |
2594 visitor_->OnError(this); | 2713 visitor_->OnError(this); |
2595 return false; | 2714 return false; |
2596 } | 2715 } |
2597 | 2716 |
2598 } // namespace net | 2717 } // namespace net |
OLD | NEW |