| 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 case PACKET_FLAGS_2BYTE_SEQUENCE: | 125 case PACKET_FLAGS_2BYTE_SEQUENCE: |
| 126 return PACKET_2BYTE_SEQUENCE_NUMBER; | 126 return PACKET_2BYTE_SEQUENCE_NUMBER; |
| 127 case PACKET_FLAGS_1BYTE_SEQUENCE: | 127 case PACKET_FLAGS_1BYTE_SEQUENCE: |
| 128 return PACKET_1BYTE_SEQUENCE_NUMBER; | 128 return PACKET_1BYTE_SEQUENCE_NUMBER; |
| 129 default: | 129 default: |
| 130 LOG(DFATAL) << "Unreachable case statement."; | 130 LOG(DFATAL) << "Unreachable case statement."; |
| 131 return PACKET_6BYTE_SEQUENCE_NUMBER; | 131 return PACKET_6BYTE_SEQUENCE_NUMBER; |
| 132 } | 132 } |
| 133 } | 133 } |
| 134 | 134 |
| 135 bool CanTruncate( | 135 bool CanTruncate(const QuicFrame& frame, size_t free_bytes) { |
| 136 QuicVersion version, const QuicFrame& frame, size_t free_bytes) { | |
| 137 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && | 136 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && |
| 138 free_bytes >= | 137 free_bytes >= |
| 139 QuicFramer::GetMinAckFrameSize(version, | 138 QuicFramer::GetMinAckFrameSize(PACKET_6BYTE_SEQUENCE_NUMBER, |
| 140 PACKET_6BYTE_SEQUENCE_NUMBER, | |
| 141 PACKET_6BYTE_SEQUENCE_NUMBER)) { | 139 PACKET_6BYTE_SEQUENCE_NUMBER)) { |
| 142 return true; | 140 return true; |
| 143 } | 141 } |
| 144 return false; | 142 return false; |
| 145 } | 143 } |
| 146 | 144 |
| 147 } // namespace | 145 } // namespace |
| 148 | 146 |
| 149 bool QuicFramerVisitorInterface::OnWindowUpdateFrame( | 147 bool QuicFramerVisitorInterface::OnWindowUpdateFrame( |
| 150 const QuicWindowUpdateFrame& frame) { | 148 const QuicWindowUpdateFrame& frame) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 174 DCHECK(!supported_versions.empty()); | 172 DCHECK(!supported_versions.empty()); |
| 175 quic_version_ = supported_versions_[0]; | 173 quic_version_ = supported_versions_[0]; |
| 176 decrypter_.reset(QuicDecrypter::Create(kNULL)); | 174 decrypter_.reset(QuicDecrypter::Create(kNULL)); |
| 177 encrypter_[ENCRYPTION_NONE].reset( | 175 encrypter_[ENCRYPTION_NONE].reset( |
| 178 QuicEncrypter::Create(kNULL)); | 176 QuicEncrypter::Create(kNULL)); |
| 179 } | 177 } |
| 180 | 178 |
| 181 QuicFramer::~QuicFramer() {} | 179 QuicFramer::~QuicFramer() {} |
| 182 | 180 |
| 183 // static | 181 // static |
| 184 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, | 182 size_t QuicFramer::GetMinStreamFrameSize(QuicStreamId stream_id, |
| 185 QuicStreamId stream_id, | |
| 186 QuicStreamOffset offset, | 183 QuicStreamOffset offset, |
| 187 bool last_frame_in_packet, | 184 bool last_frame_in_packet, |
| 188 InFecGroup is_in_fec_group) { | 185 InFecGroup is_in_fec_group) { |
| 189 bool no_stream_frame_length = last_frame_in_packet && | 186 bool no_stream_frame_length = last_frame_in_packet && |
| 190 is_in_fec_group == NOT_IN_FEC_GROUP; | 187 is_in_fec_group == NOT_IN_FEC_GROUP; |
| 191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | 188 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + |
| 192 GetStreamOffsetSize(offset) + | 189 GetStreamOffsetSize(offset) + |
| 193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); | 190 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); |
| 194 } | 191 } |
| 195 | 192 |
| 196 // static | 193 // static |
| 197 size_t QuicFramer::GetMinAckFrameSize( | 194 size_t QuicFramer::GetMinAckFrameSize( |
| 198 QuicVersion version, | |
| 199 QuicSequenceNumberLength sequence_number_length, | 195 QuicSequenceNumberLength sequence_number_length, |
| 200 QuicSequenceNumberLength largest_observed_length) { | 196 QuicSequenceNumberLength largest_observed_length) { |
| 201 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 197 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
| 202 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | 198 largest_observed_length + kQuicDeltaTimeLargestObservedSize; |
| 203 } | 199 } |
| 204 | 200 |
| 205 // static | 201 // static |
| 206 size_t QuicFramer::GetStopWaitingFrameSize( | 202 size_t QuicFramer::GetStopWaitingFrameSize( |
| 207 QuicSequenceNumberLength sequence_number_length) { | 203 QuicSequenceNumberLength sequence_number_length) { |
| 208 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 204 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
| 209 sequence_number_length; | 205 sequence_number_length; |
| 210 } | 206 } |
| 211 | 207 |
| 212 // static | 208 // static |
| 213 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { | 209 size_t QuicFramer::GetMinRstStreamFrameSize() { |
| 214 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 210 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
| 215 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + | 211 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + |
| 216 kQuicErrorDetailsLengthSize; | 212 kQuicErrorDetailsLengthSize; |
| 217 } | 213 } |
| 218 | 214 |
| 219 // static | 215 // static |
| 220 size_t QuicFramer::GetMinConnectionCloseFrameSize() { | 216 size_t QuicFramer::GetMinConnectionCloseFrameSize() { |
| 221 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; | 217 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; |
| 222 } | 218 } |
| 223 | 219 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 sequence_number_length); | 295 sequence_number_length); |
| 300 if (frame_len <= free_bytes) { | 296 if (frame_len <= free_bytes) { |
| 301 // Frame fits within packet. Note that acks may be truncated. | 297 // Frame fits within packet. Note that acks may be truncated. |
| 302 return frame_len; | 298 return frame_len; |
| 303 } | 299 } |
| 304 // Only truncate the first frame in a packet, so if subsequent ones go | 300 // Only truncate the first frame in a packet, so if subsequent ones go |
| 305 // over, stop including more frames. | 301 // over, stop including more frames. |
| 306 if (!first_frame) { | 302 if (!first_frame) { |
| 307 return 0; | 303 return 0; |
| 308 } | 304 } |
| 309 if (CanTruncate(quic_version_, frame, free_bytes)) { | 305 if (CanTruncate(frame, free_bytes)) { |
| 310 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 306 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 311 // Note that we may not use every byte of the writer in this case. | 307 // Note that we may not use every byte of the writer in this case. |
| 312 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; | 308 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; |
| 313 return free_bytes; | 309 return free_bytes; |
| 314 } | 310 } |
| 315 if (!FLAGS_quic_allow_oversized_packets_for_test) { | 311 if (!FLAGS_quic_allow_oversized_packets_for_test) { |
| 316 return 0; | 312 return 0; |
| 317 } | 313 } |
| 318 LOG(DFATAL) << "Packet size too small to fit frame."; | 314 LOG(DFATAL) << "Packet size too small to fit frame."; |
| 319 return frame_len; | 315 return frame_len; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 } | 374 } |
| 379 break; | 375 break; |
| 380 case STOP_WAITING_FRAME: | 376 case STOP_WAITING_FRAME: |
| 381 if (!AppendStopWaitingFrame( | 377 if (!AppendStopWaitingFrame( |
| 382 header, *frame.stop_waiting_frame, &writer)) { | 378 header, *frame.stop_waiting_frame, &writer)) { |
| 383 LOG(DFATAL) << "AppendStopWaitingFrame failed"; | 379 LOG(DFATAL) << "AppendStopWaitingFrame failed"; |
| 384 return kNoPacket; | 380 return kNoPacket; |
| 385 } | 381 } |
| 386 break; | 382 break; |
| 387 case PING_FRAME: | 383 case PING_FRAME: |
| 388 if (quic_version_ <= QUIC_VERSION_16) { | 384 if (quic_version_ == QUIC_VERSION_16) { |
| 389 LOG(DFATAL) << "Attempt to add a PingFrame in " | 385 LOG(DFATAL) << "Attempt to add a PingFrame in " |
| 390 << QuicVersionToString(quic_version_); | 386 << QuicVersionToString(quic_version_); |
| 391 return kNoPacket; | 387 return kNoPacket; |
| 392 } | 388 } |
| 393 // Ping has no payload. | 389 // Ping has no payload. |
| 394 break; | 390 break; |
| 395 case RST_STREAM_FRAME: | 391 case RST_STREAM_FRAME: |
| 396 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { | 392 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
| 397 LOG(DFATAL) << "AppendRstStreamFrame failed"; | 393 LOG(DFATAL) << "AppendRstStreamFrame failed"; |
| 398 return kNoPacket; | 394 return kNoPacket; |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 return PACKET_FLAGS_6BYTE_SEQUENCE; | 956 return PACKET_FLAGS_6BYTE_SEQUENCE; |
| 961 default: | 957 default: |
| 962 LOG(DFATAL) << "Unreachable case statement."; | 958 LOG(DFATAL) << "Unreachable case statement."; |
| 963 return PACKET_FLAGS_6BYTE_SEQUENCE; | 959 return PACKET_FLAGS_6BYTE_SEQUENCE; |
| 964 } | 960 } |
| 965 } | 961 } |
| 966 | 962 |
| 967 // static | 963 // static |
| 968 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | 964 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( |
| 969 const QuicAckFrame& frame) { | 965 const QuicAckFrame& frame) { |
| 970 const ReceivedPacketInfo& received_info = frame.received_info; | |
| 971 | |
| 972 AckFrameInfo ack_info; | 966 AckFrameInfo ack_info; |
| 973 if (!received_info.missing_packets.empty()) { | 967 if (!frame.missing_packets.empty()) { |
| 974 DCHECK_GE(received_info.largest_observed, | 968 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); |
| 975 *received_info.missing_packets.rbegin()); | |
| 976 size_t cur_range_length = 0; | 969 size_t cur_range_length = 0; |
| 977 SequenceNumberSet::const_iterator iter = | 970 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin(); |
| 978 received_info.missing_packets.begin(); | |
| 979 QuicPacketSequenceNumber last_missing = *iter; | 971 QuicPacketSequenceNumber last_missing = *iter; |
| 980 ++iter; | 972 ++iter; |
| 981 for (; iter != received_info.missing_packets.end(); ++iter) { | 973 for (; iter != frame.missing_packets.end(); ++iter) { |
| 982 if (cur_range_length != numeric_limits<uint8>::max() && | 974 if (cur_range_length != numeric_limits<uint8>::max() && |
| 983 *iter == (last_missing + 1)) { | 975 *iter == (last_missing + 1)) { |
| 984 ++cur_range_length; | 976 ++cur_range_length; |
| 985 } else { | 977 } else { |
| 986 ack_info.nack_ranges[last_missing - cur_range_length] | 978 ack_info.nack_ranges[last_missing - cur_range_length] |
| 987 = cur_range_length; | 979 = cur_range_length; |
| 988 cur_range_length = 0; | 980 cur_range_length = 0; |
| 989 } | 981 } |
| 990 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); | 982 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); |
| 991 last_missing = *iter; | 983 last_missing = *iter; |
| 992 } | 984 } |
| 993 // Include the last nack range. | 985 // Include the last nack range. |
| 994 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; | 986 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; |
| 995 // Include the range to the largest observed. | 987 // Include the range to the largest observed. |
| 996 ack_info.max_delta = max(ack_info.max_delta, | 988 ack_info.max_delta = max(ack_info.max_delta, |
| 997 received_info.largest_observed - last_missing); | 989 frame.largest_observed - last_missing); |
| 998 } | 990 } |
| 999 return ack_info; | 991 return ack_info; |
| 1000 } | 992 } |
| 1001 | 993 |
| 1002 bool QuicFramer::ProcessPacketHeader( | 994 bool QuicFramer::ProcessPacketHeader( |
| 1003 QuicPacketHeader* header, | 995 QuicPacketHeader* header, |
| 1004 const QuicEncryptedPacket& packet) { | 996 const QuicEncryptedPacket& packet) { |
| 1005 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, | 997 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, |
| 1006 &header->packet_sequence_number)) { | 998 &header->packet_sequence_number)) { |
| 1007 set_detailed_error("Unable to read sequence number."); | 999 set_detailed_error("Unable to read sequence number."); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 DVLOG(1) << "Visitor asked to stop further processing."; | 1090 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1099 // Returning true since there was no parsing error. | 1091 // Returning true since there was no parsing error. |
| 1100 return true; | 1092 return true; |
| 1101 } | 1093 } |
| 1102 continue; | 1094 continue; |
| 1103 } | 1095 } |
| 1104 | 1096 |
| 1105 // Ack Frame | 1097 // Ack Frame |
| 1106 if (frame_type & kQuicFrameTypeAckMask) { | 1098 if (frame_type & kQuicFrameTypeAckMask) { |
| 1107 QuicAckFrame frame; | 1099 QuicAckFrame frame; |
| 1108 if (!ProcessAckFrame(header, frame_type, &frame)) { | 1100 if (!ProcessAckFrame(frame_type, &frame)) { |
| 1109 return RaiseError(QUIC_INVALID_ACK_DATA); | 1101 return RaiseError(QUIC_INVALID_ACK_DATA); |
| 1110 } | 1102 } |
| 1111 if (!visitor_->OnAckFrame(frame)) { | 1103 if (!visitor_->OnAckFrame(frame)) { |
| 1112 DVLOG(1) << "Visitor asked to stop further processing."; | 1104 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1113 // Returning true since there was no parsing error. | 1105 // Returning true since there was no parsing error. |
| 1114 return true; | 1106 return true; |
| 1115 } | 1107 } |
| 1116 continue; | 1108 continue; |
| 1117 } | 1109 } |
| 1118 | 1110 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1215 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); | 1207 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); |
| 1216 } | 1208 } |
| 1217 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { | 1209 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { |
| 1218 DVLOG(1) << "Visitor asked to stop further processing."; | 1210 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1219 // Returning true since there was no parsing error. | 1211 // Returning true since there was no parsing error. |
| 1220 return true; | 1212 return true; |
| 1221 } | 1213 } |
| 1222 continue; | 1214 continue; |
| 1223 } | 1215 } |
| 1224 case PING_FRAME: { | 1216 case PING_FRAME: { |
| 1225 if (quic_version_ <= QUIC_VERSION_16) { | 1217 if (quic_version_ == QUIC_VERSION_16) { |
| 1226 LOG(DFATAL) << "Trying to read a Ping in " | 1218 LOG(DFATAL) << "Trying to read a Ping in " |
| 1227 << QuicVersionToString(quic_version_); | 1219 << QuicVersionToString(quic_version_); |
| 1228 return RaiseError(QUIC_INTERNAL_ERROR); | 1220 return RaiseError(QUIC_INTERNAL_ERROR); |
| 1229 } | 1221 } |
| 1230 // Ping has no payload. | 1222 // Ping has no payload. |
| 1231 QuicPingFrame ping_frame; | 1223 QuicPingFrame ping_frame; |
| 1232 if (!visitor_->OnPingFrame(ping_frame)) { | 1224 if (!visitor_->OnPingFrame(ping_frame)) { |
| 1233 DVLOG(1) << "Visitor asked to stop further processing."; | 1225 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1234 // Returning true since there was no parsing error. | 1226 // Returning true since there was no parsing error. |
| 1235 return true; | 1227 return true; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 } | 1289 } |
| 1298 // Point frame to the right data. | 1290 // Point frame to the right data. |
| 1299 frame->data.Clear(); | 1291 frame->data.Clear(); |
| 1300 if (!frame_data.empty()) { | 1292 if (!frame_data.empty()) { |
| 1301 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); | 1293 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); |
| 1302 } | 1294 } |
| 1303 | 1295 |
| 1304 return true; | 1296 return true; |
| 1305 } | 1297 } |
| 1306 | 1298 |
| 1307 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, | 1299 bool QuicFramer::ProcessAckFrame(uint8 frame_type, QuicAckFrame* ack_frame) { |
| 1308 uint8 frame_type, | |
| 1309 QuicAckFrame* frame) { | |
| 1310 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { | |
| 1311 return false; | |
| 1312 } | |
| 1313 return true; | |
| 1314 } | |
| 1315 | |
| 1316 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, | |
| 1317 ReceivedPacketInfo* received_info) { | |
| 1318 // Determine the three lengths from the frame type: largest observed length, | 1300 // Determine the three lengths from the frame type: largest observed length, |
| 1319 // missing sequence number length, and missing range length. | 1301 // missing sequence number length, and missing range length. |
| 1320 const QuicSequenceNumberLength missing_sequence_number_length = | 1302 const QuicSequenceNumberLength missing_sequence_number_length = |
| 1321 ReadSequenceNumberLength(frame_type); | 1303 ReadSequenceNumberLength(frame_type); |
| 1322 frame_type >>= kQuicSequenceNumberLengthShift; | 1304 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1323 const QuicSequenceNumberLength largest_observed_sequence_number_length = | 1305 const QuicSequenceNumberLength largest_observed_sequence_number_length = |
| 1324 ReadSequenceNumberLength(frame_type); | 1306 ReadSequenceNumberLength(frame_type); |
| 1325 frame_type >>= kQuicSequenceNumberLengthShift; | 1307 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1326 received_info->is_truncated = frame_type & kQuicAckTruncatedMask; | 1308 ack_frame->is_truncated = frame_type & kQuicAckTruncatedMask; |
| 1327 frame_type >>= kQuicAckTruncatedShift; | 1309 frame_type >>= kQuicAckTruncatedShift; |
| 1328 bool has_nacks = frame_type & kQuicHasNacksMask; | 1310 bool has_nacks = frame_type & kQuicHasNacksMask; |
| 1329 | 1311 |
| 1330 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { | 1312 if (!reader_->ReadBytes(&ack_frame->entropy_hash, 1)) { |
| 1331 set_detailed_error("Unable to read entropy hash for received packets."); | 1313 set_detailed_error("Unable to read entropy hash for received packets."); |
| 1332 return false; | 1314 return false; |
| 1333 } | 1315 } |
| 1334 | 1316 |
| 1335 if (!reader_->ReadBytes(&received_info->largest_observed, | 1317 if (!reader_->ReadBytes(&ack_frame->largest_observed, |
| 1336 largest_observed_sequence_number_length)) { | 1318 largest_observed_sequence_number_length)) { |
| 1337 set_detailed_error("Unable to read largest observed."); | 1319 set_detailed_error("Unable to read largest observed."); |
| 1338 return false; | 1320 return false; |
| 1339 } | 1321 } |
| 1340 | 1322 |
| 1341 uint64 delta_time_largest_observed_us; | 1323 uint64 delta_time_largest_observed_us; |
| 1342 if (!reader_->ReadUFloat16(&delta_time_largest_observed_us)) { | 1324 if (!reader_->ReadUFloat16(&delta_time_largest_observed_us)) { |
| 1343 set_detailed_error("Unable to read delta time largest observed."); | 1325 set_detailed_error("Unable to read delta time largest observed."); |
| 1344 return false; | 1326 return false; |
| 1345 } | 1327 } |
| 1346 | 1328 |
| 1347 if (delta_time_largest_observed_us == kUFloat16MaxValue) { | 1329 if (delta_time_largest_observed_us == kUFloat16MaxValue) { |
| 1348 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite(); | 1330 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); |
| 1349 } else { | 1331 } else { |
| 1350 received_info->delta_time_largest_observed = | 1332 ack_frame->delta_time_largest_observed = |
| 1351 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us); | 1333 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us); |
| 1352 } | 1334 } |
| 1353 | 1335 |
| 1354 if (!has_nacks) { | 1336 if (!has_nacks) { |
| 1355 return true; | 1337 return true; |
| 1356 } | 1338 } |
| 1357 | 1339 |
| 1358 uint8 num_missing_ranges; | 1340 uint8 num_missing_ranges; |
| 1359 if (!reader_->ReadBytes(&num_missing_ranges, 1)) { | 1341 if (!reader_->ReadBytes(&num_missing_ranges, 1)) { |
| 1360 set_detailed_error("Unable to read num missing packet ranges."); | 1342 set_detailed_error("Unable to read num missing packet ranges."); |
| 1361 return false; | 1343 return false; |
| 1362 } | 1344 } |
| 1363 | 1345 |
| 1364 QuicPacketSequenceNumber last_sequence_number = | 1346 QuicPacketSequenceNumber last_sequence_number = ack_frame->largest_observed; |
| 1365 received_info->largest_observed; | |
| 1366 for (size_t i = 0; i < num_missing_ranges; ++i) { | 1347 for (size_t i = 0; i < num_missing_ranges; ++i) { |
| 1367 QuicPacketSequenceNumber missing_delta = 0; | 1348 QuicPacketSequenceNumber missing_delta = 0; |
| 1368 if (!reader_->ReadBytes(&missing_delta, missing_sequence_number_length)) { | 1349 if (!reader_->ReadBytes(&missing_delta, missing_sequence_number_length)) { |
| 1369 set_detailed_error("Unable to read missing sequence number delta."); | 1350 set_detailed_error("Unable to read missing sequence number delta."); |
| 1370 return false; | 1351 return false; |
| 1371 } | 1352 } |
| 1372 last_sequence_number -= missing_delta; | 1353 last_sequence_number -= missing_delta; |
| 1373 QuicPacketSequenceNumber range_length = 0; | 1354 QuicPacketSequenceNumber range_length = 0; |
| 1374 if (!reader_->ReadBytes(&range_length, PACKET_1BYTE_SEQUENCE_NUMBER)) { | 1355 if (!reader_->ReadBytes(&range_length, PACKET_1BYTE_SEQUENCE_NUMBER)) { |
| 1375 set_detailed_error("Unable to read missing sequence number range."); | 1356 set_detailed_error("Unable to read missing sequence number range."); |
| 1376 return false; | 1357 return false; |
| 1377 } | 1358 } |
| 1378 for (size_t i = 0; i <= range_length; ++i) { | 1359 for (size_t i = 0; i <= range_length; ++i) { |
| 1379 received_info->missing_packets.insert(last_sequence_number - i); | 1360 ack_frame->missing_packets.insert(last_sequence_number - i); |
| 1380 } | 1361 } |
| 1381 // Subtract an extra 1 to ensure ranges are represented efficiently and | 1362 // Subtract an extra 1 to ensure ranges are represented efficiently and |
| 1382 // can't overlap by 1 sequence number. This allows a missing_delta of 0 | 1363 // can't overlap by 1 sequence number. This allows a missing_delta of 0 |
| 1383 // to represent an adjacent nack range. | 1364 // to represent an adjacent nack range. |
| 1384 last_sequence_number -= (range_length + 1); | 1365 last_sequence_number -= (range_length + 1); |
| 1385 } | 1366 } |
| 1386 | 1367 |
| 1387 // Parse the revived packets list. | 1368 // Parse the revived packets list. |
| 1388 uint8 num_revived_packets; | 1369 uint8 num_revived_packets; |
| 1389 if (!reader_->ReadBytes(&num_revived_packets, 1)) { | 1370 if (!reader_->ReadBytes(&num_revived_packets, 1)) { |
| 1390 set_detailed_error("Unable to read num revived packets."); | 1371 set_detailed_error("Unable to read num revived packets."); |
| 1391 return false; | 1372 return false; |
| 1392 } | 1373 } |
| 1393 | 1374 |
| 1394 for (size_t i = 0; i < num_revived_packets; ++i) { | 1375 for (size_t i = 0; i < num_revived_packets; ++i) { |
| 1395 QuicPacketSequenceNumber revived_packet = 0; | 1376 QuicPacketSequenceNumber revived_packet = 0; |
| 1396 if (!reader_->ReadBytes(&revived_packet, | 1377 if (!reader_->ReadBytes(&revived_packet, |
| 1397 largest_observed_sequence_number_length)) { | 1378 largest_observed_sequence_number_length)) { |
| 1398 set_detailed_error("Unable to read revived packet."); | 1379 set_detailed_error("Unable to read revived packet."); |
| 1399 return false; | 1380 return false; |
| 1400 } | 1381 } |
| 1401 | 1382 |
| 1402 received_info->revived_packets.insert(revived_packet); | 1383 ack_frame->revived_packets.insert(revived_packet); |
| 1403 } | 1384 } |
| 1404 | 1385 |
| 1405 return true; | 1386 return true; |
| 1406 } | 1387 } |
| 1407 | 1388 |
| 1408 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, | 1389 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, |
| 1409 QuicStopWaitingFrame* stop_waiting) { | 1390 QuicStopWaitingFrame* stop_waiting) { |
| 1410 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { | 1391 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { |
| 1411 set_detailed_error("Unable to read entropy hash for sent packets."); | 1392 set_detailed_error("Unable to read entropy hash for sent packets."); |
| 1412 return false; | 1393 return false; |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1762 | 1743 |
| 1763 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); | 1744 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); |
| 1764 return true; | 1745 return true; |
| 1765 } | 1746 } |
| 1766 | 1747 |
| 1767 size_t QuicFramer::GetAckFrameSize( | 1748 size_t QuicFramer::GetAckFrameSize( |
| 1768 const QuicAckFrame& ack, | 1749 const QuicAckFrame& ack, |
| 1769 QuicSequenceNumberLength sequence_number_length) { | 1750 QuicSequenceNumberLength sequence_number_length) { |
| 1770 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1751 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1771 QuicSequenceNumberLength largest_observed_length = | 1752 QuicSequenceNumberLength largest_observed_length = |
| 1772 GetMinSequenceNumberLength(ack.received_info.largest_observed); | 1753 GetMinSequenceNumberLength(ack.largest_observed); |
| 1773 QuicSequenceNumberLength missing_sequence_number_length = | 1754 QuicSequenceNumberLength missing_sequence_number_length = |
| 1774 GetMinSequenceNumberLength(ack_info.max_delta); | 1755 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1775 | 1756 |
| 1776 size_t ack_size = GetMinAckFrameSize(quic_version_, | 1757 size_t ack_size = GetMinAckFrameSize(sequence_number_length, |
| 1777 sequence_number_length, | |
| 1778 largest_observed_length); | 1758 largest_observed_length); |
| 1779 if (!ack_info.nack_ranges.empty()) { | 1759 if (!ack_info.nack_ranges.empty()) { |
| 1780 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; | 1760 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; |
| 1781 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | 1761 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * |
| 1782 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1762 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 1783 ack_size += min(ack.received_info.revived_packets.size(), | 1763 ack_size += min(ack.revived_packets.size(), |
| 1784 kMaxRevivedPackets) * largest_observed_length; | 1764 kMaxRevivedPackets) * largest_observed_length; |
| 1785 } | 1765 } |
| 1786 return ack_size; | 1766 return ack_size; |
| 1787 } | 1767 } |
| 1788 | 1768 |
| 1789 size_t QuicFramer::ComputeFrameLength( | 1769 size_t QuicFramer::ComputeFrameLength( |
| 1790 const QuicFrame& frame, | 1770 const QuicFrame& frame, |
| 1791 bool last_frame_in_packet, | 1771 bool last_frame_in_packet, |
| 1792 InFecGroup is_in_fec_group, | 1772 InFecGroup is_in_fec_group, |
| 1793 QuicSequenceNumberLength sequence_number_length) { | 1773 QuicSequenceNumberLength sequence_number_length) { |
| 1794 switch (frame.type) { | 1774 switch (frame.type) { |
| 1795 case STREAM_FRAME: | 1775 case STREAM_FRAME: |
| 1796 return GetMinStreamFrameSize(quic_version_, | 1776 return GetMinStreamFrameSize(frame.stream_frame->stream_id, |
| 1797 frame.stream_frame->stream_id, | |
| 1798 frame.stream_frame->offset, | 1777 frame.stream_frame->offset, |
| 1799 last_frame_in_packet, | 1778 last_frame_in_packet, |
| 1800 is_in_fec_group) + | 1779 is_in_fec_group) + |
| 1801 frame.stream_frame->data.TotalBufferSize(); | 1780 frame.stream_frame->data.TotalBufferSize(); |
| 1802 case ACK_FRAME: { | 1781 case ACK_FRAME: { |
| 1803 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); | 1782 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); |
| 1804 } | 1783 } |
| 1805 case CONGESTION_FEEDBACK_FRAME: { | 1784 case CONGESTION_FEEDBACK_FRAME: { |
| 1806 size_t len = kQuicFrameTypeSize; | 1785 size_t len = kQuicFrameTypeSize; |
| 1807 const QuicCongestionFeedbackFrame& congestion_feedback = | 1786 const QuicCongestionFeedbackFrame& congestion_feedback = |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1831 break; | 1810 break; |
| 1832 } | 1811 } |
| 1833 return len; | 1812 return len; |
| 1834 } | 1813 } |
| 1835 case STOP_WAITING_FRAME: | 1814 case STOP_WAITING_FRAME: |
| 1836 return GetStopWaitingFrameSize(sequence_number_length); | 1815 return GetStopWaitingFrameSize(sequence_number_length); |
| 1837 case PING_FRAME: | 1816 case PING_FRAME: |
| 1838 // Ping has no payload. | 1817 // Ping has no payload. |
| 1839 return kQuicFrameTypeSize; | 1818 return kQuicFrameTypeSize; |
| 1840 case RST_STREAM_FRAME: | 1819 case RST_STREAM_FRAME: |
| 1841 return GetMinRstStreamFrameSize(quic_version_) + | 1820 return GetMinRstStreamFrameSize() + |
| 1842 frame.rst_stream_frame->error_details.size(); | 1821 frame.rst_stream_frame->error_details.size(); |
| 1843 case CONNECTION_CLOSE_FRAME: | 1822 case CONNECTION_CLOSE_FRAME: |
| 1844 return GetMinConnectionCloseFrameSize() + | 1823 return GetMinConnectionCloseFrameSize() + |
| 1845 frame.connection_close_frame->error_details.size(); | 1824 frame.connection_close_frame->error_details.size(); |
| 1846 case GOAWAY_FRAME: | 1825 case GOAWAY_FRAME: |
| 1847 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); | 1826 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); |
| 1848 case WINDOW_UPDATE_FRAME: | 1827 case WINDOW_UPDATE_FRAME: |
| 1849 return GetWindowUpdateFrameSize(); | 1828 return GetWindowUpdateFrameSize(); |
| 1850 case BLOCKED_FRAME: | 1829 case BLOCKED_FRAME: |
| 1851 return GetBlockedFrameSize(); | 1830 return GetBlockedFrameSize(); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1969 void QuicFramer::set_version(const QuicVersion version) { | 1948 void QuicFramer::set_version(const QuicVersion version) { |
| 1970 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1949 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 1971 quic_version_ = version; | 1950 quic_version_ = version; |
| 1972 } | 1951 } |
| 1973 | 1952 |
| 1974 bool QuicFramer::AppendAckFrameAndTypeByte( | 1953 bool QuicFramer::AppendAckFrameAndTypeByte( |
| 1975 const QuicPacketHeader& header, | 1954 const QuicPacketHeader& header, |
| 1976 const QuicAckFrame& frame, | 1955 const QuicAckFrame& frame, |
| 1977 QuicDataWriter* writer) { | 1956 QuicDataWriter* writer) { |
| 1978 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 1957 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
| 1979 QuicPacketSequenceNumber ack_largest_observed = | 1958 QuicPacketSequenceNumber ack_largest_observed = frame.largest_observed; |
| 1980 frame.received_info.largest_observed; | |
| 1981 QuicSequenceNumberLength largest_observed_length = | 1959 QuicSequenceNumberLength largest_observed_length = |
| 1982 GetMinSequenceNumberLength(ack_largest_observed); | 1960 GetMinSequenceNumberLength(ack_largest_observed); |
| 1983 QuicSequenceNumberLength missing_sequence_number_length = | 1961 QuicSequenceNumberLength missing_sequence_number_length = |
| 1984 GetMinSequenceNumberLength(ack_info.max_delta); | 1962 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1985 // Determine whether we need to truncate ranges. | 1963 // Determine whether we need to truncate ranges. |
| 1986 size_t available_range_bytes = writer->capacity() - writer->length() - | 1964 size_t available_range_bytes = writer->capacity() - writer->length() - |
| 1987 kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize - | 1965 kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize - |
| 1988 GetMinAckFrameSize(quic_version_, | 1966 GetMinAckFrameSize(header.public_header.sequence_number_length, |
| 1989 header.public_header.sequence_number_length, | |
| 1990 largest_observed_length); | 1967 largest_observed_length); |
| 1991 size_t max_num_ranges = available_range_bytes / | 1968 size_t max_num_ranges = available_range_bytes / |
| 1992 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1969 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 1993 max_num_ranges = min(kMaxNackRanges, max_num_ranges); | 1970 max_num_ranges = min(kMaxNackRanges, max_num_ranges); |
| 1994 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 1971 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
| 1995 DVLOG_IF(1, truncated) << "Truncating ack from " | 1972 DVLOG_IF(1, truncated) << "Truncating ack from " |
| 1996 << ack_info.nack_ranges.size() << " ranges to " | 1973 << ack_info.nack_ranges.size() << " ranges to " |
| 1997 << max_num_ranges; | 1974 << max_num_ranges; |
| 1998 // Write out the type byte by setting the low order bits and doing shifts | 1975 // Write out the type byte by setting the low order bits and doing shifts |
| 1999 // to make room for the next bit flags to be set. | 1976 // to make room for the next bit flags to be set. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2011 // Missing sequence number length. | 1988 // Missing sequence number length. |
| 2012 type_byte <<= kQuicSequenceNumberLengthShift; | 1989 type_byte <<= kQuicSequenceNumberLengthShift; |
| 2013 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); | 1990 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); |
| 2014 | 1991 |
| 2015 type_byte |= kQuicFrameTypeAckMask; | 1992 type_byte |= kQuicFrameTypeAckMask; |
| 2016 | 1993 |
| 2017 if (!writer->WriteUInt8(type_byte)) { | 1994 if (!writer->WriteUInt8(type_byte)) { |
| 2018 return false; | 1995 return false; |
| 2019 } | 1996 } |
| 2020 | 1997 |
| 2021 const ReceivedPacketInfo& received_info = frame.received_info; | 1998 QuicPacketEntropyHash ack_entropy_hash = frame.entropy_hash; |
| 2022 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; | |
| 2023 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | 1999 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); |
| 2024 if (truncated) { | 2000 if (truncated) { |
| 2025 // Skip the nack ranges which the truncated ack won't include and set | 2001 // Skip the nack ranges which the truncated ack won't include and set |
| 2026 // a correct largest observed for the truncated ack. | 2002 // a correct largest observed for the truncated ack. |
| 2027 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | 2003 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); |
| 2028 ++i) { | 2004 ++i) { |
| 2029 ++ack_iter; | 2005 ++ack_iter; |
| 2030 } | 2006 } |
| 2031 // If the last range is followed by acks, include them. | 2007 // If the last range is followed by acks, include them. |
| 2032 // If the last range is followed by another range, specify the end of the | 2008 // If the last range is followed by another range, specify the end of the |
| 2033 // range as the largest_observed. | 2009 // range as the largest_observed. |
| 2034 ack_largest_observed = ack_iter->first - 1; | 2010 ack_largest_observed = ack_iter->first - 1; |
| 2035 // Also update the entropy so it matches the largest observed. | 2011 // Also update the entropy so it matches the largest observed. |
| 2036 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); | 2012 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); |
| 2037 ++ack_iter; | 2013 ++ack_iter; |
| 2038 } | 2014 } |
| 2039 | 2015 |
| 2040 if (!writer->WriteUInt8(ack_entropy_hash)) { | 2016 if (!writer->WriteUInt8(ack_entropy_hash)) { |
| 2041 return false; | 2017 return false; |
| 2042 } | 2018 } |
| 2043 | 2019 |
| 2044 if (!AppendPacketSequenceNumber(largest_observed_length, | 2020 if (!AppendPacketSequenceNumber(largest_observed_length, |
| 2045 ack_largest_observed, writer)) { | 2021 ack_largest_observed, writer)) { |
| 2046 return false; | 2022 return false; |
| 2047 } | 2023 } |
| 2048 | 2024 |
| 2049 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; | 2025 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; |
| 2050 if (!received_info.delta_time_largest_observed.IsInfinite()) { | 2026 if (!frame.delta_time_largest_observed.IsInfinite()) { |
| 2051 DCHECK_LE(0u, | 2027 DCHECK_LE(0u, frame.delta_time_largest_observed.ToMicroseconds()); |
| 2052 frame.received_info.delta_time_largest_observed.ToMicroseconds()); | |
| 2053 delta_time_largest_observed_us = | 2028 delta_time_largest_observed_us = |
| 2054 received_info.delta_time_largest_observed.ToMicroseconds(); | 2029 frame.delta_time_largest_observed.ToMicroseconds(); |
| 2055 } | 2030 } |
| 2056 | 2031 |
| 2057 if (!writer->WriteUFloat16(delta_time_largest_observed_us)) { | 2032 if (!writer->WriteUFloat16(delta_time_largest_observed_us)) { |
| 2058 return false; | 2033 return false; |
| 2059 } | 2034 } |
| 2060 | 2035 |
| 2061 if (ack_info.nack_ranges.empty()) { | 2036 if (ack_info.nack_ranges.empty()) { |
| 2062 return true; | 2037 return true; |
| 2063 } | 2038 } |
| 2064 | 2039 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2083 return false; | 2058 return false; |
| 2084 } | 2059 } |
| 2085 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2060 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2086 last_sequence_written = ack_iter->first - 1; | 2061 last_sequence_written = ack_iter->first - 1; |
| 2087 ++num_ranges_written; | 2062 ++num_ranges_written; |
| 2088 } | 2063 } |
| 2089 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2064 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2090 | 2065 |
| 2091 // Append revived packets. | 2066 // Append revived packets. |
| 2092 // If not all the revived packets fit, only mention the ones that do. | 2067 // If not all the revived packets fit, only mention the ones that do. |
| 2093 uint8 num_revived_packets = min(received_info.revived_packets.size(), | 2068 uint8 num_revived_packets = min(frame.revived_packets.size(), |
| 2094 kMaxRevivedPackets); | 2069 kMaxRevivedPackets); |
| 2095 num_revived_packets = min( | 2070 num_revived_packets = min( |
| 2096 static_cast<size_t>(num_revived_packets), | 2071 static_cast<size_t>(num_revived_packets), |
| 2097 (writer->capacity() - writer->length()) / largest_observed_length); | 2072 (writer->capacity() - writer->length()) / largest_observed_length); |
| 2098 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2073 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2099 return false; | 2074 return false; |
| 2100 } | 2075 } |
| 2101 | 2076 |
| 2102 SequenceNumberSet::const_iterator iter = | 2077 SequenceNumberSet::const_iterator iter = frame.revived_packets.begin(); |
| 2103 received_info.revived_packets.begin(); | |
| 2104 for (int i = 0; i < num_revived_packets; ++i, ++iter) { | 2078 for (int i = 0; i < num_revived_packets; ++i, ++iter) { |
| 2105 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter)); | 2079 LOG_IF(DFATAL, !ContainsKey(frame.missing_packets, *iter)); |
| 2106 if (!AppendPacketSequenceNumber(largest_observed_length, | 2080 if (!AppendPacketSequenceNumber(largest_observed_length, |
| 2107 *iter, writer)) { | 2081 *iter, writer)) { |
| 2108 return false; | 2082 return false; |
| 2109 } | 2083 } |
| 2110 } | 2084 } |
| 2111 | 2085 |
| 2112 return true; | 2086 return true; |
| 2113 } | 2087 } |
| 2114 | 2088 |
| 2115 bool QuicFramer::AppendCongestionFeedbackFrame( | 2089 bool QuicFramer::AppendCongestionFeedbackFrame( |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2292 | 2266 |
| 2293 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2267 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2294 DVLOG(1) << "Error detail: " << detailed_error_; | 2268 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2295 set_error(error); | 2269 set_error(error); |
| 2296 visitor_->OnError(this); | 2270 visitor_->OnError(this); |
| 2297 reader_.reset(NULL); | 2271 reader_.reset(NULL); |
| 2298 return false; | 2272 return false; |
| 2299 } | 2273 } |
| 2300 | 2274 |
| 2301 } // namespace net | 2275 } // namespace net |
| OLD | NEW |