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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 95 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
96 GetMinAckFrameSize(); | 96 GetMinAckFrameSize(); |
97 } | 97 } |
98 | 98 |
99 // static | 99 // static |
100 size_t QuicFramer::GetMinGoAwayFrameSize() { | 100 size_t QuicFramer::GetMinGoAwayFrameSize() { |
101 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 101 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
102 kQuicStreamIdSize; | 102 kQuicStreamIdSize; |
103 } | 103 } |
104 | 104 |
| 105 // static |
| 106 // TODO(satyamshekhar): 16 - Crypto hash for integrity. Not a static value. Use |
| 107 // QuicEncrypter::GetMaxPlaintextSize. |
| 108 size_t QuicFramer::GetMaxUnackedPackets(bool include_version) { |
| 109 return (kMaxPacketSize - GetPacketHeaderSize(include_version) - |
| 110 GetMinAckFrameSize() - 16) / kSequenceNumberSize; |
| 111 } |
| 112 |
105 bool QuicFramer::IsSupportedVersion(QuicTag version) { | 113 bool QuicFramer::IsSupportedVersion(QuicTag version) { |
106 return version == kQuicVersion1; | 114 return version == kQuicVersion1; |
107 } | 115 } |
108 | 116 |
109 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | 117 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
110 return kQuicGuidSize + kPublicFlagsSize + | 118 return kQuicGuidSize + kPublicFlagsSize + |
111 number_versions * kQuicVersionSize; | 119 number_versions * kQuicVersionSize; |
112 } | 120 } |
113 | 121 |
114 size_t QuicFramer::GetSerializedFrameLength( | 122 size_t QuicFramer::GetSerializedFrameLength( |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 for (size_t i = 0; i < supported_versions.size(); ++i) { | 314 for (size_t i = 0; i < supported_versions.size(); ++i) { |
307 if (!writer.WriteUInt32(supported_versions[i])) { | 315 if (!writer.WriteUInt32(supported_versions[i])) { |
308 return NULL; | 316 return NULL; |
309 } | 317 } |
310 } | 318 } |
311 | 319 |
312 return new QuicEncryptedPacket(writer.take(), len, true); | 320 return new QuicEncryptedPacket(writer.take(), len, true); |
313 } | 321 } |
314 | 322 |
315 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 323 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 324 // TODO(satyamshekhar): Don't RaiseError (and close the connection) for |
| 325 // invalid (unauthenticated) packets. |
316 DCHECK(!reader_.get()); | 326 DCHECK(!reader_.get()); |
317 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | 327 reader_.reset(new QuicDataReader(packet.data(), packet.length())); |
318 | 328 |
319 visitor_->OnPacket(); | 329 visitor_->OnPacket(); |
320 | 330 |
321 // First parse the public header. | 331 // First parse the public header. |
322 QuicPacketPublicHeader public_header; | 332 QuicPacketPublicHeader public_header; |
323 if (!ProcessPublicHeader(&public_header)) { | 333 if (!ProcessPublicHeader(&public_header)) { |
324 DLOG(WARNING) << "Unable to process public header."; | 334 DLOG(WARNING) << "Unable to process public header."; |
325 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 335 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 } | 412 } |
403 | 413 |
404 visitor_->OnPacketComplete(); | 414 visitor_->OnPacketComplete(); |
405 return true; | 415 return true; |
406 } | 416 } |
407 | 417 |
408 bool QuicFramer::ProcessPublicResetPacket( | 418 bool QuicFramer::ProcessPublicResetPacket( |
409 const QuicPacketPublicHeader& public_header) { | 419 const QuicPacketPublicHeader& public_header) { |
410 QuicPublicResetPacket packet(public_header); | 420 QuicPublicResetPacket packet(public_header); |
411 if (!reader_->ReadUInt64(&packet.nonce_proof)) { | 421 if (!reader_->ReadUInt64(&packet.nonce_proof)) { |
412 // TODO(satyamshekhar): Raise error. | |
413 set_detailed_error("Unable to read nonce proof."); | 422 set_detailed_error("Unable to read nonce proof."); |
414 return false; | 423 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); |
415 } | 424 } |
416 // TODO(satyamshekhar): validate nonce to protect against DoS. | 425 // TODO(satyamshekhar): validate nonce to protect against DoS. |
417 | 426 |
418 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { | 427 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { |
419 set_detailed_error("Unable to read rejected sequence number."); | 428 set_detailed_error("Unable to read rejected sequence number."); |
420 return false; | 429 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); |
421 } | 430 } |
422 visitor_->OnPublicResetPacket(packet); | 431 visitor_->OnPublicResetPacket(packet); |
423 return true; | 432 return true; |
424 } | 433 } |
425 | 434 |
426 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, | 435 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, |
427 StringPiece payload) { | 436 StringPiece payload) { |
428 DCHECK(!reader_.get()); | 437 DCHECK(!reader_.get()); |
429 | 438 |
430 visitor_->OnRevivedPacket(); | 439 visitor_->OnRevivedPacket(); |
431 | 440 |
432 header->entropy_hash = GetPacketEntropyHash(*header); | 441 header->entropy_hash = GetPacketEntropyHash(*header); |
433 | 442 |
434 // TODO(satyamshekhar): Don't process if the visitor refuses the header. | 443 if (!visitor_->OnPacketHeader(*header)) { |
435 visitor_->OnPacketHeader(*header); | 444 return true; |
| 445 } |
436 | 446 |
437 if (payload.length() > kMaxPacketSize) { | 447 if (payload.length() > kMaxPacketSize) { |
438 set_detailed_error("Revived packet too large."); | 448 set_detailed_error("Revived packet too large."); |
439 return RaiseError(QUIC_PACKET_TOO_LARGE); | 449 return RaiseError(QUIC_PACKET_TOO_LARGE); |
440 } | 450 } |
441 | 451 |
442 reader_.reset(new QuicDataReader(payload.data(), payload.length())); | 452 reader_.reset(new QuicDataReader(payload.data(), payload.length())); |
443 if (!ProcessFrameData()) { | 453 if (!ProcessFrameData()) { |
444 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | 454 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. |
445 DLOG(WARNING) << "Unable to process frame data."; | 455 DLOG(WARNING) << "Unable to process frame data."; |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 // Returning true since there was no parsing error. | 707 // Returning true since there was no parsing error. |
698 return true; | 708 return true; |
699 } | 709 } |
700 break; | 710 break; |
701 } | 711 } |
702 case CONNECTION_CLOSE_FRAME: { | 712 case CONNECTION_CLOSE_FRAME: { |
703 QuicConnectionCloseFrame frame; | 713 QuicConnectionCloseFrame frame; |
704 if (!ProcessConnectionCloseFrame(&frame)) { | 714 if (!ProcessConnectionCloseFrame(&frame)) { |
705 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); | 715 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); |
706 } | 716 } |
| 717 |
| 718 if (!visitor_->OnAckFrame(frame.ack_frame)) { |
| 719 DLOG(INFO) << "Visitor asked to stopped further processing."; |
| 720 // Returning true since there was no parsing error. |
| 721 return true; |
| 722 } |
| 723 |
707 if (!visitor_->OnConnectionCloseFrame(frame)) { | 724 if (!visitor_->OnConnectionCloseFrame(frame)) { |
708 DLOG(INFO) << "Visitor asked to stopped further processing."; | 725 DLOG(INFO) << "Visitor asked to stopped further processing."; |
709 // Returning true since there was no parsing error. | 726 // Returning true since there was no parsing error. |
710 return true; | 727 return true; |
711 } | 728 } |
712 break; | 729 break; |
713 } | 730 } |
714 case GOAWAY_FRAME: { | 731 case GOAWAY_FRAME: { |
715 QuicGoAwayFrame goaway_frame; | 732 QuicGoAwayFrame goaway_frame; |
716 if (!ProcessGoAwayFrame(&goaway_frame)) { | 733 if (!ProcessGoAwayFrame(&goaway_frame)) { |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
981 set_detailed_error("Unable to read connection close error details."); | 998 set_detailed_error("Unable to read connection close error details."); |
982 return false; | 999 return false; |
983 } | 1000 } |
984 frame->error_details = error_details.as_string(); | 1001 frame->error_details = error_details.as_string(); |
985 | 1002 |
986 if (!ProcessAckFrame(&frame->ack_frame)) { | 1003 if (!ProcessAckFrame(&frame->ack_frame)) { |
987 DLOG(WARNING) << "Unable to process ack frame."; | 1004 DLOG(WARNING) << "Unable to process ack frame."; |
988 return false; | 1005 return false; |
989 } | 1006 } |
990 | 1007 |
991 if (!visitor_->OnAckFrame(frame->ack_frame)) { | |
992 DLOG(INFO) << "Visitor asked to stopped further processing."; | |
993 // Returning true since there was no parsing error. | |
994 return true; | |
995 } | |
996 | |
997 return true; | 1008 return true; |
998 } | 1009 } |
999 | 1010 |
1000 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { | 1011 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { |
1001 uint32 error_code; | 1012 uint32 error_code; |
1002 if (!reader_->ReadUInt32(&error_code)) { | 1013 if (!reader_->ReadUInt32(&error_code)) { |
1003 set_detailed_error("Unable to read go away error code."); | 1014 set_detailed_error("Unable to read go away error code."); |
1004 return false; | 1015 return false; |
1005 } | 1016 } |
1006 frame->error_code = static_cast<QuicErrorCode>(error_code); | 1017 frame->error_code = static_cast<QuicErrorCode>(error_code); |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1485 | 1496 |
1486 bool QuicFramer::RaiseError(QuicErrorCode error) { | 1497 bool QuicFramer::RaiseError(QuicErrorCode error) { |
1487 DLOG(INFO) << detailed_error_; | 1498 DLOG(INFO) << detailed_error_; |
1488 set_error(error); | 1499 set_error(error); |
1489 visitor_->OnError(this); | 1500 visitor_->OnError(this); |
1490 reader_.reset(NULL); | 1501 reader_.reset(NULL); |
1491 return false; | 1502 return false; |
1492 } | 1503 } |
1493 | 1504 |
1494 } // namespace net | 1505 } // namespace net |
OLD | NEW |