OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |