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 |