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

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

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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
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 "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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 case PACKET_FLAGS_2BYTE_SEQUENCE: 125 case PACKET_FLAGS_2BYTE_SEQUENCE:
126 return PACKET_2BYTE_SEQUENCE_NUMBER; 126 return PACKET_2BYTE_SEQUENCE_NUMBER;
127 case PACKET_FLAGS_1BYTE_SEQUENCE: 127 case PACKET_FLAGS_1BYTE_SEQUENCE:
128 return PACKET_1BYTE_SEQUENCE_NUMBER; 128 return PACKET_1BYTE_SEQUENCE_NUMBER;
129 default: 129 default:
130 LOG(DFATAL) << "Unreachable case statement."; 130 LOG(DFATAL) << "Unreachable case statement.";
131 return PACKET_6BYTE_SEQUENCE_NUMBER; 131 return PACKET_6BYTE_SEQUENCE_NUMBER;
132 } 132 }
133 } 133 }
134 134
135 bool CanTruncate( 135 bool CanTruncate(QuicVersion version,
136 QuicVersion version, const QuicFrame& frame, size_t free_bytes) { 136 const QuicFrame& frame,
137 size_t free_bytes) {
137 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && 138 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) &&
138 free_bytes >= 139 free_bytes >=
139 QuicFramer::GetMinAckFrameSize(version, 140 QuicFramer::GetMinAckFrameSize(version,
140 PACKET_6BYTE_SEQUENCE_NUMBER, 141 PACKET_6BYTE_SEQUENCE_NUMBER,
141 PACKET_6BYTE_SEQUENCE_NUMBER)) { 142 PACKET_6BYTE_SEQUENCE_NUMBER)) {
142 return true; 143 return true;
143 } 144 }
144 return false; 145 return false;
145 } 146 }
146 147
(...skipping 20 matching lines...) Expand all
167 supported_versions_(supported_versions), 168 supported_versions_(supported_versions),
168 decrypter_level_(ENCRYPTION_NONE), 169 decrypter_level_(ENCRYPTION_NONE),
169 alternative_decrypter_level_(ENCRYPTION_NONE), 170 alternative_decrypter_level_(ENCRYPTION_NONE),
170 alternative_decrypter_latch_(false), 171 alternative_decrypter_latch_(false),
171 is_server_(is_server), 172 is_server_(is_server),
172 validate_flags_(true), 173 validate_flags_(true),
173 creation_time_(creation_time) { 174 creation_time_(creation_time) {
174 DCHECK(!supported_versions.empty()); 175 DCHECK(!supported_versions.empty());
175 quic_version_ = supported_versions_[0]; 176 quic_version_ = supported_versions_[0];
176 decrypter_.reset(QuicDecrypter::Create(kNULL)); 177 decrypter_.reset(QuicDecrypter::Create(kNULL));
177 encrypter_[ENCRYPTION_NONE].reset( 178 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL));
178 QuicEncrypter::Create(kNULL));
179 } 179 }
180 180
181 QuicFramer::~QuicFramer() {} 181 QuicFramer::~QuicFramer() {
182 }
182 183
183 // static 184 // static
184 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, 185 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version,
185 QuicStreamId stream_id, 186 QuicStreamId stream_id,
186 QuicStreamOffset offset, 187 QuicStreamOffset offset,
187 bool last_frame_in_packet, 188 bool last_frame_in_packet,
188 InFecGroup is_in_fec_group) { 189 InFecGroup is_in_fec_group) {
189 bool no_stream_frame_length = last_frame_in_packet && 190 bool no_stream_frame_length =
190 is_in_fec_group == NOT_IN_FEC_GROUP; 191 last_frame_in_packet && is_in_fec_group == NOT_IN_FEC_GROUP;
191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + 192 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
192 GetStreamOffsetSize(offset) + 193 GetStreamOffsetSize(offset) +
193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); 194 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize);
194 } 195 }
195 196
196 // static 197 // static
197 size_t QuicFramer::GetMinAckFrameSize( 198 size_t QuicFramer::GetMinAckFrameSize(
198 QuicVersion version, 199 QuicVersion version,
199 QuicSequenceNumberLength sequence_number_length, 200 QuicSequenceNumberLength sequence_number_length,
200 QuicSequenceNumberLength largest_observed_length) { 201 QuicSequenceNumberLength largest_observed_length) {
201 return kQuicFrameTypeSize + kQuicEntropyHashSize + 202 return kQuicFrameTypeSize + kQuicEntropyHashSize + sequence_number_length +
202 sequence_number_length + kQuicEntropyHashSize + 203 kQuicEntropyHashSize + largest_observed_length +
203 largest_observed_length + kQuicDeltaTimeLargestObservedSize; 204 kQuicDeltaTimeLargestObservedSize;
204 } 205 }
205 206
206 // static 207 // static
207 size_t QuicFramer::GetStopWaitingFrameSize( 208 size_t QuicFramer::GetStopWaitingFrameSize(
208 QuicSequenceNumberLength sequence_number_length) { 209 QuicSequenceNumberLength sequence_number_length) {
209 return kQuicFrameTypeSize + kQuicEntropyHashSize + 210 return kQuicFrameTypeSize + kQuicEntropyHashSize + sequence_number_length;
210 sequence_number_length;
211 } 211 }
212 212
213 // static 213 // static
214 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { 214 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) {
215 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + 215 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize +
216 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + 216 kQuicErrorCodeSize + kQuicErrorDetailsLengthSize;
217 kQuicErrorDetailsLengthSize;
218 } 217 }
219 218
220 // static 219 // static
221 size_t QuicFramer::GetMinConnectionCloseFrameSize() { 220 size_t QuicFramer::GetMinConnectionCloseFrameSize() {
222 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; 221 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize;
223 } 222 }
224 223
225 // static 224 // static
226 size_t QuicFramer::GetMinGoAwayFrameSize() { 225 size_t QuicFramer::GetMinGoAwayFrameSize() {
227 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 226 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
228 kQuicMaxStreamIdSize; 227 kQuicMaxStreamIdSize;
229 } 228 }
230 229
231 // static 230 // static
232 size_t QuicFramer::GetWindowUpdateFrameSize() { 231 size_t QuicFramer::GetWindowUpdateFrameSize() {
233 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; 232 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
234 } 233 }
235 234
236 // static 235 // static
237 size_t QuicFramer::GetBlockedFrameSize() { 236 size_t QuicFramer::GetBlockedFrameSize() {
238 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; 237 return kQuicFrameTypeSize + kQuicMaxStreamIdSize;
(...skipping 26 matching lines...) Expand all
265 return i; 264 return i;
266 } 265 }
267 } 266 }
268 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; 267 LOG(DFATAL) << "Failed to determine StreamOffsetSize.";
269 return 8; 268 return 8;
270 } 269 }
271 270
272 // static 271 // static
273 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { 272 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
274 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + 273 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID +
275 number_versions * kQuicVersionSize; 274 number_versions * kQuicVersionSize;
276 } 275 }
277 276
278 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { 277 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const {
279 for (size_t i = 0; i < supported_versions_.size(); ++i) { 278 for (size_t i = 0; i < supported_versions_.size(); ++i) {
280 if (version == supported_versions_[i]) { 279 if (version == supported_versions_[i]) {
281 return true; 280 return true;
282 } 281 }
283 } 282 }
284 return false; 283 return false;
285 } 284 }
286 285
287 size_t QuicFramer::GetSerializedFrameLength( 286 size_t QuicFramer::GetSerializedFrameLength(
288 const QuicFrame& frame, 287 const QuicFrame& frame,
289 size_t free_bytes, 288 size_t free_bytes,
290 bool first_frame, 289 bool first_frame,
291 bool last_frame, 290 bool last_frame,
292 InFecGroup is_in_fec_group, 291 InFecGroup is_in_fec_group,
293 QuicSequenceNumberLength sequence_number_length) { 292 QuicSequenceNumberLength sequence_number_length) {
294 if (frame.type == PADDING_FRAME) { 293 if (frame.type == PADDING_FRAME) {
295 // PADDING implies end of packet. 294 // PADDING implies end of packet.
296 return free_bytes; 295 return free_bytes;
297 } 296 }
298 size_t frame_len = 297 size_t frame_len = ComputeFrameLength(
299 ComputeFrameLength(frame, last_frame, is_in_fec_group, 298 frame, last_frame, is_in_fec_group, sequence_number_length);
300 sequence_number_length);
301 if (frame_len > free_bytes) { 299 if (frame_len > free_bytes) {
302 // Only truncate the first frame in a packet, so if subsequent ones go 300 // Only truncate the first frame in a packet, so if subsequent ones go
303 // over, stop including more frames. 301 // over, stop including more frames.
304 if (!first_frame) { 302 if (!first_frame) {
305 return 0; 303 return 0;
306 } 304 }
307 if (CanTruncate(quic_version_, frame, free_bytes)) { 305 if (CanTruncate(quic_version_, frame, free_bytes)) {
308 // Truncate the frame so the packet will not exceed kMaxPacketSize. 306 // Truncate the frame so the packet will not exceed kMaxPacketSize.
309 // Note that we may not use every byte of the writer in this case. 307 // Note that we may not use every byte of the writer in this case.
310 DVLOG(1) << "Truncating large frame"; 308 DVLOG(1) << "Truncating large frame";
311 return free_bytes; 309 return free_bytes;
312 } else if (!FLAGS_quic_allow_oversized_packets_for_test) { 310 } else if (!FLAGS_quic_allow_oversized_packets_for_test) {
313 return 0; 311 return 0;
314 } 312 }
315 } 313 }
316 return frame_len; 314 return frame_len;
317 } 315 }
318 316
319 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } 317 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {
318 }
320 319
321 QuicFramer::AckFrameInfo::~AckFrameInfo() { } 320 QuicFramer::AckFrameInfo::~AckFrameInfo() {
321 }
322 322
323 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 323 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
324 const QuicPacketHeader& header) const { 324 const QuicPacketHeader& header) const {
325 return header.entropy_flag << (header.packet_sequence_number % 8); 325 return header.entropy_flag << (header.packet_sequence_number % 8);
326 } 326 }
327 327
328 // Test only. 328 // Test only.
329 SerializedPacket QuicFramer::BuildUnsizedDataPacket( 329 SerializedPacket QuicFramer::BuildUnsizedDataPacket(
330 const QuicPacketHeader& header, 330 const QuicPacketHeader& header,
331 const QuicFrames& frames) { 331 const QuicFrames& frames) {
332 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); 332 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize);
333 size_t packet_size = GetPacketHeaderSize(header); 333 size_t packet_size = GetPacketHeaderSize(header);
334 for (size_t i = 0; i < frames.size(); ++i) { 334 for (size_t i = 0; i < frames.size(); ++i) {
335 DCHECK_LE(packet_size, max_plaintext_size); 335 DCHECK_LE(packet_size, max_plaintext_size);
336 bool first_frame = i == 0; 336 bool first_frame = i == 0;
337 bool last_frame = i == frames.size() - 1; 337 bool last_frame = i == frames.size() - 1;
338 const size_t frame_size = GetSerializedFrameLength( 338 const size_t frame_size =
339 frames[i], max_plaintext_size - packet_size, first_frame, last_frame, 339 GetSerializedFrameLength(frames[i],
340 header.is_in_fec_group, 340 max_plaintext_size - packet_size,
341 header.public_header.sequence_number_length); 341 first_frame,
342 last_frame,
343 header.is_in_fec_group,
344 header.public_header.sequence_number_length);
342 DCHECK(frame_size); 345 DCHECK(frame_size);
343 packet_size += frame_size; 346 packet_size += frame_size;
344 } 347 }
345 return BuildDataPacket(header, frames, packet_size); 348 return BuildDataPacket(header, frames, packet_size);
346 } 349 }
347 350
348 SerializedPacket QuicFramer::BuildDataPacket( 351 SerializedPacket QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
349 const QuicPacketHeader& header, 352 const QuicFrames& frames,
350 const QuicFrames& frames, 353 size_t packet_size) {
351 size_t packet_size) {
352 QuicDataWriter writer(packet_size); 354 QuicDataWriter writer(packet_size);
353 const SerializedPacket kNoPacket( 355 const SerializedPacket kNoPacket(
354 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); 356 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL);
355 if (!AppendPacketHeader(header, &writer)) { 357 if (!AppendPacketHeader(header, &writer)) {
356 LOG(DFATAL) << "AppendPacketHeader failed"; 358 LOG(DFATAL) << "AppendPacketHeader failed";
357 return kNoPacket; 359 return kNoPacket;
358 } 360 }
359 361
360 for (size_t i = 0; i < frames.size(); ++i) { 362 for (size_t i = 0; i < frames.size(); ++i) {
361 const QuicFrame& frame = frames[i]; 363 const QuicFrame& frame = frames[i];
362 364
363 // Determine if we should write stream frame length in header. 365 // Determine if we should write stream frame length in header.
364 const bool no_stream_frame_length = 366 const bool no_stream_frame_length =
365 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && 367 (header.is_in_fec_group == NOT_IN_FEC_GROUP) &&
366 (i == frames.size() - 1); 368 (i == frames.size() - 1);
367 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { 369 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) {
368 LOG(DFATAL) << "AppendTypeByte failed"; 370 LOG(DFATAL) << "AppendTypeByte failed";
369 return kNoPacket; 371 return kNoPacket;
370 } 372 }
371 373
372 switch (frame.type) { 374 switch (frame.type) {
373 case PADDING_FRAME: 375 case PADDING_FRAME:
374 writer.WritePadding(); 376 writer.WritePadding();
375 break; 377 break;
376 case STREAM_FRAME: 378 case STREAM_FRAME:
377 if (!AppendStreamFrame( 379 if (!AppendStreamFrame(
378 *frame.stream_frame, no_stream_frame_length, &writer)) { 380 *frame.stream_frame, no_stream_frame_length, &writer)) {
379 LOG(DFATAL) << "AppendStreamFrame failed"; 381 LOG(DFATAL) << "AppendStreamFrame failed";
380 return kNoPacket; 382 return kNoPacket;
381 } 383 }
382 break; 384 break;
383 case ACK_FRAME: 385 case ACK_FRAME:
384 if (!AppendAckFrameAndTypeByte( 386 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) {
385 header, *frame.ack_frame, &writer)) {
386 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; 387 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed";
387 return kNoPacket; 388 return kNoPacket;
388 } 389 }
389 break; 390 break;
390 case CONGESTION_FEEDBACK_FRAME: 391 case CONGESTION_FEEDBACK_FRAME:
391 if (!AppendCongestionFeedbackFrame( 392 if (!AppendCongestionFeedbackFrame(*frame.congestion_feedback_frame,
392 *frame.congestion_feedback_frame, &writer)) { 393 &writer)) {
393 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed"; 394 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed";
394 return kNoPacket; 395 return kNoPacket;
395 } 396 }
396 break; 397 break;
397 case STOP_WAITING_FRAME: 398 case STOP_WAITING_FRAME:
398 if (quic_version_ <= QUIC_VERSION_15) { 399 if (quic_version_ <= QUIC_VERSION_15) {
399 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in " 400 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in "
400 << QuicVersionToString(quic_version_); 401 << QuicVersionToString(quic_version_);
401 return kNoPacket; 402 return kNoPacket;
402 } 403 }
(...skipping 11 matching lines...) Expand all
414 } 415 }
415 // Ping has no payload. 416 // Ping has no payload.
416 break; 417 break;
417 case RST_STREAM_FRAME: 418 case RST_STREAM_FRAME:
418 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { 419 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
419 LOG(DFATAL) << "AppendRstStreamFrame failed"; 420 LOG(DFATAL) << "AppendRstStreamFrame failed";
420 return kNoPacket; 421 return kNoPacket;
421 } 422 }
422 break; 423 break;
423 case CONNECTION_CLOSE_FRAME: 424 case CONNECTION_CLOSE_FRAME:
424 if (!AppendConnectionCloseFrame( 425 if (!AppendConnectionCloseFrame(*frame.connection_close_frame,
425 *frame.connection_close_frame, &writer)) { 426 &writer)) {
426 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; 427 LOG(DFATAL) << "AppendConnectionCloseFrame failed";
427 return kNoPacket; 428 return kNoPacket;
428 } 429 }
429 break; 430 break;
430 case GOAWAY_FRAME: 431 case GOAWAY_FRAME:
431 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { 432 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
432 LOG(DFATAL) << "AppendGoAwayFrame failed"; 433 LOG(DFATAL) << "AppendGoAwayFrame failed";
433 return kNoPacket; 434 return kNoPacket;
434 } 435 }
435 break; 436 break;
(...skipping 14 matching lines...) Expand all
450 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; 451 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA";
451 return kNoPacket; 452 return kNoPacket;
452 } 453 }
453 } 454 }
454 455
455 // Save the length before writing, because take clears it. 456 // Save the length before writing, because take clears it.
456 const size_t len = writer.length(); 457 const size_t len = writer.length();
457 // Less than or equal because truncated acks end up with max_plaintex_size 458 // Less than or equal because truncated acks end up with max_plaintex_size
458 // length, even though they're typically slightly shorter. 459 // length, even though they're typically slightly shorter.
459 DCHECK_LE(len, packet_size); 460 DCHECK_LE(len, packet_size);
460 QuicPacket* packet = QuicPacket::NewDataPacket( 461 QuicPacket* packet =
461 writer.take(), len, true, header.public_header.connection_id_length, 462 QuicPacket::NewDataPacket(writer.take(),
462 header.public_header.version_flag, 463 len,
463 header.public_header.sequence_number_length); 464 true,
465 header.public_header.connection_id_length,
466 header.public_header.version_flag,
467 header.public_header.sequence_number_length);
464 468
465 if (fec_builder_) { 469 if (fec_builder_) {
466 fec_builder_->OnBuiltFecProtectedPayload(header, 470 fec_builder_->OnBuiltFecProtectedPayload(header,
467 packet->FecProtectedData()); 471 packet->FecProtectedData());
468 } 472 }
469 473
470 return SerializedPacket(header.packet_sequence_number, 474 return SerializedPacket(header.packet_sequence_number,
471 header.public_header.sequence_number_length, packet, 475 header.public_header.sequence_number_length,
472 GetPacketEntropyHash(header), NULL); 476 packet,
477 GetPacketEntropyHash(header),
478 NULL);
473 } 479 }
474 480
475 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, 481 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header,
476 const QuicFecData& fec) { 482 const QuicFecData& fec) {
477 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); 483 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
478 DCHECK_NE(0u, header.fec_group); 484 DCHECK_NE(0u, header.fec_group);
479 size_t len = GetPacketHeaderSize(header); 485 size_t len = GetPacketHeaderSize(header);
480 len += fec.redundancy.length(); 486 len += fec.redundancy.length();
481 487
482 QuicDataWriter writer(len); 488 QuicDataWriter writer(len);
483 const SerializedPacket kNoPacket( 489 const SerializedPacket kNoPacket(
484 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); 490 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL);
485 if (!AppendPacketHeader(header, &writer)) { 491 if (!AppendPacketHeader(header, &writer)) {
486 LOG(DFATAL) << "AppendPacketHeader failed"; 492 LOG(DFATAL) << "AppendPacketHeader failed";
487 return kNoPacket; 493 return kNoPacket;
488 } 494 }
489 495
490 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 496 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
491 LOG(DFATAL) << "Failed to add FEC"; 497 LOG(DFATAL) << "Failed to add FEC";
492 return kNoPacket; 498 return kNoPacket;
493 } 499 }
494 500
495 return SerializedPacket( 501 return SerializedPacket(
496 header.packet_sequence_number, 502 header.packet_sequence_number,
497 header.public_header.sequence_number_length, 503 header.public_header.sequence_number_length,
498 QuicPacket::NewFecPacket(writer.take(), len, true, 504 QuicPacket::NewFecPacket(writer.take(),
505 len,
506 true,
499 header.public_header.connection_id_length, 507 header.public_header.connection_id_length,
500 header.public_header.version_flag, 508 header.public_header.version_flag,
501 header.public_header.sequence_number_length), 509 header.public_header.sequence_number_length),
502 GetPacketEntropyHash(header), NULL); 510 GetPacketEntropyHash(header),
511 NULL);
503 } 512 }
504 513
505 // static 514 // static
506 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( 515 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket(
507 const QuicPublicResetPacket& packet) { 516 const QuicPublicResetPacket& packet) {
508 DCHECK(packet.public_header.reset_flag); 517 DCHECK(packet.public_header.reset_flag);
509 518
510 CryptoHandshakeMessage reset; 519 CryptoHandshakeMessage reset;
511 reset.set_tag(kPRST); 520 reset.set_tag(kPRST);
512 reset.SetValue(kRNON, packet.nonce_proof); 521 reset.SetValue(kRNON, packet.nonce_proof);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 set_detailed_error("Unable to read supported version in negotiation."); 629 set_detailed_error("Unable to read supported version in negotiation.");
621 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); 630 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
622 } 631 }
623 public_header->versions.push_back(QuicTagToQuicVersion(version)); 632 public_header->versions.push_back(QuicTagToQuicVersion(version));
624 } while (!reader_->IsDoneReading()); 633 } while (!reader_->IsDoneReading());
625 634
626 visitor_->OnVersionNegotiationPacket(*public_header); 635 visitor_->OnVersionNegotiationPacket(*public_header);
627 return true; 636 return true;
628 } 637 }
629 638
630 bool QuicFramer::ProcessDataPacket( 639 bool QuicFramer::ProcessDataPacket(const QuicPacketPublicHeader& public_header,
631 const QuicPacketPublicHeader& public_header, 640 const QuicEncryptedPacket& packet) {
632 const QuicEncryptedPacket& packet) {
633 QuicPacketHeader header(public_header); 641 QuicPacketHeader header(public_header);
634 if (!ProcessPacketHeader(&header, packet)) { 642 if (!ProcessPacketHeader(&header, packet)) {
635 DLOG(WARNING) << "Unable to process data packet header."; 643 DLOG(WARNING) << "Unable to process data packet header.";
636 return false; 644 return false;
637 } 645 }
638 646
639 if (!visitor_->OnPacketHeader(header)) { 647 if (!visitor_->OnPacketHeader(header)) {
640 // The visitor suppresses further processing of the packet. 648 // The visitor suppresses further processing of the packet.
641 return true; 649 return true;
642 } 650 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) != 700 if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) !=
693 QUIC_NO_ERROR) { 701 QUIC_NO_ERROR) {
694 set_detailed_error("Unable to read rejected sequence number."); 702 set_detailed_error("Unable to read rejected sequence number.");
695 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 703 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
696 } 704 }
697 705
698 StringPiece address; 706 StringPiece address;
699 if (reset->GetStringPiece(kCADR, &address)) { 707 if (reset->GetStringPiece(kCADR, &address)) {
700 QuicSocketAddressCoder address_coder; 708 QuicSocketAddressCoder address_coder;
701 if (address_coder.Decode(address.data(), address.length())) { 709 if (address_coder.Decode(address.data(), address.length())) {
702 packet.client_address = IPEndPoint(address_coder.ip(), 710 packet.client_address =
703 address_coder.port()); 711 IPEndPoint(address_coder.ip(), address_coder.port());
704 } 712 }
705 } 713 }
706 714
707 visitor_->OnPublicResetPacket(packet); 715 visitor_->OnPublicResetPacket(packet);
708 return true; 716 return true;
709 } 717 }
710 718
711 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, 719 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header,
712 StringPiece payload) { 720 StringPiece payload) {
713 DCHECK(!reader_.get()); 721 DCHECK(!reader_.get());
(...skipping 30 matching lines...) Expand all
744 uint8 public_flags = 0; 752 uint8 public_flags = 0;
745 if (header.public_header.reset_flag) { 753 if (header.public_header.reset_flag) {
746 public_flags |= PACKET_PUBLIC_FLAGS_RST; 754 public_flags |= PACKET_PUBLIC_FLAGS_RST;
747 } 755 }
748 if (header.public_header.version_flag) { 756 if (header.public_header.version_flag) {
749 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; 757 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
750 } 758 }
751 759
752 public_flags |= 760 public_flags |=
753 GetSequenceNumberFlags(header.public_header.sequence_number_length) 761 GetSequenceNumberFlags(header.public_header.sequence_number_length)
754 << kPublicHeaderSequenceNumberShift; 762 << kPublicHeaderSequenceNumberShift;
755 763
756 switch (header.public_header.connection_id_length) { 764 switch (header.public_header.connection_id_length) {
757 case PACKET_0BYTE_CONNECTION_ID: 765 case PACKET_0BYTE_CONNECTION_ID:
758 if (!writer->WriteUInt8( 766 if (!writer->WriteUInt8(public_flags |
759 public_flags | PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { 767 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) {
760 return false; 768 return false;
761 } 769 }
762 break; 770 break;
763 case PACKET_1BYTE_CONNECTION_ID: 771 case PACKET_1BYTE_CONNECTION_ID:
764 if (!writer->WriteUInt8( 772 if (!writer->WriteUInt8(public_flags |
765 public_flags | PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) { 773 PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) {
766 return false; 774 return false;
767 } 775 }
768 if (!writer->WriteUInt8( 776 if (!writer->WriteUInt8(header.public_header.connection_id &
769 header.public_header.connection_id & k1ByteConnectionIdMask)) { 777 k1ByteConnectionIdMask)) {
770 return false; 778 return false;
771 } 779 }
772 break; 780 break;
773 case PACKET_4BYTE_CONNECTION_ID: 781 case PACKET_4BYTE_CONNECTION_ID:
774 if (!writer->WriteUInt8( 782 if (!writer->WriteUInt8(public_flags |
775 public_flags | PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) { 783 PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) {
776 return false; 784 return false;
777 } 785 }
778 if (!writer->WriteUInt32( 786 if (!writer->WriteUInt32(header.public_header.connection_id &
779 header.public_header.connection_id & k4ByteConnectionIdMask)) { 787 k4ByteConnectionIdMask)) {
780 return false; 788 return false;
781 } 789 }
782 break; 790 break;
783 case PACKET_8BYTE_CONNECTION_ID: 791 case PACKET_8BYTE_CONNECTION_ID:
784 if (!writer->WriteUInt8( 792 if (!writer->WriteUInt8(public_flags |
785 public_flags | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) { 793 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) {
786 return false; 794 return false;
787 } 795 }
788 if (!writer->WriteUInt64(header.public_header.connection_id)) { 796 if (!writer->WriteUInt64(header.public_header.connection_id)) {
789 return false; 797 return false;
790 } 798 }
791 break; 799 break;
792 } 800 }
793 last_serialized_connection_id_ = header.public_header.connection_id; 801 last_serialized_connection_id_ = header.public_header.connection_id;
794 802
795 if (header.public_header.version_flag) { 803 if (header.public_header.version_flag) {
796 DCHECK(!is_server_); 804 DCHECK(!is_server_);
797 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); 805 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_));
798 } 806 }
799 807
800 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, 808 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
801 header.packet_sequence_number, writer)) { 809 header.packet_sequence_number,
810 writer)) {
802 return false; 811 return false;
803 } 812 }
804 813
805 uint8 private_flags = 0; 814 uint8 private_flags = 0;
806 if (header.entropy_flag) { 815 if (header.entropy_flag) {
807 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; 816 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
808 } 817 }
809 if (header.is_in_fec_group == IN_FEC_GROUP) { 818 if (header.is_in_fec_group == IN_FEC_GROUP) {
810 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP; 819 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP;
811 } 820 }
(...skipping 25 matching lines...) Expand all
837 QuicSequenceNumberLength sequence_number_length, 846 QuicSequenceNumberLength sequence_number_length,
838 QuicPacketSequenceNumber packet_sequence_number) const { 847 QuicPacketSequenceNumber packet_sequence_number) const {
839 // The new sequence number might have wrapped to the next epoch, or 848 // The new sequence number might have wrapped to the next epoch, or
840 // it might have reverse wrapped to the previous epoch, or it might 849 // it might have reverse wrapped to the previous epoch, or it might
841 // remain in the same epoch. Select the sequence number closest to the 850 // remain in the same epoch. Select the sequence number closest to the
842 // next expected sequence number, the previous sequence number plus 1. 851 // next expected sequence number, the previous sequence number plus 1.
843 852
844 // epoch_delta is the delta between epochs the sequence number was serialized 853 // epoch_delta is the delta between epochs the sequence number was serialized
845 // with, so the correct value is likely the same epoch as the last sequence 854 // with, so the correct value is likely the same epoch as the last sequence
846 // number or an adjacent epoch. 855 // number or an adjacent epoch.
847 const QuicPacketSequenceNumber epoch_delta = 856 const QuicPacketSequenceNumber epoch_delta = GG_UINT64_C(1)
848 GG_UINT64_C(1) << (8 * sequence_number_length); 857 << (8 * sequence_number_length);
849 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; 858 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1;
850 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); 859 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1);
851 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; 860 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta;
852 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; 861 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta;
853 862
854 return ClosestTo(next_sequence_number, 863 return ClosestTo(next_sequence_number,
855 epoch + packet_sequence_number, 864 epoch + packet_sequence_number,
856 ClosestTo(next_sequence_number, 865 ClosestTo(next_sequence_number,
857 prev_epoch + packet_sequence_number, 866 prev_epoch + packet_sequence_number,
858 next_epoch + packet_sequence_number)); 867 next_epoch + packet_sequence_number));
859 } 868 }
860 869
861 bool QuicFramer::ProcessPublicHeader( 870 bool QuicFramer::ProcessPublicHeader(QuicPacketPublicHeader* public_header) {
862 QuicPacketPublicHeader* public_header) {
863 uint8 public_flags; 871 uint8 public_flags;
864 if (!reader_->ReadBytes(&public_flags, 1)) { 872 if (!reader_->ReadBytes(&public_flags, 1)) {
865 set_detailed_error("Unable to read public flags."); 873 set_detailed_error("Unable to read public flags.");
866 return false; 874 return false;
867 } 875 }
868 876
869 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; 877 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
870 public_header->version_flag = 878 public_header->version_flag =
871 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; 879 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
872 880
873 if (validate_flags_ && 881 if (validate_flags_ && !public_header->version_flag &&
874 !public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { 882 public_flags > PACKET_PUBLIC_FLAGS_MAX) {
875 set_detailed_error("Illegal public flags value."); 883 set_detailed_error("Illegal public flags value.");
876 return false; 884 return false;
877 } 885 }
878 886
879 if (public_header->reset_flag && public_header->version_flag) { 887 if (public_header->reset_flag && public_header->version_flag) {
880 set_detailed_error("Got version flag in reset packet"); 888 set_detailed_error("Got version flag in reset packet");
881 return false; 889 return false;
882 } 890 }
883 891
884 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { 892 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) {
885 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID: 893 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID:
886 if (!reader_->ReadUInt64(&public_header->connection_id)) { 894 if (!reader_->ReadUInt64(&public_header->connection_id)) {
887 set_detailed_error("Unable to read ConnectionId."); 895 set_detailed_error("Unable to read ConnectionId.");
888 return false; 896 return false;
889 } 897 }
890 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID; 898 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID;
891 break; 899 break;
892 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID: 900 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID:
893 // If the connection_id is truncated, expect to read the last serialized 901 // If the connection_id is truncated, expect to read the last serialized
894 // connection_id. 902 // connection_id.
895 if (!reader_->ReadBytes(&public_header->connection_id, 903 if (!reader_->ReadBytes(&public_header->connection_id,
896 PACKET_4BYTE_CONNECTION_ID)) { 904 PACKET_4BYTE_CONNECTION_ID)) {
897 set_detailed_error("Unable to read ConnectionId."); 905 set_detailed_error("Unable to read ConnectionId.");
898 return false; 906 return false;
899 } 907 }
900 if ((public_header->connection_id & k4ByteConnectionIdMask) != 908 if ((public_header->connection_id & k4ByteConnectionIdMask) !=
901 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) { 909 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) {
902 set_detailed_error("Truncated 4 byte ConnectionId does not match " 910 set_detailed_error(
903 "previous connection_id."); 911 "Truncated 4 byte ConnectionId does not match "
912 "previous connection_id.");
904 return false; 913 return false;
905 } 914 }
906 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID; 915 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID;
907 public_header->connection_id = last_serialized_connection_id_; 916 public_header->connection_id = last_serialized_connection_id_;
908 break; 917 break;
909 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID: 918 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID:
910 if (!reader_->ReadBytes(&public_header->connection_id, 919 if (!reader_->ReadBytes(&public_header->connection_id,
911 PACKET_1BYTE_CONNECTION_ID)) { 920 PACKET_1BYTE_CONNECTION_ID)) {
912 set_detailed_error("Unable to read ConnectionId."); 921 set_detailed_error("Unable to read ConnectionId.");
913 return false; 922 return false;
914 } 923 }
915 if ((public_header->connection_id & k1ByteConnectionIdMask) != 924 if ((public_header->connection_id & k1ByteConnectionIdMask) !=
916 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) { 925 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) {
917 set_detailed_error("Truncated 1 byte ConnectionId does not match " 926 set_detailed_error(
918 "previous connection_id."); 927 "Truncated 1 byte ConnectionId does not match "
928 "previous connection_id.");
919 return false; 929 return false;
920 } 930 }
921 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID; 931 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID;
922 public_header->connection_id = last_serialized_connection_id_; 932 public_header->connection_id = last_serialized_connection_id_;
923 break; 933 break;
924 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID: 934 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID:
925 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID; 935 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID;
926 public_header->connection_id = last_serialized_connection_id_; 936 public_header->connection_id = last_serialized_connection_id_;
927 break; 937 break;
928 } 938 }
929 939
930 public_header->sequence_number_length = 940 public_header->sequence_number_length = ReadSequenceNumberLength(
931 ReadSequenceNumberLength( 941 public_flags >> kPublicHeaderSequenceNumberShift);
932 public_flags >> kPublicHeaderSequenceNumberShift);
933 942
934 // Read the version only if the packet is from the client. 943 // Read the version only if the packet is from the client.
935 // version flag from the server means version negotiation packet. 944 // version flag from the server means version negotiation packet.
936 if (public_header->version_flag && is_server_) { 945 if (public_header->version_flag && is_server_) {
937 QuicTag version_tag; 946 QuicTag version_tag;
938 if (!reader_->ReadUInt32(&version_tag)) { 947 if (!reader_->ReadUInt32(&version_tag)) {
939 set_detailed_error("Unable to read protocol version."); 948 set_detailed_error("Unable to read protocol version.");
940 return false; 949 return false;
941 } 950 }
942 951
(...skipping 10 matching lines...) Expand all
953 return true; 962 return true;
954 } 963 }
955 964
956 // static 965 // static
957 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( 966 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength(
958 QuicPacketSequenceNumber sequence_number) { 967 QuicPacketSequenceNumber sequence_number) {
959 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { 968 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) {
960 return PACKET_1BYTE_SEQUENCE_NUMBER; 969 return PACKET_1BYTE_SEQUENCE_NUMBER;
961 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { 970 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) {
962 return PACKET_2BYTE_SEQUENCE_NUMBER; 971 return PACKET_2BYTE_SEQUENCE_NUMBER;
963 } else if (sequence_number < 972 } else if (sequence_number < GG_UINT64_C(1)
964 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { 973 << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) {
965 return PACKET_4BYTE_SEQUENCE_NUMBER; 974 return PACKET_4BYTE_SEQUENCE_NUMBER;
966 } else { 975 } else {
967 return PACKET_6BYTE_SEQUENCE_NUMBER; 976 return PACKET_6BYTE_SEQUENCE_NUMBER;
968 } 977 }
969 } 978 }
970 979
971 // static 980 // static
972 uint8 QuicFramer::GetSequenceNumberFlags( 981 uint8 QuicFramer::GetSequenceNumberFlags(
973 QuicSequenceNumberLength sequence_number_length) { 982 QuicSequenceNumberLength sequence_number_length) {
974 switch (sequence_number_length) { 983 switch (sequence_number_length) {
(...skipping 23 matching lines...) Expand all
998 size_t cur_range_length = 0; 1007 size_t cur_range_length = 0;
999 SequenceNumberSet::const_iterator iter = 1008 SequenceNumberSet::const_iterator iter =
1000 received_info.missing_packets.begin(); 1009 received_info.missing_packets.begin();
1001 QuicPacketSequenceNumber last_missing = *iter; 1010 QuicPacketSequenceNumber last_missing = *iter;
1002 ++iter; 1011 ++iter;
1003 for (; iter != received_info.missing_packets.end(); ++iter) { 1012 for (; iter != received_info.missing_packets.end(); ++iter) {
1004 if (cur_range_length != numeric_limits<uint8>::max() && 1013 if (cur_range_length != numeric_limits<uint8>::max() &&
1005 *iter == (last_missing + 1)) { 1014 *iter == (last_missing + 1)) {
1006 ++cur_range_length; 1015 ++cur_range_length;
1007 } else { 1016 } else {
1008 ack_info.nack_ranges[last_missing - cur_range_length] 1017 ack_info.nack_ranges[last_missing - cur_range_length] =
1009 = cur_range_length; 1018 cur_range_length;
1010 cur_range_length = 0; 1019 cur_range_length = 0;
1011 } 1020 }
1012 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); 1021 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing);
1013 last_missing = *iter; 1022 last_missing = *iter;
1014 } 1023 }
1015 // Include the last nack range. 1024 // Include the last nack range.
1016 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; 1025 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length;
1017 // Include the range to the largest observed. 1026 // Include the range to the largest observed.
1018 ack_info.max_delta = max(ack_info.max_delta, 1027 ack_info.max_delta =
1019 received_info.largest_observed - last_missing); 1028 max(ack_info.max_delta, received_info.largest_observed - last_missing);
1020 } 1029 }
1021 return ack_info; 1030 return ack_info;
1022 } 1031 }
1023 1032
1024 bool QuicFramer::ProcessPacketHeader( 1033 bool QuicFramer::ProcessPacketHeader(QuicPacketHeader* header,
1025 QuicPacketHeader* header, 1034 const QuicEncryptedPacket& packet) {
1026 const QuicEncryptedPacket& packet) {
1027 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, 1035 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length,
1028 &header->packet_sequence_number)) { 1036 &header->packet_sequence_number)) {
1029 set_detailed_error("Unable to read sequence number."); 1037 set_detailed_error("Unable to read sequence number.");
1030 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1038 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1031 } 1039 }
1032 1040
1033 if (header->packet_sequence_number == 0u) { 1041 if (header->packet_sequence_number == 0u) {
1034 set_detailed_error("Packet sequence numbers cannot be 0."); 1042 set_detailed_error("Packet sequence numbers cannot be 0.");
1035 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1043 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1036 } 1044 }
(...skipping 22 matching lines...) Expand all
1059 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; 1067 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0;
1060 1068
1061 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { 1069 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) {
1062 header->is_in_fec_group = IN_FEC_GROUP; 1070 header->is_in_fec_group = IN_FEC_GROUP;
1063 uint8 first_fec_protected_packet_offset; 1071 uint8 first_fec_protected_packet_offset;
1064 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { 1072 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) {
1065 set_detailed_error("Unable to read first fec protected packet offset."); 1073 set_detailed_error("Unable to read first fec protected packet offset.");
1066 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1074 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1067 } 1075 }
1068 if (first_fec_protected_packet_offset >= header->packet_sequence_number) { 1076 if (first_fec_protected_packet_offset >= header->packet_sequence_number) {
1069 set_detailed_error("First fec protected packet offset must be less " 1077 set_detailed_error(
1070 "than the sequence number."); 1078 "First fec protected packet offset must be less "
1079 "than the sequence number.");
1071 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1080 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1072 } 1081 }
1073 header->fec_group = 1082 header->fec_group =
1074 header->packet_sequence_number - first_fec_protected_packet_offset; 1083 header->packet_sequence_number - first_fec_protected_packet_offset;
1075 } 1084 }
1076 1085
1077 header->entropy_hash = GetPacketEntropyHash(*header); 1086 header->entropy_hash = GetPacketEntropyHash(*header);
1078 // Set the last sequence number after we have decrypted the packet 1087 // Set the last sequence number after we have decrypted the packet
1079 // so we are confident is not attacker controlled. 1088 // so we are confident is not attacker controlled.
1080 last_sequence_number_ = header->packet_sequence_number; 1089 last_sequence_number_ = header->packet_sequence_number;
1081 return true; 1090 return true;
1082 } 1091 }
1083 1092
1084 bool QuicFramer::ProcessPacketSequenceNumber( 1093 bool QuicFramer::ProcessPacketSequenceNumber(
1085 QuicSequenceNumberLength sequence_number_length, 1094 QuicSequenceNumberLength sequence_number_length,
1086 QuicPacketSequenceNumber* sequence_number) { 1095 QuicPacketSequenceNumber* sequence_number) {
1087 QuicPacketSequenceNumber wire_sequence_number = 0u; 1096 QuicPacketSequenceNumber wire_sequence_number = 0u;
1088 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) { 1097 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) {
1089 return false; 1098 return false;
1090 } 1099 }
1091 1100
1092 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers 1101 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers
1093 // in case the first guess is incorrect. 1102 // in case the first guess is incorrect.
1094 *sequence_number = 1103 *sequence_number = CalculatePacketSequenceNumberFromWire(
1095 CalculatePacketSequenceNumberFromWire(sequence_number_length, 1104 sequence_number_length, wire_sequence_number);
1096 wire_sequence_number);
1097 return true; 1105 return true;
1098 } 1106 }
1099 1107
1100 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) { 1108 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) {
1101 if (reader_->IsDoneReading()) { 1109 if (reader_->IsDoneReading()) {
1102 set_detailed_error("Packet has no frames."); 1110 set_detailed_error("Packet has no frames.");
1103 return RaiseError(QUIC_MISSING_PAYLOAD); 1111 return RaiseError(QUIC_MISSING_PAYLOAD);
1104 } 1112 }
1105 while (!reader_->IsDoneReading()) { 1113 while (!reader_->IsDoneReading()) {
1106 uint8 frame_type; 1114 uint8 frame_type;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 DVLOG(1) << "Visitor asked to stop further processing."; 1156 DVLOG(1) << "Visitor asked to stop further processing.";
1149 // Returning true since there was no parsing error. 1157 // Returning true since there was no parsing error.
1150 return true; 1158 return true;
1151 } 1159 }
1152 continue; 1160 continue;
1153 } 1161 }
1154 1162
1155 // This was a special frame type that did not match any 1163 // This was a special frame type that did not match any
1156 // of the known ones. Error. 1164 // of the known ones. Error.
1157 set_detailed_error("Illegal frame type."); 1165 set_detailed_error("Illegal frame type.");
1158 DLOG(WARNING) << "Illegal frame type: " 1166 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type);
1159 << static_cast<int>(frame_type);
1160 return RaiseError(QUIC_INVALID_FRAME_DATA); 1167 return RaiseError(QUIC_INVALID_FRAME_DATA);
1161 } 1168 }
1162 1169
1163 switch (frame_type) { 1170 switch (frame_type) {
1164 case PADDING_FRAME: 1171 case PADDING_FRAME:
1165 // We're done with the packet. 1172 // We're done with the packet.
1166 return true; 1173 return true;
1167 1174
1168 case RST_STREAM_FRAME: { 1175 case RST_STREAM_FRAME: {
1169 QuicRstStreamFrame frame; 1176 QuicRstStreamFrame frame;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 if (!visitor_->OnPingFrame(ping_frame)) { 1266 if (!visitor_->OnPingFrame(ping_frame)) {
1260 DVLOG(1) << "Visitor asked to stop further processing."; 1267 DVLOG(1) << "Visitor asked to stop further processing.";
1261 // Returning true since there was no parsing error. 1268 // Returning true since there was no parsing error.
1262 return true; 1269 return true;
1263 } 1270 }
1264 continue; 1271 continue;
1265 } 1272 }
1266 1273
1267 default: 1274 default:
1268 set_detailed_error("Illegal frame type."); 1275 set_detailed_error("Illegal frame type.");
1269 DLOG(WARNING) << "Illegal frame type: " 1276 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type);
1270 << static_cast<int>(frame_type);
1271 return RaiseError(QUIC_INVALID_FRAME_DATA); 1277 return RaiseError(QUIC_INVALID_FRAME_DATA);
1272 } 1278 }
1273 } 1279 }
1274 1280
1275 return true; 1281 return true;
1276 } 1282 }
1277 1283
1278 bool QuicFramer::ProcessStreamFrame(uint8 frame_type, 1284 bool QuicFramer::ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame) {
1279 QuicStreamFrame* frame) {
1280 uint8 stream_flags = frame_type; 1285 uint8 stream_flags = frame_type;
1281 1286
1282 stream_flags &= ~kQuicFrameTypeStreamMask; 1287 stream_flags &= ~kQuicFrameTypeStreamMask;
1283 1288
1284 // Read from right to left: StreamID, Offset, Data Length, Fin. 1289 // Read from right to left: StreamID, Offset, Data Length, Fin.
1285 const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1; 1290 const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1;
1286 stream_flags >>= kQuicStreamIdShift; 1291 stream_flags >>= kQuicStreamIdShift;
1287 1292
1288 uint8 offset_length = (stream_flags & kQuicStreamOffsetMask); 1293 uint8 offset_length = (stream_flags & kQuicStreamOffsetMask);
1289 // There is no encoding for 1 byte, only 0 and 2 through 8. 1294 // There is no encoding for 1 byte, only 0 and 2 through 8.
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 return true; 1462 return true;
1458 } 1463 }
1459 1464
1460 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( 1465 bool QuicFramer::ProcessQuicCongestionFeedbackFrame(
1461 QuicCongestionFeedbackFrame* frame) { 1466 QuicCongestionFeedbackFrame* frame) {
1462 uint8 feedback_type; 1467 uint8 feedback_type;
1463 if (!reader_->ReadBytes(&feedback_type, 1)) { 1468 if (!reader_->ReadBytes(&feedback_type, 1)) {
1464 set_detailed_error("Unable to read congestion feedback type."); 1469 set_detailed_error("Unable to read congestion feedback type.");
1465 return false; 1470 return false;
1466 } 1471 }
1467 frame->type = 1472 frame->type = static_cast<CongestionFeedbackType>(feedback_type);
1468 static_cast<CongestionFeedbackType>(feedback_type);
1469 1473
1470 switch (frame->type) { 1474 switch (frame->type) {
1471 case kInterArrival: { 1475 case kInterArrival: {
1472 CongestionFeedbackMessageInterArrival* inter_arrival = 1476 CongestionFeedbackMessageInterArrival* inter_arrival =
1473 &frame->inter_arrival; 1477 &frame->inter_arrival;
1474 uint8 num_received_packets; 1478 uint8 num_received_packets;
1475 if (!reader_->ReadBytes(&num_received_packets, 1)) { 1479 if (!reader_->ReadBytes(&num_received_packets, 1)) {
1476 set_detailed_error("Unable to read num received packets."); 1480 set_detailed_error("Unable to read num received packets.");
1477 return false; 1481 return false;
1478 } 1482 }
(...skipping 26 matching lines...) Expand all
1505 } 1509 }
1506 1510
1507 int32 time_delta_us; 1511 int32 time_delta_us;
1508 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1512 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1509 set_detailed_error( 1513 set_detailed_error(
1510 "Unable to read time delta in received packets."); 1514 "Unable to read time delta in received packets.");
1511 return false; 1515 return false;
1512 } 1516 }
1513 QuicPacketSequenceNumber packet = smallest_received + sequence_delta; 1517 QuicPacketSequenceNumber packet = smallest_received + sequence_delta;
1514 inter_arrival->received_packet_times.insert( 1518 inter_arrival->received_packet_times.insert(
1515 make_pair(packet, time_received.Add( 1519 make_pair(packet,
1516 QuicTime::Delta::FromMicroseconds(time_delta_us)))); 1520 time_received.Add(
1521 QuicTime::Delta::FromMicroseconds(time_delta_us))));
1517 } 1522 }
1518 } 1523 }
1519 break; 1524 break;
1520 } 1525 }
1521 case kFixRate: { 1526 case kFixRate: {
1522 uint32 bitrate = 0; 1527 uint32 bitrate = 0;
1523 if (!reader_->ReadUInt32(&bitrate)) { 1528 if (!reader_->ReadUInt32(&bitrate)) {
1524 set_detailed_error("Unable to read bitrate."); 1529 set_detailed_error("Unable to read bitrate.");
1525 return false; 1530 return false;
1526 } 1531 }
1527 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); 1532 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate);
1528 break; 1533 break;
1529 } 1534 }
1530 case kTCP: { 1535 case kTCP: {
1531 CongestionFeedbackMessageTCP* tcp = &frame->tcp; 1536 CongestionFeedbackMessageTCP* tcp = &frame->tcp;
1532 // TODO(ianswett): Remove receive window, since it's constant. 1537 // TODO(ianswett): Remove receive window, since it's constant.
1533 uint16 receive_window = 0; 1538 uint16 receive_window = 0;
1534 if (!reader_->ReadUInt16(&receive_window)) { 1539 if (!reader_->ReadUInt16(&receive_window)) {
1535 set_detailed_error("Unable to read receive window."); 1540 set_detailed_error("Unable to read receive window.");
1536 return false; 1541 return false;
1537 } 1542 }
1538 // Simple bit packing, don't send the 4 least significant bits. 1543 // Simple bit packing, don't send the 4 least significant bits.
1539 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 1544 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
1540 break; 1545 break;
1541 } 1546 }
1542 default: 1547 default:
1543 set_detailed_error("Illegal congestion feedback type."); 1548 set_detailed_error("Illegal congestion feedback type.");
1544 DLOG(WARNING) << "Illegal congestion feedback type: " 1549 DLOG(WARNING) << "Illegal congestion feedback type: " << frame->type;
1545 << frame->type;
1546 return RaiseError(QUIC_INVALID_FRAME_DATA); 1550 return RaiseError(QUIC_INVALID_FRAME_DATA);
1547 } 1551 }
1548 1552
1549 return true; 1553 return true;
1550 } 1554 }
1551 1555
1552 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) { 1556 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) {
1553 if (!reader_->ReadUInt32(&frame->stream_id)) { 1557 if (!reader_->ReadUInt32(&frame->stream_id)) {
1554 set_detailed_error("Unable to read stream_id."); 1558 set_detailed_error("Unable to read stream_id.");
1555 return false; 1559 return false;
(...skipping 28 matching lines...) Expand all
1584 return true; 1588 return true;
1585 } 1589 }
1586 1590
1587 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) { 1591 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) {
1588 uint32 error_code; 1592 uint32 error_code;
1589 if (!reader_->ReadUInt32(&error_code)) { 1593 if (!reader_->ReadUInt32(&error_code)) {
1590 set_detailed_error("Unable to read connection close error code."); 1594 set_detailed_error("Unable to read connection close error code.");
1591 return false; 1595 return false;
1592 } 1596 }
1593 1597
1594 if (error_code >= QUIC_LAST_ERROR || 1598 if (error_code >= QUIC_LAST_ERROR || error_code < QUIC_NO_ERROR) {
1595 error_code < QUIC_NO_ERROR) {
1596 set_detailed_error("Invalid error code."); 1599 set_detailed_error("Invalid error code.");
1597 return false; 1600 return false;
1598 } 1601 }
1599 1602
1600 frame->error_code = static_cast<QuicErrorCode>(error_code); 1603 frame->error_code = static_cast<QuicErrorCode>(error_code);
1601 1604
1602 StringPiece error_details; 1605 StringPiece error_details;
1603 if (!reader_->ReadStringPiece16(&error_details)) { 1606 if (!reader_->ReadStringPiece16(&error_details)) {
1604 set_detailed_error("Unable to read connection close error details."); 1607 set_detailed_error("Unable to read connection close error details.");
1605 return false; 1608 return false;
1606 } 1609 }
1607 frame->error_details = error_details.as_string(); 1610 frame->error_details = error_details.as_string();
1608 1611
1609 return true; 1612 return true;
1610 } 1613 }
1611 1614
1612 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { 1615 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) {
1613 uint32 error_code; 1616 uint32 error_code;
1614 if (!reader_->ReadUInt32(&error_code)) { 1617 if (!reader_->ReadUInt32(&error_code)) {
1615 set_detailed_error("Unable to read go away error code."); 1618 set_detailed_error("Unable to read go away error code.");
1616 return false; 1619 return false;
1617 } 1620 }
1618 frame->error_code = static_cast<QuicErrorCode>(error_code); 1621 frame->error_code = static_cast<QuicErrorCode>(error_code);
1619 1622
1620 if (error_code >= QUIC_LAST_ERROR || 1623 if (error_code >= QUIC_LAST_ERROR || error_code < QUIC_NO_ERROR) {
1621 error_code < QUIC_NO_ERROR) {
1622 set_detailed_error("Invalid error code."); 1624 set_detailed_error("Invalid error code.");
1623 return false; 1625 return false;
1624 } 1626 }
1625 1627
1626 uint32 stream_id; 1628 uint32 stream_id;
1627 if (!reader_->ReadUInt32(&stream_id)) { 1629 if (!reader_->ReadUInt32(&stream_id)) {
1628 set_detailed_error("Unable to read last good stream id."); 1630 set_detailed_error("Unable to read last good stream id.");
1629 return false; 1631 return false;
1630 } 1632 }
1631 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id); 1633 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 return true; 1665 return true;
1664 } 1666 }
1665 1667
1666 // static 1668 // static
1667 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( 1669 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
1668 const QuicEncryptedPacket& encrypted, 1670 const QuicEncryptedPacket& encrypted,
1669 QuicConnectionIdLength connection_id_length, 1671 QuicConnectionIdLength connection_id_length,
1670 bool includes_version, 1672 bool includes_version,
1671 QuicSequenceNumberLength sequence_number_length) { 1673 QuicSequenceNumberLength sequence_number_length) {
1672 return StringPiece( 1674 return StringPiece(
1673 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( 1675 encrypted.data() + kStartOfHashData,
1674 connection_id_length, includes_version, sequence_number_length) 1676 GetStartOfEncryptedData(
1675 - kStartOfHashData); 1677 connection_id_length, includes_version, sequence_number_length) -
1678 kStartOfHashData);
1676 } 1679 }
1677 1680
1678 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, 1681 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, EncryptionLevel level) {
1679 EncryptionLevel level) {
1680 DCHECK(alternative_decrypter_.get() == NULL); 1682 DCHECK(alternative_decrypter_.get() == NULL);
1681 DCHECK_GE(level, decrypter_level_); 1683 DCHECK_GE(level, decrypter_level_);
1682 decrypter_.reset(decrypter); 1684 decrypter_.reset(decrypter);
1683 decrypter_level_ = level; 1685 decrypter_level_ = level;
1684 } 1686 }
1685 1687
1686 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, 1688 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter,
1687 EncryptionLevel level, 1689 EncryptionLevel level,
1688 bool latch_once_used) { 1690 bool latch_once_used) {
1689 alternative_decrypter_.reset(decrypter); 1691 alternative_decrypter_.reset(decrypter);
1690 alternative_decrypter_level_ = level; 1692 alternative_decrypter_level_ = level;
1691 alternative_decrypter_latch_ = latch_once_used; 1693 alternative_decrypter_latch_ = latch_once_used;
1692 } 1694 }
1693 1695
1694 const QuicDecrypter* QuicFramer::decrypter() const { 1696 const QuicDecrypter* QuicFramer::decrypter() const {
1695 return decrypter_.get(); 1697 return decrypter_.get();
1696 } 1698 }
1697 1699
1698 const QuicDecrypter* QuicFramer::alternative_decrypter() const { 1700 const QuicDecrypter* QuicFramer::alternative_decrypter() const {
1699 return alternative_decrypter_.get(); 1701 return alternative_decrypter_.get();
1700 } 1702 }
1701 1703
1702 void QuicFramer::SetEncrypter(EncryptionLevel level, 1704 void QuicFramer::SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter) {
1703 QuicEncrypter* encrypter) {
1704 DCHECK_GE(level, 0); 1705 DCHECK_GE(level, 0);
1705 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); 1706 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1706 encrypter_[level].reset(encrypter); 1707 encrypter_[level].reset(encrypter);
1707 } 1708 }
1708 1709
1709 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { 1710 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const {
1710 DCHECK_GE(level, 0); 1711 DCHECK_GE(level, 0);
1711 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); 1712 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1712 DCHECK(encrypter_[level].get() != NULL); 1713 DCHECK(encrypter_[level].get() != NULL);
1713 return encrypter_[level].get(); 1714 return encrypter_[level].get();
1714 } 1715 }
1715 1716
1716 QuicEncryptedPacket* QuicFramer::EncryptPacket( 1717 QuicEncryptedPacket* QuicFramer::EncryptPacket(
1717 EncryptionLevel level, 1718 EncryptionLevel level,
1718 QuicPacketSequenceNumber packet_sequence_number, 1719 QuicPacketSequenceNumber packet_sequence_number,
1719 const QuicPacket& packet) { 1720 const QuicPacket& packet) {
1720 DCHECK(encrypter_[level].get() != NULL); 1721 DCHECK(encrypter_[level].get() != NULL);
1721 1722
1722 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( 1723 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket(
1723 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); 1724 packet_sequence_number, packet.AssociatedData(), packet.Plaintext()));
1724 if (out.get() == NULL) { 1725 if (out.get() == NULL) {
1725 RaiseError(QUIC_ENCRYPTION_FAILURE); 1726 RaiseError(QUIC_ENCRYPTION_FAILURE);
1726 return NULL; 1727 return NULL;
1727 } 1728 }
1728 StringPiece header_data = packet.BeforePlaintext(); 1729 StringPiece header_data = packet.BeforePlaintext();
1729 size_t len = header_data.length() + out->length(); 1730 size_t len = header_data.length() + out->length();
1730 char* buffer = new char[len]; 1731 char* buffer = new char[len];
1731 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). 1732 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
1732 memcpy(buffer, header_data.data(), header_data.length()); 1733 memcpy(buffer, header_data.data(), header_data.length());
1733 memcpy(buffer + header_data.length(), out->data(), out->length()); 1734 memcpy(buffer + header_data.length(), out->data(), out->length());
1734 return new QuicEncryptedPacket(buffer, len, true); 1735 return new QuicEncryptedPacket(buffer, len, true);
1735 } 1736 }
1736 1737
1737 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { 1738 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
1738 // In order to keep the code simple, we don't have the current encryption 1739 // In order to keep the code simple, we don't have the current encryption
1739 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. 1740 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
(...skipping 19 matching lines...) Expand all
1759 } 1760 }
1760 DCHECK(decrypter_.get() != NULL); 1761 DCHECK(decrypter_.get() != NULL);
1761 decrypted_.reset(decrypter_->DecryptPacket( 1762 decrypted_.reset(decrypter_->DecryptPacket(
1762 header.packet_sequence_number, 1763 header.packet_sequence_number,
1763 GetAssociatedDataFromEncryptedPacket( 1764 GetAssociatedDataFromEncryptedPacket(
1764 packet, 1765 packet,
1765 header.public_header.connection_id_length, 1766 header.public_header.connection_id_length,
1766 header.public_header.version_flag, 1767 header.public_header.version_flag,
1767 header.public_header.sequence_number_length), 1768 header.public_header.sequence_number_length),
1768 encrypted)); 1769 encrypted));
1769 if (decrypted_.get() != NULL) { 1770 if (decrypted_.get() != NULL) {
1770 visitor_->OnDecryptedPacket(decrypter_level_); 1771 visitor_->OnDecryptedPacket(decrypter_level_);
1771 } else if (alternative_decrypter_.get() != NULL) { 1772 } else if (alternative_decrypter_.get() != NULL) {
1772 decrypted_.reset(alternative_decrypter_->DecryptPacket( 1773 decrypted_.reset(alternative_decrypter_->DecryptPacket(
1773 header.packet_sequence_number, 1774 header.packet_sequence_number,
1774 GetAssociatedDataFromEncryptedPacket( 1775 GetAssociatedDataFromEncryptedPacket(
1775 packet, 1776 packet,
1776 header.public_header.connection_id_length, 1777 header.public_header.connection_id_length,
1777 header.public_header.version_flag, 1778 header.public_header.version_flag,
1778 header.public_header.sequence_number_length), 1779 header.public_header.sequence_number_length),
1779 encrypted)); 1780 encrypted));
1780 if (decrypted_.get() != NULL) { 1781 if (decrypted_.get() != NULL) {
1781 visitor_->OnDecryptedPacket(alternative_decrypter_level_); 1782 visitor_->OnDecryptedPacket(alternative_decrypter_level_);
1782 if (alternative_decrypter_latch_) { 1783 if (alternative_decrypter_latch_) {
1783 // Switch to the alternative decrypter and latch so that we cannot 1784 // Switch to the alternative decrypter and latch so that we cannot
1784 // switch back. 1785 // switch back.
1785 decrypter_.reset(alternative_decrypter_.release()); 1786 decrypter_.reset(alternative_decrypter_.release());
1786 decrypter_level_ = alternative_decrypter_level_; 1787 decrypter_level_ = alternative_decrypter_level_;
1787 alternative_decrypter_level_ = ENCRYPTION_NONE; 1788 alternative_decrypter_level_ = ENCRYPTION_NONE;
1788 } else { 1789 } else {
1789 // Switch the alternative decrypter so that we use it first next time. 1790 // Switch the alternative decrypter so that we use it first next time.
1790 decrypter_.swap(alternative_decrypter_); 1791 decrypter_.swap(alternative_decrypter_);
1791 EncryptionLevel level = alternative_decrypter_level_; 1792 EncryptionLevel level = alternative_decrypter_level_;
1792 alternative_decrypter_level_ = decrypter_level_; 1793 alternative_decrypter_level_ = decrypter_level_;
1793 decrypter_level_ = level; 1794 decrypter_level_ = level;
1794 } 1795 }
1795 } 1796 }
1796 } 1797 }
1797 1798
1798 if (decrypted_.get() == NULL) { 1799 if (decrypted_.get() == NULL) {
1799 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" 1800 DLOG(WARNING) << "DecryptPacket failed for sequence_number:"
1800 << header.packet_sequence_number; 1801 << header.packet_sequence_number;
1801 return false; 1802 return false;
1802 } 1803 }
1803 1804
1804 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); 1805 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length()));
1805 return true; 1806 return true;
1806 } 1807 }
1807 1808
1808 size_t QuicFramer::GetAckFrameSize( 1809 size_t QuicFramer::GetAckFrameSize(
1809 const QuicAckFrame& ack, 1810 const QuicAckFrame& ack,
1810 QuicSequenceNumberLength sequence_number_length) { 1811 QuicSequenceNumberLength sequence_number_length) {
1811 AckFrameInfo ack_info = GetAckFrameInfo(ack); 1812 AckFrameInfo ack_info = GetAckFrameInfo(ack);
1812 QuicSequenceNumberLength largest_observed_length = 1813 QuicSequenceNumberLength largest_observed_length =
1813 GetMinSequenceNumberLength(ack.received_info.largest_observed); 1814 GetMinSequenceNumberLength(ack.received_info.largest_observed);
1814 QuicSequenceNumberLength missing_sequence_number_length = 1815 QuicSequenceNumberLength missing_sequence_number_length =
1815 GetMinSequenceNumberLength(ack_info.max_delta); 1816 GetMinSequenceNumberLength(ack_info.max_delta);
1816 1817
1817 size_t ack_size = GetMinAckFrameSize(quic_version_, 1818 size_t ack_size = GetMinAckFrameSize(
1818 sequence_number_length, 1819 quic_version_, sequence_number_length, largest_observed_length);
1819 largest_observed_length);
1820 if (!ack_info.nack_ranges.empty()) { 1820 if (!ack_info.nack_ranges.empty()) {
1821 ack_size += kNumberOfMissingPacketsSize + kNumberOfRevivedPacketsSize; 1821 ack_size += kNumberOfMissingPacketsSize + kNumberOfRevivedPacketsSize;
1822 ack_size += ack_info.nack_ranges.size() * 1822 ack_size += ack_info.nack_ranges.size() *
1823 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); 1823 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
1824 ack_size += 1824 ack_size +=
1825 ack.received_info.revived_packets.size() * largest_observed_length; 1825 ack.received_info.revived_packets.size() * largest_observed_length;
1826 } 1826 }
1827 return ack_size; 1827 return ack_size;
1828 } 1828 }
1829 1829
1830 size_t QuicFramer::ComputeFrameLength( 1830 size_t QuicFramer::ComputeFrameLength(
1831 const QuicFrame& frame, 1831 const QuicFrame& frame,
1832 bool last_frame_in_packet, 1832 bool last_frame_in_packet,
1833 InFecGroup is_in_fec_group, 1833 InFecGroup is_in_fec_group,
1834 QuicSequenceNumberLength sequence_number_length) { 1834 QuicSequenceNumberLength sequence_number_length) {
1835 switch (frame.type) { 1835 switch (frame.type) {
1836 case STREAM_FRAME: 1836 case STREAM_FRAME:
1837 return GetMinStreamFrameSize(quic_version_, 1837 return GetMinStreamFrameSize(quic_version_,
1838 frame.stream_frame->stream_id, 1838 frame.stream_frame->stream_id,
1839 frame.stream_frame->offset, 1839 frame.stream_frame->offset,
1840 last_frame_in_packet, 1840 last_frame_in_packet,
1841 is_in_fec_group) + 1841 is_in_fec_group) +
1842 frame.stream_frame->data.TotalBufferSize(); 1842 frame.stream_frame->data.TotalBufferSize();
1843 case ACK_FRAME: { 1843 case ACK_FRAME: {
1844 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); 1844 return GetAckFrameSize(*frame.ack_frame, sequence_number_length);
1845 } 1845 }
1846 case CONGESTION_FEEDBACK_FRAME: { 1846 case CONGESTION_FEEDBACK_FRAME: {
1847 size_t len = kQuicFrameTypeSize; 1847 size_t len = kQuicFrameTypeSize;
1848 const QuicCongestionFeedbackFrame& congestion_feedback = 1848 const QuicCongestionFeedbackFrame& congestion_feedback =
1849 *frame.congestion_feedback_frame; 1849 *frame.congestion_feedback_frame;
1850 len += 1; // Congestion feedback type. 1850 len += 1; // Congestion feedback type.
1851 1851
1852 switch (congestion_feedback.type) { 1852 switch (congestion_feedback.type) {
1853 case kInterArrival: { 1853 case kInterArrival: {
1854 const CongestionFeedbackMessageInterArrival& inter_arrival = 1854 const CongestionFeedbackMessageInterArrival& inter_arrival =
1855 congestion_feedback.inter_arrival; 1855 congestion_feedback.inter_arrival;
1856 len += 1; // Number received packets. 1856 len += 1; // Number received packets.
1857 if (inter_arrival.received_packet_times.size() > 0) { 1857 if (inter_arrival.received_packet_times.size() > 0) {
1858 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. 1858 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received.
1859 len += 8; // Time. 1859 len += 8; // Time.
1860 // 2 bytes per sequence number delta plus 4 bytes per delta time. 1860 // 2 bytes per sequence number delta plus 4 bytes per delta time.
1861 len += PACKET_6BYTE_SEQUENCE_NUMBER * 1861 len += PACKET_6BYTE_SEQUENCE_NUMBER *
1862 (inter_arrival.received_packet_times.size() - 1); 1862 (inter_arrival.received_packet_times.size() - 1);
1863 } 1863 }
1864 break; 1864 break;
1865 } 1865 }
1866 case kFixRate: 1866 case kFixRate:
1867 len += 4; // Bitrate. 1867 len += 4; // Bitrate.
1868 break; 1868 break;
1869 case kTCP: 1869 case kTCP:
1870 len += 2; // Receive window. 1870 len += 2; // Receive window.
1871 break; 1871 break;
1872 default: 1872 default:
1873 set_detailed_error("Illegal feedback type."); 1873 set_detailed_error("Illegal feedback type.");
1874 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1874 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
1875 break; 1875 break;
1876 } 1876 }
1877 return len; 1877 return len;
1878 } 1878 }
1879 case STOP_WAITING_FRAME: 1879 case STOP_WAITING_FRAME:
1880 return GetStopWaitingFrameSize(sequence_number_length); 1880 return GetStopWaitingFrameSize(sequence_number_length);
1881 case PING_FRAME: 1881 case PING_FRAME:
1882 // Ping has no payload. 1882 // Ping has no payload.
1883 return kQuicFrameTypeSize; 1883 return kQuicFrameTypeSize;
1884 case RST_STREAM_FRAME: 1884 case RST_STREAM_FRAME:
1885 return GetMinRstStreamFrameSize(quic_version_) + 1885 return GetMinRstStreamFrameSize(quic_version_) +
1886 frame.rst_stream_frame->error_details.size(); 1886 frame.rst_stream_frame->error_details.size();
1887 case CONNECTION_CLOSE_FRAME: 1887 case CONNECTION_CLOSE_FRAME:
1888 return GetMinConnectionCloseFrameSize() + 1888 return GetMinConnectionCloseFrameSize() +
1889 frame.connection_close_frame->error_details.size(); 1889 frame.connection_close_frame->error_details.size();
1890 case GOAWAY_FRAME: 1890 case GOAWAY_FRAME:
1891 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); 1891 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size();
1892 case WINDOW_UPDATE_FRAME: 1892 case WINDOW_UPDATE_FRAME:
1893 return GetWindowUpdateFrameSize(); 1893 return GetWindowUpdateFrameSize();
1894 case BLOCKED_FRAME: 1894 case BLOCKED_FRAME:
1895 return GetBlockedFrameSize(); 1895 return GetBlockedFrameSize();
1896 case PADDING_FRAME: 1896 case PADDING_FRAME:
1897 DCHECK(false); 1897 DCHECK(false);
1898 return 0; 1898 return 0;
1899 case NUM_FRAME_TYPES: 1899 case NUM_FRAME_TYPES:
(...skipping 13 matching lines...) Expand all
1913 switch (frame.type) { 1913 switch (frame.type) {
1914 case STREAM_FRAME: { 1914 case STREAM_FRAME: {
1915 if (frame.stream_frame == NULL) { 1915 if (frame.stream_frame == NULL) {
1916 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; 1916 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame.";
1917 } 1917 }
1918 // Fin bit. 1918 // Fin bit.
1919 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; 1919 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0;
1920 1920
1921 // Data Length bit. 1921 // Data Length bit.
1922 type_byte <<= kQuicStreamDataLengthShift; 1922 type_byte <<= kQuicStreamDataLengthShift;
1923 type_byte |= no_stream_frame_length ? 0: kQuicStreamDataLengthMask; 1923 type_byte |= no_stream_frame_length ? 0 : kQuicStreamDataLengthMask;
1924 1924
1925 // Offset 3 bits. 1925 // Offset 3 bits.
1926 type_byte <<= kQuicStreamOffsetShift; 1926 type_byte <<= kQuicStreamOffsetShift;
1927 const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset); 1927 const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset);
1928 if (offset_len > 0) { 1928 if (offset_len > 0) {
1929 type_byte |= offset_len - 1; 1929 type_byte |= offset_len - 1;
1930 } 1930 }
1931 1931
1932 // stream id 2 bits. 1932 // stream id 2 bits.
1933 type_byte <<= kQuicStreamIdShift; 1933 type_byte <<= kQuicStreamIdShift;
(...skipping 21 matching lines...) Expand all
1955 QuicSequenceNumberLength sequence_number_length, 1955 QuicSequenceNumberLength sequence_number_length,
1956 QuicPacketSequenceNumber packet_sequence_number, 1956 QuicPacketSequenceNumber packet_sequence_number,
1957 QuicDataWriter* writer) { 1957 QuicDataWriter* writer) {
1958 // Ensure the entire sequence number can be written. 1958 // Ensure the entire sequence number can be written.
1959 if (writer->capacity() - writer->length() < 1959 if (writer->capacity() - writer->length() <
1960 static_cast<size_t>(sequence_number_length)) { 1960 static_cast<size_t>(sequence_number_length)) {
1961 return false; 1961 return false;
1962 } 1962 }
1963 switch (sequence_number_length) { 1963 switch (sequence_number_length) {
1964 case PACKET_1BYTE_SEQUENCE_NUMBER: 1964 case PACKET_1BYTE_SEQUENCE_NUMBER:
1965 return writer->WriteUInt8( 1965 return writer->WriteUInt8(packet_sequence_number &
1966 packet_sequence_number & k1ByteSequenceNumberMask); 1966 k1ByteSequenceNumberMask);
1967 break; 1967 break;
1968 case PACKET_2BYTE_SEQUENCE_NUMBER: 1968 case PACKET_2BYTE_SEQUENCE_NUMBER:
1969 return writer->WriteUInt16( 1969 return writer->WriteUInt16(packet_sequence_number &
1970 packet_sequence_number & k2ByteSequenceNumberMask); 1970 k2ByteSequenceNumberMask);
1971 break; 1971 break;
1972 case PACKET_4BYTE_SEQUENCE_NUMBER: 1972 case PACKET_4BYTE_SEQUENCE_NUMBER:
1973 return writer->WriteUInt32( 1973 return writer->WriteUInt32(packet_sequence_number &
1974 packet_sequence_number & k4ByteSequenceNumberMask); 1974 k4ByteSequenceNumberMask);
1975 break; 1975 break;
1976 case PACKET_6BYTE_SEQUENCE_NUMBER: 1976 case PACKET_6BYTE_SEQUENCE_NUMBER:
1977 return writer->WriteUInt48( 1977 return writer->WriteUInt48(packet_sequence_number &
1978 packet_sequence_number & k6ByteSequenceNumberMask); 1978 k6ByteSequenceNumberMask);
1979 break; 1979 break;
1980 default: 1980 default:
1981 DCHECK(false) << "sequence_number_length: " << sequence_number_length; 1981 DCHECK(false) << "sequence_number_length: " << sequence_number_length;
1982 return false; 1982 return false;
1983 } 1983 }
1984 } 1984 }
1985 1985
1986 bool QuicFramer::AppendStreamFrame( 1986 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
1987 const QuicStreamFrame& frame, 1987 bool no_stream_frame_length,
1988 bool no_stream_frame_length, 1988 QuicDataWriter* writer) {
1989 QuicDataWriter* writer) {
1990 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { 1989 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) {
1991 LOG(DFATAL) << "Writing stream id size failed."; 1990 LOG(DFATAL) << "Writing stream id size failed.";
1992 return false; 1991 return false;
1993 } 1992 }
1994 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { 1993 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) {
1995 LOG(DFATAL) << "Writing offset size failed."; 1994 LOG(DFATAL) << "Writing offset size failed.";
1996 return false; 1995 return false;
1997 } 1996 }
1998 if (!no_stream_frame_length) { 1997 if (!no_stream_frame_length) {
1999 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { 1998 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) {
2000 LOG(DFATAL) << "Writing stream frame length failed"; 1999 LOG(DFATAL) << "Writing stream frame length failed";
2001 return false; 2000 return false;
2002 } 2001 }
2003 } 2002 }
2004 2003
2005 if (!writer->WriteIOVector(frame.data)) { 2004 if (!writer->WriteIOVector(frame.data)) {
2006 LOG(DFATAL) << "Writing frame data failed."; 2005 LOG(DFATAL) << "Writing frame data failed.";
2007 return false; 2006 return false;
2008 } 2007 }
2009 return true; 2008 return true;
2010 } 2009 }
2011 2010
2012 // static 2011 // static
2013 void QuicFramer::set_version(const QuicVersion version) { 2012 void QuicFramer::set_version(const QuicVersion version) {
2014 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); 2013 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version);
2015 quic_version_ = version; 2014 quic_version_ = version;
2016 } 2015 }
2017 2016
2018 bool QuicFramer::AppendAckFrameAndTypeByte( 2017 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicPacketHeader& header,
2019 const QuicPacketHeader& header, 2018 const QuicAckFrame& frame,
2020 const QuicAckFrame& frame, 2019 QuicDataWriter* writer) {
2021 QuicDataWriter* writer) {
2022 AckFrameInfo ack_info = GetAckFrameInfo(frame); 2020 AckFrameInfo ack_info = GetAckFrameInfo(frame);
2023 QuicPacketSequenceNumber ack_largest_observed = 2021 QuicPacketSequenceNumber ack_largest_observed =
2024 frame.received_info.largest_observed; 2022 frame.received_info.largest_observed;
2025 QuicSequenceNumberLength largest_observed_length = 2023 QuicSequenceNumberLength largest_observed_length =
2026 GetMinSequenceNumberLength(ack_largest_observed); 2024 GetMinSequenceNumberLength(ack_largest_observed);
2027 QuicSequenceNumberLength missing_sequence_number_length = 2025 QuicSequenceNumberLength missing_sequence_number_length =
2028 GetMinSequenceNumberLength(ack_info.max_delta); 2026 GetMinSequenceNumberLength(ack_info.max_delta);
2029 // Determine whether we need to truncate ranges. 2027 // Determine whether we need to truncate ranges.
2030 size_t available_range_bytes = writer->capacity() - writer->length() - 2028 size_t available_range_bytes =
2029 writer->capacity() - writer->length() -
2031 GetMinAckFrameSize(quic_version_, 2030 GetMinAckFrameSize(quic_version_,
2032 header.public_header.sequence_number_length, 2031 header.public_header.sequence_number_length,
2033 largest_observed_length) - kNumberOfRevivedPacketsSize; 2032 largest_observed_length) -
2034 size_t max_num_ranges = available_range_bytes / 2033 kNumberOfRevivedPacketsSize;
2034 size_t max_num_ranges =
2035 available_range_bytes /
2035 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); 2036 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
2036 max_num_ranges = 2037 max_num_ranges =
2037 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); 2038 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges);
2038 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; 2039 bool truncated = ack_info.nack_ranges.size() > max_num_ranges;
2039 DVLOG_IF(1, truncated) << "Truncating ack from " 2040 DVLOG_IF(1, truncated) << "Truncating ack from "
2040 << ack_info.nack_ranges.size() << " ranges to " 2041 << ack_info.nack_ranges.size() << " ranges to "
2041 << max_num_ranges; 2042 << max_num_ranges;
2042 2043
2043 // Write out the type byte by setting the low order bits and doing shifts 2044 // Write out the type byte by setting the low order bits and doing shifts
2044 // to make room for the next bit flags to be set. 2045 // to make room for the next bit flags to be set.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2085 ack_largest_observed = ack_iter->first - 1; 2086 ack_largest_observed = ack_iter->first - 1;
2086 // Also update the entropy so it matches the largest observed. 2087 // Also update the entropy so it matches the largest observed.
2087 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); 2088 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed);
2088 ++ack_iter; 2089 ++ack_iter;
2089 } 2090 }
2090 2091
2091 if (!writer->WriteUInt8(ack_entropy_hash)) { 2092 if (!writer->WriteUInt8(ack_entropy_hash)) {
2092 return false; 2093 return false;
2093 } 2094 }
2094 2095
2095 if (!AppendPacketSequenceNumber(largest_observed_length, 2096 if (!AppendPacketSequenceNumber(
2096 ack_largest_observed, writer)) { 2097 largest_observed_length, ack_largest_observed, writer)) {
2097 return false; 2098 return false;
2098 } 2099 }
2099 2100
2100 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; 2101 uint64 delta_time_largest_observed_us = kUFloat16MaxValue;
2101 if (!received_info.delta_time_largest_observed.IsInfinite()) { 2102 if (!received_info.delta_time_largest_observed.IsInfinite()) {
2102 DCHECK_LE(0u, 2103 DCHECK_LE(0u,
2103 frame.received_info.delta_time_largest_observed.ToMicroseconds()); 2104 frame.received_info.delta_time_largest_observed.ToMicroseconds());
2104 delta_time_largest_observed_us = 2105 delta_time_largest_observed_us =
2105 received_info.delta_time_largest_observed.ToMicroseconds(); 2106 received_info.delta_time_largest_observed.ToMicroseconds();
2106 } 2107 }
(...skipping 11 matching lines...) Expand all
2118 if (!writer->WriteBytes(&num_missing_ranges, 1)) { 2119 if (!writer->WriteBytes(&num_missing_ranges, 1)) {
2119 return false; 2120 return false;
2120 } 2121 }
2121 2122
2122 int num_ranges_written = 0; 2123 int num_ranges_written = 0;
2123 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; 2124 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed;
2124 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { 2125 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) {
2125 // Calculate the delta to the last number in the range. 2126 // Calculate the delta to the last number in the range.
2126 QuicPacketSequenceNumber missing_delta = 2127 QuicPacketSequenceNumber missing_delta =
2127 last_sequence_written - (ack_iter->first + ack_iter->second); 2128 last_sequence_written - (ack_iter->first + ack_iter->second);
2128 if (!AppendPacketSequenceNumber(missing_sequence_number_length, 2129 if (!AppendPacketSequenceNumber(
2129 missing_delta, writer)) { 2130 missing_sequence_number_length, missing_delta, writer)) {
2130 return false; 2131 return false;
2131 } 2132 }
2132 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, 2133 if (!AppendPacketSequenceNumber(
2133 ack_iter->second, writer)) { 2134 PACKET_1BYTE_SEQUENCE_NUMBER, ack_iter->second, writer)) {
2134 return false; 2135 return false;
2135 } 2136 }
2136 // Subtract 1 so a missing_delta of 0 means an adjacent range. 2137 // Subtract 1 so a missing_delta of 0 means an adjacent range.
2137 last_sequence_written = ack_iter->first - 1; 2138 last_sequence_written = ack_iter->first - 1;
2138 ++num_ranges_written; 2139 ++num_ranges_written;
2139 } 2140 }
2140 DCHECK_EQ(num_missing_ranges, num_ranges_written); 2141 DCHECK_EQ(num_missing_ranges, num_ranges_written);
2141 2142
2142 // Append revived packets. 2143 // Append revived packets.
2143 // If not all the revived packets fit, only mention the ones that do. 2144 // If not all the revived packets fit, only mention the ones that do.
2144 uint8 num_revived_packets = 2145 uint8 num_revived_packets =
2145 min(received_info.revived_packets.size(), 2146 min(received_info.revived_packets.size(),
2146 static_cast<size_t>(numeric_limits<uint8>::max())); 2147 static_cast<size_t>(numeric_limits<uint8>::max()));
2147 num_revived_packets = min( 2148 num_revived_packets =
2148 static_cast<size_t>(num_revived_packets), 2149 min(static_cast<size_t>(num_revived_packets),
2149 (writer->capacity() - writer->length()) / largest_observed_length); 2150 (writer->capacity() - writer->length()) / largest_observed_length);
2150 if (!writer->WriteBytes(&num_revived_packets, 1)) { 2151 if (!writer->WriteBytes(&num_revived_packets, 1)) {
2151 return false; 2152 return false;
2152 } 2153 }
2153 2154
2154 SequenceNumberSet::const_iterator iter = 2155 SequenceNumberSet::const_iterator iter =
2155 received_info.revived_packets.begin(); 2156 received_info.revived_packets.begin();
2156 for (int i = 0; i < num_revived_packets; ++i, ++iter) { 2157 for (int i = 0; i < num_revived_packets; ++i, ++iter) {
2157 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter)); 2158 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter));
2158 if (!AppendPacketSequenceNumber(largest_observed_length, 2159 if (!AppendPacketSequenceNumber(largest_observed_length, *iter, writer)) {
2159 *iter, writer)) {
2160 return false; 2160 return false;
2161 } 2161 }
2162 } 2162 }
2163 2163
2164 return true; 2164 return true;
2165 } 2165 }
2166 2166
2167 bool QuicFramer::AppendCongestionFeedbackFrame( 2167 bool QuicFramer::AppendCongestionFeedbackFrame(
2168 const QuicCongestionFeedbackFrame& frame, 2168 const QuicCongestionFeedbackFrame& frame,
2169 QuicDataWriter* writer) { 2169 QuicDataWriter* writer) {
2170 if (!writer->WriteBytes(&frame.type, 1)) { 2170 if (!writer->WriteBytes(&frame.type, 1)) {
2171 return false; 2171 return false;
2172 } 2172 }
2173 2173
2174 switch (frame.type) { 2174 switch (frame.type) {
2175 case kInterArrival: { 2175 case kInterArrival: {
2176 const CongestionFeedbackMessageInterArrival& inter_arrival = 2176 const CongestionFeedbackMessageInterArrival& inter_arrival =
2177 frame.inter_arrival; 2177 frame.inter_arrival;
2178 DCHECK_GE(numeric_limits<uint8>::max(), 2178 DCHECK_GE(numeric_limits<uint8>::max(),
2179 inter_arrival.received_packet_times.size()); 2179 inter_arrival.received_packet_times.size());
2180 if (inter_arrival.received_packet_times.size() > 2180 if (inter_arrival.received_packet_times.size() >
2181 numeric_limits<uint8>::max()) { 2181 numeric_limits<uint8>::max()) {
2182 return false; 2182 return false;
2183 } 2183 }
2184 // TODO(ianswett): Make num_received_packets a varint. 2184 // TODO(ianswett): Make num_received_packets a varint.
2185 uint8 num_received_packets = 2185 uint8 num_received_packets = inter_arrival.received_packet_times.size();
2186 inter_arrival.received_packet_times.size();
2187 if (!writer->WriteBytes(&num_received_packets, 1)) { 2186 if (!writer->WriteBytes(&num_received_packets, 1)) {
2188 return false; 2187 return false;
2189 } 2188 }
2190 if (num_received_packets > 0) { 2189 if (num_received_packets > 0) {
2191 TimeMap::const_iterator it = 2190 TimeMap::const_iterator it =
2192 inter_arrival.received_packet_times.begin(); 2191 inter_arrival.received_packet_times.begin();
2193 2192
2194 QuicPacketSequenceNumber lowest_sequence = it->first; 2193 QuicPacketSequenceNumber lowest_sequence = it->first;
2195 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, 2194 if (!AppendPacketSequenceNumber(
2196 lowest_sequence, writer)) { 2195 PACKET_6BYTE_SEQUENCE_NUMBER, lowest_sequence, writer)) {
2197 return false; 2196 return false;
2198 } 2197 }
2199 2198
2200 QuicTime lowest_time = it->second; 2199 QuicTime lowest_time = it->second;
2201 if (!writer->WriteUInt64( 2200 if (!writer->WriteUInt64(
2202 lowest_time.Subtract(creation_time_).ToMicroseconds())) { 2201 lowest_time.Subtract(creation_time_).ToMicroseconds())) {
2203 return false; 2202 return false;
2204 } 2203 }
2205 2204
2206 for (++it; it != inter_arrival.received_packet_times.end(); ++it) { 2205 for (++it; it != inter_arrival.received_packet_times.end(); ++it) {
2207 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence; 2206 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
2208 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta); 2207 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
2209 if (sequence_delta > numeric_limits<uint16>::max()) { 2208 if (sequence_delta > numeric_limits<uint16>::max()) {
2210 return false; 2209 return false;
2211 } 2210 }
2212 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) { 2211 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
2213 return false; 2212 return false;
2214 } 2213 }
2215 2214
2216 int32 time_delta_us = 2215 int32 time_delta_us =
2217 it->second.Subtract(lowest_time).ToMicroseconds(); 2216 it->second.Subtract(lowest_time).ToMicroseconds();
2218 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { 2217 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
2219 return false; 2218 return false;
2220 } 2219 }
2221 } 2220 }
2222 } 2221 }
2223 break; 2222 break;
2224 } 2223 }
2225 case kFixRate: { 2224 case kFixRate: {
2226 const CongestionFeedbackMessageFixRate& fix_rate = 2225 const CongestionFeedbackMessageFixRate& fix_rate = frame.fix_rate;
2227 frame.fix_rate;
2228 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { 2226 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) {
2229 return false; 2227 return false;
2230 } 2228 }
2231 break; 2229 break;
2232 } 2230 }
2233 case kTCP: { 2231 case kTCP: {
2234 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2232 const CongestionFeedbackMessageTCP& tcp = frame.tcp;
2235 DCHECK_LE(tcp.receive_window, 1u << 20); 2233 DCHECK_LE(tcp.receive_window, 1u << 20);
2236 // Simple bit packing, don't send the 4 least significant bits. 2234 // Simple bit packing, don't send the 4 least significant bits.
2237 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2235 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
2238 if (!writer->WriteUInt16(receive_window)) { 2236 if (!writer->WriteUInt16(receive_window)) {
2239 return false; 2237 return false;
2240 } 2238 }
2241 break; 2239 break;
2242 } 2240 }
2243 default: 2241 default:
2244 return false; 2242 return false;
2245 } 2243 }
2246 2244
2247 return true; 2245 return true;
2248 } 2246 }
2249 2247
2250 bool QuicFramer::AppendStopWaitingFrame( 2248 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header,
2251 const QuicPacketHeader& header, 2249 const QuicStopWaitingFrame& frame,
2252 const QuicStopWaitingFrame& frame, 2250 QuicDataWriter* writer) {
2253 QuicDataWriter* writer) {
2254 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); 2251 DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
2255 const QuicPacketSequenceNumber least_unacked_delta = 2252 const QuicPacketSequenceNumber least_unacked_delta =
2256 header.packet_sequence_number - frame.least_unacked; 2253 header.packet_sequence_number - frame.least_unacked;
2257 const QuicPacketSequenceNumber length_shift = 2254 const QuicPacketSequenceNumber length_shift =
2258 header.public_header.sequence_number_length * 8; 2255 header.public_header.sequence_number_length * 8;
2259 if (!writer->WriteUInt8(frame.entropy_hash)) { 2256 if (!writer->WriteUInt8(frame.entropy_hash)) {
2260 LOG(DFATAL) << " hash failed"; 2257 LOG(DFATAL) << " hash failed";
2261 return false; 2258 return false;
2262 } 2259 }
2263 2260
2264 if (least_unacked_delta >> length_shift > 0) { 2261 if (least_unacked_delta >> length_shift > 0) {
2265 LOG(DFATAL) << "sequence_number_length " 2262 LOG(DFATAL) << "sequence_number_length "
2266 << header.public_header.sequence_number_length 2263 << header.public_header.sequence_number_length
2267 << " is too small for least_unacked_delta: " 2264 << " is too small for least_unacked_delta: "
2268 << least_unacked_delta; 2265 << least_unacked_delta;
2269 return false; 2266 return false;
2270 } 2267 }
2271 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, 2268 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
2272 least_unacked_delta, writer)) { 2269 least_unacked_delta,
2270 writer)) {
2273 LOG(DFATAL) << " seq failed: " 2271 LOG(DFATAL) << " seq failed: "
2274 << header.public_header.sequence_number_length; 2272 << header.public_header.sequence_number_length;
2275 return false; 2273 return false;
2276 } 2274 }
2277 2275
2278 return true; 2276 return true;
2279 } 2277 }
2280 2278
2281 bool QuicFramer::AppendRstStreamFrame( 2279 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame,
2282 const QuicRstStreamFrame& frame, 2280 QuicDataWriter* writer) {
2283 QuicDataWriter* writer) {
2284 if (!writer->WriteUInt32(frame.stream_id)) { 2281 if (!writer->WriteUInt32(frame.stream_id)) {
2285 return false; 2282 return false;
2286 } 2283 }
2287 2284
2288 if (!writer->WriteUInt64(frame.byte_offset)) { 2285 if (!writer->WriteUInt64(frame.byte_offset)) {
2289 return false; 2286 return false;
2290 } 2287 }
2291 2288
2292 uint32 error_code = static_cast<uint32>(frame.error_code); 2289 uint32 error_code = static_cast<uint32>(frame.error_code);
2293 if (!writer->WriteUInt32(error_code)) { 2290 if (!writer->WriteUInt32(error_code)) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2352 2349
2353 bool QuicFramer::RaiseError(QuicErrorCode error) { 2350 bool QuicFramer::RaiseError(QuicErrorCode error) {
2354 DVLOG(1) << "Error detail: " << detailed_error_; 2351 DVLOG(1) << "Error detail: " << detailed_error_;
2355 set_error(error); 2352 set_error(error);
2356 visitor_->OnError(this); 2353 visitor_->OnError(this);
2357 reader_.reset(NULL); 2354 reader_.reset(NULL);
2358 return false; 2355 return false;
2359 } 2356 }
2360 2357
2361 } // namespace net 2358 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698