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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 default: | 977 default: |
978 LOG(DFATAL) << "Unreachable case statement."; | 978 LOG(DFATAL) << "Unreachable case statement."; |
979 return PACKET_FLAGS_6BYTE_PACKET; | 979 return PACKET_FLAGS_6BYTE_PACKET; |
980 } | 980 } |
981 } | 981 } |
982 | 982 |
983 // static | 983 // static |
984 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | 984 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( |
985 const QuicAckFrame& frame) { | 985 const QuicAckFrame& frame) { |
986 AckFrameInfo ack_info; | 986 AckFrameInfo ack_info; |
987 if (frame.missing_packets.empty()) { | 987 if (frame.missing_packets.Empty()) { |
988 return ack_info; | 988 return ack_info; |
989 } | 989 } |
990 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); | 990 DCHECK_GE(frame.largest_observed, frame.missing_packets.Max()); |
991 size_t cur_range_length = 0; | 991 size_t cur_range_length = 0; |
992 PacketNumberSet::const_iterator iter = frame.missing_packets.begin(); | 992 PacketNumberSet::const_iterator iter = frame.missing_packets.begin(); |
993 QuicPacketNumber last_missing = *iter; | 993 QuicPacketNumber last_missing = *iter; |
994 ++iter; | 994 ++iter; |
995 for (; iter != frame.missing_packets.end(); ++iter) { | 995 for (; iter != frame.missing_packets.end(); ++iter) { |
996 if (cur_range_length < numeric_limits<uint8>::max() && | 996 if (cur_range_length < numeric_limits<uint8>::max() && |
997 *iter == (last_missing + 1)) { | 997 *iter == (last_missing + 1)) { |
998 ++cur_range_length; | 998 ++cur_range_length; |
999 } else { | 999 } else { |
1000 ack_info.nack_ranges[last_missing - cur_range_length] = | 1000 ack_info.nack_ranges[last_missing - cur_range_length] = |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 if (!reader->ReadBytes(&missing_delta, missing_packet_number_length)) { | 1354 if (!reader->ReadBytes(&missing_delta, missing_packet_number_length)) { |
1355 set_detailed_error("Unable to read missing packet number delta."); | 1355 set_detailed_error("Unable to read missing packet number delta."); |
1356 return false; | 1356 return false; |
1357 } | 1357 } |
1358 last_packet_number -= missing_delta; | 1358 last_packet_number -= missing_delta; |
1359 QuicPacketNumber range_length = 0; | 1359 QuicPacketNumber range_length = 0; |
1360 if (!reader->ReadBytes(&range_length, PACKET_1BYTE_PACKET_NUMBER)) { | 1360 if (!reader->ReadBytes(&range_length, PACKET_1BYTE_PACKET_NUMBER)) { |
1361 set_detailed_error("Unable to read missing packet number range."); | 1361 set_detailed_error("Unable to read missing packet number range."); |
1362 return false; | 1362 return false; |
1363 } | 1363 } |
1364 for (size_t j = 0; j <= range_length; ++j) { | 1364 ack_frame->missing_packets.Add(last_packet_number - range_length, |
1365 ack_frame->missing_packets.insert(last_packet_number - j); | 1365 last_packet_number + 1); |
1366 } | |
1367 // Subtract an extra 1 to ensure ranges are represented efficiently and | 1366 // Subtract an extra 1 to ensure ranges are represented efficiently and |
1368 // can't overlap by 1 packet number. This allows a missing_delta of 0 | 1367 // can't overlap by 1 packet number. This allows a missing_delta of 0 |
1369 // to represent an adjacent nack range. | 1368 // to represent an adjacent nack range. |
1370 last_packet_number -= (range_length + 1); | 1369 last_packet_number -= (range_length + 1); |
1371 } | 1370 } |
1372 | 1371 |
1373 // Parse the revived packets list. | 1372 // Parse the revived packets list. |
1374 uint8 num_revived_packets; | 1373 uint8 num_revived_packets; |
1375 if (!reader->ReadBytes(&num_revived_packets, 1)) { | 1374 if (!reader->ReadBytes(&num_revived_packets, 1)) { |
1376 set_detailed_error("Unable to read num revived packets."); | 1375 set_detailed_error("Unable to read num revived packets."); |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2056 static_cast<uint8>(min(frame.revived_packets.size(), kMaxRevivedPackets)); | 2055 static_cast<uint8>(min(frame.revived_packets.size(), kMaxRevivedPackets)); |
2057 num_revived_packets = static_cast<uint8>(min( | 2056 num_revived_packets = static_cast<uint8>(min( |
2058 static_cast<size_t>(num_revived_packets), | 2057 static_cast<size_t>(num_revived_packets), |
2059 (writer->capacity() - writer->length()) / largest_observed_length)); | 2058 (writer->capacity() - writer->length()) / largest_observed_length)); |
2060 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2059 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
2061 return false; | 2060 return false; |
2062 } | 2061 } |
2063 | 2062 |
2064 PacketNumberSet::const_iterator iter = frame.revived_packets.begin(); | 2063 PacketNumberSet::const_iterator iter = frame.revived_packets.begin(); |
2065 for (int i = 0; i < num_revived_packets; ++i, ++iter) { | 2064 for (int i = 0; i < num_revived_packets; ++i, ++iter) { |
2066 LOG_IF(DFATAL, !ContainsKey(frame.missing_packets, *iter)); | 2065 LOG_IF(DFATAL, !frame.missing_packets.Contains(*iter)); |
2067 if (!AppendPacketSequenceNumber(largest_observed_length, | 2066 if (!AppendPacketSequenceNumber(largest_observed_length, |
2068 *iter, writer)) { | 2067 *iter, writer)) { |
2069 return false; | 2068 return false; |
2070 } | 2069 } |
2071 } | 2070 } |
2072 | 2071 |
2073 return true; | 2072 return true; |
2074 } | 2073 } |
2075 | 2074 |
2076 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame, | 2075 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame, |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2244 | 2243 |
2245 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2244 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2246 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2245 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2247 << " detail: " << detailed_error_; | 2246 << " detail: " << detailed_error_; |
2248 set_error(error); | 2247 set_error(error); |
2249 visitor_->OnError(this); | 2248 visitor_->OnError(this); |
2250 return false; | 2249 return false; |
2251 } | 2250 } |
2252 | 2251 |
2253 } // namespace net | 2252 } // namespace net |
OLD | NEW |