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