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 "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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 QuicPacketSequenceNumber b) { | 107 QuicPacketSequenceNumber b) { |
108 return (Delta(target, a) < Delta(target, b)) ? a : b; | 108 return (Delta(target, a) < Delta(target, b)) ? a : b; |
109 } | 109 } |
110 | 110 |
111 QuicTag GetNullTag(QuicVersion version) { | 111 QuicTag GetNullTag(QuicVersion version) { |
112 return version >= QUIC_VERSION_11 ? kNULN : kNULL; | 112 return version >= QUIC_VERSION_11 ? kNULN : kNULL; |
113 } | 113 } |
114 | 114 |
115 } // namespace | 115 } // namespace |
116 | 116 |
117 QuicFramer::QuicFramer(QuicVersion version, | 117 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
118 QuicTime creation_time, | 118 QuicTime creation_time, |
119 bool is_server) | 119 bool is_server) |
120 : visitor_(NULL), | 120 : visitor_(NULL), |
121 fec_builder_(NULL), | 121 fec_builder_(NULL), |
122 error_(QUIC_NO_ERROR), | 122 error_(QUIC_NO_ERROR), |
123 last_sequence_number_(0), | 123 last_sequence_number_(0), |
124 last_serialized_guid_(0), | 124 last_serialized_guid_(0), |
125 quic_version_(version), | 125 supported_versions_(supported_versions), |
126 decrypter_(QuicDecrypter::Create(GetNullTag(version))), | |
127 alternative_decrypter_latch_(false), | 126 alternative_decrypter_latch_(false), |
128 is_server_(is_server), | 127 is_server_(is_server), |
129 creation_time_(creation_time) { | 128 creation_time_(creation_time) { |
130 DCHECK(IsSupportedVersion(version)); | 129 DCHECK(!supported_versions.empty()); |
131 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(GetNullTag(version))); | 130 quic_version_ = supported_versions_[0]; |
| 131 decrypter_.reset(QuicDecrypter::Create(GetNullTag(quic_version_))); |
| 132 encrypter_[ENCRYPTION_NONE].reset( |
| 133 QuicEncrypter::Create(GetNullTag(quic_version_))); |
132 } | 134 } |
133 | 135 |
134 QuicFramer::~QuicFramer() {} | 136 QuicFramer::~QuicFramer() {} |
135 | 137 |
136 // static | 138 // static |
137 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, | 139 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, |
138 QuicStreamId stream_id, | 140 QuicStreamId stream_id, |
139 QuicStreamOffset offset, | 141 QuicStreamOffset offset, |
140 bool last_frame_in_packet) { | 142 bool last_frame_in_packet) { |
141 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | 143 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 // checking for it here results in frames not being added, but the resulting | 224 // checking for it here results in frames not being added, but the resulting |
223 // frames do actually fit. | 225 // frames do actually fit. |
224 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && | 226 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && |
225 free_bytes >= GetMinAckFrameSize()) { | 227 free_bytes >= GetMinAckFrameSize()) { |
226 return true; | 228 return true; |
227 } | 229 } |
228 return false; | 230 return false; |
229 } | 231 } |
230 | 232 |
231 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { | 233 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { |
232 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | 234 for (size_t i = 0; i < supported_versions_.size(); ++i) { |
233 if (version == kSupportedQuicVersions[i]) { | 235 if (version == supported_versions_[i]) { |
234 return true; | 236 return true; |
235 } | 237 } |
236 } | 238 } |
237 return false; | 239 return false; |
238 } | 240 } |
239 | 241 |
240 size_t QuicFramer::GetSerializedFrameLength(const QuicFrame& frame, | 242 size_t QuicFramer::GetSerializedFrameLength(const QuicFrame& frame, |
241 size_t free_bytes, | 243 size_t free_bytes, |
242 bool first_frame, | 244 bool first_frame, |
243 bool last_frame) { | 245 bool last_frame) { |
(...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1426 memcpy(buffer, header_data.data(), header_data.length()); | 1428 memcpy(buffer, header_data.data(), header_data.length()); |
1427 memcpy(buffer + header_data.length(), out->data(), out->length()); | 1429 memcpy(buffer + header_data.length(), out->data(), out->length()); |
1428 return new QuicEncryptedPacket(buffer, len, true); | 1430 return new QuicEncryptedPacket(buffer, len, true); |
1429 } | 1431 } |
1430 | 1432 |
1431 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { | 1433 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { |
1432 // In order to keep the code simple, we don't have the current encryption | 1434 // In order to keep the code simple, we don't have the current encryption |
1433 // level to hand. At the moment, the NullEncrypter has a tag length of 16 | 1435 // level to hand. At the moment, the NullEncrypter has a tag length of 16 |
1434 // bytes and AES-GCM has a tag length of 12. We take the minimum plaintext | 1436 // bytes and AES-GCM has a tag length of 12. We take the minimum plaintext |
1435 // length just to be safe. | 1437 // length just to be safe. |
1436 size_t min_plaintext_size = ciphertext_size; | 1438 // TODO(rtenneti): remove '- 16' after we delete QUIC_VERSION_10. |
| 1439 size_t min_plaintext_size = ciphertext_size - 16; |
1437 | 1440 |
1438 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { | 1441 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { |
1439 if (encrypter_[i].get() != NULL) { | 1442 if (encrypter_[i].get() != NULL) { |
1440 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); | 1443 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); |
1441 if (size < min_plaintext_size) { | 1444 if (size < min_plaintext_size) { |
1442 min_plaintext_size = size; | 1445 min_plaintext_size = size; |
1443 } | 1446 } |
1444 } | 1447 } |
1445 } | 1448 } |
1446 | 1449 |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 if (it != missing_packets.end() && previous_missing + 1 != *it) { | 1680 if (it != missing_packets.end() && previous_missing + 1 != *it) { |
1678 return *it - 1; | 1681 return *it - 1; |
1679 } | 1682 } |
1680 | 1683 |
1681 // Otherwise return the largest missing packet, as indirectly observed. | 1684 // Otherwise return the largest missing packet, as indirectly observed. |
1682 return *largest_written; | 1685 return *largest_written; |
1683 } | 1686 } |
1684 | 1687 |
1685 void QuicFramer::set_version(const QuicVersion version) { | 1688 void QuicFramer::set_version(const QuicVersion version) { |
1686 DCHECK(IsSupportedVersion(version)); | 1689 DCHECK(IsSupportedVersion(version)); |
| 1690 // Handle version incompatibility between QUIC_VERSION_10 and QUIC_VERSION_11 |
| 1691 // because of introduction of a new QUIC null encryption format in |
| 1692 // QUIC_VERSION_11. |
1687 if ((quic_version_ > QUIC_VERSION_10 && version <= QUIC_VERSION_10) || | 1693 if ((quic_version_ > QUIC_VERSION_10 && version <= QUIC_VERSION_10) || |
1688 (quic_version_ <= QUIC_VERSION_10 && version > QUIC_VERSION_10)) { | 1694 (quic_version_ <= QUIC_VERSION_10 && version > QUIC_VERSION_10)) { |
1689 // TODO(rtenneti): remove the following code after we delete | 1695 // TODO(rtenneti): remove the following code after we delete |
1690 // QUIC_VERSION_10. | 1696 // QUIC_VERSION_10. |
1691 decrypter_.reset(QuicDecrypter::Create(GetNullTag(version))); | 1697 decrypter_.reset(QuicDecrypter::Create(GetNullTag(version))); |
1692 encrypter_[ENCRYPTION_NONE].reset( | 1698 encrypter_[ENCRYPTION_NONE].reset( |
1693 QuicEncrypter::Create(GetNullTag(version))); | 1699 QuicEncrypter::Create(GetNullTag(version))); |
1694 } | 1700 } |
1695 quic_version_ = version; | 1701 quic_version_ = version; |
1696 } | 1702 } |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1909 | 1915 |
1910 bool QuicFramer::RaiseError(QuicErrorCode error) { | 1916 bool QuicFramer::RaiseError(QuicErrorCode error) { |
1911 DLOG(INFO) << detailed_error_; | 1917 DLOG(INFO) << detailed_error_; |
1912 set_error(error); | 1918 set_error(error); |
1913 visitor_->OnError(this); | 1919 visitor_->OnError(this); |
1914 reader_.reset(NULL); | 1920 reader_.reset(NULL); |
1915 return false; | 1921 return false; |
1916 } | 1922 } |
1917 | 1923 |
1918 } // namespace net | 1924 } // namespace net |
OLD | NEW |