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

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

Issue 761903003: Update from https://crrev.com/306655 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years 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_flow_controller_test.cc ('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 "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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_flow_controller_test.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698