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/hash_tables.h" | 7 #include "base/hash_tables.h" |
8 #include "net/quic/crypto/quic_decrypter.h" | 8 #include "net/quic/crypto/quic_decrypter.h" |
9 #include "net/quic/crypto/quic_encrypter.h" | 9 #include "net/quic/crypto/quic_encrypter.h" |
10 #include "net/quic/quic_data_reader.h" | 10 #include "net/quic/quic_data_reader.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, | 38 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, |
39 QuicPacketSequenceNumber a, | 39 QuicPacketSequenceNumber a, |
40 QuicPacketSequenceNumber b) { | 40 QuicPacketSequenceNumber b) { |
41 return (Delta(target, a) < Delta(target, b)) ? a : b; | 41 return (Delta(target, a) < Delta(target, b)) ? a : b; |
42 } | 42 } |
43 | 43 |
44 } // namespace | 44 } // namespace |
45 | 45 |
46 QuicFramer::QuicFramer(QuicVersionTag version, | 46 QuicFramer::QuicFramer(QuicVersionTag version, |
47 QuicDecrypter* decrypter, | 47 QuicDecrypter* decrypter, |
48 QuicEncrypter* encrypter) | 48 QuicEncrypter* encrypter, |
| 49 bool is_server) |
49 : visitor_(NULL), | 50 : visitor_(NULL), |
50 fec_builder_(NULL), | 51 fec_builder_(NULL), |
51 error_(QUIC_NO_ERROR), | 52 error_(QUIC_NO_ERROR), |
52 last_sequence_number_(0), | 53 last_sequence_number_(0), |
53 quic_version_(version), | 54 quic_version_(version), |
54 decrypter_(decrypter), | 55 decrypter_(decrypter), |
55 encrypter_(encrypter) { | 56 encrypter_(encrypter), |
56 DCHECK_EQ(kQuicVersion1, version); | 57 is_server_(is_server) { |
| 58 DCHECK(IsSupportedVersion(version)); |
57 } | 59 } |
58 | 60 |
59 QuicFramer::~QuicFramer() {} | 61 QuicFramer::~QuicFramer() {} |
60 | 62 |
61 bool CanTruncate(const QuicFrame& frame) { | 63 bool CanTruncate(const QuicFrame& frame) { |
62 if (frame.type == ACK_FRAME || | 64 if (frame.type == ACK_FRAME || |
63 frame.type == CONNECTION_CLOSE_FRAME) { | 65 frame.type == CONNECTION_CLOSE_FRAME) { |
64 return true; | 66 return true; |
65 } | 67 } |
66 return false; | 68 return false; |
(...skipping 22 matching lines...) Expand all Loading... |
89 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 91 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
90 GetMinAckFrameSize(); | 92 GetMinAckFrameSize(); |
91 } | 93 } |
92 | 94 |
93 // static | 95 // static |
94 size_t QuicFramer::GetMinGoAwayFrameSize() { | 96 size_t QuicFramer::GetMinGoAwayFrameSize() { |
95 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 97 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
96 kQuicStreamIdSize; | 98 kQuicStreamIdSize; |
97 } | 99 } |
98 | 100 |
| 101 bool QuicFramer::IsSupportedVersion(QuicVersionTag version) { |
| 102 return version == kQuicVersion1; |
| 103 } |
| 104 |
| 105 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
| 106 return kQuicGuidSize + kPublicFlagsSize + |
| 107 number_versions * kQuicVersionSize; |
| 108 } |
| 109 |
99 size_t QuicFramer::GetSerializedFrameLength( | 110 size_t QuicFramer::GetSerializedFrameLength( |
100 const QuicFrame& frame, size_t free_bytes, bool first_frame) { | 111 const QuicFrame& frame, size_t free_bytes, bool first_frame) { |
101 if (frame.type == PADDING_FRAME) { | 112 if (frame.type == PADDING_FRAME) { |
102 // PADDING implies end of packet. | 113 // PADDING implies end of packet. |
103 return free_bytes; | 114 return free_bytes; |
104 } | 115 } |
105 size_t frame_len = ComputeFrameLength(frame); | 116 size_t frame_len = ComputeFrameLength(frame); |
106 if (frame_len > free_bytes) { | 117 if (frame_len > free_bytes) { |
107 // Only truncate the first frame in a packet, so if subsequent ones go | 118 // Only truncate the first frame in a packet, so if subsequent ones go |
108 // over, stop including more frames. | 119 // over, stop including more frames. |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 QuicPacket::NewFecPacket( | 249 QuicPacket::NewFecPacket( |
239 writer.take(), len, true, | 250 writer.take(), len, true, |
240 header.public_header.version_flag), | 251 header.public_header.version_flag), |
241 GetPacketEntropyHash(header), NULL); | 252 GetPacketEntropyHash(header), NULL); |
242 } | 253 } |
243 | 254 |
244 // static | 255 // static |
245 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( | 256 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( |
246 const QuicPublicResetPacket& packet) { | 257 const QuicPublicResetPacket& packet) { |
247 DCHECK(packet.public_header.reset_flag); | 258 DCHECK(packet.public_header.reset_flag); |
248 DCHECK(!packet.public_header.version_flag); | |
249 size_t len = GetPublicResetPacketSize(); | 259 size_t len = GetPublicResetPacketSize(); |
250 QuicDataWriter writer(len); | 260 QuicDataWriter writer(len); |
251 | 261 |
252 if (!writer.WriteUInt64(packet.public_header.guid)) { | 262 if (!writer.WriteUInt64(packet.public_header.guid)) { |
253 return NULL; | 263 return NULL; |
254 } | 264 } |
255 | 265 |
256 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST); | 266 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST); |
257 if (!writer.WriteUInt8(flags)) { | 267 if (!writer.WriteUInt8(flags)) { |
258 return NULL; | 268 return NULL; |
259 } | 269 } |
260 | 270 |
261 if (!writer.WriteUInt64(packet.nonce_proof)) { | 271 if (!writer.WriteUInt64(packet.nonce_proof)) { |
262 return NULL; | 272 return NULL; |
263 } | 273 } |
264 | 274 |
265 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, | 275 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, |
266 &writer)) { | 276 &writer)) { |
267 return NULL; | 277 return NULL; |
268 } | 278 } |
269 | 279 |
270 return new QuicEncryptedPacket(writer.take(), len, true); | 280 return new QuicEncryptedPacket(writer.take(), len, true); |
271 } | 281 } |
272 | 282 |
| 283 QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket( |
| 284 const QuicPacketPublicHeader& header, |
| 285 const QuicVersionTagList& supported_versions) { |
| 286 DCHECK(header.version_flag); |
| 287 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); |
| 288 QuicDataWriter writer(len); |
| 289 |
| 290 if (!writer.WriteUInt64(header.guid)) { |
| 291 return NULL; |
| 292 } |
| 293 |
| 294 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION); |
| 295 if (!writer.WriteUInt8(flags)) { |
| 296 return NULL; |
| 297 } |
| 298 |
| 299 for (size_t i = 0; i < supported_versions.size(); ++i) { |
| 300 if (!writer.WriteUInt32(supported_versions[i])) { |
| 301 return NULL; |
| 302 } |
| 303 } |
| 304 |
| 305 return new QuicEncryptedPacket(writer.take(), len, true); |
| 306 } |
| 307 |
273 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 308 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
274 DCHECK(!reader_.get()); | 309 DCHECK(!reader_.get()); |
275 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | 310 reader_.reset(new QuicDataReader(packet.data(), packet.length())); |
276 | 311 |
| 312 visitor_->OnPacket(); |
| 313 |
277 // First parse the public header. | 314 // First parse the public header. |
278 QuicPacketPublicHeader public_header; | 315 QuicPacketPublicHeader public_header; |
279 if (!ProcessPublicHeader(&public_header)) { | 316 if (!ProcessPublicHeader(&public_header)) { |
280 DLOG(WARNING) << "Unable to process public header."; | 317 DLOG(WARNING) << "Unable to process public header."; |
281 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 318 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
282 } | 319 } |
283 // TODO(satyamshekhar): Handle version negotiation. | 320 |
284 if (public_header.version_flag && public_header.version != quic_version_) { | 321 if (is_server_ && public_header.version_flag && |
285 return false; | 322 public_header.versions[0] != quic_version_) { |
| 323 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { |
| 324 reader_.reset(NULL); |
| 325 return true; |
| 326 } |
286 } | 327 } |
287 | 328 |
288 bool rv; | 329 bool rv; |
289 if (public_header.reset_flag) { | 330 if (!is_server_ && public_header.version_flag) { |
| 331 rv = ProcessVersionNegotiationPacket(&public_header); |
| 332 } else if (public_header.reset_flag) { |
290 rv = ProcessPublicResetPacket(public_header); | 333 rv = ProcessPublicResetPacket(public_header); |
291 } else { | 334 } else { |
292 rv = ProcessDataPacket(public_header, packet); | 335 rv = ProcessDataPacket(public_header, packet); |
293 } | 336 } |
294 | 337 |
295 reader_.reset(NULL); | 338 reader_.reset(NULL); |
296 return rv; | 339 return rv; |
297 } | 340 } |
298 | 341 |
| 342 bool QuicFramer::ProcessVersionNegotiationPacket( |
| 343 QuicPacketPublicHeader* public_header) { |
| 344 DCHECK(!is_server_); |
| 345 // Try reading at least once to raise error if the packet is invalid. |
| 346 do { |
| 347 QuicVersionTag version; |
| 348 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { |
| 349 set_detailed_error("Unable to read supported version in negotiation."); |
| 350 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); |
| 351 } |
| 352 public_header->versions.push_back(version); |
| 353 } while (!reader_->IsDoneReading()); |
| 354 |
| 355 visitor_->OnVersionNegotiationPacket(*public_header); |
| 356 return true; |
| 357 } |
| 358 |
299 bool QuicFramer::ProcessDataPacket( | 359 bool QuicFramer::ProcessDataPacket( |
300 const QuicPacketPublicHeader& public_header, | 360 const QuicPacketPublicHeader& public_header, |
301 const QuicEncryptedPacket& packet) { | 361 const QuicEncryptedPacket& packet) { |
302 visitor_->OnPacket(); | |
303 | |
304 QuicPacketHeader header(public_header); | 362 QuicPacketHeader header(public_header); |
305 if (!ProcessPacketHeader(&header, packet)) { | 363 if (!ProcessPacketHeader(&header, packet)) { |
306 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessPacketHeader sets the error. | 364 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessPacketHeader sets the error. |
307 DLOG(WARNING) << "Unable to process data packet header."; | 365 DLOG(WARNING) << "Unable to process data packet header."; |
308 return false; | 366 return false; |
309 } | 367 } |
310 | 368 |
311 if (!visitor_->OnPacketHeader(header)) { | 369 if (!visitor_->OnPacketHeader(header)) { |
312 // The visitor suppresses further processing of the packet. | 370 // The visitor suppresses further processing of the packet. |
313 return true; | 371 return true; |
(...skipping 23 matching lines...) Expand all Loading... |
337 } | 395 } |
338 | 396 |
339 visitor_->OnPacketComplete(); | 397 visitor_->OnPacketComplete(); |
340 return true; | 398 return true; |
341 } | 399 } |
342 | 400 |
343 bool QuicFramer::ProcessPublicResetPacket( | 401 bool QuicFramer::ProcessPublicResetPacket( |
344 const QuicPacketPublicHeader& public_header) { | 402 const QuicPacketPublicHeader& public_header) { |
345 QuicPublicResetPacket packet(public_header); | 403 QuicPublicResetPacket packet(public_header); |
346 if (!reader_->ReadUInt64(&packet.nonce_proof)) { | 404 if (!reader_->ReadUInt64(&packet.nonce_proof)) { |
| 405 // TODO(satyamshekhar): Raise error. |
347 set_detailed_error("Unable to read nonce proof."); | 406 set_detailed_error("Unable to read nonce proof."); |
348 return false; | 407 return false; |
349 } | 408 } |
350 // TODO(satyamshekhar): validate nonce to protect against DoS. | 409 // TODO(satyamshekhar): validate nonce to protect against DoS. |
351 | 410 |
352 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { | 411 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { |
353 set_detailed_error("Unable to read rejected sequence number."); | 412 set_detailed_error("Unable to read rejected sequence number."); |
354 return false; | 413 return false; |
355 } | 414 } |
356 visitor_->OnPublicResetPacket(packet); | 415 visitor_->OnPublicResetPacket(packet); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 flags |= PACKET_PUBLIC_FLAGS_RST; | 455 flags |= PACKET_PUBLIC_FLAGS_RST; |
397 } | 456 } |
398 if (header.public_header.version_flag) { | 457 if (header.public_header.version_flag) { |
399 flags |= PACKET_PUBLIC_FLAGS_VERSION; | 458 flags |= PACKET_PUBLIC_FLAGS_VERSION; |
400 } | 459 } |
401 if (!writer->WriteUInt8(flags)) { | 460 if (!writer->WriteUInt8(flags)) { |
402 return false; | 461 return false; |
403 } | 462 } |
404 | 463 |
405 if (header.public_header.version_flag) { | 464 if (header.public_header.version_flag) { |
| 465 DCHECK(!is_server_); |
406 writer->WriteUInt32(quic_version_); | 466 writer->WriteUInt32(quic_version_); |
407 } | 467 } |
408 | 468 |
409 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { | 469 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { |
410 return false; | 470 return false; |
411 } | 471 } |
412 | 472 |
413 flags = 0; | 473 flags = 0; |
414 if (header.fec_flag) { | 474 if (header.fec_flag) { |
415 flags |= PACKET_PRIVATE_FLAGS_FEC; | 475 flags |= PACKET_PRIVATE_FLAGS_FEC; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 | 534 |
475 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 535 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
476 set_detailed_error("Illegal public flags value."); | 536 set_detailed_error("Illegal public flags value."); |
477 return false; | 537 return false; |
478 } | 538 } |
479 | 539 |
480 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; | 540 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; |
481 public_header->version_flag = | 541 public_header->version_flag = |
482 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; | 542 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; |
483 | 543 |
484 if (public_header->version_flag && | 544 if (public_header->reset_flag && public_header->version_flag) { |
485 !reader_->ReadUInt32(&public_header->version)) { | 545 set_detailed_error("Got version flag in reset packet"); |
486 set_detailed_error("Unable to read protocol version."); | |
487 return false; | 546 return false; |
488 } | 547 } |
489 | 548 |
| 549 if (public_header->version_flag && is_server_) { |
| 550 QuicVersionTag version; |
| 551 if (!reader_->ReadUInt32(&version)) { |
| 552 // Read the version only if the packet is from the client. |
| 553 // version flag from the server means version negotiation packet. |
| 554 set_detailed_error("Unable to read protocol version."); |
| 555 return false; |
| 556 } |
| 557 public_header->versions.push_back(version); |
| 558 } |
490 return true; | 559 return true; |
491 } | 560 } |
492 | 561 |
493 // static | 562 // static |
494 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, | 563 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, |
495 QuicGuid* guid) { | 564 QuicGuid* guid) { |
496 QuicDataReader reader(packet.data(), packet.length()); | 565 QuicDataReader reader(packet.data(), packet.length()); |
497 return reader.ReadUInt64(guid); | 566 return reader.ReadUInt64(guid); |
498 } | 567 } |
499 | 568 |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { | 735 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { |
667 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { | 736 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { |
668 set_detailed_error("Unable to read entropy hash for received packets."); | 737 set_detailed_error("Unable to read entropy hash for received packets."); |
669 return false; | 738 return false; |
670 } | 739 } |
671 | 740 |
672 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { | 741 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { |
673 set_detailed_error("Unable to read largest observed."); | 742 set_detailed_error("Unable to read largest observed."); |
674 return false; | 743 return false; |
675 } | 744 } |
| 745 // TODO(pwestin): read and update delta_time_largest_observed. |
676 | 746 |
677 uint8 num_missing_packets; | 747 uint8 num_missing_packets; |
678 if (!reader_->ReadBytes(&num_missing_packets, 1)) { | 748 if (!reader_->ReadBytes(&num_missing_packets, 1)) { |
679 set_detailed_error("Unable to read num missing packets."); | 749 set_detailed_error("Unable to read num missing packets."); |
680 return false; | 750 return false; |
681 } | 751 } |
682 | 752 |
683 for (int i = 0; i < num_missing_packets; ++i) { | 753 for (int i = 0; i < num_missing_packets; ++i) { |
684 QuicPacketSequenceNumber sequence_number; | 754 QuicPacketSequenceNumber sequence_number; |
685 if (!ProcessPacketSequenceNumber(&sequence_number)) { | 755 if (!ProcessPacketSequenceNumber(&sequence_number)) { |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 } | 952 } |
883 frame.reason_phrase = reason_phrase.as_string(); | 953 frame.reason_phrase = reason_phrase.as_string(); |
884 | 954 |
885 visitor_->OnGoAwayFrame(frame); | 955 visitor_->OnGoAwayFrame(frame); |
886 return true; | 956 return true; |
887 } | 957 } |
888 | 958 |
889 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( | 959 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( |
890 const QuicEncryptedPacket& encrypted, bool includes_version) { | 960 const QuicEncryptedPacket& encrypted, bool includes_version) { |
891 return StringPiece(encrypted.data() + kStartOfHashData, | 961 return StringPiece(encrypted.data() + kStartOfHashData, |
892 GetStartOfEncryptedData(includes_version) | 962 GetStartOfEncryptedData(includes_version) - |
893 - kStartOfHashData); | 963 kStartOfHashData); |
894 } | 964 } |
895 | 965 |
896 QuicEncryptedPacket* QuicFramer::EncryptPacket( | 966 QuicEncryptedPacket* QuicFramer::EncryptPacket( |
897 QuicPacketSequenceNumber packet_sequence_number, | 967 QuicPacketSequenceNumber packet_sequence_number, |
898 const QuicPacket& packet) { | 968 const QuicPacket& packet) { |
899 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet_sequence_number, | 969 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet_sequence_number, |
900 packet.AssociatedData(), | 970 packet.AssociatedData(), |
901 packet.Plaintext())); | 971 packet.Plaintext())); |
902 if (out.get() == NULL) { | 972 if (out.get() == NULL) { |
903 RaiseError(QUIC_ENCRYPTION_FAILURE); | 973 RaiseError(QUIC_ENCRYPTION_FAILURE); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1069 size_t received_entropy_offset = writer->length(); | 1139 size_t received_entropy_offset = writer->length(); |
1070 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) { | 1140 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) { |
1071 return false; | 1141 return false; |
1072 } | 1142 } |
1073 | 1143 |
1074 size_t largest_observed_offset = writer->length(); | 1144 size_t largest_observed_offset = writer->length(); |
1075 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, | 1145 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, |
1076 writer)) { | 1146 writer)) { |
1077 return false; | 1147 return false; |
1078 } | 1148 } |
| 1149 // TODO(pwestin): calculate and add delta_time_largest_observed to the |
| 1150 // message. |
1079 | 1151 |
1080 // We don't check for overflowing uint8 here, because we only can fit 192 acks | 1152 // We don't check for overflowing uint8 here, because we only can fit 192 acks |
1081 // per packet, so if we overflow we will be truncated. | 1153 // per packet, so if we overflow we will be truncated. |
1082 uint8 num_missing_packets = frame.received_info.missing_packets.size(); | 1154 uint8 num_missing_packets = frame.received_info.missing_packets.size(); |
1083 size_t num_missing_packets_offset = writer->length(); | 1155 size_t num_missing_packets_offset = writer->length(); |
1084 if (!writer->WriteBytes(&num_missing_packets, 1)) { | 1156 if (!writer->WriteBytes(&num_missing_packets, 1)) { |
1085 return false; | 1157 return false; |
1086 } | 1158 } |
1087 | 1159 |
1088 SequenceNumberSet::const_iterator it = | 1160 SequenceNumberSet::const_iterator it = |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 | 1323 |
1252 bool QuicFramer::RaiseError(QuicErrorCode error) { | 1324 bool QuicFramer::RaiseError(QuicErrorCode error) { |
1253 DLOG(INFO) << detailed_error_; | 1325 DLOG(INFO) << detailed_error_; |
1254 set_error(error); | 1326 set_error(error); |
1255 visitor_->OnError(this); | 1327 visitor_->OnError(this); |
1256 reader_.reset(NULL); | 1328 reader_.reset(NULL); |
1257 return false; | 1329 return false; |
1258 } | 1330 } |
1259 | 1331 |
1260 } // namespace net | 1332 } // namespace net |
OLD | NEW |