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

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

Issue 14287009: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with Tot Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/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/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include "base/hash_tables.h" 7 #include "base/hash_tables.h"
8 #include "net/quic/crypto/quic_decrypter.h" 8 #include "net/quic/crypto/quic_decrypter.h"
9 #include "net/quic/crypto/quic_encrypter.h" 9 #include "net/quic/crypto/quic_encrypter.h"
10 #include "net/quic/quic_data_reader.h" 10 #include "net/quic/quic_data_reader.h"
11 #include "net/quic/quic_data_writer.h" 11 #include "net/quic/quic_data_writer.h"
12 #include "net/quic/quic_utils.h" 12 #include "net/quic/quic_utils.h"
13 13
14 using base::StringPiece; 14 using base::StringPiece;
15 using std::make_pair; 15 using std::make_pair;
16 using std::map; 16 using std::map;
17 using std::numeric_limits; 17 using std::numeric_limits;
18 using std::string; 18 using std::string;
19 19
20 namespace net { 20 namespace net {
21 21
22 namespace { 22 namespace {
23 23
24 // Mask to select the lowest 48 bits of a sequence number. 24 // Mask to select the lowest 48 bits of a sequence number.
25 const QuicPacketSequenceNumber kSequenceNumberMask = 25 const QuicPacketSequenceNumber kSequenceNumberMask =
26 GG_UINT64_C(0x0000FFFFFFFFFFFF); 26 GG_UINT64_C(0x0000FFFFFFFFFFFF);
27 27
28 const uint32 kInvalidDeltaTime = 0xffffffff;
29
28 // Returns the absolute value of the difference between |a| and |b|. 30 // Returns the absolute value of the difference between |a| and |b|.
29 QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a, 31 QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a,
30 QuicPacketSequenceNumber b) { 32 QuicPacketSequenceNumber b) {
31 // Since these are unsigned numbers, we can't just return abs(a - b) 33 // Since these are unsigned numbers, we can't just return abs(a - b)
32 if (a < b) { 34 if (a < b) {
33 return b - a; 35 return b - a;
34 } 36 }
35 return a - b; 37 return a - b;
36 } 38 }
37 39
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 74
73 // static 75 // static
74 size_t QuicFramer::GetMinStreamFrameSize() { 76 size_t QuicFramer::GetMinStreamFrameSize() {
75 return kQuicFrameTypeSize + kQuicStreamIdSize + 77 return kQuicFrameTypeSize + kQuicStreamIdSize +
76 kQuicStreamFinSize + kQuicStreamOffsetSize + kQuicStreamPayloadLengthSize; 78 kQuicStreamFinSize + kQuicStreamOffsetSize + kQuicStreamPayloadLengthSize;
77 } 79 }
78 80
79 // static 81 // static
80 size_t QuicFramer::GetMinAckFrameSize() { 82 size_t QuicFramer::GetMinAckFrameSize() {
81 return kQuicFrameTypeSize + kQuicEntropyHashSize + kSequenceNumberSize + 83 return kQuicFrameTypeSize + kQuicEntropyHashSize + kSequenceNumberSize +
82 kQuicEntropyHashSize + kSequenceNumberSize + kNumberOfMissingPacketsSize; 84 kQuicEntropyHashSize + kSequenceNumberSize +
85 kQuicDeltaTimeLargestObservedSize + kNumberOfMissingPacketsSize;
83 } 86 }
84 87
85 // static 88 // static
86 size_t QuicFramer::GetMinRstStreamFrameSize() { 89 size_t QuicFramer::GetMinRstStreamFrameSize() {
87 return kQuicFrameTypeSize + kQuicStreamIdSize + kQuicErrorCodeSize + 90 return kQuicFrameTypeSize + kQuicStreamIdSize + kQuicErrorCodeSize +
88 kQuicErrorDetailsLengthSize; 91 kQuicErrorDetailsLengthSize;
89 } 92 }
90 93
91 // static 94 // static
92 size_t QuicFramer::GetMinConnectionCloseFrameSize() { 95 size_t QuicFramer::GetMinConnectionCloseFrameSize() {
(...skipping 25 matching lines...) Expand all
118 size_t frame_len = ComputeFrameLength(frame); 121 size_t frame_len = ComputeFrameLength(frame);
119 if (frame_len > free_bytes) { 122 if (frame_len > free_bytes) {
120 // Only truncate the first frame in a packet, so if subsequent ones go 123 // Only truncate the first frame in a packet, so if subsequent ones go
121 // over, stop including more frames. 124 // over, stop including more frames.
122 if (!first_frame) { 125 if (!first_frame) {
123 return 0; 126 return 0;
124 } 127 }
125 if (CanTruncate(frame)) { 128 if (CanTruncate(frame)) {
126 // Truncate the frame so the packet will not exceed kMaxPacketSize. 129 // Truncate the frame so the packet will not exceed kMaxPacketSize.
127 // Note that we may not use every byte of the writer in this case. 130 // Note that we may not use every byte of the writer in this case.
128 DLOG(INFO) << "Truncating large frame"; 131 if (free_bytes >= GetMinAckFrameSize()) {
129 return free_bytes; 132 DLOG(INFO) << "Truncating large frame";
133 return free_bytes;
134 }
135 return 0;
130 } 136 }
131 } 137 }
132 return frame_len; 138 return frame_len;
133 } 139 }
134 140
135 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 141 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
136 const QuicPacketHeader& header) const { 142 const QuicPacketHeader& header) const {
137 if (!header.entropy_flag) { 143 if (!header.entropy_flag) {
138 // TODO(satyamshekhar): Return some more better value here (something that 144 // TODO(satyamshekhar): Return some more better value here (something that
139 // is not a constant). 145 // is not a constant).
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 while (!reader_->IsDoneReading()) { 645 while (!reader_->IsDoneReading()) {
640 uint8 frame_type; 646 uint8 frame_type;
641 if (!reader_->ReadBytes(&frame_type, 1)) { 647 if (!reader_->ReadBytes(&frame_type, 1)) {
642 set_detailed_error("Unable to read frame type."); 648 set_detailed_error("Unable to read frame type.");
643 return RaiseError(QUIC_INVALID_FRAME_DATA); 649 return RaiseError(QUIC_INVALID_FRAME_DATA);
644 } 650 }
645 switch (frame_type) { 651 switch (frame_type) {
646 case PADDING_FRAME: 652 case PADDING_FRAME:
647 // We're done with the packet 653 // We're done with the packet
648 return true; 654 return true;
649 case STREAM_FRAME: 655 case STREAM_FRAME: {
650 if (!ProcessStreamFrame()) { 656 QuicStreamFrame frame;
657 if (!ProcessStreamFrame(&frame)) {
651 return RaiseError(QUIC_INVALID_FRAME_DATA); 658 return RaiseError(QUIC_INVALID_FRAME_DATA);
652 } 659 }
660 if (!visitor_->OnStreamFrame(frame)) {
661 DLOG(INFO) << "Visitor asked to stopped further processing.";
662 // Returning true since there was no parsing error.
663 return true;
664 }
653 break; 665 break;
666 }
654 case ACK_FRAME: { 667 case ACK_FRAME: {
655 QuicAckFrame frame; 668 QuicAckFrame frame;
656 if (!ProcessAckFrame(&frame)) { 669 if (!ProcessAckFrame(&frame)) {
657 return RaiseError(QUIC_INVALID_FRAME_DATA); 670 return RaiseError(QUIC_INVALID_FRAME_DATA);
658 } 671 }
672 if (!visitor_->OnAckFrame(frame)) {
673 DLOG(INFO) << "Visitor asked to stopped further processing.";
674 // Returning true since there was no parsing error.
675 return true;
676 }
659 break; 677 break;
660 } 678 }
661 case CONGESTION_FEEDBACK_FRAME: { 679 case CONGESTION_FEEDBACK_FRAME: {
662 QuicCongestionFeedbackFrame frame; 680 QuicCongestionFeedbackFrame frame;
663 if (!ProcessQuicCongestionFeedbackFrame(&frame)) { 681 if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
664 return RaiseError(QUIC_INVALID_FRAME_DATA); 682 return RaiseError(QUIC_INVALID_FRAME_DATA);
665 } 683 }
684 if (!visitor_->OnCongestionFeedbackFrame(frame)) {
685 DLOG(INFO) << "Visitor asked to stopped further processing.";
686 // Returning true since there was no parsing error.
687 return true;
688 }
666 break; 689 break;
667 } 690 }
668 case RST_STREAM_FRAME: 691 case RST_STREAM_FRAME: {
669 if (!ProcessRstStreamFrame()) { 692 QuicRstStreamFrame frame;
693 if (!ProcessRstStreamFrame(&frame)) {
670 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); 694 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
671 } 695 }
696 if (!visitor_->OnRstStreamFrame(frame)) {
697 DLOG(INFO) << "Visitor asked to stopped further processing.";
698 // Returning true since there was no parsing error.
699 return true;
700 }
672 break; 701 break;
673 case CONNECTION_CLOSE_FRAME: 702 }
674 if (!ProcessConnectionCloseFrame()) { 703 case CONNECTION_CLOSE_FRAME: {
704 QuicConnectionCloseFrame frame;
705 if (!ProcessConnectionCloseFrame(&frame)) {
675 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); 706 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
676 } 707 }
708 if (!visitor_->OnConnectionCloseFrame(frame)) {
709 DLOG(INFO) << "Visitor asked to stopped further processing.";
710 // Returning true since there was no parsing error.
711 return true;
712 }
677 break; 713 break;
678 case GOAWAY_FRAME: 714 }
679 if (!ProcessGoAwayFrame()) { 715 case GOAWAY_FRAME: {
716 QuicGoAwayFrame goaway_frame;
717 if (!ProcessGoAwayFrame(&goaway_frame)) {
680 return RaiseError(QUIC_INVALID_GOAWAY_DATA); 718 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
681 } 719 }
720 if (!visitor_->OnGoAwayFrame(goaway_frame)) {
721 DLOG(INFO) << "Visitor asked to stopped further processing.";
722 // Returning true since there was no parsing error.
723 return true;
724 }
682 break; 725 break;
726 }
683 default: 727 default:
684 set_detailed_error("Illegal frame type."); 728 set_detailed_error("Illegal frame type.");
685 DLOG(WARNING) << "Illegal frame type: " 729 DLOG(WARNING) << "Illegal frame type: "
686 << static_cast<int>(frame_type); 730 << static_cast<int>(frame_type);
687 return RaiseError(QUIC_INVALID_FRAME_DATA); 731 return RaiseError(QUIC_INVALID_FRAME_DATA);
688 } 732 }
689 } 733 }
690 734
691 return true; 735 return true;
692 } 736 }
693 737
694 bool QuicFramer::ProcessStreamFrame() { 738 bool QuicFramer::ProcessStreamFrame(QuicStreamFrame* frame) {
695 QuicStreamFrame frame; 739 if (!reader_->ReadUInt32(&frame->stream_id)) {
696 if (!reader_->ReadUInt32(&frame.stream_id)) {
697 set_detailed_error("Unable to read stream_id."); 740 set_detailed_error("Unable to read stream_id.");
698 return false; 741 return false;
699 } 742 }
700 743
701 uint8 fin; 744 uint8 fin;
702 if (!reader_->ReadBytes(&fin, 1)) { 745 if (!reader_->ReadBytes(&fin, 1)) {
703 set_detailed_error("Unable to read fin."); 746 set_detailed_error("Unable to read fin.");
704 return false; 747 return false;
705 } 748 }
706 if (fin > 1) { 749 if (fin > 1) {
707 set_detailed_error("Invalid fin value."); 750 set_detailed_error("Invalid fin value.");
708 return false; 751 return false;
709 } 752 }
710 frame.fin = (fin == 1); 753 frame->fin = (fin == 1);
711 754
712 if (!reader_->ReadUInt64(&frame.offset)) { 755 if (!reader_->ReadUInt64(&frame->offset)) {
713 set_detailed_error("Unable to read offset."); 756 set_detailed_error("Unable to read offset.");
714 return false; 757 return false;
715 } 758 }
716 759
717 if (!reader_->ReadStringPiece16(&frame.data)) { 760 if (!reader_->ReadStringPiece16(&frame->data)) {
718 set_detailed_error("Unable to read frame data."); 761 set_detailed_error("Unable to read frame data.");
719 return false; 762 return false;
720 } 763 }
721 764
722 visitor_->OnStreamFrame(frame);
723 return true; 765 return true;
724 } 766 }
725 767
726 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) { 768 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
727 if (!ProcessSentInfo(&frame->sent_info)) { 769 if (!ProcessSentInfo(&frame->sent_info)) {
728 return false; 770 return false;
729 } 771 }
730 if (!ProcessReceivedInfo(&frame->received_info)) { 772 if (!ProcessReceivedInfo(&frame->received_info)) {
731 return false; 773 return false;
732 } 774 }
733 visitor_->OnAckFrame(*frame);
734 return true; 775 return true;
735 } 776 }
736 777
737 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { 778 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) {
738 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { 779 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) {
739 set_detailed_error("Unable to read entropy hash for received packets."); 780 set_detailed_error("Unable to read entropy hash for received packets.");
740 return false; 781 return false;
741 } 782 }
742 783
743 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { 784 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) {
744 set_detailed_error("Unable to read largest observed."); 785 set_detailed_error("Unable to read largest observed.");
745 return false; 786 return false;
746 } 787 }
747 // TODO(pwestin): read and update delta_time_largest_observed. 788
789 uint32 delta_time_largest_observed_us;
790 if (!reader_->ReadUInt32(&delta_time_largest_observed_us)) {
791 set_detailed_error("Unable to read delta time largest observed.");
792 return false;
793 }
794
795 if (delta_time_largest_observed_us == kInvalidDeltaTime) {
796 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite();
797 } else {
798 received_info->delta_time_largest_observed =
799 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us);
800 }
748 801
749 uint8 num_missing_packets; 802 uint8 num_missing_packets;
750 if (!reader_->ReadBytes(&num_missing_packets, 1)) { 803 if (!reader_->ReadBytes(&num_missing_packets, 1)) {
751 set_detailed_error("Unable to read num missing packets."); 804 set_detailed_error("Unable to read num missing packets.");
752 return false; 805 return false;
753 } 806 }
754 807
755 for (int i = 0; i < num_missing_packets; ++i) { 808 for (int i = 0; i < num_missing_packets; ++i) {
756 QuicPacketSequenceNumber sequence_number; 809 QuicPacketSequenceNumber sequence_number;
757 if (!ProcessPacketSequenceNumber(&sequence_number)) { 810 if (!ProcessPacketSequenceNumber(&sequence_number)) {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 922 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
870 break; 923 break;
871 } 924 }
872 default: 925 default:
873 set_detailed_error("Illegal congestion feedback type."); 926 set_detailed_error("Illegal congestion feedback type.");
874 DLOG(WARNING) << "Illegal congestion feedback type: " 927 DLOG(WARNING) << "Illegal congestion feedback type: "
875 << frame->type; 928 << frame->type;
876 return RaiseError(QUIC_INVALID_FRAME_DATA); 929 return RaiseError(QUIC_INVALID_FRAME_DATA);
877 } 930 }
878 931
879 visitor_->OnCongestionFeedbackFrame(*frame);
880 return true; 932 return true;
881 } 933 }
882 934
883 bool QuicFramer::ProcessRstStreamFrame() { 935 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) {
884 QuicRstStreamFrame frame; 936 if (!reader_->ReadUInt32(&frame->stream_id)) {
885 if (!reader_->ReadUInt32(&frame.stream_id)) {
886 set_detailed_error("Unable to read stream_id."); 937 set_detailed_error("Unable to read stream_id.");
887 return false; 938 return false;
888 } 939 }
889 940
890 uint32 error_code; 941 uint32 error_code;
891 if (!reader_->ReadUInt32(&error_code)) { 942 if (!reader_->ReadUInt32(&error_code)) {
892 set_detailed_error("Unable to read rst stream error code."); 943 set_detailed_error("Unable to read rst stream error code.");
893 return false; 944 return false;
894 } 945 }
895 946
896 if (error_code >= QUIC_STREAM_LAST_ERROR || 947 if (error_code >= QUIC_STREAM_LAST_ERROR ||
897 error_code < QUIC_STREAM_NO_ERROR) { 948 error_code < QUIC_STREAM_NO_ERROR) {
898 set_detailed_error("Invalid rst stream error code."); 949 set_detailed_error("Invalid rst stream error code.");
899 return false; 950 return false;
900 } 951 }
901 952
902 frame.error_code = static_cast<QuicRstStreamErrorCode>(error_code); 953 frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
903 954
904 StringPiece error_details; 955 StringPiece error_details;
905 if (!reader_->ReadStringPiece16(&error_details)) { 956 if (!reader_->ReadStringPiece16(&error_details)) {
906 set_detailed_error("Unable to read rst stream error details."); 957 set_detailed_error("Unable to read rst stream error details.");
907 return false; 958 return false;
908 } 959 }
909 frame.error_details = error_details.as_string(); 960 frame->error_details = error_details.as_string();
910 961
911 visitor_->OnRstStreamFrame(frame);
912 return true; 962 return true;
913 } 963 }
914 964
915 bool QuicFramer::ProcessConnectionCloseFrame() { 965 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) {
916 QuicConnectionCloseFrame frame;
917
918 uint32 error_code; 966 uint32 error_code;
919 if (!reader_->ReadUInt32(&error_code)) { 967 if (!reader_->ReadUInt32(&error_code)) {
920 set_detailed_error("Unable to read connection close error code."); 968 set_detailed_error("Unable to read connection close error code.");
921 return false; 969 return false;
922 } 970 }
923 971
924 if (error_code >= QUIC_LAST_ERROR || 972 if (error_code >= QUIC_LAST_ERROR ||
925 error_code < QUIC_NO_ERROR) { 973 error_code < QUIC_NO_ERROR) {
926 set_detailed_error("Invalid error code."); 974 set_detailed_error("Invalid error code.");
927 return false; 975 return false;
928 } 976 }
929 977
930 frame.error_code = static_cast<QuicErrorCode>(error_code); 978 frame->error_code = static_cast<QuicErrorCode>(error_code);
931 979
932 StringPiece error_details; 980 StringPiece error_details;
933 if (!reader_->ReadStringPiece16(&error_details)) { 981 if (!reader_->ReadStringPiece16(&error_details)) {
934 set_detailed_error("Unable to read connection close error details."); 982 set_detailed_error("Unable to read connection close error details.");
935 return false; 983 return false;
936 } 984 }
937 frame.error_details = error_details.as_string(); 985 frame->error_details = error_details.as_string();
938 986
939 if (!ProcessAckFrame(&frame.ack_frame)) { 987 if (!ProcessAckFrame(&frame->ack_frame)) {
940 DLOG(WARNING) << "Unable to process ack frame."; 988 DLOG(WARNING) << "Unable to process ack frame.";
941 return false; 989 return false;
942 } 990 }
943 991
944 visitor_->OnConnectionCloseFrame(frame); 992 if (!visitor_->OnAckFrame(frame->ack_frame)) {
993 DLOG(INFO) << "Visitor asked to stopped further processing.";
994 // Returning true since there was no parsing error.
995 return true;
996 }
997
945 return true; 998 return true;
946 } 999 }
947 1000
948 bool QuicFramer::ProcessGoAwayFrame() { 1001 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) {
949 QuicGoAwayFrame frame;
950
951 uint32 error_code; 1002 uint32 error_code;
952 if (!reader_->ReadUInt32(&error_code)) { 1003 if (!reader_->ReadUInt32(&error_code)) {
953 set_detailed_error("Unable to read go away error code."); 1004 set_detailed_error("Unable to read go away error code.");
954 return false; 1005 return false;
955 } 1006 }
956 frame.error_code = static_cast<QuicErrorCode>(error_code); 1007 frame->error_code = static_cast<QuicErrorCode>(error_code);
957 1008
958 if (error_code >= QUIC_LAST_ERROR || 1009 if (error_code >= QUIC_LAST_ERROR ||
959 error_code < QUIC_NO_ERROR) { 1010 error_code < QUIC_NO_ERROR) {
960 set_detailed_error("Invalid error code."); 1011 set_detailed_error("Invalid error code.");
961 return false; 1012 return false;
962 } 1013 }
963 1014
964 uint32 stream_id; 1015 uint32 stream_id;
965 if (!reader_->ReadUInt32(&stream_id)) { 1016 if (!reader_->ReadUInt32(&stream_id)) {
966 set_detailed_error("Unable to read last good stream id."); 1017 set_detailed_error("Unable to read last good stream id.");
967 return false; 1018 return false;
968 } 1019 }
969 frame.last_good_stream_id = static_cast<QuicStreamId>(stream_id); 1020 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
970 1021
971 StringPiece reason_phrase; 1022 StringPiece reason_phrase;
972 if (!reader_->ReadStringPiece16(&reason_phrase)) { 1023 if (!reader_->ReadStringPiece16(&reason_phrase)) {
973 set_detailed_error("Unable to read goaway reason."); 1024 set_detailed_error("Unable to read goaway reason.");
974 return false; 1025 return false;
975 } 1026 }
976 frame.reason_phrase = reason_phrase.as_string(); 1027 frame->reason_phrase = reason_phrase.as_string();
977 1028
978 visitor_->OnGoAwayFrame(frame);
979 return true; 1029 return true;
980 } 1030 }
981 1031
982 // static 1032 // static
983 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( 1033 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
984 const QuicEncryptedPacket& encrypted, bool includes_version) { 1034 const QuicEncryptedPacket& encrypted, bool includes_version) {
985 return StringPiece(encrypted.data() + kStartOfHashData, 1035 return StringPiece(encrypted.data() + kStartOfHashData,
986 GetStartOfEncryptedData(includes_version) - 1036 GetStartOfEncryptedData(includes_version) -
987 kStartOfHashData); 1037 kStartOfHashData);
988 } 1038 }
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 size_t received_entropy_offset = writer->length(); 1238 size_t received_entropy_offset = writer->length();
1189 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) { 1239 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) {
1190 return false; 1240 return false;
1191 } 1241 }
1192 1242
1193 size_t largest_observed_offset = writer->length(); 1243 size_t largest_observed_offset = writer->length();
1194 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, 1244 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed,
1195 writer)) { 1245 writer)) {
1196 return false; 1246 return false;
1197 } 1247 }
1198 // TODO(pwestin): calculate and add delta_time_largest_observed to the 1248 uint32 delta_time_largest_observed_us = kInvalidDeltaTime;
1199 // message. 1249 if (!frame.received_info.delta_time_largest_observed.IsInfinite()) {
1250 delta_time_largest_observed_us =
1251 frame.received_info.delta_time_largest_observed.ToMicroseconds();
1252 }
1253
1254 size_t delta_time_largest_observed_offset = writer->length();
1255 if (!writer->WriteUInt32(delta_time_largest_observed_us)) {
1256 return false;
1257 }
1200 1258
1201 // We don't check for overflowing uint8 here, because we only can fit 192 acks 1259 // We don't check for overflowing uint8 here, because we only can fit 192 acks
1202 // per packet, so if we overflow we will be truncated. 1260 // per packet, so if we overflow we will be truncated.
1203 uint8 num_missing_packets = frame.received_info.missing_packets.size(); 1261 uint8 num_missing_packets = frame.received_info.missing_packets.size();
1204 size_t num_missing_packets_offset = writer->length(); 1262 size_t num_missing_packets_offset = writer->length();
1205 if (!writer->WriteBytes(&num_missing_packets, 1)) { 1263 if (!writer->WriteBytes(&num_missing_packets, 1)) {
1206 return false; 1264 return false;
1207 } 1265 }
1208 1266
1209 SequenceNumberSet::const_iterator it = 1267 SequenceNumberSet::const_iterator it =
1210 frame.received_info.missing_packets.begin(); 1268 frame.received_info.missing_packets.begin();
1211 int num_missing_packets_written = 0; 1269 int num_missing_packets_written = 0;
1212 for (; it != frame.received_info.missing_packets.end(); ++it) { 1270 for (; it != frame.received_info.missing_packets.end(); ++it) {
1213 if (!AppendPacketSequenceNumber(*it, writer)) { 1271 if (!AppendPacketSequenceNumber(*it, writer)) {
1214 // We are truncating. 1272 // We are truncating.
1215 QuicPacketSequenceNumber largest_observed = 1273 QuicPacketSequenceNumber largest_observed =
1216 CalculateLargestObserved(frame.received_info.missing_packets, --it); 1274 CalculateLargestObserved(frame.received_info.missing_packets, --it);
1217 // Overwrite entropy hash for received packets. 1275 // Overwrite entropy hash for received packets.
1218 writer->WriteUInt8ToOffset( 1276 writer->WriteUInt8ToOffset(
1219 entropy_calculator_->ReceivedEntropyHash(largest_observed), 1277 entropy_calculator_->ReceivedEntropyHash(largest_observed),
1220 received_entropy_offset); 1278 received_entropy_offset);
1221 // Overwrite largest_observed. 1279 // Overwrite largest_observed.
1222 writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask, 1280 writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask,
1223 largest_observed_offset); 1281 largest_observed_offset);
1282 writer->WriteUInt32ToOffset(kInvalidDeltaTime,
1283 delta_time_largest_observed_offset);
1224 writer->WriteUInt8ToOffset(num_missing_packets_written, 1284 writer->WriteUInt8ToOffset(num_missing_packets_written,
1225 num_missing_packets_offset); 1285 num_missing_packets_offset);
1226 return true; 1286 return true;
1227 } 1287 }
1228 ++num_missing_packets_written; 1288 ++num_missing_packets_written;
1229 DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written); 1289 DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written);
1230 } 1290 }
1231 1291
1232 return true; 1292 return true;
1233 } 1293 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 1431
1372 bool QuicFramer::RaiseError(QuicErrorCode error) { 1432 bool QuicFramer::RaiseError(QuicErrorCode error) {
1373 DLOG(INFO) << detailed_error_; 1433 DLOG(INFO) << detailed_error_;
1374 set_error(error); 1434 set_error(error);
1375 visitor_->OnError(this); 1435 visitor_->OnError(this);
1376 reader_.reset(NULL); 1436 reader_.reset(NULL);
1377 return false; 1437 return false;
1378 } 1438 }
1379 1439
1380 } // namespace net 1440 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698