quic_framer.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 3// found in the LICENSE file. 4 5#include "net/quic/quic_framer.h" 6 7#include "base/containers/hash_tables.h" 8#include "base/stl_util.h" 9#include "net/quic/crypto/crypto_framer.h" 10#include "net/quic/crypto/crypto_handshake_message.h" 11#include "net/quic/crypto/quic_decrypter.h" 12#include "net/quic/crypto/quic_encrypter.h" 13#include "net/quic/quic_data_reader.h" 14#include "net/quic/quic_data_writer.h" 15#include "net/quic/quic_socket_address_coder.h" 16 17using base::StringPiece; 18using std::make_pair; 19using std::map; 20using std::max; 21using std::min; 22using std::numeric_limits; 23using std::string; 24 25bool FLAGS_quic_allow_oversized_packets_for_test = false; 26 27namespace net { 28 29namespace { 30 31// Mask to select the lowest 48 bits of a sequence number. 32const QuicPacketSequenceNumber k6ByteSequenceNumberMask = 33 GG_UINT64_C(0x0000FFFFFFFFFFFF); 34const QuicPacketSequenceNumber k4ByteSequenceNumberMask = 35 GG_UINT64_C(0x00000000FFFFFFFF); 36const QuicPacketSequenceNumber k2ByteSequenceNumberMask = 37 GG_UINT64_C(0x000000000000FFFF); 38const QuicPacketSequenceNumber k1ByteSequenceNumberMask = 39 GG_UINT64_C(0x00000000000000FF); 40 41const QuicGuid k1ByteGuidMask = GG_UINT64_C(0x00000000000000FF); 42const QuicGuid k4ByteGuidMask = GG_UINT64_C(0x00000000FFFFFFFF); 43 44// Number of bits the sequence number length bits are shifted from the right 45// edge of the public header. 46const uint8 kPublicHeaderSequenceNumberShift = 4; 47 48// New Frame Types, QUIC v. >= 10: 49// There are two interpretations for the Frame Type byte in the QUIC protocol, 50// resulting in two Frame Types: Special Frame Types and Regular Frame Types. 51// 52// Regular Frame Types use the Frame Type byte simply. Currently defined 53// Regular Frame Types are: 54// Padding : 0b 00000000 (0x00) 55// ResetStream : 0b 00000001 (0x01) 56// ConnectionClose : 0b 00000010 (0x02) 57// GoAway : 0b 00000011 (0x03) 58// WindowUpdate : 0b 00000100 (0x04) 59// Blocked : 0b 00000101 (0x05) 60// 61// Special Frame Types encode both a Frame Type and corresponding flags 62// all in the Frame Type byte. Currently defined Special Frame Types are: 63// Stream : 0b 1xxxxxxx 64// Ack : 0b 01xxxxxx 65// CongestionFeedback : 0b 001xxxxx 66// 67// Semantics of the flag bits above (the x bits) depends on the frame type. 68 69// Masks to determine if the frame type is a special use 70// and for specific special frame types. 71const uint8 kQuicFrameTypeSpecialMask = 0xE0; // 0b 11100000 72const uint8 kQuicFrameTypeStreamMask = 0x80; 73const uint8 kQuicFrameTypeAckMask = 0x40; 74const uint8 kQuicFrameTypeCongestionFeedbackMask = 0x20; 75 76// Stream frame relative shifts and masks for interpreting the stream flags. 77// StreamID may be 1, 2, 3, or 4 bytes. 78const uint8 kQuicStreamIdShift = 2; 79const uint8 kQuicStreamIDLengthMask = 0x03; 80 81// Offset may be 0, 2, 3, 4, 5, 6, 7, 8 bytes. 82const uint8 kQuicStreamOffsetShift = 3; 83const uint8 kQuicStreamOffsetMask = 0x07; 84 85// Data length may be 0 or 2 bytes. 86const uint8 kQuicStreamDataLengthShift = 1; 87const uint8 kQuicStreamDataLengthMask = 0x01; 88 89// Fin bit may be set or not. 90const uint8 kQuicStreamFinShift = 1; 91const uint8 kQuicStreamFinMask = 0x01; 92 93// Sequence number size shift used in AckFrames. 94const uint8 kQuicSequenceNumberLengthShift = 2; 95 96// Acks may be truncated. 97const uint8 kQuicAckTruncatedShift = 1; 98const uint8 kQuicAckTruncatedMask = 0x01; 99 100// Acks may not have any nacks. 101const uint8 kQuicHasNacksMask = 0x01; 102 103// Returns the absolute value of the difference between |a| and |b|. 104QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a, 105 QuicPacketSequenceNumber b) { 106 // Since these are unsigned numbers, we can't just return abs(a - b) 107 if (a < b) { 108 return b - a; 109 } 110 return a - b; 111} 112 113QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, 114 QuicPacketSequenceNumber a, 115 QuicPacketSequenceNumber b) { 116 return (Delta(target, a) < Delta(target, b)) ? a : b; 117} 118 119QuicSequenceNumberLength ReadSequenceNumberLength(uint8 flags) { 120 switch (flags & PACKET_FLAGS_6BYTE_SEQUENCE) { 121 case PACKET_FLAGS_6BYTE_SEQUENCE: 122 return PACKET_6BYTE_SEQUENCE_NUMBER; 123 case PACKET_FLAGS_4BYTE_SEQUENCE: 124 return PACKET_4BYTE_SEQUENCE_NUMBER; 125 case PACKET_FLAGS_2BYTE_SEQUENCE: 126 return PACKET_2BYTE_SEQUENCE_NUMBER; 127 case PACKET_FLAGS_1BYTE_SEQUENCE: 128 return PACKET_1BYTE_SEQUENCE_NUMBER; 129 default: 130 LOG(DFATAL) << "Unreachable case statement."; 131 return PACKET_6BYTE_SEQUENCE_NUMBER; 132 } 133} 134 135bool CanTruncate( 136 QuicVersion version, const QuicFrame& frame, size_t free_bytes) { 137 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && 138 free_bytes >= 139 QuicFramer::GetMinAckFrameSize(version, 140 PACKET_6BYTE_SEQUENCE_NUMBER, 141 PACKET_6BYTE_SEQUENCE_NUMBER)) { 142 return true; 143 } 144 return false; 145} 146 147} // namespace 148 149bool QuicFramerVisitorInterface::OnWindowUpdateFrame( 150 const QuicWindowUpdateFrame& frame) { 151 return true; 152} 153 154bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { 155 return true; 156} 157 158QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, 159 QuicTime creation_time, 160 bool is_server) 161 : visitor_(NULL), 162 fec_builder_(NULL), 163 entropy_calculator_(NULL), 164 error_(QUIC_NO_ERROR), 165 last_sequence_number_(0), 166 last_serialized_guid_(0), 167 supported_versions_(supported_versions), 168 alternative_decrypter_latch_(false), 169 is_server_(is_server), 170 creation_time_(creation_time) { 171 DCHECK(!supported_versions.empty()); 172 quic_version_ = supported_versions_[0]; 173 decrypter_.reset(QuicDecrypter::Create(kNULL)); 174 encrypter_[ENCRYPTION_NONE].reset( 175 QuicEncrypter::Create(kNULL)); 176} 177 178QuicFramer::~QuicFramer() {} 179 180// static 181size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, 182 QuicStreamId stream_id, 183 QuicStreamOffset offset, 184 bool last_frame_in_packet) { 185 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + 186 GetStreamOffsetSize(offset) + 187 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize); 188} 189 190// static 191size_t QuicFramer::GetMinAckFrameSize( 192 QuicVersion version, 193 QuicSequenceNumberLength sequence_number_length, 194 QuicSequenceNumberLength largest_observed_length) { 195 return kQuicFrameTypeSize + kQuicEntropyHashSize + 196 sequence_number_length + kQuicEntropyHashSize + 197 largest_observed_length + kQuicDeltaTimeLargestObservedSize; 198} 199 200// static 201size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { 202 if (quic_version > QUIC_VERSION_13) { 203 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + 204 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + 205 kQuicErrorDetailsLengthSize; 206 } else { 207 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicErrorCodeSize + 208 kQuicErrorDetailsLengthSize; 209 } 210} 211 212// static 213size_t QuicFramer::GetMinConnectionCloseFrameSize() { 214 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; 215} 216 217// static 218size_t QuicFramer::GetMinGoAwayFrameSize() { 219 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 220 kQuicMaxStreamIdSize; 221} 222 223// static 224size_t QuicFramer::GetWindowUpdateFrameSize() { 225 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; 226} 227 228// static 229size_t QuicFramer::GetBlockedFrameSize() { 230 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; 231} 232 233// static 234size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) { 235 // Sizes are 1 through 4 bytes. 236 for (int i = 1; i <= 4; ++i) { 237 stream_id >>= 8; 238 if (stream_id == 0) { 239 return i; 240 } 241 } 242 LOG(DFATAL) << "Failed to determine StreamIDSize."; 243 return 4; 244} 245 246// static 247size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) { 248 // 0 is a special case. 249 if (offset == 0) { 250 return 0; 251 } 252 // 2 through 8 are the remaining sizes. 253 offset >>= 8; 254 for (int i = 2; i <= 8; ++i) { 255 offset >>= 8; 256 if (offset == 0) { 257 return i; 258 } 259 } 260 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; 261 return 8; 262} 263 264// static 265size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { 266 return kPublicFlagsSize + PACKET_8BYTE_GUID + 267 number_versions * kQuicVersionSize; 268} 269 270bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { 271 for (size_t i = 0; i < supported_versions_.size(); ++i) { 272 if (version == supported_versions_[i]) { 273 return true; 274 } 275 } 276 return false; 277} 278 279size_t QuicFramer::GetSerializedFrameLength( 280 const QuicFrame& frame, 281 size_t free_bytes, 282 bool first_frame, 283 bool last_frame, 284 QuicSequenceNumberLength sequence_number_length) { 285 if (frame.type == PADDING_FRAME) { 286 // PADDING implies end of packet. 287 return free_bytes; 288 } 289 size_t frame_len = 290 ComputeFrameLength(frame, last_frame, sequence_number_length); 291 if (frame_len > free_bytes) { 292 // Only truncate the first frame in a packet, so if subsequent ones go 293 // over, stop including more frames. 294 if (!first_frame) { 295 return 0; 296 } 297 if (CanTruncate(quic_version_, frame, free_bytes)) { 298 // Truncate the frame so the packet will not exceed kMaxPacketSize. 299 // Note that we may not use every byte of the writer in this case. 300 DVLOG(1) << "Truncating large frame"; 301 return free_bytes; 302 } else if (!FLAGS_quic_allow_oversized_packets_for_test) { 303 return 0; 304 } 305 } 306 return frame_len; 307} 308 309QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } 310 311QuicFramer::AckFrameInfo::~AckFrameInfo() { } 312 313QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 314 const QuicPacketHeader& header) const { 315 return header.entropy_flag << (header.packet_sequence_number % 8); 316} 317 318// Test only. 319SerializedPacket QuicFramer::BuildUnsizedDataPacket( 320 const QuicPacketHeader& header, 321 const QuicFrames& frames) { 322 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); 323 size_t packet_size = GetPacketHeaderSize(header); 324 for (size_t i = 0; i < frames.size(); ++i) { 325 DCHECK_LE(packet_size, max_plaintext_size); 326 bool first_frame = i == 0; 327 bool last_frame = i == frames.size() - 1; 328 const size_t frame_size = GetSerializedFrameLength( 329 frames[i], max_plaintext_size - packet_size, first_frame, last_frame, 330 header.public_header.sequence_number_length); 331 DCHECK(frame_size); 332 packet_size += frame_size; 333 } 334 return BuildDataPacket(header, frames, packet_size); 335} 336 337SerializedPacket QuicFramer::BuildDataPacket( 338 const QuicPacketHeader& header, 339 const QuicFrames& frames, 340 size_t packet_size) { 341 QuicDataWriter writer(packet_size); 342 const SerializedPacket kNoPacket( 343 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); 344 if (!AppendPacketHeader(header, &writer)) { 345 LOG(DFATAL) << "AppendPacketHeader failed"; 346 return kNoPacket; 347 } 348 349 for (size_t i = 0; i < frames.size(); ++i) { 350 const QuicFrame& frame = frames[i]; 351 352 const bool last_frame_in_packet = i == (frames.size() - 1); 353 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { 354 LOG(DFATAL) << "AppendTypeByte failed"; 355 return kNoPacket; 356 } 357 358 switch (frame.type) { 359 case PADDING_FRAME: 360 writer.WritePadding(); 361 break; 362 case STREAM_FRAME: 363 if (!AppendStreamFrame( 364 *frame.stream_frame, last_frame_in_packet, &writer)) { 365 LOG(DFATAL) << "AppendStreamFrame failed"; 366 return kNoPacket; 367 } 368 break; 369 case ACK_FRAME: 370 if (!AppendAckFrameAndTypeByte( 371 header, *frame.ack_frame, &writer)) { 372 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; 373 return kNoPacket; 374 } 375 break; 376 case CONGESTION_FEEDBACK_FRAME: 377 if (!AppendQuicCongestionFeedbackFrame( 378 *frame.congestion_feedback_frame, &writer)) { 379 LOG(DFATAL) << "AppendQuicCongestionFeedbackFrame failed"; 380 return kNoPacket; 381 } 382 break; 383 case RST_STREAM_FRAME: 384 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { 385 LOG(DFATAL) << "AppendRstStreamFrame failed"; 386 return kNoPacket; 387 } 388 break; 389 case CONNECTION_CLOSE_FRAME: 390 if (!AppendConnectionCloseFrame( 391 *frame.connection_close_frame, &writer)) { 392 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; 393 return kNoPacket; 394 } 395 break; 396 case GOAWAY_FRAME: 397 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { 398 LOG(DFATAL) << "AppendGoAwayFrame failed"; 399 return kNoPacket; 400 } 401 break; 402 case WINDOW_UPDATE_FRAME: 403 if (quic_version_ > QUIC_VERSION_13) { 404 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { 405 LOG(DFATAL) << "AppendWindowUpdateFrame failed"; 406 return kNoPacket; 407 } 408 } else { 409 LOG(DFATAL) << "Attempt to add a WindowUpdateFrame in " 410 << QuicVersionToString(quic_version_); 411 return kNoPacket; 412 } 413 break; 414 case BLOCKED_FRAME: 415 if (quic_version_ > QUIC_VERSION_13) { 416 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { 417 LOG(DFATAL) << "AppendBlockedFrame failed"; 418 return kNoPacket; 419 } 420 } else { 421 LOG(DFATAL) << "Attempt to add a BlockedFrame in " 422 << QuicVersionToString(quic_version_); 423 return kNoPacket; 424 } 425 break; 426 default: 427 RaiseError(QUIC_INVALID_FRAME_DATA); 428 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; 429 return kNoPacket; 430 } 431 } 432 433 // Save the length before writing, because take clears it. 434 const size_t len = writer.length(); 435 // Less than or equal because truncated acks end up with max_plaintex_size 436 // length, even though they're typically slightly shorter. 437 DCHECK_LE(len, packet_size); 438 QuicPacket* packet = QuicPacket::NewDataPacket( 439 writer.take(), len, true, header.public_header.guid_length, 440 header.public_header.version_flag, 441 header.public_header.sequence_number_length); 442 443 if (fec_builder_) { 444 fec_builder_->OnBuiltFecProtectedPayload(header, 445 packet->FecProtectedData()); 446 } 447 448 return SerializedPacket(header.packet_sequence_number, 449 header.public_header.sequence_number_length, packet, 450 GetPacketEntropyHash(header), NULL); 451} 452 453SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, 454 const QuicFecData& fec) { 455 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); 456 DCHECK_NE(0u, header.fec_group); 457 size_t len = GetPacketHeaderSize(header); 458 len += fec.redundancy.length(); 459 460 QuicDataWriter writer(len); 461 const SerializedPacket kNoPacket( 462 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); 463 if (!AppendPacketHeader(header, &writer)) { 464 LOG(DFATAL) << "AppendPacketHeader failed"; 465 return kNoPacket; 466 } 467 468 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 469 LOG(DFATAL) << "Failed to add FEC"; 470 return kNoPacket; 471 } 472 473 return SerializedPacket( 474 header.packet_sequence_number, 475 header.public_header.sequence_number_length, 476 QuicPacket::NewFecPacket(writer.take(), len, true, 477 header.public_header.guid_length, 478 header.public_header.version_flag, 479 header.public_header.sequence_number_length), 480 GetPacketEntropyHash(header), NULL); 481} 482 483// static 484QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( 485 const QuicPublicResetPacket& packet) { 486 DCHECK(packet.public_header.reset_flag); 487 488 CryptoHandshakeMessage reset; 489 reset.set_tag(kPRST); 490 reset.SetValue(kRNON, packet.nonce_proof); 491 reset.SetValue(kRSEQ, packet.rejected_sequence_number); 492 if (!packet.client_address.address().empty()) { 493 // packet.client_address is non-empty. 494 QuicSocketAddressCoder address_coder(packet.client_address); 495 string serialized_address = address_coder.Encode(); 496 if (serialized_address.empty()) { 497 return NULL; 498 } 499 reset.SetStringPiece(kCADR, serialized_address); 500 } 501 const QuicData& reset_serialized = reset.GetSerialized(); 502 503 size_t len = kPublicFlagsSize + PACKET_8BYTE_GUID + reset_serialized.length(); 504 QuicDataWriter writer(len); 505 506 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | 507 PACKET_PUBLIC_FLAGS_8BYTE_GUID); 508 if (!writer.WriteUInt8(flags)) { 509 return NULL; 510 } 511 512 if (!writer.WriteUInt64(packet.public_header.guid)) { 513 return NULL; 514 } 515 516 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { 517 return NULL; 518 } 519 520 return new QuicEncryptedPacket(writer.take(), len, true); 521} 522 523QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( 524 const QuicPacketPublicHeader& header, 525 const QuicVersionVector& supported_versions) { 526 DCHECK(header.version_flag); 527 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); 528 QuicDataWriter writer(len); 529 530 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | 531 PACKET_PUBLIC_FLAGS_8BYTE_GUID); 532 if (!writer.WriteUInt8(flags)) { 533 return NULL; 534 } 535 536 if (!writer.WriteUInt64(header.guid)) { 537 return NULL; 538 } 539 540 for (size_t i = 0; i < supported_versions.size(); ++i) { 541 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { 542 return NULL; 543 } 544 } 545 546 return new QuicEncryptedPacket(writer.take(), len, true); 547} 548 549bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 550 DCHECK(!reader_.get()); 551 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 552 553 visitor_->OnPacket(); 554 555 // First parse the public header. 556 QuicPacketPublicHeader public_header; 557 if (!ProcessPublicHeader(&public_header)) { 558 DLOG(WARNING) << "Unable to process public header."; 559 DCHECK_NE("", detailed_error_); 560 return RaiseError(QUIC_INVALID_PACKET_HEADER); 561 } 562 563 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { 564 // The visitor suppresses further processing of the packet. 565 reader_.reset(NULL); 566 return true; 567 } 568 569 if (is_server_ && public_header.version_flag && 570 public_header.versions[0] != quic_version_) { 571 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { 572 reader_.reset(NULL); 573 return true; 574 } 575 } 576 577 bool rv; 578 if (!is_server_ && public_header.version_flag) { 579 rv = ProcessVersionNegotiationPacket(&public_header); 580 } else if (public_header.reset_flag) { 581 rv = ProcessPublicResetPacket(public_header); 582 } else { 583 rv = ProcessDataPacket(public_header, packet); 584 } 585 586 reader_.reset(NULL); 587 return rv; 588} 589 590bool QuicFramer::ProcessVersionNegotiationPacket( 591 QuicPacketPublicHeader* public_header) { 592 DCHECK(!is_server_); 593 // Try reading at least once to raise error if the packet is invalid. 594 do { 595 QuicTag version; 596 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { 597 set_detailed_error("Unable to read supported version in negotiation."); 598 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); 599 } 600 public_header->versions.push_back(QuicTagToQuicVersion(version)); 601 } while (!reader_->IsDoneReading()); 602 603 visitor_->OnVersionNegotiationPacket(*public_header); 604 return true; 605} 606 607bool QuicFramer::ProcessDataPacket( 608 const QuicPacketPublicHeader& public_header, 609 const QuicEncryptedPacket& packet) { 610 QuicPacketHeader header(public_header); 611 if (!ProcessPacketHeader(&header, packet)) { 612 DLOG(WARNING) << "Unable to process data packet header."; 613 return false; 614 } 615 616 if (!visitor_->OnPacketHeader(header)) { 617 // The visitor suppresses further processing of the packet. 618 return true; 619 } 620 621 if (packet.length() > kMaxPacketSize) { 622 DLOG(WARNING) << "Packet too large: " << packet.length(); 623 return RaiseError(QUIC_PACKET_TOO_LARGE); 624 } 625 626 // Handle the payload. 627 if (!header.fec_flag) { 628 if (header.is_in_fec_group == IN_FEC_GROUP) { 629 StringPiece payload = reader_->PeekRemainingPayload(); 630 visitor_->OnFecProtectedPayload(payload); 631 } 632 if (!ProcessFrameData(header)) { 633 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. 634 DLOG(WARNING) << "Unable to process frame data."; 635 return false; 636 } 637 } else { 638 QuicFecData fec_data; 639 fec_data.fec_group = header.fec_group; 640 fec_data.redundancy = reader_->ReadRemainingPayload(); 641 visitor_->OnFecData(fec_data); 642 } 643 644 visitor_->OnPacketComplete(); 645 return true; 646} 647 648bool QuicFramer::ProcessPublicResetPacket( 649 const QuicPacketPublicHeader& public_header) { 650 QuicPublicResetPacket packet(public_header); 651 652 if (public_header.sequence_number_length == PACKET_6BYTE_SEQUENCE_NUMBER) { 653 // An old-style public reset packet has the 654 // PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE bits set in the public flags. 655 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. 656 if (!reader_->ReadUInt64(&packet.nonce_proof)) { 657 set_detailed_error("Unable to read nonce proof."); 658 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 659 } 660 661 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { 662 set_detailed_error("Unable to read rejected sequence number."); 663 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 664 } 665 666 visitor_->OnPublicResetPacket(packet); 667 return true; 668 } 669 670 scoped_ptr<CryptoHandshakeMessage> reset( 671 CryptoFramer::ParseMessage(reader_->ReadRemainingPayload())); 672 if (!reset.get()) { 673 set_detailed_error("Unable to read reset message."); 674 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 675 } 676 if (reset->tag() != kPRST) { 677 set_detailed_error("Incorrect message tag."); 678 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 679 } 680 681 if (reset->GetUint64(kRNON, &packet.nonce_proof) != QUIC_NO_ERROR) { 682 set_detailed_error("Unable to read nonce proof."); 683 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 684 } 685 // TODO(satyamshekhar): validate nonce to protect against DoS. 686 687 if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) != 688 QUIC_NO_ERROR) { 689 set_detailed_error("Unable to read rejected sequence number."); 690 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 691 } 692 693 StringPiece address; 694 if (reset->GetStringPiece(kCADR, &address)) { 695 QuicSocketAddressCoder address_coder; 696 if (address_coder.Decode(address.data(), address.length())) { 697 packet.client_address = IPEndPoint(address_coder.ip(), 698 address_coder.port()); 699 } 700 } 701 702 visitor_->OnPublicResetPacket(packet); 703 return true; 704} 705 706bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, 707 StringPiece payload) { 708 DCHECK(!reader_.get()); 709 710 visitor_->OnRevivedPacket(); 711 712 header->entropy_hash = GetPacketEntropyHash(*header); 713 714 if (!visitor_->OnPacketHeader(*header)) { 715 return true; 716 } 717 718 if (payload.length() > kMaxPacketSize) { 719 set_detailed_error("Revived packet too large."); 720 return RaiseError(QUIC_PACKET_TOO_LARGE); 721 } 722 723 reader_.reset(new QuicDataReader(payload.data(), payload.length())); 724 if (!ProcessFrameData(*header)) { 725 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. 726 DLOG(WARNING) << "Unable to process frame data."; 727 return false; 728 } 729 730 visitor_->OnPacketComplete(); 731 reader_.reset(NULL); 732 return true; 733} 734 735bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, 736 QuicDataWriter* writer) { 737 DVLOG(1) << "Appending header: " << header; 738 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP); 739 uint8 public_flags = 0; 740 if (header.public_header.reset_flag) { 741 public_flags |= PACKET_PUBLIC_FLAGS_RST; 742 } 743 if (header.public_header.version_flag) { 744 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; 745 } 746 747 public_flags |= 748 GetSequenceNumberFlags(header.public_header.sequence_number_length) 749 << kPublicHeaderSequenceNumberShift; 750 751 switch (header.public_header.guid_length) { 752 case PACKET_0BYTE_GUID: 753 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_0BYTE_GUID)) { 754 return false; 755 } 756 break; 757 case PACKET_1BYTE_GUID: 758 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_1BYTE_GUID)) { 759 return false; 760 } 761 if (!writer->WriteUInt8(header.public_header.guid & k1ByteGuidMask)) { 762 return false; 763 } 764 break; 765 case PACKET_4BYTE_GUID: 766 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_4BYTE_GUID)) { 767 return false; 768 } 769 if (!writer->WriteUInt32(header.public_header.guid & k4ByteGuidMask)) { 770 return false; 771 } 772 break; 773 case PACKET_8BYTE_GUID: 774 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_8BYTE_GUID)) { 775 return false; 776 } 777 if (!writer->WriteUInt64(header.public_header.guid)) { 778 return false; 779 } 780 break; 781 } 782 last_serialized_guid_ = header.public_header.guid; 783 784 if (header.public_header.version_flag) { 785 DCHECK(!is_server_); 786 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); 787 } 788 789 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, 790 header.packet_sequence_number, writer)) { 791 return false; 792 } 793 794 uint8 private_flags = 0; 795 if (header.entropy_flag) { 796 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; 797 } 798 if (header.is_in_fec_group == IN_FEC_GROUP) { 799 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP; 800 } 801 if (header.fec_flag) { 802 private_flags |= PACKET_PRIVATE_FLAGS_FEC; 803 } 804 if (!writer->WriteUInt8(private_flags)) { 805 return false; 806 } 807 808 // The FEC group number is the sequence number of the first fec 809 // protected packet, or 0 if this packet is not protected. 810 if (header.is_in_fec_group == IN_FEC_GROUP) { 811 DCHECK_GE(header.packet_sequence_number, header.fec_group); 812 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group); 813 // Offset from the current packet sequence number to the first fec 814 // protected packet. 815 uint8 first_fec_protected_packet_offset = 816 header.packet_sequence_number - header.fec_group; 817 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { 818 return false; 819 } 820 } 821 822 return true; 823} 824 825QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( 826 QuicSequenceNumberLength sequence_number_length, 827 QuicPacketSequenceNumber packet_sequence_number) const { 828 // The new sequence number might have wrapped to the next epoch, or 829 // it might have reverse wrapped to the previous epoch, or it might 830 // remain in the same epoch. Select the sequence number closest to the 831 // next expected sequence number, the previous sequence number plus 1. 832 833 // epoch_delta is the delta between epochs the sequence number was serialized 834 // with, so the correct value is likely the same epoch as the last sequence 835 // number or an adjacent epoch. 836 const QuicPacketSequenceNumber epoch_delta = 837 GG_UINT64_C(1) << (8 * sequence_number_length); 838 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; 839 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); 840 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; 841 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; 842 843 return ClosestTo(next_sequence_number, 844 epoch + packet_sequence_number, 845 ClosestTo(next_sequence_number, 846 prev_epoch + packet_sequence_number, 847 next_epoch + packet_sequence_number)); 848} 849 850bool QuicFramer::ProcessPublicHeader( 851 QuicPacketPublicHeader* public_header) { 852 uint8 public_flags; 853 if (!reader_->ReadBytes(&public_flags, 1)) { 854 set_detailed_error("Unable to read public flags."); 855 return false; 856 } 857 858 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; 859 public_header->version_flag = 860 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; 861 862 if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { 863 set_detailed_error("Illegal public flags value."); 864 return false; 865 } 866 867 if (public_header->reset_flag && public_header->version_flag) { 868 set_detailed_error("Got version flag in reset packet"); 869 return false; 870 } 871 872 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_GUID) { 873 case PACKET_PUBLIC_FLAGS_8BYTE_GUID: 874 if (!reader_->ReadUInt64(&public_header->guid)) { 875 set_detailed_error("Unable to read GUID."); 876 return false; 877 } 878 public_header->guid_length = PACKET_8BYTE_GUID; 879 break; 880 case PACKET_PUBLIC_FLAGS_4BYTE_GUID: 881 // If the guid is truncated, expect to read the last serialized guid. 882 if (!reader_->ReadBytes(&public_header->guid, PACKET_4BYTE_GUID)) { 883 set_detailed_error("Unable to read GUID."); 884 return false; 885 } 886 if ((public_header->guid & k4ByteGuidMask) != 887 (last_serialized_guid_ & k4ByteGuidMask)) { 888 set_detailed_error( 889 "Truncated 4 byte GUID does not match previous guid."); 890 return false; 891 } 892 public_header->guid_length = PACKET_4BYTE_GUID; 893 public_header->guid = last_serialized_guid_; 894 break; 895 case PACKET_PUBLIC_FLAGS_1BYTE_GUID: 896 if (!reader_->ReadBytes(&public_header->guid, PACKET_1BYTE_GUID)) { 897 set_detailed_error("Unable to read GUID."); 898 return false; 899 } 900 if ((public_header->guid & k1ByteGuidMask) != 901 (last_serialized_guid_ & k1ByteGuidMask)) { 902 set_detailed_error( 903 "Truncated 1 byte GUID does not match previous guid."); 904 return false; 905 } 906 public_header->guid_length = PACKET_1BYTE_GUID; 907 public_header->guid = last_serialized_guid_; 908 break; 909 case PACKET_PUBLIC_FLAGS_0BYTE_GUID: 910 public_header->guid_length = PACKET_0BYTE_GUID; 911 public_header->guid = last_serialized_guid_; 912 break; 913 } 914 915 public_header->sequence_number_length = 916 ReadSequenceNumberLength( 917 public_flags >> kPublicHeaderSequenceNumberShift); 918 919 // Read the version only if the packet is from the client. 920 // version flag from the server means version negotiation packet. 921 if (public_header->version_flag && is_server_) { 922 QuicTag version_tag; 923 if (!reader_->ReadUInt32(&version_tag)) { 924 set_detailed_error("Unable to read protocol version."); 925 return false; 926 } 927 928 // If the version from the new packet is the same as the version of this 929 // framer, then the public flags should be set to something we understand. 930 // If not, this raises an error. 931 QuicVersion version = QuicTagToQuicVersion(version_tag); 932 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { 933 set_detailed_error("Illegal public flags value."); 934 return false; 935 } 936 public_header->versions.push_back(version); 937 } 938 return true; 939} 940 941// static 942QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( 943 QuicPacketSequenceNumber sequence_number) { 944 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { 945 return PACKET_1BYTE_SEQUENCE_NUMBER; 946 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { 947 return PACKET_2BYTE_SEQUENCE_NUMBER; 948 } else if (sequence_number < 949 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { 950 return PACKET_4BYTE_SEQUENCE_NUMBER; 951 } else { 952 return PACKET_6BYTE_SEQUENCE_NUMBER; 953 } 954} 955 956// static 957uint8 QuicFramer::GetSequenceNumberFlags( 958 QuicSequenceNumberLength sequence_number_length) { 959 switch (sequence_number_length) { 960 case PACKET_1BYTE_SEQUENCE_NUMBER: 961 return PACKET_FLAGS_1BYTE_SEQUENCE; 962 case PACKET_2BYTE_SEQUENCE_NUMBER: 963 return PACKET_FLAGS_2BYTE_SEQUENCE; 964 case PACKET_4BYTE_SEQUENCE_NUMBER: 965 return PACKET_FLAGS_4BYTE_SEQUENCE; 966 case PACKET_6BYTE_SEQUENCE_NUMBER: 967 return PACKET_FLAGS_6BYTE_SEQUENCE; 968 default: 969 LOG(DFATAL) << "Unreachable case statement."; 970 return PACKET_FLAGS_6BYTE_SEQUENCE; 971 } 972} 973 974// static 975QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( 976 const QuicAckFrame& frame) { 977 const ReceivedPacketInfo& received_info = frame.received_info; 978 979 AckFrameInfo ack_info; 980 if (!received_info.missing_packets.empty()) { 981 DCHECK_GE(received_info.largest_observed, 982 *received_info.missing_packets.rbegin()); 983 size_t cur_range_length = 0; 984 SequenceNumberSet::const_iterator iter = 985 received_info.missing_packets.begin(); 986 QuicPacketSequenceNumber last_missing = *iter; 987 ++iter; 988 for (; iter != received_info.missing_packets.end(); ++iter) { 989 if (cur_range_length != numeric_limits<uint8>::max() && 990 *iter == (last_missing + 1)) { 991 ++cur_range_length; 992 } else { 993 ack_info.nack_ranges[last_missing - cur_range_length] 994 = cur_range_length; 995 cur_range_length = 0; 996 } 997 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); 998 last_missing = *iter; 999 } 1000 // Include the last nack range. 1001 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; 1002 // Include the range to the largest observed. 1003 ack_info.max_delta = max(ack_info.max_delta, 1004 received_info.largest_observed - last_missing); 1005 } 1006 return ack_info; 1007} 1008 1009bool QuicFramer::ProcessPacketHeader( 1010 QuicPacketHeader* header, 1011 const QuicEncryptedPacket& packet) { 1012 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, 1013 &header->packet_sequence_number)) { 1014 set_detailed_error("Unable to read sequence number."); 1015 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1016 } 1017 1018 if (header->packet_sequence_number == 0u) { 1019 set_detailed_error("Packet sequence numbers cannot be 0."); 1020 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1021 } 1022 1023 if (!visitor_->OnUnauthenticatedHeader(*header)) { 1024 return false; 1025 } 1026 1027 if (!DecryptPayload(*header, packet)) { 1028 set_detailed_error("Unable to decrypt payload."); 1029 return RaiseError(QUIC_DECRYPTION_FAILURE); 1030 } 1031 1032 uint8 private_flags; 1033 if (!reader_->ReadBytes(&private_flags, 1)) { 1034 set_detailed_error("Unable to read private flags."); 1035 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1036 } 1037 1038 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { 1039 set_detailed_error("Illegal private flags value."); 1040 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1041 } 1042 1043 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; 1044 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; 1045 1046 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { 1047 header->is_in_fec_group = IN_FEC_GROUP; 1048 uint8 first_fec_protected_packet_offset; 1049 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { 1050 set_detailed_error("Unable to read first fec protected packet offset."); 1051 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1052 } 1053 if (first_fec_protected_packet_offset >= header->packet_sequence_number) { 1054 set_detailed_error("First fec protected packet offset must be less " 1055 "than the sequence number."); 1056 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1057 } 1058 header->fec_group = 1059 header->packet_sequence_number - first_fec_protected_packet_offset; 1060 } 1061 1062 header->entropy_hash = GetPacketEntropyHash(*header); 1063 // Set the last sequence number after we have decrypted the packet 1064 // so we are confident is not attacker controlled. 1065 last_sequence_number_ = header->packet_sequence_number; 1066 return true; 1067} 1068 1069bool QuicFramer::ProcessPacketSequenceNumber( 1070 QuicSequenceNumberLength sequence_number_length, 1071 QuicPacketSequenceNumber* sequence_number) { 1072 QuicPacketSequenceNumber wire_sequence_number = 0u; 1073 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) { 1074 return false; 1075 } 1076 1077 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers 1078 // in case the first guess is incorrect. 1079 *sequence_number = 1080 CalculatePacketSequenceNumberFromWire(sequence_number_length, 1081 wire_sequence_number); 1082 return true; 1083} 1084 1085bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) { 1086 if (reader_->IsDoneReading()) { 1087 set_detailed_error("Packet has no frames."); 1088 return RaiseError(QUIC_MISSING_PAYLOAD); 1089 } 1090 while (!reader_->IsDoneReading()) { 1091 uint8 frame_type; 1092 if (!reader_->ReadBytes(&frame_type, 1)) { 1093 set_detailed_error("Unable to read frame type."); 1094 return RaiseError(QUIC_INVALID_FRAME_DATA); 1095 } 1096 1097 if (frame_type & kQuicFrameTypeSpecialMask) { 1098 // Stream Frame 1099 if (frame_type & kQuicFrameTypeStreamMask) { 1100 QuicStreamFrame frame; 1101 if (!ProcessStreamFrame(frame_type, &frame)) { 1102 return RaiseError(QUIC_INVALID_STREAM_DATA); 1103 } 1104 if (!visitor_->OnStreamFrame(frame)) { 1105 DVLOG(1) << "Visitor asked to stop further processing."; 1106 // Returning true since there was no parsing error. 1107 return true; 1108 } 1109 continue; 1110 } 1111 1112 // Ack Frame 1113 if (frame_type & kQuicFrameTypeAckMask) { 1114 QuicAckFrame frame; 1115 if (!ProcessAckFrame(header, frame_type, &frame)) { 1116 return RaiseError(QUIC_INVALID_ACK_DATA); 1117 } 1118 if (!visitor_->OnAckFrame(frame)) { 1119 DVLOG(1) << "Visitor asked to stop further processing."; 1120 // Returning true since there was no parsing error. 1121 return true; 1122 } 1123 continue; 1124 } 1125 1126 // Congestion Feedback Frame 1127 if (frame_type & kQuicFrameTypeCongestionFeedbackMask) { 1128 QuicCongestionFeedbackFrame frame; 1129 if (!ProcessQuicCongestionFeedbackFrame(&frame)) { 1130 return RaiseError(QUIC_INVALID_CONGESTION_FEEDBACK_DATA); 1131 } 1132 if (!visitor_->OnCongestionFeedbackFrame(frame)) { 1133 DVLOG(1) << "Visitor asked to stop further processing."; 1134 // Returning true since there was no parsing error. 1135 return true; 1136 } 1137 continue; 1138 } 1139 1140 // This was a special frame type that did not match any 1141 // of the known ones. Error. 1142 set_detailed_error("Illegal frame type."); 1143 DLOG(WARNING) << "Illegal frame type: " 1144 << static_cast<int>(frame_type); 1145 return RaiseError(QUIC_INVALID_FRAME_DATA); 1146 } 1147 1148 switch (frame_type) { 1149 case PADDING_FRAME: 1150 // We're done with the packet. 1151 return true; 1152 1153 case RST_STREAM_FRAME: { 1154 QuicRstStreamFrame frame; 1155 if (!ProcessRstStreamFrame(&frame)) { 1156 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); 1157 } 1158 if (!visitor_->OnRstStreamFrame(frame)) { 1159 DVLOG(1) << "Visitor asked to stop further processing."; 1160 // Returning true since there was no parsing error. 1161 return true; 1162 } 1163 continue; 1164 } 1165 1166 case CONNECTION_CLOSE_FRAME: { 1167 QuicConnectionCloseFrame frame; 1168 if (!ProcessConnectionCloseFrame(&frame)) { 1169 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); 1170 } 1171 1172 if (!visitor_->OnConnectionCloseFrame(frame)) { 1173 DVLOG(1) << "Visitor asked to stop further processing."; 1174 // Returning true since there was no parsing error. 1175 return true; 1176 } 1177 continue; 1178 } 1179 1180 case GOAWAY_FRAME: { 1181 QuicGoAwayFrame goaway_frame; 1182 if (!ProcessGoAwayFrame(&goaway_frame)) { 1183 return RaiseError(QUIC_INVALID_GOAWAY_DATA); 1184 } 1185 if (!visitor_->OnGoAwayFrame(goaway_frame)) { 1186 DVLOG(1) << "Visitor asked to stop further processing."; 1187 // Returning true since there was no parsing error. 1188 return true; 1189 } 1190 continue; 1191 } 1192 1193 case WINDOW_UPDATE_FRAME: { 1194 if (quic_version_ > QUIC_VERSION_13) { 1195 QuicWindowUpdateFrame window_update_frame; 1196 if (!ProcessWindowUpdateFrame(&window_update_frame)) { 1197 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA); 1198 } 1199 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) { 1200 DVLOG(1) << "Visitor asked to stop further processing."; 1201 // Returning true since there was no parsing error. 1202 return true; 1203 } 1204 } else { 1205 LOG(DFATAL) << "Trying to read a WindowUpdateFrame in " 1206 << QuicVersionToString(quic_version_); 1207 return RaiseError(QUIC_INTERNAL_ERROR); 1208 } 1209 continue; 1210 } 1211 1212 case BLOCKED_FRAME: { 1213 if (quic_version_ > QUIC_VERSION_13) { 1214 QuicBlockedFrame blocked_frame; 1215 if (!ProcessBlockedFrame(&blocked_frame)) { 1216 return RaiseError(QUIC_INVALID_BLOCKED_DATA); 1217 } 1218 if (!visitor_->OnBlockedFrame(blocked_frame)) { 1219 DVLOG(1) << "Visitor asked to stop further processing."; 1220 // Returning true since there was no parsing error. 1221 return true; 1222 } 1223 } else { 1224 LOG(DFATAL) << "Trying to read a BlockedFrame in " 1225 << QuicVersionToString(quic_version_); 1226 return RaiseError(QUIC_INTERNAL_ERROR); 1227 } 1228 continue; 1229 } 1230 1231 default: 1232 set_detailed_error("Illegal frame type."); 1233 DLOG(WARNING) << "Illegal frame type: " 1234 << static_cast<int>(frame_type); 1235 return RaiseError(QUIC_INVALID_FRAME_DATA); 1236 } 1237 } 1238 1239 return true; 1240} 1241 1242bool QuicFramer::ProcessStreamFrame(uint8 frame_type, 1243 QuicStreamFrame* frame) { 1244 uint8 stream_flags = frame_type; 1245 1246 stream_flags &= ~kQuicFrameTypeStreamMask; 1247 1248 // Read from right to left: StreamID, Offset, Data Length, Fin. 1249 const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1; 1250 stream_flags >>= kQuicStreamIdShift; 1251 1252 uint8 offset_length = (stream_flags & kQuicStreamOffsetMask); 1253 // There is no encoding for 1 byte, only 0 and 2 through 8. 1254 if (offset_length > 0) { 1255 offset_length += 1; 1256 } 1257 stream_flags >>= kQuicStreamOffsetShift; 1258 1259 bool has_data_length = 1260 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; 1261 stream_flags >>= kQuicStreamDataLengthShift; 1262 1263 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; 1264 1265 frame->stream_id = 0; 1266 if (!reader_->ReadBytes(&frame->stream_id, stream_id_length)) { 1267 set_detailed_error("Unable to read stream_id."); 1268 return false; 1269 } 1270 1271 frame->offset = 0; 1272 if (!reader_->ReadBytes(&frame->offset, offset_length)) { 1273 set_detailed_error("Unable to read offset."); 1274 return false; 1275 } 1276 1277 StringPiece frame_data; 1278 if (has_data_length) { 1279 if (!reader_->ReadStringPiece16(&frame_data)) { 1280 set_detailed_error("Unable to read frame data."); 1281 return false; 1282 } 1283 } else { 1284 if (!reader_->ReadStringPiece(&frame_data, reader_->BytesRemaining())) { 1285 set_detailed_error("Unable to read frame data."); 1286 return false; 1287 } 1288 } 1289 // Point frame to the right data. 1290 frame->data.Clear(); 1291 if (!frame_data.empty()) { 1292 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); 1293 } 1294 1295 return true; 1296} 1297 1298bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, 1299 uint8 frame_type, 1300 QuicAckFrame* frame) { 1301 if (!ProcessSentInfo(header, &frame->sent_info)) { 1302 return false; 1303 } 1304 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { 1305 return false; 1306 } 1307 return true; 1308} 1309 1310bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, 1311 ReceivedPacketInfo* received_info) { 1312 // Determine the three lengths from the frame type: largest observed length, 1313 // missing sequence number length, and missing range length. 1314 const QuicSequenceNumberLength missing_sequence_number_length = 1315 ReadSequenceNumberLength(frame_type); 1316 frame_type >>= kQuicSequenceNumberLengthShift; 1317 const QuicSequenceNumberLength largest_observed_sequence_number_length = 1318 ReadSequenceNumberLength(frame_type); 1319 frame_type >>= kQuicSequenceNumberLengthShift; 1320 received_info->is_truncated = frame_type & kQuicAckTruncatedMask; 1321 frame_type >>= kQuicAckTruncatedShift; 1322 bool has_nacks = frame_type & kQuicHasNacksMask; 1323 1324 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { 1325 set_detailed_error("Unable to read entropy hash for received packets."); 1326 return false; 1327 } 1328 1329 if (!reader_->ReadBytes(&received_info->largest_observed, 1330 largest_observed_sequence_number_length)) { 1331 set_detailed_error("Unable to read largest observed."); 1332 return false; 1333 } 1334 1335 uint64 delta_time_largest_observed_us; 1336 if (!reader_->ReadUFloat16(&delta_time_largest_observed_us)) { 1337 set_detailed_error("Unable to read delta time largest observed."); 1338 return false; 1339 } 1340 1341 if (delta_time_largest_observed_us == kUFloat16MaxValue) { 1342 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite(); 1343 } else { 1344 received_info->delta_time_largest_observed = 1345 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us); 1346 } 1347 1348 if (!has_nacks) { 1349 return true; 1350 } 1351 1352 uint8 num_missing_ranges; 1353 if (!reader_->ReadBytes(&num_missing_ranges, 1)) { 1354 set_detailed_error("Unable to read num missing packet ranges."); 1355 return false; 1356 } 1357 1358 QuicPacketSequenceNumber last_sequence_number = 1359 received_info->largest_observed; 1360 for (size_t i = 0; i < num_missing_ranges; ++i) { 1361 QuicPacketSequenceNumber missing_delta = 0; 1362 if (!reader_->ReadBytes(&missing_delta, missing_sequence_number_length)) { 1363 set_detailed_error("Unable to read missing sequence number delta."); 1364 return false; 1365 } 1366 last_sequence_number -= missing_delta; 1367 QuicPacketSequenceNumber range_length = 0; 1368 if (!reader_->ReadBytes(&range_length, PACKET_1BYTE_SEQUENCE_NUMBER)) { 1369 set_detailed_error("Unable to read missing sequence number range."); 1370 return false; 1371 } 1372 for (size_t i = 0; i <= range_length; ++i) { 1373 received_info->missing_packets.insert(last_sequence_number - i); 1374 } 1375 // Subtract an extra 1 to ensure ranges are represented efficiently and 1376 // can't overlap by 1 sequence number. This allows a missing_delta of 0 1377 // to represent an adjacent nack range. 1378 last_sequence_number -= (range_length + 1); 1379 } 1380 1381 if (quic_version_ > QUIC_VERSION_14) { 1382 // Parse the revived packets list. 1383 uint8 num_revived_packets; 1384 if (!reader_->ReadBytes(&num_revived_packets, 1)) { 1385 set_detailed_error("Unable to read num revived packets."); 1386 return false; 1387 } 1388 1389 for (size_t i = 0; i < num_revived_packets; ++i) { 1390 QuicPacketSequenceNumber revived_packet = 0; 1391 if (!reader_->ReadBytes(&revived_packet, 1392 largest_observed_sequence_number_length)) { 1393 set_detailed_error("Unable to read revived packet."); 1394 return false; 1395 } 1396 1397 received_info->revived_packets.insert(revived_packet); 1398 } 1399 } 1400 1401 return true; 1402} 1403 1404bool QuicFramer::ProcessSentInfo(const QuicPacketHeader& header, 1405 SentPacketInfo* sent_info) { 1406 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) { 1407 set_detailed_error("Unable to read entropy hash for sent packets."); 1408 return false; 1409 } 1410 1411 QuicPacketSequenceNumber least_unacked_delta = 0; 1412 if (!reader_->ReadBytes(&least_unacked_delta, 1413 header.public_header.sequence_number_length)) { 1414 set_detailed_error("Unable to read least unacked delta."); 1415 return false; 1416 } 1417 DCHECK_GE(header.packet_sequence_number, least_unacked_delta); 1418 sent_info->least_unacked = 1419 header.packet_sequence_number - least_unacked_delta; 1420 1421 return true; 1422} 1423 1424bool QuicFramer::ProcessQuicCongestionFeedbackFrame( 1425 QuicCongestionFeedbackFrame* frame) { 1426 uint8 feedback_type; 1427 if (!reader_->ReadBytes(&feedback_type, 1)) { 1428 set_detailed_error("Unable to read congestion feedback type."); 1429 return false; 1430 } 1431 frame->type = 1432 static_cast<CongestionFeedbackType>(feedback_type); 1433 1434 switch (frame->type) { 1435 case kInterArrival: { 1436 CongestionFeedbackMessageInterArrival* inter_arrival = 1437 &frame->inter_arrival; 1438 if (quic_version_ <= QUIC_VERSION_14) { 1439 uint16 unused_accumulated_number_of_lost_packets; 1440 if (!reader_->ReadUInt16( 1441 &unused_accumulated_number_of_lost_packets)) { 1442 set_detailed_error( 1443 "Unable to read accumulated number of lost packets."); 1444 return false; 1445 } 1446 } 1447 uint8 num_received_packets; 1448 if (!reader_->ReadBytes(&num_received_packets, 1)) { 1449 set_detailed_error("Unable to read num received packets."); 1450 return false; 1451 } 1452 1453 if (num_received_packets > 0u) { 1454 uint64 smallest_received; 1455 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, 1456 &smallest_received)) { 1457 set_detailed_error("Unable to read smallest received."); 1458 return false; 1459 } 1460 1461 uint64 time_received_us; 1462 if (!reader_->ReadUInt64(&time_received_us)) { 1463 set_detailed_error("Unable to read time received."); 1464 return false; 1465 } 1466 QuicTime time_received = creation_time_.Add( 1467 QuicTime::Delta::FromMicroseconds(time_received_us)); 1468 1469 inter_arrival->received_packet_times.insert( 1470 make_pair(smallest_received, time_received)); 1471 1472 for (uint8 i = 0; i < num_received_packets - 1; ++i) { 1473 uint16 sequence_delta; 1474 if (!reader_->ReadUInt16(&sequence_delta)) { 1475 set_detailed_error( 1476 "Unable to read sequence delta in received packets."); 1477 return false; 1478 } 1479 1480 int32 time_delta_us; 1481 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1482 set_detailed_error( 1483 "Unable to read time delta in received packets."); 1484 return false; 1485 } 1486 QuicPacketSequenceNumber packet = smallest_received + sequence_delta; 1487 inter_arrival->received_packet_times.insert( 1488 make_pair(packet, time_received.Add( 1489 QuicTime::Delta::FromMicroseconds(time_delta_us)))); 1490 } 1491 } 1492 break; 1493 } 1494 case kFixRate: { 1495 uint32 bitrate = 0; 1496 if (!reader_->ReadUInt32(&bitrate)) { 1497 set_detailed_error("Unable to read bitrate."); 1498 return false; 1499 } 1500 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); 1501 break; 1502 } 1503 case kTCP: { 1504 CongestionFeedbackMessageTCP* tcp = &frame->tcp; 1505 if (quic_version_ <= QUIC_VERSION_14) { 1506 uint16 unused_accumulated_number_of_lost_packets; 1507 if (!reader_->ReadUInt16(&unused_accumulated_number_of_lost_packets)) { 1508 set_detailed_error( 1509 "Unable to read accumulated number of lost packets."); 1510 return false; 1511 } 1512 } 1513 // TODO(ianswett): Remove receive window, since it's constant. 1514 uint16 receive_window = 0; 1515 if (!reader_->ReadUInt16(&receive_window)) { 1516 set_detailed_error("Unable to read receive window."); 1517 return false; 1518 } 1519 // Simple bit packing, don't send the 4 least significant bits. 1520 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 1521 break; 1522 } 1523 default: 1524 set_detailed_error("Illegal congestion feedback type."); 1525 DLOG(WARNING) << "Illegal congestion feedback type: " 1526 << frame->type; 1527 return RaiseError(QUIC_INVALID_FRAME_DATA); 1528 } 1529 1530 return true; 1531} 1532 1533bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) { 1534 if (!reader_->ReadUInt32(&frame->stream_id)) { 1535 set_detailed_error("Unable to read stream_id."); 1536 return false; 1537 } 1538 1539 if (quic_version_ > QUIC_VERSION_13) { 1540 if (!reader_->ReadUInt64(&frame->byte_offset)) { 1541 set_detailed_error("Unable to read rst stream sent byte offset."); 1542 return false; 1543 } 1544 } 1545 1546 uint32 error_code; 1547 if (!reader_->ReadUInt32(&error_code)) { 1548 set_detailed_error("Unable to read rst stream error code."); 1549 return false; 1550 } 1551 1552 if (error_code >= QUIC_STREAM_LAST_ERROR || 1553 error_code < QUIC_STREAM_NO_ERROR) { 1554 set_detailed_error("Invalid rst stream error code."); 1555 return false; 1556 } 1557 1558 frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code); 1559 1560 StringPiece error_details; 1561 if (!reader_->ReadStringPiece16(&error_details)) { 1562 set_detailed_error("Unable to read rst stream error details."); 1563 return false; 1564 } 1565 frame->error_details = error_details.as_string(); 1566 1567 return true; 1568} 1569 1570bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) { 1571 uint32 error_code; 1572 if (!reader_->ReadUInt32(&error_code)) { 1573 set_detailed_error("Unable to read connection close error code."); 1574 return false; 1575 } 1576 1577 if (error_code >= QUIC_LAST_ERROR || 1578 error_code < QUIC_NO_ERROR) { 1579 set_detailed_error("Invalid error code."); 1580 return false; 1581 } 1582 1583 frame->error_code = static_cast<QuicErrorCode>(error_code); 1584 1585 StringPiece error_details; 1586 if (!reader_->ReadStringPiece16(&error_details)) { 1587 set_detailed_error("Unable to read connection close error details."); 1588 return false; 1589 } 1590 frame->error_details = error_details.as_string(); 1591 1592 return true; 1593} 1594 1595bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { 1596 uint32 error_code; 1597 if (!reader_->ReadUInt32(&error_code)) { 1598 set_detailed_error("Unable to read go away error code."); 1599 return false; 1600 } 1601 frame->error_code = static_cast<QuicErrorCode>(error_code); 1602 1603 if (error_code >= QUIC_LAST_ERROR || 1604 error_code < QUIC_NO_ERROR) { 1605 set_detailed_error("Invalid error code."); 1606 return false; 1607 } 1608 1609 uint32 stream_id; 1610 if (!reader_->ReadUInt32(&stream_id)) { 1611 set_detailed_error("Unable to read last good stream id."); 1612 return false; 1613 } 1614 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id); 1615 1616 StringPiece reason_phrase; 1617 if (!reader_->ReadStringPiece16(&reason_phrase)) { 1618 set_detailed_error("Unable to read goaway reason."); 1619 return false; 1620 } 1621 frame->reason_phrase = reason_phrase.as_string(); 1622 1623 return true; 1624} 1625 1626bool QuicFramer::ProcessWindowUpdateFrame(QuicWindowUpdateFrame* frame) { 1627 if (!reader_->ReadUInt32(&frame->stream_id)) { 1628 set_detailed_error("Unable to read stream_id."); 1629 return false; 1630 } 1631 1632 if (!reader_->ReadUInt64(&frame->byte_offset)) { 1633 set_detailed_error("Unable to read window byte_offset."); 1634 return false; 1635 } 1636 1637 return true; 1638} 1639 1640bool QuicFramer::ProcessBlockedFrame(QuicBlockedFrame* frame) { 1641 if (!reader_->ReadUInt32(&frame->stream_id)) { 1642 set_detailed_error("Unable to read stream_id."); 1643 return false; 1644 } 1645 1646 return true; 1647} 1648 1649// static 1650StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( 1651 const QuicEncryptedPacket& encrypted, 1652 QuicGuidLength guid_length, 1653 bool includes_version, 1654 QuicSequenceNumberLength sequence_number_length) { 1655 return StringPiece(encrypted.data() + kStartOfHashData, 1656 GetStartOfEncryptedData( 1657 guid_length, includes_version, sequence_number_length) 1658 - kStartOfHashData); 1659} 1660 1661void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) { 1662 DCHECK(alternative_decrypter_.get() == NULL); 1663 decrypter_.reset(decrypter); 1664} 1665 1666void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, 1667 bool latch_once_used) { 1668 alternative_decrypter_.reset(decrypter); 1669 alternative_decrypter_latch_ = latch_once_used; 1670} 1671 1672const QuicDecrypter* QuicFramer::decrypter() const { 1673 return decrypter_.get(); 1674} 1675 1676const QuicDecrypter* QuicFramer::alternative_decrypter() const { 1677 return alternative_decrypter_.get(); 1678} 1679 1680void QuicFramer::SetEncrypter(EncryptionLevel level, 1681 QuicEncrypter* encrypter) { 1682 DCHECK_GE(level, 0); 1683 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); 1684 encrypter_[level].reset(encrypter); 1685} 1686 1687const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { 1688 DCHECK_GE(level, 0); 1689 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); 1690 DCHECK(encrypter_[level].get() != NULL); 1691 return encrypter_[level].get(); 1692} 1693 1694void QuicFramer::SwapCryptersForTest(QuicFramer* other) { 1695 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { 1696 encrypter_[i].swap(other->encrypter_[i]); 1697 } 1698 decrypter_.swap(other->decrypter_); 1699 alternative_decrypter_.swap(other->alternative_decrypter_); 1700 1701 const bool other_latch = other->alternative_decrypter_latch_; 1702 other->alternative_decrypter_latch_ = alternative_decrypter_latch_; 1703 alternative_decrypter_latch_ = other_latch; 1704} 1705 1706QuicEncryptedPacket* QuicFramer::EncryptPacket( 1707 EncryptionLevel level, 1708 QuicPacketSequenceNumber packet_sequence_number, 1709 const QuicPacket& packet) { 1710 DCHECK(encrypter_[level].get() != NULL); 1711 1712 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( 1713 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); 1714 if (out.get() == NULL) { 1715 RaiseError(QUIC_ENCRYPTION_FAILURE); 1716 return NULL; 1717 } 1718 StringPiece header_data = packet.BeforePlaintext(); 1719 size_t len = header_data.length() + out->length(); 1720 char* buffer = new char[len]; 1721 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). 1722 memcpy(buffer, header_data.data(), header_data.length()); 1723 memcpy(buffer + header_data.length(), out->data(), out->length()); 1724 return new QuicEncryptedPacket(buffer, len, true); 1725} 1726 1727size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { 1728 // In order to keep the code simple, we don't have the current encryption 1729 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. 1730 size_t min_plaintext_size = ciphertext_size; 1731 1732 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { 1733 if (encrypter_[i].get() != NULL) { 1734 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); 1735 if (size < min_plaintext_size) { 1736 min_plaintext_size = size; 1737 } 1738 } 1739 } 1740 1741 return min_plaintext_size; 1742} 1743 1744bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, 1745 const QuicEncryptedPacket& packet) { 1746 StringPiece encrypted; 1747 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { 1748 return false; 1749 } 1750 DCHECK(decrypter_.get() != NULL); 1751 decrypted_.reset(decrypter_->DecryptPacket( 1752 header.packet_sequence_number, 1753 GetAssociatedDataFromEncryptedPacket( 1754 packet, 1755 header.public_header.guid_length, 1756 header.public_header.version_flag, 1757 header.public_header.sequence_number_length), 1758 encrypted)); 1759 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { 1760 decrypted_.reset(alternative_decrypter_->DecryptPacket( 1761 header.packet_sequence_number, 1762 GetAssociatedDataFromEncryptedPacket( 1763 packet, 1764 header.public_header.guid_length, 1765 header.public_header.version_flag, 1766 header.public_header.sequence_number_length), 1767 encrypted)); 1768 if (decrypted_.get() != NULL) { 1769 if (alternative_decrypter_latch_) { 1770 // Switch to the alternative decrypter and latch so that we cannot 1771 // switch back. 1772 decrypter_.reset(alternative_decrypter_.release()); 1773 } else { 1774 // Switch the alternative decrypter so that we use it first next time. 1775 decrypter_.swap(alternative_decrypter_); 1776 } 1777 } 1778 } 1779 1780 if (decrypted_.get() == NULL) { 1781 return false; 1782 } 1783 1784 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); 1785 return true; 1786} 1787 1788size_t QuicFramer::GetAckFrameSize( 1789 const QuicAckFrame& ack, 1790 QuicSequenceNumberLength sequence_number_length) { 1791 AckFrameInfo ack_info = GetAckFrameInfo(ack); 1792 QuicSequenceNumberLength largest_observed_length = 1793 GetMinSequenceNumberLength(ack.received_info.largest_observed); 1794 QuicSequenceNumberLength missing_sequence_number_length = 1795 GetMinSequenceNumberLength(ack_info.max_delta); 1796 1797 size_t ack_size = GetMinAckFrameSize(quic_version_, 1798 sequence_number_length, 1799 largest_observed_length); 1800 if (!ack_info.nack_ranges.empty()) { 1801 ack_size += kNumberOfMissingPacketsSize + 1802 (quic_version_ <= QUIC_VERSION_14 ? 0 : kNumberOfRevivedPacketsSize); 1803 ack_size += ack_info.nack_ranges.size() * 1804 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); 1805 ack_size += 1806 ack.received_info.revived_packets.size() * largest_observed_length; 1807 } 1808 return ack_size; 1809} 1810 1811size_t QuicFramer::ComputeFrameLength( 1812 const QuicFrame& frame, 1813 bool last_frame_in_packet, 1814 QuicSequenceNumberLength sequence_number_length) { 1815 switch (frame.type) { 1816 case STREAM_FRAME: 1817 return GetMinStreamFrameSize(quic_version_, 1818 frame.stream_frame->stream_id, 1819 frame.stream_frame->offset, 1820 last_frame_in_packet) + 1821 frame.stream_frame->data.TotalBufferSize(); 1822 case ACK_FRAME: { 1823 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); 1824 } 1825 case CONGESTION_FEEDBACK_FRAME: { 1826 size_t len = kQuicFrameTypeSize; 1827 const QuicCongestionFeedbackFrame& congestion_feedback = 1828 *frame.congestion_feedback_frame; 1829 len += 1; // Congestion feedback type. 1830 1831 switch (congestion_feedback.type) { 1832 case kInterArrival: { 1833 const CongestionFeedbackMessageInterArrival& inter_arrival = 1834 congestion_feedback.inter_arrival; 1835 if (quic_version_ <= QUIC_VERSION_14) { 1836 len += 2; // Accumulated number of lost packets. 1837 } 1838 len += 1; // Number received packets. 1839 if (inter_arrival.received_packet_times.size() > 0) { 1840 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. 1841 len += 8; // Time. 1842 // 2 bytes per sequence number delta plus 4 bytes per delta time. 1843 len += PACKET_6BYTE_SEQUENCE_NUMBER * 1844 (inter_arrival.received_packet_times.size() - 1); 1845 } 1846 break; 1847 } 1848 case kFixRate: 1849 len += 4; // Bitrate. 1850 break; 1851 case kTCP: 1852 if (quic_version_ <= QUIC_VERSION_14) { 1853 len += 2; // Accumulated number of lost packets. 1854 } 1855 len += 2; // Receive window. 1856 break; 1857 default: 1858 set_detailed_error("Illegal feedback type."); 1859 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1860 break; 1861 } 1862 return len; 1863 } 1864 case RST_STREAM_FRAME: 1865 return GetMinRstStreamFrameSize(quic_version_) + 1866 frame.rst_stream_frame->error_details.size(); 1867 case CONNECTION_CLOSE_FRAME: 1868 return GetMinConnectionCloseFrameSize() + 1869 frame.connection_close_frame->error_details.size(); 1870 case GOAWAY_FRAME: 1871 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); 1872 case WINDOW_UPDATE_FRAME: 1873 return GetWindowUpdateFrameSize(); 1874 case BLOCKED_FRAME: 1875 return GetBlockedFrameSize(); 1876 case PADDING_FRAME: 1877 DCHECK(false); 1878 return 0; 1879 case NUM_FRAME_TYPES: 1880 DCHECK(false); 1881 return 0; 1882 } 1883 1884 // Not reachable, but some Chrome compilers can't figure that out. *sigh* 1885 DCHECK(false); 1886 return 0; 1887} 1888 1889bool QuicFramer::AppendTypeByte(const QuicFrame& frame, 1890 bool last_frame_in_packet, 1891 QuicDataWriter* writer) { 1892 uint8 type_byte = 0; 1893 switch (frame.type) { 1894 case STREAM_FRAME: { 1895 if (frame.stream_frame == NULL) { 1896 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; 1897 } 1898 // Fin bit. 1899 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; 1900 1901 // Data Length bit. 1902 type_byte <<= kQuicStreamDataLengthShift; 1903 type_byte |= last_frame_in_packet ? 0 : kQuicStreamDataLengthMask; 1904 1905 // Offset 3 bits. 1906 type_byte <<= kQuicStreamOffsetShift; 1907 const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset); 1908 if (offset_len > 0) { 1909 type_byte |= offset_len - 1; 1910 } 1911 1912 // stream id 2 bits. 1913 type_byte <<= kQuicStreamIdShift; 1914 type_byte |= GetStreamIdSize(frame.stream_frame->stream_id) - 1; 1915 type_byte |= kQuicFrameTypeStreamMask; // Set Stream Frame Type to 1. 1916 break; 1917 } 1918 case ACK_FRAME: 1919 return true; 1920 case CONGESTION_FEEDBACK_FRAME: { 1921 // TODO(ianswett): Use extra 5 bits in the congestion feedback framing. 1922 type_byte = kQuicFrameTypeCongestionFeedbackMask; 1923 break; 1924 } 1925 default: 1926 type_byte = frame.type; 1927 break; 1928 } 1929 1930 return writer->WriteUInt8(type_byte); 1931} 1932 1933// static 1934bool QuicFramer::AppendPacketSequenceNumber( 1935 QuicSequenceNumberLength sequence_number_length, 1936 QuicPacketSequenceNumber packet_sequence_number, 1937 QuicDataWriter* writer) { 1938 // Ensure the entire sequence number can be written. 1939 if (writer->capacity() - writer->length() < 1940 static_cast<size_t>(sequence_number_length)) { 1941 return false; 1942 } 1943 switch (sequence_number_length) { 1944 case PACKET_1BYTE_SEQUENCE_NUMBER: 1945 return writer->WriteUInt8( 1946 packet_sequence_number & k1ByteSequenceNumberMask); 1947 break; 1948 case PACKET_2BYTE_SEQUENCE_NUMBER: 1949 return writer->WriteUInt16( 1950 packet_sequence_number & k2ByteSequenceNumberMask); 1951 break; 1952 case PACKET_4BYTE_SEQUENCE_NUMBER: 1953 return writer->WriteUInt32( 1954 packet_sequence_number & k4ByteSequenceNumberMask); 1955 break; 1956 case PACKET_6BYTE_SEQUENCE_NUMBER: 1957 return writer->WriteUInt48( 1958 packet_sequence_number & k6ByteSequenceNumberMask); 1959 break; 1960 default: 1961 DCHECK(false) << "sequence_number_length: " << sequence_number_length; 1962 return false; 1963 } 1964} 1965 1966bool QuicFramer::AppendStreamFrame( 1967 const QuicStreamFrame& frame, 1968 bool last_frame_in_packet, 1969 QuicDataWriter* writer) { 1970 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { 1971 return false; 1972 } 1973 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { 1974 return false; 1975 } 1976 if (!last_frame_in_packet) { 1977 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { 1978 return false; 1979 } 1980 } 1981 1982 if (!writer->WriteIOVector(frame.data)) { 1983 return false; 1984 } 1985 return true; 1986} 1987 1988// static 1989void QuicFramer::set_version(const QuicVersion version) { 1990 DCHECK(IsSupportedVersion(version)); 1991 quic_version_ = version; 1992} 1993 1994bool QuicFramer::AppendAckFrameAndTypeByte( 1995 const QuicPacketHeader& header, 1996 const QuicAckFrame& frame, 1997 QuicDataWriter* writer) { 1998 AckFrameInfo ack_info = GetAckFrameInfo(frame); 1999 QuicPacketSequenceNumber ack_largest_observed = 2000 frame.received_info.largest_observed; 2001 QuicSequenceNumberLength largest_observed_length = 2002 GetMinSequenceNumberLength(ack_largest_observed); 2003 QuicSequenceNumberLength missing_sequence_number_length = 2004 GetMinSequenceNumberLength(ack_info.max_delta); 2005 // Determine whether we need to truncate ranges. 2006 size_t available_range_bytes = writer->capacity() - writer->length() - 2007 GetMinAckFrameSize(quic_version_, 2008 header.public_header.sequence_number_length, 2009 largest_observed_length) - 2010 (quic_version_ <= QUIC_VERSION_14 ? 0 : kNumberOfRevivedPacketsSize); 2011 size_t max_num_ranges = available_range_bytes / 2012 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); 2013 max_num_ranges = 2014 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); 2015 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; 2016 DVLOG_IF(1, truncated) << "Truncating ack from " 2017 << ack_info.nack_ranges.size() << " ranges to " 2018 << max_num_ranges; 2019 2020 // Write out the type byte by setting the low order bits and doing shifts 2021 // to make room for the next bit flags to be set. 2022 // Whether there are any nacks. 2023 uint8 type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask; 2024 2025 // truncating bit. 2026 type_byte <<= kQuicAckTruncatedShift; 2027 type_byte |= truncated ? kQuicAckTruncatedMask : 0; 2028 2029 // Largest observed sequence number length. 2030 type_byte <<= kQuicSequenceNumberLengthShift; 2031 type_byte |= GetSequenceNumberFlags(largest_observed_length); 2032 2033 // Missing sequence number length. 2034 type_byte <<= kQuicSequenceNumberLengthShift; 2035 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); 2036 2037 type_byte |= kQuicFrameTypeAckMask; 2038 2039 if (!writer->WriteUInt8(type_byte)) { 2040 return false; 2041 } 2042 2043 // TODO(satyamshekhar): Decide how often we really should send this 2044 // entropy_hash update. 2045 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) { 2046 return false; 2047 } 2048 2049 DCHECK_GE(header.packet_sequence_number, frame.sent_info.least_unacked); 2050 const QuicPacketSequenceNumber least_unacked_delta = 2051 header.packet_sequence_number - frame.sent_info.least_unacked; 2052 const QuicPacketSequenceNumber length_shift = 2053 header.public_header.sequence_number_length * 8; 2054 if (least_unacked_delta >> length_shift > 0) { 2055 LOG(DFATAL) << "sequence_number_length " 2056 << header.public_header.sequence_number_length 2057 << " is too small for least_unacked_delta: " 2058 << least_unacked_delta; 2059 return false; 2060 } 2061 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, 2062 least_unacked_delta, writer)) { 2063 return false; 2064 } 2065 2066 const ReceivedPacketInfo& received_info = frame.received_info; 2067 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; 2068 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); 2069 if (truncated) { 2070 // Skip the nack ranges which the truncated ack won't include and set 2071 // a correct largest observed for the truncated ack. 2072 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); 2073 ++i) { 2074 ++ack_iter; 2075 } 2076 // If the last range is followed by acks, include them. 2077 // If the last range is followed by another range, specify the end of the 2078 // range as the largest_observed. 2079 ack_largest_observed = ack_iter->first - 1; 2080 // Also update the entropy so it matches the largest observed. 2081 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); 2082 ++ack_iter; 2083 } 2084 2085 if (!writer->WriteUInt8(ack_entropy_hash)) { 2086 return false; 2087 } 2088 2089 if (!AppendPacketSequenceNumber(largest_observed_length, 2090 ack_largest_observed, writer)) { 2091 return false; 2092 } 2093 2094 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; 2095 if (!received_info.delta_time_largest_observed.IsInfinite()) { 2096 DCHECK_LE(0u, 2097 frame.received_info.delta_time_largest_observed.ToMicroseconds()); 2098 delta_time_largest_observed_us = 2099 received_info.delta_time_largest_observed.ToMicroseconds(); 2100 } 2101 2102 if (!writer->WriteUFloat16(delta_time_largest_observed_us)) { 2103 return false; 2104 } 2105 2106 if (ack_info.nack_ranges.empty()) { 2107 return true; 2108 } 2109 2110 const uint8 num_missing_ranges = 2111 min(ack_info.nack_ranges.size(), max_num_ranges); 2112 if (!writer->WriteBytes(&num_missing_ranges, 1)) { 2113 return false; 2114 } 2115 2116 int num_ranges_written = 0; 2117 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; 2118 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { 2119 // Calculate the delta to the last number in the range. 2120 QuicPacketSequenceNumber missing_delta = 2121 last_sequence_written - (ack_iter->first + ack_iter->second); 2122 if (!AppendPacketSequenceNumber(missing_sequence_number_length, 2123 missing_delta, writer)) { 2124 return false; 2125 } 2126 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, 2127 ack_iter->second, writer)) { 2128 return false; 2129 } 2130 // Subtract 1 so a missing_delta of 0 means an adjacent range. 2131 last_sequence_written = ack_iter->first - 1; 2132 ++num_ranges_written; 2133 } 2134 DCHECK_EQ(num_missing_ranges, num_ranges_written); 2135 2136 if (quic_version_ > QUIC_VERSION_14) { 2137 // Append revived packets. 2138 // If not all the revived packets fit, only mention the ones that do. 2139 uint8 num_revived_packets = 2140 min(received_info.revived_packets.size(), 2141 static_cast<size_t>(numeric_limits<uint8>::max())); 2142 num_revived_packets = min( 2143 static_cast<size_t>(num_revived_packets), 2144 (writer->capacity() - writer->length()) / largest_observed_length); 2145 if (!writer->WriteBytes(&num_revived_packets, 1)) { 2146 return false; 2147 } 2148 2149 SequenceNumberSet::const_iterator iter = 2150 received_info.revived_packets.begin(); 2151 for (int i = 0; i < num_revived_packets; ++i, ++iter) { 2152 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter)); 2153 if (!AppendPacketSequenceNumber(largest_observed_length, 2154 *iter, writer)) { 2155 return false; 2156 } 2157 } 2158 } 2159 2160 return true; 2161} 2162 2163bool QuicFramer::AppendQuicCongestionFeedbackFrame( 2164 const QuicCongestionFeedbackFrame& frame, 2165 QuicDataWriter* writer) { 2166 if (!writer->WriteBytes(&frame.type, 1)) { 2167 return false; 2168 } 2169 2170 switch (frame.type) { 2171 case kInterArrival: { 2172 const CongestionFeedbackMessageInterArrival& inter_arrival = 2173 frame.inter_arrival; 2174 if (quic_version_ <= QUIC_VERSION_14) { 2175 // accumulated_number_of_lost_packets is removed. Always write 0. 2176 if (!writer->WriteUInt16(0)) { 2177 return false; 2178 } 2179 } 2180 DCHECK_GE(numeric_limits<uint8>::max(), 2181 inter_arrival.received_packet_times.size()); 2182 if (inter_arrival.received_packet_times.size() > 2183 numeric_limits<uint8>::max()) { 2184 return false; 2185 } 2186 // TODO(ianswett): Make num_received_packets a varint. 2187 uint8 num_received_packets = 2188 inter_arrival.received_packet_times.size(); 2189 if (!writer->WriteBytes(&num_received_packets, 1)) { 2190 return false; 2191 } 2192 if (num_received_packets > 0) { 2193 TimeMap::const_iterator it = 2194 inter_arrival.received_packet_times.begin(); 2195 2196 QuicPacketSequenceNumber lowest_sequence = it->first; 2197 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, 2198 lowest_sequence, writer)) { 2199 return false; 2200 } 2201 2202 QuicTime lowest_time = it->second; 2203 if (!writer->WriteUInt64( 2204 lowest_time.Subtract(creation_time_).ToMicroseconds())) { 2205 return false; 2206 } 2207 2208 for (++it; it != inter_arrival.received_packet_times.end(); ++it) { 2209 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence; 2210 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta); 2211 if (sequence_delta > numeric_limits<uint16>::max()) { 2212 return false; 2213 } 2214 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) { 2215 return false; 2216 } 2217 2218 int32 time_delta_us = 2219 it->second.Subtract(lowest_time).ToMicroseconds(); 2220 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { 2221 return false; 2222 } 2223 } 2224 } 2225 break; 2226 } 2227 case kFixRate: { 2228 const CongestionFeedbackMessageFixRate& fix_rate = 2229 frame.fix_rate; 2230 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { 2231 return false; 2232 } 2233 break; 2234 } 2235 case kTCP: { 2236 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2237 DCHECK_LE(tcp.receive_window, 1u << 20); 2238 // Simple bit packing, don't send the 4 least significant bits. 2239 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2240 if (quic_version_ <= QUIC_VERSION_14) { 2241 // accumulated_number_of_lost_packets is removed. Always write 0. 2242 if (!writer->WriteUInt16(0)) { 2243 return false; 2244 } 2245 } 2246 if (!writer->WriteUInt16(receive_window)) { 2247 return false; 2248 } 2249 break; 2250 } 2251 default: 2252 return false; 2253 } 2254 2255 return true; 2256} 2257 2258bool QuicFramer::AppendRstStreamFrame( 2259 const QuicRstStreamFrame& frame, 2260 QuicDataWriter* writer) { 2261 if (!writer->WriteUInt32(frame.stream_id)) { 2262 return false; 2263 } 2264 2265 if (quic_version_ > QUIC_VERSION_13) { 2266 if (!writer->WriteUInt64(frame.byte_offset)) { 2267 return false; 2268 } 2269 } 2270 2271 uint32 error_code = static_cast<uint32>(frame.error_code); 2272 if (!writer->WriteUInt32(error_code)) { 2273 return false; 2274 } 2275 2276 if (!writer->WriteStringPiece16(frame.error_details)) { 2277 return false; 2278 } 2279 return true; 2280} 2281 2282bool QuicFramer::AppendConnectionCloseFrame( 2283 const QuicConnectionCloseFrame& frame, 2284 QuicDataWriter* writer) { 2285 uint32 error_code = static_cast<uint32>(frame.error_code); 2286 if (!writer->WriteUInt32(error_code)) { 2287 return false; 2288 } 2289 if (!writer->WriteStringPiece16(frame.error_details)) { 2290 return false; 2291 } 2292 return true; 2293} 2294 2295bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame, 2296 QuicDataWriter* writer) { 2297 uint32 error_code = static_cast<uint32>(frame.error_code); 2298 if (!writer->WriteUInt32(error_code)) { 2299 return false; 2300 } 2301 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); 2302 if (!writer->WriteUInt32(stream_id)) { 2303 return false; 2304 } 2305 if (!writer->WriteStringPiece16(frame.reason_phrase)) { 2306 return false; 2307 } 2308 return true; 2309} 2310 2311bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame, 2312 QuicDataWriter* writer) { 2313 uint32 stream_id = static_cast<uint32>(frame.stream_id); 2314 if (!writer->WriteUInt32(stream_id)) { 2315 return false; 2316 } 2317 if (!writer->WriteUInt64(frame.byte_offset)) { 2318 return false; 2319 } 2320 return true; 2321} 2322 2323bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame, 2324 QuicDataWriter* writer) { 2325 uint32 stream_id = static_cast<uint32>(frame.stream_id); 2326 if (!writer->WriteUInt32(stream_id)) { 2327 return false; 2328 } 2329 return true; 2330} 2331 2332bool QuicFramer::RaiseError(QuicErrorCode error) { 2333 DVLOG(1) << "Error detail: " << detailed_error_; 2334 set_error(error); 2335 visitor_->OnError(this); 2336 reader_.reset(NULL); 2337 return false; 2338} 2339 2340} // namespace net 2341