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

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

Issue 2850573002: Landing Recent QUIC changes until 3:35 PM, Apr 26, 2017 UTC-4 (Closed)
Patch Set: Remove Disconnect from ~QuicTestClient Created 3 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
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/core/quic_framer.h" 5 #include "net/quic/core/quic_framer.h"
6 6
7 #include <cstdint> 7 #include <cstdint>
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 18 matching lines...) Expand all
29 29
30 using std::string; 30 using std::string;
31 31
32 namespace net { 32 namespace net {
33 33
34 namespace { 34 namespace {
35 35
36 #define ENDPOINT \ 36 #define ENDPOINT \
37 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") 37 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
38 38
39 // Mask to select the lowest 48 bits of a packet number.
40 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF);
41 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF);
42 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF);
43 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF);
44
45 // Number of bits the packet number length bits are shifted from the right 39 // Number of bits the packet number length bits are shifted from the right
46 // edge of the public header. 40 // edge of the public header.
47 const uint8_t kPublicHeaderSequenceNumberShift = 4; 41 const uint8_t kPublicHeaderSequenceNumberShift = 4;
48 42
49 // New Frame Types, QUIC v. >= 10: 43 // New Frame Types, QUIC v. >= 10:
50 // There are two interpretations for the Frame Type byte in the QUIC protocol, 44 // There are two interpretations for the Frame Type byte in the QUIC protocol,
51 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. 45 // resulting in two Frame Types: Special Frame Types and Regular Frame Types.
52 // 46 //
53 // Regular Frame Types use the Frame Type byte simply. Currently defined 47 // Regular Frame Types use the Frame Type byte simply. Currently defined
54 // Regular Frame Types are: 48 // Regular Frame Types are:
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} 306 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {}
313 307
314 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; 308 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default;
315 309
316 QuicFramer::AckFrameInfo::~AckFrameInfo() {} 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
317 311
318 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, 312 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
319 const QuicFrames& frames, 313 const QuicFrames& frames,
320 char* buffer, 314 char* buffer,
321 size_t packet_length) { 315 size_t packet_length) {
322 QuicDataWriter writer(packet_length, buffer, perspective_); 316 QuicDataWriter writer(packet_length, buffer, perspective_, endianness());
323 if (!AppendPacketHeader(header, &writer)) { 317 if (!AppendPacketHeader(header, &writer)) {
324 QUIC_BUG << "AppendPacketHeader failed"; 318 QUIC_BUG << "AppendPacketHeader failed";
325 return 0; 319 return 0;
326 } 320 }
327 321
328 size_t i = 0; 322 size_t i = 0;
329 for (const QuicFrame& frame : frames) { 323 for (const QuicFrame& frame : frames) {
330 // Determine if we should write stream frame length in header. 324 // Determine if we should write stream frame length in header.
331 const bool no_stream_frame_length = i == frames.size() - 1; 325 const bool no_stream_frame_length = i == frames.size() - 1;
332 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { 326 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 } 404 }
411 405
412 // static 406 // static
413 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket( 407 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
414 const QuicPublicResetPacket& packet) { 408 const QuicPublicResetPacket& packet) {
415 DCHECK(packet.public_header.reset_flag); 409 DCHECK(packet.public_header.reset_flag);
416 410
417 CryptoHandshakeMessage reset; 411 CryptoHandshakeMessage reset;
418 reset.set_tag(kPRST); 412 reset.set_tag(kPRST);
419 reset.SetValue(kRNON, packet.nonce_proof); 413 reset.SetValue(kRNON, packet.nonce_proof);
420 if (!FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) {
421 reset.SetValue(kRSEQ, packet.rejected_packet_number);
422 }
423 if (packet.client_address.host().address_family() != 414 if (packet.client_address.host().address_family() !=
424 IpAddressFamily::IP_UNSPEC) { 415 IpAddressFamily::IP_UNSPEC) {
425 // packet.client_address is non-empty. 416 // packet.client_address is non-empty.
426 QuicSocketAddressCoder address_coder(packet.client_address); 417 QuicSocketAddressCoder address_coder(packet.client_address);
427 string serialized_address = address_coder.Encode(); 418 string serialized_address = address_coder.Encode();
428 if (serialized_address.empty()) { 419 if (serialized_address.empty()) {
429 return nullptr; 420 return nullptr;
430 } 421 }
431 reset.SetStringPiece(kCADR, serialized_address); 422 reset.SetStringPiece(kCADR, serialized_address);
432 } 423 }
433 const QuicData& reset_serialized = 424 const QuicData& reset_serialized =
434 reset.GetSerialized(Perspective::IS_SERVER); 425 reset.GetSerialized(Perspective::IS_SERVER);
435 426
436 size_t len = 427 size_t len =
437 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); 428 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length();
438 std::unique_ptr<char[]> buffer(new char[len]); 429 std::unique_ptr<char[]> buffer(new char[len]);
439 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); 430 // Endianness is not a concern here, as writer is not going to write integers
431 // or floating numbers.
432 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER,
433 NETWORK_BYTE_ORDER);
440 434
441 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | 435 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
442 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 436 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
443 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { 437 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) {
444 // TODO(rch): Remove this QUIC_VERSION_32 is retired. 438 // TODO(rch): Remove this QUIC_VERSION_32 is retired.
445 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); 439 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
446 } 440 }
447 if (!writer.WriteUInt8(flags)) { 441 if (!writer.WriteUInt8(flags)) {
448 return nullptr; 442 return nullptr;
449 } 443 }
450 444
451 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { 445 if (!writer.WriteConnectionId(packet.public_header.connection_id)) {
452 return nullptr; 446 return nullptr;
453 } 447 }
454 448
455 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { 449 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
456 return nullptr; 450 return nullptr;
457 } 451 }
458 452
459 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); 453 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
460 } 454 }
461 455
462 // static 456 // static
463 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( 457 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
464 QuicConnectionId connection_id, 458 QuicConnectionId connection_id,
465 const QuicVersionVector& versions) { 459 const QuicVersionVector& versions) {
466 DCHECK(!versions.empty()); 460 DCHECK(!versions.empty());
467 size_t len = GetVersionNegotiationPacketSize(versions.size()); 461 size_t len = GetVersionNegotiationPacketSize(versions.size());
468 std::unique_ptr<char[]> buffer(new char[len]); 462 std::unique_ptr<char[]> buffer(new char[len]);
469 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); 463 // Endianness is not a concern here, version negotiation packet does not have
464 // integers or floating numbers.
465 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER,
466 NETWORK_BYTE_ORDER);
470 467
471 uint8_t flags = static_cast<uint8_t>( 468 uint8_t flags = static_cast<uint8_t>(
472 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | 469 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
473 // TODO(rch): Remove this QUIC_VERSION_32 is retired. 470 // TODO(rch): Remove this QUIC_VERSION_32 is retired.
474 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
475 if (!writer.WriteUInt8(flags)) { 472 if (!writer.WriteUInt8(flags)) {
476 return nullptr; 473 return nullptr;
477 } 474 }
478 475
479 if (!writer.WriteConnectionId(connection_id)) { 476 if (!writer.WriteConnectionId(connection_id)) {
480 return nullptr; 477 return nullptr;
481 } 478 }
482 479
483 for (QuicVersion version : versions) { 480 for (QuicVersion version : versions) {
484 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { 481 if (!writer.WriteTag(QuicVersionToQuicTag(version))) {
485 return nullptr; 482 return nullptr;
486 } 483 }
487 } 484 }
488 485
489 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); 486 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
490 } 487 }
491 488
492 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 489 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
493 QuicDataReader reader(packet.data(), packet.length(), perspective_); 490 QuicDataReader reader(packet.data(), packet.length(), perspective_,
491 endianness());
494 492
495 visitor_->OnPacket(); 493 visitor_->OnPacket();
496 494
497 // First parse the public header. 495 // First parse the public header.
498 QuicPacketPublicHeader public_header; 496 QuicPacketPublicHeader public_header;
499 if (!ProcessPublicHeader(&reader, &public_header)) { 497 if (!ProcessPublicHeader(&reader, &public_header)) {
500 DCHECK_NE("", detailed_error_); 498 DCHECK_NE("", detailed_error_);
501 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " 499 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: "
502 << detailed_error_; 500 << detailed_error_;
503 DCHECK_NE("", detailed_error_); 501 DCHECK_NE("", detailed_error_);
504 return RaiseError(QUIC_INVALID_PACKET_HEADER); 502 return RaiseError(QUIC_INVALID_PACKET_HEADER);
505 } 503 }
506 504
507 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { 505 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) {
508 // The visitor suppresses further processing of the packet. 506 // The visitor suppresses further processing of the packet.
509 return true; 507 return true;
510 } 508 }
511 509
512 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && 510 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag &&
513 public_header.versions[0] != quic_version_) { 511 public_header.versions[0] != quic_version_) {
514 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { 512 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) {
515 return true; 513 return true;
516 } 514 }
517 } 515 }
518 516
517 // framer's version may change, reset reader's endianness.
518 reader.set_endianness(endianness());
519
519 bool rv; 520 bool rv;
520 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { 521 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) {
521 rv = ProcessVersionNegotiationPacket(&reader, &public_header); 522 rv = ProcessVersionNegotiationPacket(&reader, &public_header);
522 } else if (public_header.reset_flag) { 523 } else if (public_header.reset_flag) {
523 rv = ProcessPublicResetPacket(&reader, public_header); 524 rv = ProcessPublicResetPacket(&reader, public_header);
524 } else if (packet.length() <= kMaxPacketSize) { 525 } else if (packet.length() <= kMaxPacketSize) {
525 // The optimized decryption algorithm implementations run faster when 526 // The optimized decryption algorithm implementations run faster when
526 // operating on aligned memory. 527 // operating on aligned memory.
527 QUIC_CACHELINE_ALIGNED char buffer[kMaxPacketSize]; 528 QUIC_CACHELINE_ALIGNED char buffer[kMaxPacketSize];
528 rv = ProcessDataPacket(&reader, public_header, packet, buffer, 529 rv = ProcessDataPacket(&reader, public_header, packet, buffer,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 return false; 572 return false;
572 } 573 }
573 574
574 size_t decrypted_length = 0; 575 size_t decrypted_length = 0;
575 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, 576 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer,
576 buffer_length, &decrypted_length)) { 577 buffer_length, &decrypted_length)) {
577 set_detailed_error("Unable to decrypt payload."); 578 set_detailed_error("Unable to decrypt payload.");
578 return RaiseError(QUIC_DECRYPTION_FAILURE); 579 return RaiseError(QUIC_DECRYPTION_FAILURE);
579 } 580 }
580 581
581 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_); 582 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_,
583 endianness());
582 584
583 // Set the last packet number after we have decrypted the packet 585 // Set the last packet number after we have decrypted the packet
584 // so we are confident is not attacker controlled. 586 // so we are confident is not attacker controlled.
585 SetLastPacketNumber(header); 587 SetLastPacketNumber(header);
586 588
587 if (!visitor_->OnPacketHeader(header)) { 589 if (!visitor_->OnPacketHeader(header)) {
588 // The visitor suppresses further processing of the packet. 590 // The visitor suppresses further processing of the packet.
589 return true; 591 return true;
590 } 592 }
591 593
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 public_flags |= PACKET_PUBLIC_FLAGS_RST; 653 public_flags |= PACKET_PUBLIC_FLAGS_RST;
652 } 654 }
653 if (header.public_header.version_flag) { 655 if (header.public_header.version_flag) {
654 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; 656 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
655 } 657 }
656 if (header.public_header.multipath_flag) { 658 if (header.public_header.multipath_flag) {
657 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; 659 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH;
658 } 660 }
659 661
660 public_flags |= 662 public_flags |=
661 GetSequenceNumberFlags(header.public_header.packet_number_length) 663 GetPacketNumberFlags(header.public_header.packet_number_length)
662 << kPublicHeaderSequenceNumberShift; 664 << kPublicHeaderSequenceNumberShift;
663 665
664 if (header.public_header.nonce != nullptr) { 666 if (header.public_header.nonce != nullptr) {
665 DCHECK_EQ(Perspective::IS_SERVER, perspective_); 667 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
666 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; 668 public_flags |= PACKET_PUBLIC_FLAGS_NONCE;
667 } 669 }
668 670
669 switch (header.public_header.connection_id_length) { 671 switch (header.public_header.connection_id_length) {
670 case PACKET_0BYTE_CONNECTION_ID: 672 case PACKET_0BYTE_CONNECTION_ID:
671 if (!writer->WriteUInt8(public_flags | 673 if (!writer->WriteUInt8(public_flags |
(...skipping 24 matching lines...) Expand all
696 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" 698 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '"
697 << QuicTagToString(tag) << "'"; 699 << QuicTagToString(tag) << "'";
698 } 700 }
699 701
700 if (header.public_header.nonce != nullptr && 702 if (header.public_header.nonce != nullptr &&
701 !writer->WriteBytes(header.public_header.nonce, 703 !writer->WriteBytes(header.public_header.nonce,
702 kDiversificationNonceSize)) { 704 kDiversificationNonceSize)) {
703 return false; 705 return false;
704 } 706 }
705 707
706 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, 708 if (!AppendPacketNumber(header.public_header.packet_number_length,
707 header.packet_number, writer)) { 709 header.packet_number, writer)) {
708 return false; 710 return false;
709 } 711 }
710 712
711 return true; 713 return true;
712 } 714 }
713 715
714 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( 716 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
715 uint32_t time_delta_us) { 717 uint32_t time_delta_us) {
716 // The new time_delta might have wrapped to the next epoch, or it 718 // The new time_delta might have wrapped to the next epoch, or it
717 // might have reverse wrapped to the previous epoch, or it might 719 // might have reverse wrapped to the previous epoch, or it might
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 } 855 }
854 public_header->nonce = &last_nonce_; 856 public_header->nonce = &last_nonce_;
855 } else { 857 } else {
856 public_header->nonce = nullptr; 858 public_header->nonce = nullptr;
857 } 859 }
858 860
859 return true; 861 return true;
860 } 862 }
861 863
862 // static 864 // static
863 QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength( 865 QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength(
864 QuicPacketNumber packet_number) { 866 QuicPacketNumber packet_number) {
865 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { 867 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) {
866 return PACKET_1BYTE_PACKET_NUMBER; 868 return PACKET_1BYTE_PACKET_NUMBER;
867 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { 869 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) {
868 return PACKET_2BYTE_PACKET_NUMBER; 870 return PACKET_2BYTE_PACKET_NUMBER;
869 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { 871 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) {
870 return PACKET_4BYTE_PACKET_NUMBER; 872 return PACKET_4BYTE_PACKET_NUMBER;
871 } else { 873 } else {
872 return PACKET_6BYTE_PACKET_NUMBER; 874 return PACKET_6BYTE_PACKET_NUMBER;
873 } 875 }
874 } 876 }
875 877
876 // static 878 // static
877 uint8_t QuicFramer::GetSequenceNumberFlags( 879 uint8_t QuicFramer::GetPacketNumberFlags(
878 QuicPacketNumberLength packet_number_length) { 880 QuicPacketNumberLength packet_number_length) {
879 switch (packet_number_length) { 881 switch (packet_number_length) {
880 case PACKET_1BYTE_PACKET_NUMBER: 882 case PACKET_1BYTE_PACKET_NUMBER:
881 return PACKET_FLAGS_1BYTE_PACKET; 883 return PACKET_FLAGS_1BYTE_PACKET;
882 case PACKET_2BYTE_PACKET_NUMBER: 884 case PACKET_2BYTE_PACKET_NUMBER:
883 return PACKET_FLAGS_2BYTE_PACKET; 885 return PACKET_FLAGS_2BYTE_PACKET;
884 case PACKET_4BYTE_PACKET_NUMBER: 886 case PACKET_4BYTE_PACKET_NUMBER:
885 return PACKET_FLAGS_4BYTE_PACKET; 887 return PACKET_FLAGS_4BYTE_PACKET;
886 case PACKET_6BYTE_PACKET_NUMBER: 888 case PACKET_6BYTE_PACKET_NUMBER:
887 return PACKET_FLAGS_6BYTE_PACKET; 889 return PACKET_FLAGS_6BYTE_PACKET;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
919 new_ack_info.max_block_length = 921 new_ack_info.max_block_length =
920 std::max(new_ack_info.max_block_length, interval.Length()); 922 std::max(new_ack_info.max_block_length, interval.Length());
921 } 923 }
922 return new_ack_info; 924 return new_ack_info;
923 } 925 }
924 926
925 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, 927 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
926 QuicPacketHeader* header) { 928 QuicPacketHeader* header) {
927 QuicPacketNumber base_packet_number = largest_packet_number_; 929 QuicPacketNumber base_packet_number = largest_packet_number_;
928 930
929 if (!ProcessPacketSequenceNumber( 931 if (!ProcessAndCalculatePacketNumber(
930 encrypted_reader, header->public_header.packet_number_length, 932 encrypted_reader, header->public_header.packet_number_length,
931 base_packet_number, &header->packet_number)) { 933 base_packet_number, &header->packet_number)) {
932 set_detailed_error("Unable to read packet number."); 934 set_detailed_error("Unable to read packet number.");
933 return RaiseError(QUIC_INVALID_PACKET_HEADER); 935 return RaiseError(QUIC_INVALID_PACKET_HEADER);
934 } 936 }
935 937
936 if (header->packet_number == 0u) { 938 if (header->packet_number == 0u) {
937 set_detailed_error("packet numbers cannot be 0."); 939 set_detailed_error("packet numbers cannot be 0.");
938 return RaiseError(QUIC_INVALID_PACKET_HEADER); 940 return RaiseError(QUIC_INVALID_PACKET_HEADER);
939 } 941 }
940 942
941 if (!visitor_->OnUnauthenticatedHeader(*header)) { 943 if (!visitor_->OnUnauthenticatedHeader(*header)) {
942 set_detailed_error( 944 set_detailed_error(
943 "Visitor asked to stop processing of unauthenticated header."); 945 "Visitor asked to stop processing of unauthenticated header.");
944 return false; 946 return false;
945 } 947 }
946 return true; 948 return true;
947 } 949 }
948 950
949 bool QuicFramer::ProcessPacketSequenceNumber( 951 bool QuicFramer::ProcessAndCalculatePacketNumber(
950 QuicDataReader* reader, 952 QuicDataReader* reader,
951 QuicPacketNumberLength packet_number_length, 953 QuicPacketNumberLength packet_number_length,
952 QuicPacketNumber base_packet_number, 954 QuicPacketNumber base_packet_number,
953 QuicPacketNumber* packet_number) { 955 QuicPacketNumber* packet_number) {
954 QuicPacketNumber wire_packet_number = 0u; 956 QuicPacketNumber wire_packet_number = 0u;
955 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { 957 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) {
956 return false; 958 return false;
957 } 959 }
958 960
959 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers 961 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers
960 // in case the first guess is incorrect. 962 // in case the first guess is incorrect.
961 *packet_number = CalculatePacketNumberFromWire( 963 *packet_number = CalculatePacketNumberFromWire(
962 packet_number_length, base_packet_number, wire_packet_number); 964 packet_number_length, base_packet_number, wire_packet_number);
963 return true; 965 return true;
964 } 966 }
965 967
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 offset_length += 1; 1152 offset_length += 1;
1151 } 1153 }
1152 stream_flags >>= kQuicStreamOffsetShift; 1154 stream_flags >>= kQuicStreamOffsetShift;
1153 1155
1154 bool has_data_length = 1156 bool has_data_length =
1155 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; 1157 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask;
1156 stream_flags >>= kQuicStreamDataLengthShift; 1158 stream_flags >>= kQuicStreamDataLengthShift;
1157 1159
1158 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; 1160 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
1159 1161
1160 frame->stream_id = 0; 1162 uint64_t stream_id = 0;
1161 if (!reader->ReadBytes(&frame->stream_id, stream_id_length)) { 1163 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) {
1162 set_detailed_error("Unable to read stream_id."); 1164 set_detailed_error("Unable to read stream_id.");
1163 return false; 1165 return false;
1164 } 1166 }
1167 frame->stream_id = static_cast<QuicStreamId>(stream_id);
1165 1168
1166 frame->offset = 0; 1169 frame->offset = 0;
1167 if (!reader->ReadBytes(&frame->offset, offset_length)) { 1170 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) {
1168 set_detailed_error("Unable to read offset."); 1171 set_detailed_error("Unable to read offset.");
1169 return false; 1172 return false;
1170 } 1173 }
1171 1174
1172 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. 1175 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
1173 QuicStringPiece data; 1176 QuicStringPiece data;
1174 if (has_data_length) { 1177 if (has_data_length) {
1175 if (!reader->ReadStringPiece16(&data)) { 1178 if (!reader->ReadStringPiece16(&data)) {
1176 set_detailed_error("Unable to read frame data."); 1179 set_detailed_error("Unable to read frame data.");
1177 return false; 1180 return false;
(...skipping 17 matching lines...) Expand all
1195 // ack block length. 1198 // ack block length.
1196 const QuicPacketNumberLength ack_block_length = 1199 const QuicPacketNumberLength ack_block_length =
1197 ReadSequenceNumberLength(frame_type); 1200 ReadSequenceNumberLength(frame_type);
1198 frame_type >>= kQuicSequenceNumberLengthShift; 1201 frame_type >>= kQuicSequenceNumberLengthShift;
1199 const QuicPacketNumberLength largest_acked_length = 1202 const QuicPacketNumberLength largest_acked_length =
1200 ReadSequenceNumberLength(frame_type); 1203 ReadSequenceNumberLength(frame_type);
1201 frame_type >>= kQuicSequenceNumberLengthShift; 1204 frame_type >>= kQuicSequenceNumberLengthShift;
1202 frame_type >>= kQuicHasMultipleAckBlocksShift; 1205 frame_type >>= kQuicHasMultipleAckBlocksShift;
1203 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; 1206 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask;
1204 1207
1205 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { 1208 if (!reader->ReadBytesToUInt64(largest_acked_length,
1209 &ack_frame->largest_observed)) {
1206 set_detailed_error("Unable to read largest acked."); 1210 set_detailed_error("Unable to read largest acked.");
1207 return false; 1211 return false;
1208 } 1212 }
1209 1213
1210 uint64_t ack_delay_time_us; 1214 uint64_t ack_delay_time_us;
1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { 1215 if (!reader->ReadUFloat16(&ack_delay_time_us)) {
1212 set_detailed_error("Unable to read ack delay time."); 1216 set_detailed_error("Unable to read ack delay time.");
1213 return false; 1217 return false;
1214 } 1218 }
1215 1219
1216 if (ack_delay_time_us == kUFloat16MaxValue) { 1220 if (ack_delay_time_us == kUFloat16MaxValue) {
1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); 1221 ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
1218 } else { 1222 } else {
1219 ack_frame->ack_delay_time = 1223 ack_frame->ack_delay_time =
1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); 1224 QuicTime::Delta::FromMicroseconds(ack_delay_time_us);
1221 } 1225 }
1222 1226
1223 uint8_t num_ack_blocks = 0; 1227 uint8_t num_ack_blocks = 0;
1224 if (has_ack_blocks) { 1228 if (has_ack_blocks) {
1225 if (!reader->ReadBytes(&num_ack_blocks, 1)) { 1229 if (!reader->ReadUInt8(&num_ack_blocks)) {
1226 set_detailed_error("Unable to read num of ack blocks."); 1230 set_detailed_error("Unable to read num of ack blocks.");
1227 return false; 1231 return false;
1228 } 1232 }
1229 } 1233 }
1230 1234
1231 size_t first_block_length = 0; 1235 uint64_t first_block_length = 0;
1232 if (!reader->ReadBytes(&first_block_length, ack_block_length)) { 1236 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) {
1233 set_detailed_error("Unable to read first ack block length."); 1237 set_detailed_error("Unable to read first ack block length.");
1234 return false; 1238 return false;
1235 } 1239 }
1236 QuicPacketNumber first_received = 1240 QuicPacketNumber first_received =
1237 ack_frame->largest_observed + 1 - first_block_length; 1241 ack_frame->largest_observed + 1 - first_block_length;
1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); 1242 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1);
1239 1243
1240 if (num_ack_blocks > 0) { 1244 if (num_ack_blocks > 0) {
1241 for (size_t i = 0; i < num_ack_blocks; ++i) { 1245 for (size_t i = 0; i < num_ack_blocks; ++i) {
1242 size_t gap = 0; 1246 uint8_t gap = 0;
1243 if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) { 1247 if (!reader->ReadUInt8(&gap)) {
1244 set_detailed_error("Unable to read gap to next ack block."); 1248 set_detailed_error("Unable to read gap to next ack block.");
1245 return false; 1249 return false;
1246 } 1250 }
1247 size_t current_block_length = 0; 1251 uint64_t current_block_length = 0;
1248 if (!reader->ReadBytes(&current_block_length, ack_block_length)) { 1252 if (!reader->ReadBytesToUInt64(ack_block_length, &current_block_length)) {
1249 set_detailed_error("Unable to ack block length."); 1253 set_detailed_error("Unable to ack block length.");
1250 return false; 1254 return false;
1251 } 1255 }
1252 first_received -= (gap + current_block_length); 1256 first_received -= (gap + current_block_length);
1253 if (current_block_length > 0) { 1257 if (current_block_length > 0) {
1254 ack_frame->packets.Add(first_received, 1258 ack_frame->packets.Add(first_received,
1255 first_received + current_block_length); 1259 first_received + current_block_length);
1256 } 1260 }
1257 } 1261 }
1258 } 1262 }
1259 1263
1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { 1264 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) {
1261 return false; 1265 return false;
1262 } 1266 }
1263 1267
1264 return true; 1268 return true;
1265 } 1269 }
1266 1270
1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, 1271 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader,
1268 QuicAckFrame* ack_frame) { 1272 QuicAckFrame* ack_frame) {
1269 uint8_t num_received_packets; 1273 uint8_t num_received_packets;
1270 if (!reader->ReadBytes(&num_received_packets, 1)) { 1274 if (!reader->ReadUInt8(&num_received_packets)) {
1271 set_detailed_error("Unable to read num received packets."); 1275 set_detailed_error("Unable to read num received packets.");
1272 return false; 1276 return false;
1273 } 1277 }
1274 1278
1275 if (num_received_packets > 0) { 1279 if (num_received_packets > 0) {
1276 uint8_t delta_from_largest_observed; 1280 uint8_t delta_from_largest_observed;
1277 if (!reader->ReadBytes(&delta_from_largest_observed, 1281 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
1278 PACKET_1BYTE_PACKET_NUMBER)) {
1279 set_detailed_error("Unable to read sequence delta in received packets."); 1282 set_detailed_error("Unable to read sequence delta in received packets.");
1280 return false; 1283 return false;
1281 } 1284 }
1282 QuicPacketNumber seq_num = 1285 QuicPacketNumber seq_num =
1283 ack_frame->largest_observed - delta_from_largest_observed; 1286 ack_frame->largest_observed - delta_from_largest_observed;
1284 1287
1285 // Time delta from the framer creation. 1288 // Time delta from the framer creation.
1286 uint32_t time_delta_us; 1289 uint32_t time_delta_us;
1287 if (!reader->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1290 if (!reader->ReadUInt32(&time_delta_us)) {
1288 set_detailed_error("Unable to read time delta in received packets."); 1291 set_detailed_error("Unable to read time delta in received packets.");
1289 return false; 1292 return false;
1290 } 1293 }
1291 1294
1292 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); 1295 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
1293 1296
1294 ack_frame->received_packet_times.reserve(num_received_packets); 1297 ack_frame->received_packet_times.reserve(num_received_packets);
1295 ack_frame->received_packet_times.push_back( 1298 ack_frame->received_packet_times.push_back(
1296 std::make_pair(seq_num, creation_time_ + last_timestamp_)); 1299 std::make_pair(seq_num, creation_time_ + last_timestamp_));
1297 1300
1298 for (uint8_t i = 1; i < num_received_packets; ++i) { 1301 for (uint8_t i = 1; i < num_received_packets; ++i) {
1299 if (!reader->ReadBytes(&delta_from_largest_observed, 1302 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
1300 PACKET_1BYTE_PACKET_NUMBER)) {
1301 set_detailed_error( 1303 set_detailed_error(
1302 "Unable to read sequence delta in received packets."); 1304 "Unable to read sequence delta in received packets.");
1303 return false; 1305 return false;
1304 } 1306 }
1305 seq_num = ack_frame->largest_observed - delta_from_largest_observed; 1307 seq_num = ack_frame->largest_observed - delta_from_largest_observed;
1306 1308
1307 // Time delta from the previous timestamp. 1309 // Time delta from the previous timestamp.
1308 uint64_t incremental_time_delta_us; 1310 uint64_t incremental_time_delta_us;
1309 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { 1311 if (!reader->ReadUFloat16(&incremental_time_delta_us)) {
1310 set_detailed_error( 1312 set_detailed_error(
1311 "Unable to read incremental time delta in received packets."); 1313 "Unable to read incremental time delta in received packets.");
1312 return false; 1314 return false;
1313 } 1315 }
1314 1316
1315 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( 1317 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds(
1316 incremental_time_delta_us); 1318 incremental_time_delta_us);
1317 ack_frame->received_packet_times.push_back( 1319 ack_frame->received_packet_times.push_back(
1318 std::make_pair(seq_num, creation_time_ + last_timestamp_)); 1320 std::make_pair(seq_num, creation_time_ + last_timestamp_));
1319 } 1321 }
1320 } 1322 }
1321 return true; 1323 return true;
1322 } 1324 }
1323 1325
1324 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, 1326 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
1325 const QuicPacketHeader& header, 1327 const QuicPacketHeader& header,
1326 QuicStopWaitingFrame* stop_waiting) { 1328 QuicStopWaitingFrame* stop_waiting) {
1327 QuicPacketNumber least_unacked_delta = 0; 1329 QuicPacketNumber least_unacked_delta = 0;
1328 if (!reader->ReadBytes(&least_unacked_delta, 1330 if (!reader->ReadBytesToUInt64(header.public_header.packet_number_length,
1329 header.public_header.packet_number_length)) { 1331 &least_unacked_delta)) {
1330 set_detailed_error("Unable to read least unacked delta."); 1332 set_detailed_error("Unable to read least unacked delta.");
1331 return false; 1333 return false;
1332 } 1334 }
1333 DCHECK_GE(header.packet_number, least_unacked_delta); 1335 DCHECK_GE(header.packet_number, least_unacked_delta);
1334 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; 1336 stop_waiting->least_unacked = header.packet_number - least_unacked_delta;
1335 1337
1336 return true; 1338 return true;
1337 } 1339 }
1338 1340
1339 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, 1341 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader,
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 return 5 + 3 * (ack.received_packet_times.size() - 1); 1646 return 5 + 3 * (ack.received_packet_times.size() - 1);
1645 } 1647 }
1646 1648
1647 size_t QuicFramer::GetAckFrameSize( 1649 size_t QuicFramer::GetAckFrameSize(
1648 const QuicAckFrame& ack, 1650 const QuicAckFrame& ack,
1649 QuicPacketNumberLength packet_number_length) { 1651 QuicPacketNumberLength packet_number_length) {
1650 size_t ack_size = 0; 1652 size_t ack_size = 0;
1651 1653
1652 AckFrameInfo ack_info = GetAckFrameInfo(ack); 1654 AckFrameInfo ack_info = GetAckFrameInfo(ack);
1653 QuicPacketNumberLength largest_acked_length = 1655 QuicPacketNumberLength largest_acked_length =
1654 GetMinSequenceNumberLength(ack.largest_observed); 1656 GetMinPacketNumberLength(ack.largest_observed);
1655 QuicPacketNumberLength ack_block_length = 1657 QuicPacketNumberLength ack_block_length =
1656 GetMinSequenceNumberLength(ack_info.max_block_length); 1658 GetMinPacketNumberLength(ack_info.max_block_length);
1657 1659
1658 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); 1660 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length);
1659 // First ack block length. 1661 // First ack block length.
1660 ack_size += ack_block_length; 1662 ack_size += ack_block_length;
1661 if (ack_info.num_ack_blocks != 0) { 1663 if (ack_info.num_ack_blocks != 0) {
1662 ack_size += kNumberOfAckBlocksSize; 1664 ack_size += kNumberOfAckBlocksSize;
1663 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * 1665 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) *
1664 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); 1666 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
1665 } 1667 }
1666 1668
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1750 break; 1752 break;
1751 default: 1753 default:
1752 type_byte = static_cast<uint8_t>(frame.type); 1754 type_byte = static_cast<uint8_t>(frame.type);
1753 break; 1755 break;
1754 } 1756 }
1755 1757
1756 return writer->WriteUInt8(type_byte); 1758 return writer->WriteUInt8(type_byte);
1757 } 1759 }
1758 1760
1759 // static 1761 // static
1760 bool QuicFramer::AppendPacketSequenceNumber( 1762 bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length,
1761 QuicPacketNumberLength packet_number_length, 1763 QuicPacketNumber packet_number,
1762 QuicPacketNumber packet_number, 1764 QuicDataWriter* writer) {
1763 QuicDataWriter* writer) { 1765 size_t length = packet_number_length;
1764 // Ensure the entire packet number can be written. 1766 if (length != 1 && length != 2 && length != 4 && length != 6) {
1765 if (writer->capacity() - writer->length() < 1767 QUIC_BUG << "Invalid packet_number_length: " << length;
1766 static_cast<size_t>(packet_number_length)) {
1767 return false; 1768 return false;
1768 } 1769 }
1769 switch (packet_number_length) { 1770 return writer->WriteBytesToUInt64(packet_number_length, packet_number);
1770 case PACKET_1BYTE_PACKET_NUMBER:
1771 return writer->WriteUInt8(packet_number & k1ByteSequenceNumberMask);
1772 break;
1773 case PACKET_2BYTE_PACKET_NUMBER:
1774 return writer->WriteUInt16(packet_number & k2ByteSequenceNumberMask);
1775 break;
1776 case PACKET_4BYTE_PACKET_NUMBER:
1777 return writer->WriteUInt32(packet_number & k4ByteSequenceNumberMask);
1778 break;
1779 case PACKET_6BYTE_PACKET_NUMBER:
1780 return writer->WriteUInt48(packet_number & k6ByteSequenceNumberMask);
1781 break;
1782 default:
1783 DCHECK(false) << "packet_number_length: " << packet_number_length;
1784 return false;
1785 }
1786 } 1771 }
1787 1772
1788 // static 1773 // static
1774 bool QuicFramer::AppendStreamId(size_t stream_id_length,
1775 QuicStreamId stream_id,
1776 QuicDataWriter* writer) {
1777 if (stream_id_length == 0 || stream_id_length > 4) {
1778 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length;
1779 return false;
1780 }
1781 return writer->WriteBytesToUInt64(stream_id_length, stream_id);
1782 }
1783
1784 // static
1785 bool QuicFramer::AppendStreamOffset(size_t offset_length,
1786 QuicStreamOffset offset,
1787 QuicDataWriter* writer) {
1788 if (offset_length == 1 || offset_length > 8) {
1789 QUIC_BUG << "Invalid stream_offset_length: " << offset_length;
1790 return false;
1791 }
1792
1793 return writer->WriteBytesToUInt64(offset_length, offset);
1794 }
1795
1796 // static
1789 bool QuicFramer::AppendAckBlock(uint8_t gap, 1797 bool QuicFramer::AppendAckBlock(uint8_t gap,
1790 QuicPacketNumberLength length_length, 1798 QuicPacketNumberLength length_length,
1791 QuicPacketNumber length, 1799 QuicPacketNumber length,
1792 QuicDataWriter* writer) { 1800 QuicDataWriter* writer) {
1793 return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) && 1801 return writer->WriteUInt8(gap) &&
1794 AppendPacketSequenceNumber(length_length, length, writer); 1802 AppendPacketNumber(length_length, length, writer);
1795 } 1803 }
1796 1804
1797 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, 1805 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
1798 bool no_stream_frame_length, 1806 bool no_stream_frame_length,
1799 QuicDataWriter* writer) { 1807 QuicDataWriter* writer) {
1800 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { 1808 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
1809 writer)) {
1801 QUIC_BUG << "Writing stream id size failed."; 1810 QUIC_BUG << "Writing stream id size failed.";
1802 return false; 1811 return false;
1803 } 1812 }
1804 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { 1813 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset,
1814 writer)) {
1805 QUIC_BUG << "Writing offset size failed."; 1815 QUIC_BUG << "Writing offset size failed.";
1806 return false; 1816 return false;
1807 } 1817 }
1808 if (!no_stream_frame_length) { 1818 if (!no_stream_frame_length) {
1809 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || 1819 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) ||
1810 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { 1820 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) {
1811 QUIC_BUG << "Writing stream frame length failed"; 1821 QUIC_BUG << "Writing stream frame length failed";
1812 return false; 1822 return false;
1813 } 1823 }
1814 } 1824 }
1815 1825
1816 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { 1826 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
1817 QUIC_BUG << "Writing frame data failed."; 1827 QUIC_BUG << "Writing frame data failed.";
1818 return false; 1828 return false;
1819 } 1829 }
1820 return true; 1830 return true;
1821 } 1831 }
1822 1832
1823 void QuicFramer::set_version(const QuicVersion version) { 1833 void QuicFramer::set_version(const QuicVersion version) {
1824 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); 1834 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version);
1825 quic_version_ = version; 1835 quic_version_ = version;
1826 } 1836 }
1827 1837
1828 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, 1838 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
1829 QuicDataWriter* writer) { 1839 QuicDataWriter* writer) {
1830 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); 1840 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame);
1831 QuicPacketNumber largest_acked = frame.largest_observed; 1841 QuicPacketNumber largest_acked = frame.largest_observed;
1832 QuicPacketNumberLength largest_acked_length = 1842 QuicPacketNumberLength largest_acked_length =
1833 GetMinSequenceNumberLength(largest_acked); 1843 GetMinPacketNumberLength(largest_acked);
1834 QuicPacketNumberLength ack_block_length = 1844 QuicPacketNumberLength ack_block_length =
1835 GetMinSequenceNumberLength(new_ack_info.max_block_length); 1845 GetMinPacketNumberLength(new_ack_info.max_block_length);
1836 // Calculate available bytes for timestamps and ack blocks. 1846 // Calculate available bytes for timestamps and ack blocks.
1837 int32_t available_timestamp_and_ack_block_bytes = 1847 int32_t available_timestamp_and_ack_block_bytes =
1838 writer->capacity() - writer->length() - ack_block_length - 1848 writer->capacity() - writer->length() - ack_block_length -
1839 GetMinAckFrameSize(quic_version_, largest_acked_length) - 1849 GetMinAckFrameSize(quic_version_, largest_acked_length) -
1840 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); 1850 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0);
1841 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); 1851 DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
1842 1852
1843 // Write out the type byte by setting the low order bits and doing shifts 1853 // Write out the type byte by setting the low order bits and doing shifts
1844 // to make room for the next bit flags to be set. 1854 // to make room for the next bit flags to be set.
1845 // Whether there are multiple ack blocks. 1855 // Whether there are multiple ack blocks.
1846 uint8_t type_byte = 1856 uint8_t type_byte =
1847 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; 1857 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask;
1848 type_byte <<= kQuicHasMultipleAckBlocksShift; 1858 type_byte <<= kQuicHasMultipleAckBlocksShift;
1849 1859
1850 // Largest acked length. 1860 // Largest acked length.
1851 type_byte <<= kQuicSequenceNumberLengthShift; 1861 type_byte <<= kQuicSequenceNumberLengthShift;
1852 type_byte |= GetSequenceNumberFlags(largest_acked_length); 1862 type_byte |= GetPacketNumberFlags(largest_acked_length);
1853 1863
1854 // Ack block length. 1864 // Ack block length.
1855 type_byte <<= kQuicSequenceNumberLengthShift; 1865 type_byte <<= kQuicSequenceNumberLengthShift;
1856 type_byte |= GetSequenceNumberFlags(ack_block_length); 1866 type_byte |= GetPacketNumberFlags(ack_block_length);
1857 1867
1858 type_byte |= kQuicFrameTypeAckMask; 1868 type_byte |= kQuicFrameTypeAckMask;
1859 1869
1860 if (!writer->WriteUInt8(type_byte)) { 1870 if (!writer->WriteUInt8(type_byte)) {
1861 return false; 1871 return false;
1862 } 1872 }
1863 1873
1864 // Largest acked. 1874 // Largest acked.
1865 if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked, 1875 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) {
1866 writer)) {
1867 return false; 1876 return false;
1868 } 1877 }
1869 1878
1870 // Largest acked delta time. 1879 // Largest acked delta time.
1871 uint64_t ack_delay_time_us = kUFloat16MaxValue; 1880 uint64_t ack_delay_time_us = kUFloat16MaxValue;
1872 if (!frame.ack_delay_time.IsInfinite()) { 1881 if (!frame.ack_delay_time.IsInfinite()) {
1873 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); 1882 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
1874 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); 1883 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
1875 } 1884 }
1876 if (!writer->WriteUFloat16(ack_delay_time_us)) { 1885 if (!writer->WriteUFloat16(ack_delay_time_us)) {
(...skipping 10 matching lines...) Expand all
1887 num_ack_blocks = std::numeric_limits<uint8_t>::max(); 1896 num_ack_blocks = std::numeric_limits<uint8_t>::max();
1888 } 1897 }
1889 1898
1890 if (num_ack_blocks > 0) { 1899 if (num_ack_blocks > 0) {
1891 if (!writer->WriteBytes(&num_ack_blocks, 1)) { 1900 if (!writer->WriteBytes(&num_ack_blocks, 1)) {
1892 return false; 1901 return false;
1893 } 1902 }
1894 } 1903 }
1895 1904
1896 // First ack block length. 1905 // First ack block length.
1897 if (!AppendPacketSequenceNumber(ack_block_length, 1906 if (!AppendPacketNumber(ack_block_length, new_ack_info.first_block_length,
1898 new_ack_info.first_block_length, writer)) { 1907 writer)) {
1899 return false; 1908 return false;
1900 } 1909 }
1901 1910
1902 // Ack blocks. 1911 // Ack blocks.
1903 if (num_ack_blocks > 0) { 1912 if (num_ack_blocks > 0) {
1904 size_t num_ack_blocks_written = 0; 1913 size_t num_ack_blocks_written = 0;
1905 // Append, in descending order from the largest ACKed packet, a series of 1914 // Append, in descending order from the largest ACKed packet, a series of
1906 // ACK blocks that represents the successfully acknoweldged packets. Each 1915 // ACK blocks that represents the successfully acknoweldged packets. Each
1907 // appended gap/block length represents a descending delta from the previous 1916 // appended gap/block length represents a descending delta from the previous
1908 // block. i.e.: 1917 // block. i.e.:
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); 2003 PacketTimeVector::const_iterator it = frame.received_packet_times.begin();
1995 QuicPacketNumber packet_number = it->first; 2004 QuicPacketNumber packet_number = it->first;
1996 QuicPacketNumber delta_from_largest_observed = 2005 QuicPacketNumber delta_from_largest_observed =
1997 frame.largest_observed - packet_number; 2006 frame.largest_observed - packet_number;
1998 2007
1999 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); 2008 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed);
2000 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { 2009 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
2001 return false; 2010 return false;
2002 } 2011 }
2003 2012
2004 if (!writer->WriteUInt8(delta_from_largest_observed & 2013 if (!writer->WriteUInt8(delta_from_largest_observed)) {
2005 k1ByteSequenceNumberMask)) {
2006 return false; 2014 return false;
2007 } 2015 }
2008 2016
2009 // Use the lowest 4 bytes of the time delta from the creation_time_. 2017 // Use the lowest 4 bytes of the time delta from the creation_time_.
2010 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; 2018 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32;
2011 uint32_t time_delta_us = 2019 uint32_t time_delta_us =
2012 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & 2020 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() &
2013 (time_epoch_delta_us - 1)); 2021 (time_epoch_delta_us - 1));
2014 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { 2022 if (!writer->WriteUInt32(time_delta_us)) {
2015 return false; 2023 return false;
2016 } 2024 }
2017 2025
2018 QuicTime prev_time = it->second; 2026 QuicTime prev_time = it->second;
2019 2027
2020 for (++it; it != frame.received_packet_times.end(); ++it) { 2028 for (++it; it != frame.received_packet_times.end(); ++it) {
2021 packet_number = it->first; 2029 packet_number = it->first;
2022 delta_from_largest_observed = frame.largest_observed - packet_number; 2030 delta_from_largest_observed = frame.largest_observed - packet_number;
2023 2031
2024 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { 2032 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
2025 return false; 2033 return false;
2026 } 2034 }
2027 2035
2028 if (!writer->WriteUInt8(delta_from_largest_observed & 2036 if (!writer->WriteUInt8(delta_from_largest_observed)) {
2029 k1ByteSequenceNumberMask)) {
2030 return false; 2037 return false;
2031 } 2038 }
2032 2039
2033 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); 2040 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds();
2034 prev_time = it->second; 2041 prev_time = it->second;
2035 if (!writer->WriteUFloat16(frame_time_delta_us)) { 2042 if (!writer->WriteUFloat16(frame_time_delta_us)) {
2036 return false; 2043 return false;
2037 } 2044 }
2038 } 2045 }
2039 return true; 2046 return true;
(...skipping 10 matching lines...) Expand all
2050 2057
2051 if (least_unacked_delta >> length_shift > 0) { 2058 if (least_unacked_delta >> length_shift > 0) {
2052 QUIC_BUG << "packet_number_length " 2059 QUIC_BUG << "packet_number_length "
2053 << header.public_header.packet_number_length 2060 << header.public_header.packet_number_length
2054 << " is too small for least_unacked_delta: " << least_unacked_delta 2061 << " is too small for least_unacked_delta: " << least_unacked_delta
2055 << " packet_number:" << header.packet_number 2062 << " packet_number:" << header.packet_number
2056 << " least_unacked:" << frame.least_unacked 2063 << " least_unacked:" << frame.least_unacked
2057 << " version:" << quic_version_; 2064 << " version:" << quic_version_;
2058 return false; 2065 return false;
2059 } 2066 }
2060 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, 2067 if (!AppendPacketNumber(header.public_header.packet_number_length,
2061 least_unacked_delta, writer)) { 2068 least_unacked_delta, writer)) {
2062 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; 2069 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length;
2063 return false; 2070 return false;
2064 } 2071 }
2065 2072
2066 return true; 2073 return true;
2067 } 2074 }
2068 2075
2069 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, 2076 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame,
2070 QuicDataWriter* writer) { 2077 QuicDataWriter* writer) {
2071 if (!writer->WriteUInt32(frame.stream_id)) { 2078 if (!writer->WriteUInt32(frame.stream_id)) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2154 } 2161 }
2155 2162
2156 bool QuicFramer::RaiseError(QuicErrorCode error) { 2163 bool QuicFramer::RaiseError(QuicErrorCode error) {
2157 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) 2164 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error)
2158 << " detail: " << detailed_error_; 2165 << " detail: " << detailed_error_;
2159 set_error(error); 2166 set_error(error);
2160 visitor_->OnError(this); 2167 visitor_->OnError(this);
2161 return false; 2168 return false;
2162 } 2169 }
2163 2170
2171 Endianness QuicFramer::endianness() const {
2172 return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER;
2173 }
2174
2164 } // namespace net 2175 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698