| 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 "base/containers/hash_tables.h" | 7 #include "base/containers/hash_tables.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/quic/crypto/crypto_framer.h" | 9 #include "net/quic/crypto/crypto_framer.h" |
| 10 #include "net/quic/crypto/crypto_handshake_message.h" | 10 #include "net/quic/crypto/crypto_handshake_message.h" |
| (...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 if (header.fec_flag) { | 774 if (header.fec_flag) { |
| 775 private_flags |= PACKET_PRIVATE_FLAGS_FEC; | 775 private_flags |= PACKET_PRIVATE_FLAGS_FEC; |
| 776 } | 776 } |
| 777 if (!writer->WriteUInt8(private_flags)) { | 777 if (!writer->WriteUInt8(private_flags)) { |
| 778 return false; | 778 return false; |
| 779 } | 779 } |
| 780 | 780 |
| 781 // The FEC group number is the sequence number of the first fec | 781 // The FEC group number is the sequence number of the first fec |
| 782 // protected packet, or 0 if this packet is not protected. | 782 // protected packet, or 0 if this packet is not protected. |
| 783 if (header.is_in_fec_group == IN_FEC_GROUP) { | 783 if (header.is_in_fec_group == IN_FEC_GROUP) { |
| 784 DCHECK_GE(header.packet_sequence_number, header.fec_group); | 784 DCHECK_LE(header.fec_group, header.packet_sequence_number); |
| 785 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group); | 785 DCHECK_LT(header.packet_sequence_number - header.fec_group, 255u); |
| 786 // Offset from the current packet sequence number to the first fec | 786 // Offset from the current packet sequence number to the first fec |
| 787 // protected packet. | 787 // protected packet. |
| 788 uint8 first_fec_protected_packet_offset = | 788 uint8 first_fec_protected_packet_offset = |
| 789 header.packet_sequence_number - header.fec_group; | 789 static_cast<uint8>(header.packet_sequence_number - header.fec_group); |
| 790 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { | 790 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { |
| 791 return false; | 791 return false; |
| 792 } | 792 } |
| 793 } | 793 } |
| 794 | 794 |
| 795 return true; | 795 return true; |
| 796 } | 796 } |
| 797 | 797 |
| 798 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 798 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
| 799 uint32 time_delta_us) { | 799 uint32 time_delta_us) { |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 980 AckFrameInfo ack_info; | 980 AckFrameInfo ack_info; |
| 981 if (frame.missing_packets.empty()) { | 981 if (frame.missing_packets.empty()) { |
| 982 return ack_info; | 982 return ack_info; |
| 983 } | 983 } |
| 984 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); | 984 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); |
| 985 size_t cur_range_length = 0; | 985 size_t cur_range_length = 0; |
| 986 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin(); | 986 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin(); |
| 987 QuicPacketSequenceNumber last_missing = *iter; | 987 QuicPacketSequenceNumber last_missing = *iter; |
| 988 ++iter; | 988 ++iter; |
| 989 for (; iter != frame.missing_packets.end(); ++iter) { | 989 for (; iter != frame.missing_packets.end(); ++iter) { |
| 990 if (cur_range_length != numeric_limits<uint8>::max() && | 990 if (cur_range_length < numeric_limits<uint8>::max() && |
| 991 *iter == (last_missing + 1)) { | 991 *iter == (last_missing + 1)) { |
| 992 ++cur_range_length; | 992 ++cur_range_length; |
| 993 } else { | 993 } else { |
| 994 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; | 994 ack_info.nack_ranges[last_missing - cur_range_length] = |
| 995 static_cast<uint8>(cur_range_length); |
| 995 cur_range_length = 0; | 996 cur_range_length = 0; |
| 996 } | 997 } |
| 997 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); | 998 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); |
| 998 last_missing = *iter; | 999 last_missing = *iter; |
| 999 } | 1000 } |
| 1000 // Include the last nack range. | 1001 // Include the last nack range. |
| 1001 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; | 1002 ack_info.nack_ranges[last_missing - cur_range_length] = |
| 1003 static_cast<uint8>(cur_range_length); |
| 1002 // Include the range to the largest observed. | 1004 // Include the range to the largest observed. |
| 1003 ack_info.max_delta = | 1005 ack_info.max_delta = |
| 1004 max(ack_info.max_delta, frame.largest_observed - last_missing); | 1006 max(ack_info.max_delta, frame.largest_observed - last_missing); |
| 1005 return ack_info; | 1007 return ack_info; |
| 1006 } | 1008 } |
| 1007 | 1009 |
| 1008 bool QuicFramer::ProcessPacketHeader( | 1010 bool QuicFramer::ProcessPacketHeader( |
| 1009 QuicPacketHeader* header, | 1011 QuicPacketHeader* header, |
| 1010 const QuicEncryptedPacket& packet) { | 1012 const QuicEncryptedPacket& packet) { |
| 1011 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, | 1013 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, |
| (...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1897 break; | 1899 break; |
| 1898 } | 1900 } |
| 1899 case ACK_FRAME: | 1901 case ACK_FRAME: |
| 1900 return true; | 1902 return true; |
| 1901 case CONGESTION_FEEDBACK_FRAME: { | 1903 case CONGESTION_FEEDBACK_FRAME: { |
| 1902 // TODO(ianswett): Use extra 5 bits in the congestion feedback framing. | 1904 // TODO(ianswett): Use extra 5 bits in the congestion feedback framing. |
| 1903 type_byte = kQuicFrameTypeCongestionFeedbackMask; | 1905 type_byte = kQuicFrameTypeCongestionFeedbackMask; |
| 1904 break; | 1906 break; |
| 1905 } | 1907 } |
| 1906 default: | 1908 default: |
| 1907 type_byte = frame.type; | 1909 type_byte = static_cast<uint8>(frame.type); |
| 1908 break; | 1910 break; |
| 1909 } | 1911 } |
| 1910 | 1912 |
| 1911 return writer->WriteUInt8(type_byte); | 1913 return writer->WriteUInt8(type_byte); |
| 1912 } | 1914 } |
| 1913 | 1915 |
| 1914 // static | 1916 // static |
| 1915 bool QuicFramer::AppendPacketSequenceNumber( | 1917 bool QuicFramer::AppendPacketSequenceNumber( |
| 1916 QuicSequenceNumberLength sequence_number_length, | 1918 QuicSequenceNumberLength sequence_number_length, |
| 1917 QuicPacketSequenceNumber packet_sequence_number, | 1919 QuicPacketSequenceNumber packet_sequence_number, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1950 QuicDataWriter* writer) { | 1952 QuicDataWriter* writer) { |
| 1951 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1953 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
| 1952 LOG(DFATAL) << "Writing stream id size failed."; | 1954 LOG(DFATAL) << "Writing stream id size failed."; |
| 1953 return false; | 1955 return false; |
| 1954 } | 1956 } |
| 1955 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1957 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { |
| 1956 LOG(DFATAL) << "Writing offset size failed."; | 1958 LOG(DFATAL) << "Writing offset size failed."; |
| 1957 return false; | 1959 return false; |
| 1958 } | 1960 } |
| 1959 if (!no_stream_frame_length) { | 1961 if (!no_stream_frame_length) { |
| 1960 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { | 1962 if ((frame.data.TotalBufferSize() > std::numeric_limits<uint16>::max()) || |
| 1963 !writer->WriteUInt16( |
| 1964 static_cast<uint16>(frame.data.TotalBufferSize()))) { |
| 1961 LOG(DFATAL) << "Writing stream frame length failed"; | 1965 LOG(DFATAL) << "Writing stream frame length failed"; |
| 1962 return false; | 1966 return false; |
| 1963 } | 1967 } |
| 1964 } | 1968 } |
| 1965 | 1969 |
| 1966 if (!writer->WriteIOVector(frame.data)) { | 1970 if (!writer->WriteIOVector(frame.data)) { |
| 1967 LOG(DFATAL) << "Writing frame data failed."; | 1971 LOG(DFATAL) << "Writing frame data failed."; |
| 1968 return false; | 1972 return false; |
| 1969 } | 1973 } |
| 1970 return true; | 1974 return true; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2064 if (!AppendTimestampToAckFrame(frame, writer)) { | 2068 if (!AppendTimestampToAckFrame(frame, writer)) { |
| 2065 return false; | 2069 return false; |
| 2066 } | 2070 } |
| 2067 } | 2071 } |
| 2068 | 2072 |
| 2069 if (ack_info.nack_ranges.empty()) { | 2073 if (ack_info.nack_ranges.empty()) { |
| 2070 return true; | 2074 return true; |
| 2071 } | 2075 } |
| 2072 | 2076 |
| 2073 const uint8 num_missing_ranges = | 2077 const uint8 num_missing_ranges = |
| 2074 min(ack_info.nack_ranges.size(), max_num_ranges); | 2078 static_cast<uint8>(min(ack_info.nack_ranges.size(), max_num_ranges)); |
| 2075 if (!writer->WriteBytes(&num_missing_ranges, 1)) { | 2079 if (!writer->WriteBytes(&num_missing_ranges, 1)) { |
| 2076 return false; | 2080 return false; |
| 2077 } | 2081 } |
| 2078 | 2082 |
| 2079 int num_ranges_written = 0; | 2083 int num_ranges_written = 0; |
| 2080 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; | 2084 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; |
| 2081 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { | 2085 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { |
| 2082 // Calculate the delta to the last number in the range. | 2086 // Calculate the delta to the last number in the range. |
| 2083 QuicPacketSequenceNumber missing_delta = | 2087 QuicPacketSequenceNumber missing_delta = |
| 2084 last_sequence_written - (ack_iter->first + ack_iter->second); | 2088 last_sequence_written - (ack_iter->first + ack_iter->second); |
| 2085 if (!AppendPacketSequenceNumber(missing_sequence_number_length, | 2089 if (!AppendPacketSequenceNumber(missing_sequence_number_length, |
| 2086 missing_delta, writer)) { | 2090 missing_delta, writer)) { |
| 2087 return false; | 2091 return false; |
| 2088 } | 2092 } |
| 2089 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, | 2093 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 2090 ack_iter->second, writer)) { | 2094 ack_iter->second, writer)) { |
| 2091 return false; | 2095 return false; |
| 2092 } | 2096 } |
| 2093 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2097 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2094 last_sequence_written = ack_iter->first - 1; | 2098 last_sequence_written = ack_iter->first - 1; |
| 2095 ++num_ranges_written; | 2099 ++num_ranges_written; |
| 2096 } | 2100 } |
| 2097 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2101 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2098 | 2102 |
| 2099 // Append revived packets. | 2103 // Append revived packets. |
| 2100 // If not all the revived packets fit, only mention the ones that do. | 2104 // If not all the revived packets fit, only mention the ones that do. |
| 2101 uint8 num_revived_packets = min(frame.revived_packets.size(), | 2105 uint8 num_revived_packets = |
| 2102 kMaxRevivedPackets); | 2106 static_cast<uint8>(min(frame.revived_packets.size(), kMaxRevivedPackets)); |
| 2103 num_revived_packets = min( | 2107 num_revived_packets = static_cast<uint8>(min( |
| 2104 static_cast<size_t>(num_revived_packets), | 2108 static_cast<size_t>(num_revived_packets), |
| 2105 (writer->capacity() - writer->length()) / largest_observed_length); | 2109 (writer->capacity() - writer->length()) / largest_observed_length)); |
| 2106 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2110 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2107 return false; | 2111 return false; |
| 2108 } | 2112 } |
| 2109 | 2113 |
| 2110 SequenceNumberSet::const_iterator iter = frame.revived_packets.begin(); | 2114 SequenceNumberSet::const_iterator iter = frame.revived_packets.begin(); |
| 2111 for (int i = 0; i < num_revived_packets; ++i, ++iter) { | 2115 for (int i = 0; i < num_revived_packets; ++i, ++iter) { |
| 2112 LOG_IF(DFATAL, !ContainsKey(frame.missing_packets, *iter)); | 2116 LOG_IF(DFATAL, !ContainsKey(frame.missing_packets, *iter)); |
| 2113 if (!AppendPacketSequenceNumber(largest_observed_length, | 2117 if (!AppendPacketSequenceNumber(largest_observed_length, |
| 2114 *iter, writer)) { | 2118 *iter, writer)) { |
| 2115 return false; | 2119 return false; |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2315 | 2319 |
| 2316 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2320 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2317 DVLOG(1) << "Error detail: " << detailed_error_; | 2321 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2318 set_error(error); | 2322 set_error(error); |
| 2319 visitor_->OnError(this); | 2323 visitor_->OnError(this); |
| 2320 reader_.reset(nullptr); | 2324 reader_.reset(nullptr); |
| 2321 return false; | 2325 return false; |
| 2322 } | 2326 } |
| 2323 | 2327 |
| 2324 } // namespace net | 2328 } // namespace net |
| OLD | NEW |