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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 size_t QuicFramer::GetMinAckFrameSize( | 191 size_t QuicFramer::GetMinAckFrameSize( |
192 QuicVersion version, | 192 QuicVersion version, |
193 QuicSequenceNumberLength sequence_number_length, | 193 QuicSequenceNumberLength sequence_number_length, |
194 QuicSequenceNumberLength largest_observed_length) { | 194 QuicSequenceNumberLength largest_observed_length) { |
195 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 195 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
196 sequence_number_length + kQuicEntropyHashSize + | 196 sequence_number_length + kQuicEntropyHashSize + |
197 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | 197 largest_observed_length + kQuicDeltaTimeLargestObservedSize; |
198 } | 198 } |
199 | 199 |
200 // static | 200 // static |
| 201 size_t QuicFramer::GetStopWaitingFrameSize( |
| 202 QuicSequenceNumberLength sequence_number_length) { |
| 203 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
| 204 sequence_number_length; |
| 205 } |
| 206 |
| 207 // static |
201 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { | 208 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { |
202 if (quic_version > QUIC_VERSION_13) { | 209 if (quic_version > QUIC_VERSION_13) { |
203 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 210 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
204 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + | 211 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + |
205 kQuicErrorDetailsLengthSize; | 212 kQuicErrorDetailsLengthSize; |
206 } else { | 213 } else { |
207 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicErrorCodeSize + | 214 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicErrorCodeSize + |
208 kQuicErrorDetailsLengthSize; | 215 kQuicErrorDetailsLengthSize; |
209 } | 216 } |
210 } | 217 } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 } | 374 } |
368 break; | 375 break; |
369 case ACK_FRAME: | 376 case ACK_FRAME: |
370 if (!AppendAckFrameAndTypeByte( | 377 if (!AppendAckFrameAndTypeByte( |
371 header, *frame.ack_frame, &writer)) { | 378 header, *frame.ack_frame, &writer)) { |
372 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; | 379 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; |
373 return kNoPacket; | 380 return kNoPacket; |
374 } | 381 } |
375 break; | 382 break; |
376 case CONGESTION_FEEDBACK_FRAME: | 383 case CONGESTION_FEEDBACK_FRAME: |
377 if (!AppendQuicCongestionFeedbackFrame( | 384 if (!AppendCongestionFeedbackFrame( |
378 *frame.congestion_feedback_frame, &writer)) { | 385 *frame.congestion_feedback_frame, &writer)) { |
379 LOG(DFATAL) << "AppendQuicCongestionFeedbackFrame failed"; | 386 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed"; |
380 return kNoPacket; | 387 return kNoPacket; |
381 } | 388 } |
382 break; | 389 break; |
| 390 case STOP_WAITING_FRAME: |
| 391 if (quic_version_ <= QUIC_VERSION_15) { |
| 392 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in " |
| 393 << QuicVersionToString(quic_version_); |
| 394 return kNoPacket; |
| 395 } |
| 396 if (!AppendStopWaitingFrame( |
| 397 header, *frame.stop_waiting_frame, &writer)) { |
| 398 LOG(DFATAL) << "AppendStopWaitingFrame failed"; |
| 399 return kNoPacket; |
| 400 } |
| 401 break; |
383 case RST_STREAM_FRAME: | 402 case RST_STREAM_FRAME: |
384 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { | 403 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
385 LOG(DFATAL) << "AppendRstStreamFrame failed"; | 404 LOG(DFATAL) << "AppendRstStreamFrame failed"; |
386 return kNoPacket; | 405 return kNoPacket; |
387 } | 406 } |
388 break; | 407 break; |
389 case CONNECTION_CLOSE_FRAME: | 408 case CONNECTION_CLOSE_FRAME: |
390 if (!AppendConnectionCloseFrame( | 409 if (!AppendConnectionCloseFrame( |
391 *frame.connection_close_frame, &writer)) { | 410 *frame.connection_close_frame, &writer)) { |
392 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; | 411 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; |
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1221 return true; | 1240 return true; |
1222 } | 1241 } |
1223 } else { | 1242 } else { |
1224 LOG(DFATAL) << "Trying to read a BlockedFrame in " | 1243 LOG(DFATAL) << "Trying to read a BlockedFrame in " |
1225 << QuicVersionToString(quic_version_); | 1244 << QuicVersionToString(quic_version_); |
1226 return RaiseError(QUIC_INTERNAL_ERROR); | 1245 return RaiseError(QUIC_INTERNAL_ERROR); |
1227 } | 1246 } |
1228 continue; | 1247 continue; |
1229 } | 1248 } |
1230 | 1249 |
| 1250 case STOP_WAITING_FRAME: { |
| 1251 if (quic_version_ <= QUIC_VERSION_15) { |
| 1252 LOG(DFATAL) << "Trying to read a StopWaiting in " |
| 1253 << QuicVersionToString(quic_version_); |
| 1254 return RaiseError(QUIC_INTERNAL_ERROR); |
| 1255 } |
| 1256 QuicStopWaitingFrame stop_waiting_frame; |
| 1257 if (!ProcessStopWaitingFrame(header, &stop_waiting_frame)) { |
| 1258 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); |
| 1259 } |
| 1260 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { |
| 1261 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1262 // Returning true since there was no parsing error. |
| 1263 return true; |
| 1264 } |
| 1265 continue; |
| 1266 } |
| 1267 |
1231 default: | 1268 default: |
1232 set_detailed_error("Illegal frame type."); | 1269 set_detailed_error("Illegal frame type."); |
1233 DLOG(WARNING) << "Illegal frame type: " | 1270 DLOG(WARNING) << "Illegal frame type: " |
1234 << static_cast<int>(frame_type); | 1271 << static_cast<int>(frame_type); |
1235 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1272 return RaiseError(QUIC_INVALID_FRAME_DATA); |
1236 } | 1273 } |
1237 } | 1274 } |
1238 | 1275 |
1239 return true; | 1276 return true; |
1240 } | 1277 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 if (!frame_data.empty()) { | 1328 if (!frame_data.empty()) { |
1292 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); | 1329 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); |
1293 } | 1330 } |
1294 | 1331 |
1295 return true; | 1332 return true; |
1296 } | 1333 } |
1297 | 1334 |
1298 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, | 1335 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, |
1299 uint8 frame_type, | 1336 uint8 frame_type, |
1300 QuicAckFrame* frame) { | 1337 QuicAckFrame* frame) { |
1301 if (!ProcessSentInfo(header, &frame->sent_info)) { | 1338 if (quic_version_ <= QUIC_VERSION_15) { |
1302 return false; | 1339 if (!ProcessStopWaitingFrame(header, &frame->sent_info)) { |
| 1340 return false; |
| 1341 } |
1303 } | 1342 } |
1304 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { | 1343 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { |
1305 return false; | 1344 return false; |
1306 } | 1345 } |
1307 return true; | 1346 return true; |
1308 } | 1347 } |
1309 | 1348 |
1310 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, | 1349 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, |
1311 ReceivedPacketInfo* received_info) { | 1350 ReceivedPacketInfo* received_info) { |
1312 // Determine the three lengths from the frame type: largest observed length, | 1351 // Determine the three lengths from the frame type: largest observed length, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1394 return false; | 1433 return false; |
1395 } | 1434 } |
1396 | 1435 |
1397 received_info->revived_packets.insert(revived_packet); | 1436 received_info->revived_packets.insert(revived_packet); |
1398 } | 1437 } |
1399 } | 1438 } |
1400 | 1439 |
1401 return true; | 1440 return true; |
1402 } | 1441 } |
1403 | 1442 |
1404 bool QuicFramer::ProcessSentInfo(const QuicPacketHeader& header, | 1443 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, |
1405 SentPacketInfo* sent_info) { | 1444 QuicStopWaitingFrame* stop_waiting) { |
1406 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) { | 1445 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { |
1407 set_detailed_error("Unable to read entropy hash for sent packets."); | 1446 set_detailed_error("Unable to read entropy hash for sent packets."); |
1408 return false; | 1447 return false; |
1409 } | 1448 } |
1410 | 1449 |
1411 QuicPacketSequenceNumber least_unacked_delta = 0; | 1450 QuicPacketSequenceNumber least_unacked_delta = 0; |
1412 if (!reader_->ReadBytes(&least_unacked_delta, | 1451 if (!reader_->ReadBytes(&least_unacked_delta, |
1413 header.public_header.sequence_number_length)) { | 1452 header.public_header.sequence_number_length)) { |
1414 set_detailed_error("Unable to read least unacked delta."); | 1453 set_detailed_error("Unable to read least unacked delta."); |
1415 return false; | 1454 return false; |
1416 } | 1455 } |
1417 DCHECK_GE(header.packet_sequence_number, least_unacked_delta); | 1456 DCHECK_GE(header.packet_sequence_number, least_unacked_delta); |
1418 sent_info->least_unacked = | 1457 stop_waiting->least_unacked = |
1419 header.packet_sequence_number - least_unacked_delta; | 1458 header.packet_sequence_number - least_unacked_delta; |
1420 | 1459 |
1421 return true; | 1460 return true; |
1422 } | 1461 } |
1423 | 1462 |
1424 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( | 1463 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( |
1425 QuicCongestionFeedbackFrame* frame) { | 1464 QuicCongestionFeedbackFrame* frame) { |
1426 uint8 feedback_type; | 1465 uint8 feedback_type; |
1427 if (!reader_->ReadBytes(&feedback_type, 1)) { | 1466 if (!reader_->ReadBytes(&feedback_type, 1)) { |
1428 set_detailed_error("Unable to read congestion feedback type."); | 1467 set_detailed_error("Unable to read congestion feedback type."); |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1854 } | 1893 } |
1855 len += 2; // Receive window. | 1894 len += 2; // Receive window. |
1856 break; | 1895 break; |
1857 default: | 1896 default: |
1858 set_detailed_error("Illegal feedback type."); | 1897 set_detailed_error("Illegal feedback type."); |
1859 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; | 1898 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; |
1860 break; | 1899 break; |
1861 } | 1900 } |
1862 return len; | 1901 return len; |
1863 } | 1902 } |
| 1903 case STOP_WAITING_FRAME: |
| 1904 return GetStopWaitingFrameSize(sequence_number_length); |
1864 case RST_STREAM_FRAME: | 1905 case RST_STREAM_FRAME: |
1865 return GetMinRstStreamFrameSize(quic_version_) + | 1906 return GetMinRstStreamFrameSize(quic_version_) + |
1866 frame.rst_stream_frame->error_details.size(); | 1907 frame.rst_stream_frame->error_details.size(); |
1867 case CONNECTION_CLOSE_FRAME: | 1908 case CONNECTION_CLOSE_FRAME: |
1868 return GetMinConnectionCloseFrameSize() + | 1909 return GetMinConnectionCloseFrameSize() + |
1869 frame.connection_close_frame->error_details.size(); | 1910 frame.connection_close_frame->error_details.size(); |
1870 case GOAWAY_FRAME: | 1911 case GOAWAY_FRAME: |
1871 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); | 1912 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); |
1872 case WINDOW_UPDATE_FRAME: | 1913 case WINDOW_UPDATE_FRAME: |
1873 return GetWindowUpdateFrameSize(); | 1914 return GetWindowUpdateFrameSize(); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1980 } | 2021 } |
1981 | 2022 |
1982 if (!writer->WriteIOVector(frame.data)) { | 2023 if (!writer->WriteIOVector(frame.data)) { |
1983 return false; | 2024 return false; |
1984 } | 2025 } |
1985 return true; | 2026 return true; |
1986 } | 2027 } |
1987 | 2028 |
1988 // static | 2029 // static |
1989 void QuicFramer::set_version(const QuicVersion version) { | 2030 void QuicFramer::set_version(const QuicVersion version) { |
1990 DCHECK(IsSupportedVersion(version)); | 2031 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
1991 quic_version_ = version; | 2032 quic_version_ = version; |
1992 } | 2033 } |
1993 | 2034 |
1994 bool QuicFramer::AppendAckFrameAndTypeByte( | 2035 bool QuicFramer::AppendAckFrameAndTypeByte( |
1995 const QuicPacketHeader& header, | 2036 const QuicPacketHeader& header, |
1996 const QuicAckFrame& frame, | 2037 const QuicAckFrame& frame, |
1997 QuicDataWriter* writer) { | 2038 QuicDataWriter* writer) { |
1998 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 2039 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
1999 QuicPacketSequenceNumber ack_largest_observed = | 2040 QuicPacketSequenceNumber ack_largest_observed = |
2000 frame.received_info.largest_observed; | 2041 frame.received_info.largest_observed; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2033 // Missing sequence number length. | 2074 // Missing sequence number length. |
2034 type_byte <<= kQuicSequenceNumberLengthShift; | 2075 type_byte <<= kQuicSequenceNumberLengthShift; |
2035 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); | 2076 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); |
2036 | 2077 |
2037 type_byte |= kQuicFrameTypeAckMask; | 2078 type_byte |= kQuicFrameTypeAckMask; |
2038 | 2079 |
2039 if (!writer->WriteUInt8(type_byte)) { | 2080 if (!writer->WriteUInt8(type_byte)) { |
2040 return false; | 2081 return false; |
2041 } | 2082 } |
2042 | 2083 |
2043 // TODO(satyamshekhar): Decide how often we really should send this | 2084 if (quic_version_ <= QUIC_VERSION_15) { |
2044 // entropy_hash update. | 2085 if (!AppendStopWaitingFrame(header, frame.sent_info, writer)) { |
2045 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) { | 2086 return false; |
2046 return false; | 2087 } |
2047 } | |
2048 | |
2049 DCHECK_GE(header.packet_sequence_number, frame.sent_info.least_unacked); | |
2050 const QuicPacketSequenceNumber least_unacked_delta = | |
2051 header.packet_sequence_number - frame.sent_info.least_unacked; | |
2052 const QuicPacketSequenceNumber length_shift = | |
2053 header.public_header.sequence_number_length * 8; | |
2054 if (least_unacked_delta >> length_shift > 0) { | |
2055 LOG(DFATAL) << "sequence_number_length " | |
2056 << header.public_header.sequence_number_length | |
2057 << " is too small for least_unacked_delta: " | |
2058 << least_unacked_delta; | |
2059 return false; | |
2060 } | |
2061 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | |
2062 least_unacked_delta, writer)) { | |
2063 return false; | |
2064 } | 2088 } |
2065 | 2089 |
2066 const ReceivedPacketInfo& received_info = frame.received_info; | 2090 const ReceivedPacketInfo& received_info = frame.received_info; |
2067 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; | 2091 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; |
2068 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | 2092 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); |
2069 if (truncated) { | 2093 if (truncated) { |
2070 // Skip the nack ranges which the truncated ack won't include and set | 2094 // Skip the nack ranges which the truncated ack won't include and set |
2071 // a correct largest observed for the truncated ack. | 2095 // a correct largest observed for the truncated ack. |
2072 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | 2096 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); |
2073 ++i) { | 2097 ++i) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2153 if (!AppendPacketSequenceNumber(largest_observed_length, | 2177 if (!AppendPacketSequenceNumber(largest_observed_length, |
2154 *iter, writer)) { | 2178 *iter, writer)) { |
2155 return false; | 2179 return false; |
2156 } | 2180 } |
2157 } | 2181 } |
2158 } | 2182 } |
2159 | 2183 |
2160 return true; | 2184 return true; |
2161 } | 2185 } |
2162 | 2186 |
2163 bool QuicFramer::AppendQuicCongestionFeedbackFrame( | 2187 bool QuicFramer::AppendCongestionFeedbackFrame( |
2164 const QuicCongestionFeedbackFrame& frame, | 2188 const QuicCongestionFeedbackFrame& frame, |
2165 QuicDataWriter* writer) { | 2189 QuicDataWriter* writer) { |
2166 if (!writer->WriteBytes(&frame.type, 1)) { | 2190 if (!writer->WriteBytes(&frame.type, 1)) { |
2167 return false; | 2191 return false; |
2168 } | 2192 } |
2169 | 2193 |
2170 switch (frame.type) { | 2194 switch (frame.type) { |
2171 case kInterArrival: { | 2195 case kInterArrival: { |
2172 const CongestionFeedbackMessageInterArrival& inter_arrival = | 2196 const CongestionFeedbackMessageInterArrival& inter_arrival = |
2173 frame.inter_arrival; | 2197 frame.inter_arrival; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2248 } | 2272 } |
2249 break; | 2273 break; |
2250 } | 2274 } |
2251 default: | 2275 default: |
2252 return false; | 2276 return false; |
2253 } | 2277 } |
2254 | 2278 |
2255 return true; | 2279 return true; |
2256 } | 2280 } |
2257 | 2281 |
| 2282 bool QuicFramer::AppendStopWaitingFrame( |
| 2283 const QuicPacketHeader& header, |
| 2284 const QuicStopWaitingFrame& frame, |
| 2285 QuicDataWriter* writer) { |
| 2286 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); |
| 2287 const QuicPacketSequenceNumber least_unacked_delta = |
| 2288 header.packet_sequence_number - frame.least_unacked; |
| 2289 const QuicPacketSequenceNumber length_shift = |
| 2290 header.public_header.sequence_number_length * 8; |
| 2291 if (!writer->WriteUInt8(frame.entropy_hash)) { |
| 2292 LOG(DFATAL) << " hash failed"; |
| 2293 return false; |
| 2294 } |
| 2295 |
| 2296 if (least_unacked_delta >> length_shift > 0) { |
| 2297 LOG(DFATAL) << "sequence_number_length " |
| 2298 << header.public_header.sequence_number_length |
| 2299 << " is too small for least_unacked_delta: " |
| 2300 << least_unacked_delta; |
| 2301 return false; |
| 2302 } |
| 2303 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, |
| 2304 least_unacked_delta, writer)) { |
| 2305 LOG(DFATAL) << " seq failed: " |
| 2306 << header.public_header.sequence_number_length; |
| 2307 return false; |
| 2308 } |
| 2309 |
| 2310 return true; |
| 2311 } |
| 2312 |
2258 bool QuicFramer::AppendRstStreamFrame( | 2313 bool QuicFramer::AppendRstStreamFrame( |
2259 const QuicRstStreamFrame& frame, | 2314 const QuicRstStreamFrame& frame, |
2260 QuicDataWriter* writer) { | 2315 QuicDataWriter* writer) { |
2261 if (!writer->WriteUInt32(frame.stream_id)) { | 2316 if (!writer->WriteUInt32(frame.stream_id)) { |
2262 return false; | 2317 return false; |
2263 } | 2318 } |
2264 | 2319 |
2265 if (quic_version_ > QUIC_VERSION_13) { | 2320 if (quic_version_ > QUIC_VERSION_13) { |
2266 if (!writer->WriteUInt64(frame.byte_offset)) { | 2321 if (!writer->WriteUInt64(frame.byte_offset)) { |
2267 return false; | 2322 return false; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2331 | 2386 |
2332 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2387 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2333 DVLOG(1) << "Error detail: " << detailed_error_; | 2388 DVLOG(1) << "Error detail: " << detailed_error_; |
2334 set_error(error); | 2389 set_error(error); |
2335 visitor_->OnError(this); | 2390 visitor_->OnError(this); |
2336 reader_.reset(NULL); | 2391 reader_.reset(NULL); |
2337 return false; | 2392 return false; |
2338 } | 2393 } |
2339 | 2394 |
2340 } // namespace net | 2395 } // namespace net |
OLD | NEW |