| 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/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 return false; | 1377 return false; |
| 1378 } | 1378 } |
| 1379 | 1379 |
| 1380 for (size_t i = 0; i < num_revived_packets; ++i) { | 1380 for (size_t i = 0; i < num_revived_packets; ++i) { |
| 1381 QuicPacketNumber revived_packet = 0; | 1381 QuicPacketNumber revived_packet = 0; |
| 1382 if (!reader->ReadBytes(&revived_packet, | 1382 if (!reader->ReadBytes(&revived_packet, |
| 1383 largest_observed_packet_number_length)) { | 1383 largest_observed_packet_number_length)) { |
| 1384 set_detailed_error("Unable to read revived packet."); | 1384 set_detailed_error("Unable to read revived packet."); |
| 1385 return false; | 1385 return false; |
| 1386 } | 1386 } |
| 1387 ack_frame->latest_revived_packet = revived_packet; | |
| 1388 } | 1387 } |
| 1389 | 1388 |
| 1390 return true; | 1389 return true; |
| 1391 } | 1390 } |
| 1392 | 1391 |
| 1393 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1392 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
| 1394 QuicAckFrame* ack_frame) { | 1393 QuicAckFrame* ack_frame) { |
| 1395 if (ack_frame->is_truncated) { | 1394 if (ack_frame->is_truncated) { |
| 1396 return true; | 1395 return true; |
| 1397 } | 1396 } |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1750 QuicPacketNumberLength largest_observed_length = | 1749 QuicPacketNumberLength largest_observed_length = |
| 1751 GetMinSequenceNumberLength(ack.largest_observed); | 1750 GetMinSequenceNumberLength(ack.largest_observed); |
| 1752 QuicPacketNumberLength missing_packet_number_length = | 1751 QuicPacketNumberLength missing_packet_number_length = |
| 1753 GetMinSequenceNumberLength(ack_info.max_delta); | 1752 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1754 | 1753 |
| 1755 size_t ack_size = GetMinAckFrameSize(largest_observed_length); | 1754 size_t ack_size = GetMinAckFrameSize(largest_observed_length); |
| 1756 if (!ack_info.nack_ranges.empty()) { | 1755 if (!ack_info.nack_ranges.empty()) { |
| 1757 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; | 1756 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; |
| 1758 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | 1757 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * |
| 1759 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | 1758 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); |
| 1760 if (ack.latest_revived_packet != 0) { | |
| 1761 ack_size += largest_observed_length; | |
| 1762 } | |
| 1763 } | 1759 } |
| 1764 | 1760 |
| 1765 // In version 23, if the ack will be truncated due to too many nack ranges, | 1761 // In version 23, if the ack will be truncated due to too many nack ranges, |
| 1766 // then do not include the number of timestamps (1 byte). | 1762 // then do not include the number of timestamps (1 byte). |
| 1767 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { | 1763 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { |
| 1768 // 1 byte for the number of timestamps. | 1764 // 1 byte for the number of timestamps. |
| 1769 ack_size += 1; | 1765 ack_size += 1; |
| 1770 if (ack.received_packet_times.size() > 0) { | 1766 if (ack.received_packet_times.size() > 0) { |
| 1771 // 1 byte for packet number, 4 bytes for timestamp for the first | 1767 // 1 byte for packet number, 4 bytes for timestamp for the first |
| 1772 // packet. | 1768 // packet. |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 ack_iter->second, writer)) { | 2037 ack_iter->second, writer)) { |
| 2042 return false; | 2038 return false; |
| 2043 } | 2039 } |
| 2044 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2040 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2045 last_sequence_written = ack_iter->first - 1; | 2041 last_sequence_written = ack_iter->first - 1; |
| 2046 ++num_ranges_written; | 2042 ++num_ranges_written; |
| 2047 } | 2043 } |
| 2048 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2044 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2049 | 2045 |
| 2050 // Append revived packets. | 2046 // Append revived packets. |
| 2051 // If not all the revived packets fit, only mention the ones that do. | 2047 // FEC is not supported. |
| 2052 uint8_t num_revived_packets = frame.latest_revived_packet == 0 ? 0 : 1; | 2048 uint8_t num_revived_packets = 0; |
| 2053 if (((writer->capacity() - writer->length()) / largest_observed_length) == | |
| 2054 0) { | |
| 2055 num_revived_packets = 0; | |
| 2056 } | |
| 2057 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2049 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2058 return false; | 2050 return false; |
| 2059 } | 2051 } |
| 2060 | 2052 |
| 2061 if (num_revived_packets > 0) { | |
| 2062 QUIC_BUG_IF(!frame.missing_packets.Contains(frame.latest_revived_packet)); | |
| 2063 if (!AppendPacketSequenceNumber(largest_observed_length, | |
| 2064 frame.latest_revived_packet, writer)) { | |
| 2065 return false; | |
| 2066 } | |
| 2067 } | |
| 2068 | |
| 2069 return true; | 2053 return true; |
| 2070 } | 2054 } |
| 2071 | 2055 |
| 2072 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame, | 2056 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame, |
| 2073 QuicDataWriter* writer) { | 2057 QuicDataWriter* writer) { |
| 2074 DCHECK_GE(numeric_limits<uint8_t>::max(), frame.received_packet_times.size()); | 2058 DCHECK_GE(numeric_limits<uint8_t>::max(), frame.received_packet_times.size()); |
| 2075 // num_received_packets is only 1 byte. | 2059 // num_received_packets is only 1 byte. |
| 2076 if (frame.received_packet_times.size() > numeric_limits<uint8_t>::max()) { | 2060 if (frame.received_packet_times.size() > numeric_limits<uint8_t>::max()) { |
| 2077 return false; | 2061 return false; |
| 2078 } | 2062 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2242 | 2226 |
| 2243 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2227 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2244 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2228 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
| 2245 << " detail: " << detailed_error_; | 2229 << " detail: " << detailed_error_; |
| 2246 set_error(error); | 2230 set_error(error); |
| 2247 visitor_->OnError(this); | 2231 visitor_->OnError(this); |
| 2248 return false; | 2232 return false; |
| 2249 } | 2233 } |
| 2250 | 2234 |
| 2251 } // namespace net | 2235 } // namespace net |
| OLD | NEW |