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

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

Issue 15074007: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix for windows Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include "base/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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698