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

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

Issue 18307003: Implement the variable length changes necessary to easily accommodate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merging with TOT Created 7 years, 5 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_packet_creator.h » ('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/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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 return false; 80 return false;
81 } 81 }
82 82
83 // static 83 // static
84 size_t QuicFramer::GetMinStreamFrameSize() { 84 size_t QuicFramer::GetMinStreamFrameSize() {
85 return kQuicFrameTypeSize + kQuicStreamIdSize + 85 return kQuicFrameTypeSize + kQuicStreamIdSize +
86 kQuicStreamFinSize + kQuicStreamOffsetSize + kQuicStreamPayloadLengthSize; 86 kQuicStreamFinSize + kQuicStreamOffsetSize + kQuicStreamPayloadLengthSize;
87 } 87 }
88 88
89 // static 89 // static
90 size_t QuicFramer::GetMinStreamFrameSize(QuicStreamId stream_id,
91 QuicStreamOffset offset,
92 bool last_frame) {
93 // TODO(ianswett): Remove kQuicStreamFinSize for the next STREAM framing.
94 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
95 GetStreamOffsetSize(offset) + kQuicStreamFinSize +
96 kQuicStreamPayloadLengthSize;
97 }
98
99 // static
90 size_t QuicFramer::GetMinAckFrameSize() { 100 size_t QuicFramer::GetMinAckFrameSize() {
91 return kQuicFrameTypeSize + kQuicEntropyHashSize + 101 return kQuicFrameTypeSize + kQuicEntropyHashSize +
92 PACKET_6BYTE_SEQUENCE_NUMBER + kQuicEntropyHashSize + 102 PACKET_6BYTE_SEQUENCE_NUMBER + kQuicEntropyHashSize +
93 PACKET_6BYTE_SEQUENCE_NUMBER + kQuicDeltaTimeLargestObservedSize + 103 PACKET_6BYTE_SEQUENCE_NUMBER + kQuicDeltaTimeLargestObservedSize +
94 kNumberOfMissingPacketsSize; 104 kNumberOfMissingPacketsSize;
95 } 105 }
96 106
97 // static 107 // static
98 size_t QuicFramer::GetMinRstStreamFrameSize() { 108 size_t QuicFramer::GetMinRstStreamFrameSize() {
99 return kQuicFrameTypeSize + kQuicStreamIdSize + kQuicErrorCodeSize + 109 return kQuicFrameTypeSize + kQuicStreamIdSize + kQuicErrorCodeSize +
(...skipping 15 matching lines...) Expand all
115 // static 125 // static
116 // TODO(satyamshekhar): 16 - Crypto hash for integrity. Not a static value. Use 126 // TODO(satyamshekhar): 16 - Crypto hash for integrity. Not a static value. Use
117 // QuicEncrypter::GetMaxPlaintextSize. 127 // QuicEncrypter::GetMaxPlaintextSize.
118 // 16 is a conservative estimate in the case of AEAD_AES_128_GCM_12, which uses 128 // 16 is a conservative estimate in the case of AEAD_AES_128_GCM_12, which uses
119 // 12-byte tags. 129 // 12-byte tags.
120 size_t QuicFramer::GetMaxUnackedPackets(QuicPacketHeader header) { 130 size_t QuicFramer::GetMaxUnackedPackets(QuicPacketHeader header) {
121 return (kMaxPacketSize - GetPacketHeaderSize(header) - 131 return (kMaxPacketSize - GetPacketHeaderSize(header) -
122 GetMinAckFrameSize() - 16) / PACKET_6BYTE_SEQUENCE_NUMBER; 132 GetMinAckFrameSize() - 16) / PACKET_6BYTE_SEQUENCE_NUMBER;
123 } 133 }
124 134
135 // static
136 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
137 return 4;
138 }
139
140 // static
141 size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) {
142 return 8;
143 }
144
125 bool QuicFramer::IsSupportedVersion(QuicTag version) { 145 bool QuicFramer::IsSupportedVersion(QuicTag version) {
126 return version == kQuicVersion1; 146 return version == kQuicVersion1;
127 } 147 }
128 148
129 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { 149 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
130 return kPublicFlagsSize + PACKET_8BYTE_GUID + 150 return kPublicFlagsSize + PACKET_8BYTE_GUID +
131 number_versions * kQuicVersionSize; 151 number_versions * kQuicVersionSize;
132 } 152 }
133 153
134 size_t QuicFramer::GetSerializedFrameLength( 154 size_t QuicFramer::GetSerializedFrameLength(
135 const QuicFrame& frame, size_t free_bytes, bool first_frame) { 155 const QuicFrame& frame, size_t free_bytes, bool first_frame) {
136 if (frame.type == PADDING_FRAME) { 156 if (frame.type == PADDING_FRAME) {
137 // PADDING implies end of packet. 157 // PADDING implies end of packet.
138 return free_bytes; 158 return free_bytes;
139 } 159 }
140 size_t frame_len = ComputeFrameLength(frame); 160 // See if it fits as the non-last frame.
161 size_t frame_len = ComputeFrameLength(frame, false);
141 if (frame_len > free_bytes) { 162 if (frame_len > free_bytes) {
142 // Only truncate the first frame in a packet, so if subsequent ones go 163 // Only truncate the first frame in a packet, so if subsequent ones go
143 // over, stop including more frames. 164 // over, stop including more frames.
144 if (!first_frame) { 165 if (!first_frame) {
145 return 0; 166 return 0;
146 } 167 }
147 if (CanTruncate(frame)) { 168 if (CanTruncate(frame)) {
148 // Truncate the frame so the packet will not exceed kMaxPacketSize. 169 // Truncate the frame so the packet will not exceed kMaxPacketSize.
149 // Note that we may not use every byte of the writer in this case. 170 // Note that we may not use every byte of the writer in this case.
150 if (free_bytes >= GetMinAckFrameSize()) { 171 if (free_bytes >= GetMinAckFrameSize()) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 const QuicFrames& frames, 208 const QuicFrames& frames,
188 size_t packet_size) { 209 size_t packet_size) {
189 QuicDataWriter writer(packet_size); 210 QuicDataWriter writer(packet_size);
190 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL); 211 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL);
191 if (!WritePacketHeader(header, &writer)) { 212 if (!WritePacketHeader(header, &writer)) {
192 return kNoPacket; 213 return kNoPacket;
193 } 214 }
194 215
195 for (size_t i = 0; i < frames.size(); ++i) { 216 for (size_t i = 0; i < frames.size(); ++i) {
196 const QuicFrame& frame = frames[i]; 217 const QuicFrame& frame = frames[i];
218
197 if (!writer.WriteUInt8(frame.type)) { 219 if (!writer.WriteUInt8(frame.type)) {
198 return kNoPacket; 220 return kNoPacket;
199 } 221 }
200 222
201 switch (frame.type) { 223 switch (frame.type) {
202 case PADDING_FRAME: 224 case PADDING_FRAME:
203 writer.WritePadding(); 225 writer.WritePadding();
204 break; 226 break;
205 case STREAM_FRAME: 227 case STREAM_FRAME:
206 if (!AppendStreamFramePayload(*frame.stream_frame, &writer)) { 228 if (!AppendStreamFramePayload(
229 *frame.stream_frame, &writer)) {
207 return kNoPacket; 230 return kNoPacket;
208 } 231 }
209 break; 232 break;
210 case ACK_FRAME: 233 case ACK_FRAME:
211 if (!AppendAckFramePayload(*frame.ack_frame, &writer)) { 234 if (!AppendAckFramePayload(*frame.ack_frame, &writer)) {
212 return kNoPacket; 235 return kNoPacket;
213 } 236 }
214 break; 237 break;
215 case CONGESTION_FEEDBACK_FRAME: 238 case CONGESTION_FEEDBACK_FRAME:
216 if (!AppendQuicCongestionFeedbackFramePayload( 239 if (!AppendQuicCongestionFeedbackFramePayload(
(...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 } 1344 }
1322 1345
1323 if (decrypted_.get() == NULL) { 1346 if (decrypted_.get() == NULL) {
1324 return false; 1347 return false;
1325 } 1348 }
1326 1349
1327 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); 1350 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length()));
1328 return true; 1351 return true;
1329 } 1352 }
1330 1353
1331 size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) { 1354 size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame, bool last_frame) {
1332 switch (frame.type) { 1355 switch (frame.type) {
1333 case STREAM_FRAME: 1356 case STREAM_FRAME:
1334 return GetMinStreamFrameSize() + frame.stream_frame->data.size(); 1357 return GetMinStreamFrameSize(frame.stream_frame->stream_id,
1358 frame.stream_frame->offset,
1359 last_frame) +
1360 frame.stream_frame->data.size();
1335 case ACK_FRAME: { 1361 case ACK_FRAME: {
1336 const QuicAckFrame& ack = *frame.ack_frame; 1362 const QuicAckFrame& ack = *frame.ack_frame;
1337 return GetMinAckFrameSize() + PACKET_6BYTE_SEQUENCE_NUMBER * 1363 return GetMinAckFrameSize() + PACKET_6BYTE_SEQUENCE_NUMBER *
1338 ack.received_info.missing_packets.size(); 1364 ack.received_info.missing_packets.size();
1339 } 1365 }
1340 case CONGESTION_FEEDBACK_FRAME: { 1366 case CONGESTION_FEEDBACK_FRAME: {
1341 size_t len = kQuicFrameTypeSize; 1367 size_t len = kQuicFrameTypeSize;
1342 const QuicCongestionFeedbackFrame& congestion_feedback = 1368 const QuicCongestionFeedbackFrame& congestion_feedback =
1343 *frame.congestion_feedback_frame; 1369 *frame.congestion_feedback_frame;
1344 len += 1; // Congestion feedback type. 1370 len += 1; // Congestion feedback type.
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
1681 1707
1682 bool QuicFramer::RaiseError(QuicErrorCode error) { 1708 bool QuicFramer::RaiseError(QuicErrorCode error) {
1683 DLOG(INFO) << detailed_error_; 1709 DLOG(INFO) << detailed_error_;
1684 set_error(error); 1710 set_error(error);
1685 visitor_->OnError(this); 1711 visitor_->OnError(this);
1686 reader_.reset(NULL); 1712 reader_.reset(NULL);
1687 return false; 1713 return false;
1688 } 1714 }
1689 1715
1690 } // namespace net 1716 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_packet_creator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698