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

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

Issue 2192633002: Switch to PacketNumberQueue interval iteration and avoid allocations in new ACK frame generation. G… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@128431128
Patch Set: Rebase Created 4 years, 4 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
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698