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/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 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 return QuicTime::Delta::FromMicroseconds(time); | 796 return QuicTime::Delta::FromMicroseconds(time); |
797 } | 797 } |
798 | 798 |
799 bool QuicFramer::IsValidPath(QuicPathId path_id, | 799 bool QuicFramer::IsValidPath(QuicPathId path_id, |
800 QuicPacketNumber* base_packet_number) { | 800 QuicPacketNumber* base_packet_number) { |
801 if (ContainsKey(closed_paths_, path_id)) { | 801 if (ContainsKey(closed_paths_, path_id)) { |
802 // Path is closed. | 802 // Path is closed. |
803 return false; | 803 return false; |
804 } | 804 } |
805 | 805 |
806 if (FLAGS_quic_packet_numbers_largest_received) { | 806 if (path_id == last_path_id_) { |
807 if (path_id == last_path_id_) { | 807 *base_packet_number = largest_packet_number_; |
808 *base_packet_number = largest_packet_number_; | 808 return true; |
809 return true; | 809 } |
810 } | |
811 | 810 |
812 if (ContainsKey(largest_packet_numbers_, path_id)) { | 811 if (ContainsKey(largest_packet_numbers_, path_id)) { |
813 *base_packet_number = largest_packet_numbers_[path_id]; | 812 *base_packet_number = largest_packet_numbers_[path_id]; |
814 } else { | |
815 *base_packet_number = 0; | |
816 } | |
817 } else { | 813 } else { |
818 if (path_id == last_path_id_) { | 814 *base_packet_number = 0; |
819 *base_packet_number = last_packet_number_; | |
820 return true; | |
821 } | |
822 | |
823 if (ContainsKey(last_packet_numbers_, path_id)) { | |
824 *base_packet_number = last_packet_numbers_[path_id]; | |
825 } else { | |
826 *base_packet_number = 0; | |
827 } | |
828 } | 815 } |
829 | 816 |
830 return true; | 817 return true; |
831 } | 818 } |
832 | 819 |
833 void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { | 820 void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { |
834 if (header.public_header.multipath_flag && header.path_id != last_path_id_) { | 821 if (header.public_header.multipath_flag && header.path_id != last_path_id_) { |
835 if (last_path_id_ != kInvalidPathId) { | 822 if (last_path_id_ != kInvalidPathId) { |
836 // Save current last packet number before changing path. | 823 // Save current last packet number before changing path. |
837 last_packet_numbers_[last_path_id_] = last_packet_number_; | 824 largest_packet_numbers_[last_path_id_] = largest_packet_number_; |
838 if (FLAGS_quic_packet_numbers_largest_received) { | |
839 largest_packet_numbers_[last_path_id_] = largest_packet_number_; | |
840 } | |
841 } | 825 } |
842 // Change path. | 826 // Change path. |
843 last_path_id_ = header.path_id; | 827 last_path_id_ = header.path_id; |
844 } | 828 } |
845 last_packet_number_ = header.packet_number; | 829 last_packet_number_ = header.packet_number; |
846 if (FLAGS_quic_packet_numbers_largest_received) { | 830 largest_packet_number_ = max(header.packet_number, largest_packet_number_); |
847 largest_packet_number_ = max(header.packet_number, largest_packet_number_); | |
848 } | |
849 } | 831 } |
850 | 832 |
851 void QuicFramer::OnPathClosed(QuicPathId path_id) { | 833 void QuicFramer::OnPathClosed(QuicPathId path_id) { |
852 closed_paths_.insert(path_id); | 834 closed_paths_.insert(path_id); |
853 last_packet_numbers_.erase(path_id); | 835 largest_packet_numbers_.erase(path_id); |
854 } | 836 } |
855 | 837 |
856 QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( | 838 QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( |
857 QuicPacketNumberLength packet_number_length, | 839 QuicPacketNumberLength packet_number_length, |
858 QuicPacketNumber base_packet_number, | 840 QuicPacketNumber base_packet_number, |
859 QuicPacketNumber packet_number) const { | 841 QuicPacketNumber packet_number) const { |
860 // The new packet number might have wrapped to the next epoch, or | 842 // The new packet number might have wrapped to the next epoch, or |
861 // it might have reverse wrapped to the previous epoch, or it might | 843 // it might have reverse wrapped to the previous epoch, or it might |
862 // remain in the same epoch. Select the packet number closest to the | 844 // remain in the same epoch. Select the packet number closest to the |
863 // next expected packet number, the previous packet number plus 1. | 845 // next expected packet number, the previous packet number plus 1. |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 | 1043 |
1062 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 1044 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
1063 QuicPacketHeader* header) { | 1045 QuicPacketHeader* header) { |
1064 header->path_id = kDefaultPathId; | 1046 header->path_id = kDefaultPathId; |
1065 if (header->public_header.multipath_flag && | 1047 if (header->public_header.multipath_flag && |
1066 !ProcessPathId(encrypted_reader, &header->path_id)) { | 1048 !ProcessPathId(encrypted_reader, &header->path_id)) { |
1067 set_detailed_error("Unable to read path id."); | 1049 set_detailed_error("Unable to read path id."); |
1068 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1050 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
1069 } | 1051 } |
1070 | 1052 |
1071 QuicPacketNumber base_packet_number = | 1053 QuicPacketNumber base_packet_number = largest_packet_number_; |
1072 FLAGS_quic_packet_numbers_largest_received ? largest_packet_number_ | |
1073 : last_packet_number_; | |
1074 if (header->public_header.multipath_flag && | 1054 if (header->public_header.multipath_flag && |
1075 !IsValidPath(header->path_id, &base_packet_number)) { | 1055 !IsValidPath(header->path_id, &base_packet_number)) { |
1076 // Stop processing because path is closed. | 1056 // Stop processing because path is closed. |
1077 return false; | 1057 return false; |
1078 } | 1058 } |
1079 | 1059 |
1080 if (!ProcessPacketSequenceNumber( | 1060 if (!ProcessPacketSequenceNumber( |
1081 encrypted_reader, header->public_header.packet_number_length, | 1061 encrypted_reader, header->public_header.packet_number_length, |
1082 base_packet_number, &header->packet_number)) { | 1062 base_packet_number, &header->packet_number)) { |
1083 set_detailed_error("Unable to read packet number."); | 1063 set_detailed_error("Unable to read packet number."); |
(...skipping 1491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2575 | 2555 |
2576 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2556 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2577 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2557 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2578 << " detail: " << detailed_error_; | 2558 << " detail: " << detailed_error_; |
2579 set_error(error); | 2559 set_error(error); |
2580 visitor_->OnError(this); | 2560 visitor_->OnError(this); |
2581 return false; | 2561 return false; |
2582 } | 2562 } |
2583 | 2563 |
2584 } // namespace net | 2564 } // namespace net |
OLD | NEW |