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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 const QuicWindowUpdateFrame& frame) { | 135 const QuicWindowUpdateFrame& frame) { |
136 return true; | 136 return true; |
137 } | 137 } |
138 | 138 |
139 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { | 139 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { |
140 return true; | 140 return true; |
141 } | 141 } |
142 | 142 |
143 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 143 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
144 QuicTime creation_time, | 144 QuicTime creation_time, |
145 bool is_server) | 145 Perspective perspective) |
146 : visitor_(nullptr), | 146 : visitor_(nullptr), |
147 fec_builder_(nullptr), | 147 fec_builder_(nullptr), |
148 entropy_calculator_(nullptr), | 148 entropy_calculator_(nullptr), |
149 error_(QUIC_NO_ERROR), | 149 error_(QUIC_NO_ERROR), |
150 last_sequence_number_(0), | 150 last_sequence_number_(0), |
151 last_serialized_connection_id_(0), | 151 last_serialized_connection_id_(0), |
152 supported_versions_(supported_versions), | 152 supported_versions_(supported_versions), |
153 decrypter_level_(ENCRYPTION_NONE), | 153 decrypter_level_(ENCRYPTION_NONE), |
154 alternative_decrypter_level_(ENCRYPTION_NONE), | 154 alternative_decrypter_level_(ENCRYPTION_NONE), |
155 alternative_decrypter_latch_(false), | 155 alternative_decrypter_latch_(false), |
156 is_server_(is_server), | 156 perspective_(perspective), |
157 validate_flags_(true), | 157 validate_flags_(true), |
158 creation_time_(creation_time), | 158 creation_time_(creation_time), |
159 last_timestamp_(QuicTime::Delta::Zero()) { | 159 last_timestamp_(QuicTime::Delta::Zero()) { |
160 DCHECK(!supported_versions.empty()); | 160 DCHECK(!supported_versions.empty()); |
161 quic_version_ = supported_versions_[0]; | 161 quic_version_ = supported_versions_[0]; |
162 decrypter_.reset(QuicDecrypter::Create(kNULL)); | 162 decrypter_.reset(QuicDecrypter::Create(kNULL)); |
163 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); | 163 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); |
164 } | 164 } |
165 | 165 |
166 QuicFramer::~QuicFramer() {} | 166 QuicFramer::~QuicFramer() {} |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 DCHECK_NE("", detailed_error_); | 524 DCHECK_NE("", detailed_error_); |
525 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 525 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
526 } | 526 } |
527 | 527 |
528 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | 528 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
529 // The visitor suppresses further processing of the packet. | 529 // The visitor suppresses further processing of the packet. |
530 reader_.reset(nullptr); | 530 reader_.reset(nullptr); |
531 return true; | 531 return true; |
532 } | 532 } |
533 | 533 |
534 if (is_server_ && public_header.version_flag && | 534 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && |
535 public_header.versions[0] != quic_version_) { | 535 public_header.versions[0] != quic_version_) { |
536 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { | 536 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { |
537 reader_.reset(nullptr); | 537 reader_.reset(nullptr); |
538 return true; | 538 return true; |
539 } | 539 } |
540 } | 540 } |
541 | 541 |
542 bool rv; | 542 bool rv; |
543 if (!is_server_ && public_header.version_flag) { | 543 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { |
544 rv = ProcessVersionNegotiationPacket(&public_header); | 544 rv = ProcessVersionNegotiationPacket(&public_header); |
545 } else if (public_header.reset_flag) { | 545 } else if (public_header.reset_flag) { |
546 rv = ProcessPublicResetPacket(public_header); | 546 rv = ProcessPublicResetPacket(public_header); |
547 } else if (packet.length() <= kMaxPacketSize) { | 547 } else if (packet.length() <= kMaxPacketSize) { |
548 char buffer[kMaxPacketSize]; | 548 char buffer[kMaxPacketSize]; |
549 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize); | 549 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize); |
550 } else { | 550 } else { |
551 scoped_ptr<char[]> large_buffer(new char[packet.length()]); | 551 scoped_ptr<char[]> large_buffer(new char[packet.length()]); |
552 rv = ProcessDataPacket(public_header, packet, large_buffer.get(), | 552 rv = ProcessDataPacket(public_header, packet, large_buffer.get(), |
553 packet.length()); | 553 packet.length()); |
554 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets " | 554 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets " |
555 << "larger than kMaxPacketSize. packet size:" | 555 << "larger than kMaxPacketSize. packet size:" |
556 << packet.length(); | 556 << packet.length(); |
557 } | 557 } |
558 | 558 |
559 reader_.reset(nullptr); | 559 reader_.reset(nullptr); |
560 return rv; | 560 return rv; |
561 } | 561 } |
562 | 562 |
563 bool QuicFramer::ProcessVersionNegotiationPacket( | 563 bool QuicFramer::ProcessVersionNegotiationPacket( |
564 QuicPacketPublicHeader* public_header) { | 564 QuicPacketPublicHeader* public_header) { |
565 DCHECK(!is_server_); | 565 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); |
566 // Try reading at least once to raise error if the packet is invalid. | 566 // Try reading at least once to raise error if the packet is invalid. |
567 do { | 567 do { |
568 QuicTag version; | 568 QuicTag version; |
569 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { | 569 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { |
570 set_detailed_error("Unable to read supported version in negotiation."); | 570 set_detailed_error("Unable to read supported version in negotiation."); |
571 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); | 571 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); |
572 } | 572 } |
573 public_header->versions.push_back(QuicTagToQuicVersion(version)); | 573 public_header->versions.push_back(QuicTagToQuicVersion(version)); |
574 } while (!reader_->IsDoneReading()); | 574 } while (!reader_->IsDoneReading()); |
575 | 575 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 return false; | 737 return false; |
738 } | 738 } |
739 if (!writer->WriteUInt64(header.public_header.connection_id)) { | 739 if (!writer->WriteUInt64(header.public_header.connection_id)) { |
740 return false; | 740 return false; |
741 } | 741 } |
742 break; | 742 break; |
743 } | 743 } |
744 last_serialized_connection_id_ = header.public_header.connection_id; | 744 last_serialized_connection_id_ = header.public_header.connection_id; |
745 | 745 |
746 if (header.public_header.version_flag) { | 746 if (header.public_header.version_flag) { |
747 DCHECK(!is_server_); | 747 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); |
748 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); | 748 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); |
749 } | 749 } |
750 | 750 |
751 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | 751 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, |
752 header.packet_sequence_number, writer)) { | 752 header.packet_sequence_number, writer)) { |
753 return false; | 753 return false; |
754 } | 754 } |
755 | 755 |
756 uint8 private_flags = 0; | 756 uint8 private_flags = 0; |
757 if (header.entropy_flag) { | 757 if (header.entropy_flag) { |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 public_header->connection_id = last_serialized_connection_id_; | 903 public_header->connection_id = last_serialized_connection_id_; |
904 break; | 904 break; |
905 } | 905 } |
906 | 906 |
907 public_header->sequence_number_length = | 907 public_header->sequence_number_length = |
908 ReadSequenceNumberLength( | 908 ReadSequenceNumberLength( |
909 public_flags >> kPublicHeaderSequenceNumberShift); | 909 public_flags >> kPublicHeaderSequenceNumberShift); |
910 | 910 |
911 // Read the version only if the packet is from the client. | 911 // Read the version only if the packet is from the client. |
912 // version flag from the server means version negotiation packet. | 912 // version flag from the server means version negotiation packet. |
913 if (public_header->version_flag && is_server_) { | 913 if (public_header->version_flag && perspective_ == Perspective::IS_SERVER) { |
914 QuicTag version_tag; | 914 QuicTag version_tag; |
915 if (!reader_->ReadUInt32(&version_tag)) { | 915 if (!reader_->ReadUInt32(&version_tag)) { |
916 set_detailed_error("Unable to read protocol version."); | 916 set_detailed_error("Unable to read protocol version."); |
917 return false; | 917 return false; |
918 } | 918 } |
919 | 919 |
920 // If the version from the new packet is the same as the version of this | 920 // If the version from the new packet is the same as the version of this |
921 // framer, then the public flags should be set to something we understand. | 921 // framer, then the public flags should be set to something we understand. |
922 // If not, this raises an error. | 922 // If not, this raises an error. |
923 QuicVersion version = QuicTagToQuicVersion(version_tag); | 923 QuicVersion version = QuicTagToQuicVersion(version_tag); |
(...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2214 | 2214 |
2215 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2215 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2216 DVLOG(1) << "Error detail: " << detailed_error_; | 2216 DVLOG(1) << "Error detail: " << detailed_error_; |
2217 set_error(error); | 2217 set_error(error); |
2218 visitor_->OnError(this); | 2218 visitor_->OnError(this); |
2219 reader_.reset(nullptr); | 2219 reader_.reset(nullptr); |
2220 return false; | 2220 return false; |
2221 } | 2221 } |
2222 | 2222 |
2223 } // namespace net | 2223 } // namespace net |
OLD | NEW |