| 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 <stdint.h> |
| 8 |
| 7 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 8 #include "base/logging.h" | 10 #include "base/logging.h" |
| 9 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 10 #include "net/quic/crypto/crypto_framer.h" | 12 #include "net/quic/crypto/crypto_framer.h" |
| 11 #include "net/quic/crypto/crypto_handshake_message.h" | 13 #include "net/quic/crypto/crypto_handshake_message.h" |
| 12 #include "net/quic/crypto/crypto_protocol.h" | 14 #include "net/quic/crypto/crypto_protocol.h" |
| 13 #include "net/quic/crypto/quic_decrypter.h" | 15 #include "net/quic/crypto/quic_decrypter.h" |
| 14 #include "net/quic/crypto/quic_encrypter.h" | 16 #include "net/quic/crypto/quic_encrypter.h" |
| 15 #include "net/quic/quic_data_reader.h" | 17 #include "net/quic/quic_data_reader.h" |
| 16 #include "net/quic/quic_data_writer.h" | 18 #include "net/quic/quic_data_writer.h" |
| 17 #include "net/quic/quic_flags.h" | 19 #include "net/quic/quic_flags.h" |
| 18 #include "net/quic/quic_socket_address_coder.h" | 20 #include "net/quic/quic_socket_address_coder.h" |
| 19 #include "net/quic/quic_utils.h" | 21 #include "net/quic/quic_utils.h" |
| 20 | 22 |
| 21 using base::StringPiece; | 23 using base::StringPiece; |
| 22 using std::map; | 24 using std::map; |
| 23 using std::max; | 25 using std::max; |
| 24 using std::min; | 26 using std::min; |
| 25 using std::numeric_limits; | 27 using std::numeric_limits; |
| 26 using std::string; | 28 using std::string; |
| 27 | 29 |
| 28 namespace net { | 30 namespace net { |
| 29 | 31 |
| 30 namespace { | 32 namespace { |
| 31 | 33 |
| 32 // Mask to select the lowest 48 bits of a sequence number. | 34 // Mask to select the lowest 48 bits of a sequence number. |
| 33 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = | 35 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = |
| 34 GG_UINT64_C(0x0000FFFFFFFFFFFF); | 36 UINT64_C(0x0000FFFFFFFFFFFF); |
| 35 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = | 37 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = |
| 36 GG_UINT64_C(0x00000000FFFFFFFF); | 38 UINT64_C(0x00000000FFFFFFFF); |
| 37 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = | 39 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = |
| 38 GG_UINT64_C(0x000000000000FFFF); | 40 UINT64_C(0x000000000000FFFF); |
| 39 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = | 41 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = |
| 40 GG_UINT64_C(0x00000000000000FF); | 42 UINT64_C(0x00000000000000FF); |
| 41 | 43 |
| 42 const QuicConnectionId k1ByteConnectionIdMask = GG_UINT64_C(0x00000000000000FF); | 44 const QuicConnectionId k1ByteConnectionIdMask = UINT64_C(0x00000000000000FF); |
| 43 const QuicConnectionId k4ByteConnectionIdMask = GG_UINT64_C(0x00000000FFFFFFFF); | 45 const QuicConnectionId k4ByteConnectionIdMask = UINT64_C(0x00000000FFFFFFFF); |
| 44 | 46 |
| 45 // Number of bits the sequence number length bits are shifted from the right | 47 // Number of bits the sequence number length bits are shifted from the right |
| 46 // edge of the public header. | 48 // edge of the public header. |
| 47 const uint8 kPublicHeaderSequenceNumberShift = 4; | 49 const uint8 kPublicHeaderSequenceNumberShift = 4; |
| 48 | 50 |
| 49 // New Frame Types, QUIC v. >= 10: | 51 // New Frame Types, QUIC v. >= 10: |
| 50 // There are two interpretations for the Frame Type byte in the QUIC protocol, | 52 // 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. | 53 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. |
| 52 // | 54 // |
| 53 // Regular Frame Types use the Frame Type byte simply. Currently defined | 55 // Regular Frame Types use the Frame Type byte simply. Currently defined |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 | 805 |
| 804 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 806 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
| 805 uint32 time_delta_us) { | 807 uint32 time_delta_us) { |
| 806 // The new time_delta might have wrapped to the next epoch, or it | 808 // The new time_delta might have wrapped to the next epoch, or it |
| 807 // might have reverse wrapped to the previous epoch, or it might | 809 // might have reverse wrapped to the previous epoch, or it might |
| 808 // remain in the same epoch. Select the time closest to the previous | 810 // remain in the same epoch. Select the time closest to the previous |
| 809 // time. | 811 // time. |
| 810 // | 812 // |
| 811 // epoch_delta is the delta between epochs. A delta is 4 bytes of | 813 // epoch_delta is the delta between epochs. A delta is 4 bytes of |
| 812 // microseconds. | 814 // microseconds. |
| 813 const uint64 epoch_delta = GG_UINT64_C(1) << 32; | 815 const uint64 epoch_delta = UINT64_C(1) << 32; |
| 814 uint64 epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1); | 816 uint64 epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1); |
| 815 // Wrapping is safe here because a wrapped value will not be ClosestTo below. | 817 // Wrapping is safe here because a wrapped value will not be ClosestTo below. |
| 816 uint64 prev_epoch = epoch - epoch_delta; | 818 uint64 prev_epoch = epoch - epoch_delta; |
| 817 uint64 next_epoch = epoch + epoch_delta; | 819 uint64 next_epoch = epoch + epoch_delta; |
| 818 | 820 |
| 819 uint64 time = ClosestTo(last_timestamp_.ToMicroseconds(), | 821 uint64 time = ClosestTo(last_timestamp_.ToMicroseconds(), |
| 820 epoch + time_delta_us, | 822 epoch + time_delta_us, |
| 821 ClosestTo(last_timestamp_.ToMicroseconds(), | 823 ClosestTo(last_timestamp_.ToMicroseconds(), |
| 822 prev_epoch + time_delta_us, | 824 prev_epoch + time_delta_us, |
| 823 next_epoch + time_delta_us)); | 825 next_epoch + time_delta_us)); |
| 824 | 826 |
| 825 return QuicTime::Delta::FromMicroseconds(time); | 827 return QuicTime::Delta::FromMicroseconds(time); |
| 826 } | 828 } |
| 827 | 829 |
| 828 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( | 830 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( |
| 829 QuicSequenceNumberLength sequence_number_length, | 831 QuicSequenceNumberLength sequence_number_length, |
| 830 QuicPacketSequenceNumber packet_sequence_number) const { | 832 QuicPacketSequenceNumber packet_sequence_number) const { |
| 831 // The new sequence number might have wrapped to the next epoch, or | 833 // The new sequence number might have wrapped to the next epoch, or |
| 832 // it might have reverse wrapped to the previous epoch, or it might | 834 // it might have reverse wrapped to the previous epoch, or it might |
| 833 // remain in the same epoch. Select the sequence number closest to the | 835 // remain in the same epoch. Select the sequence number closest to the |
| 834 // next expected sequence number, the previous sequence number plus 1. | 836 // next expected sequence number, the previous sequence number plus 1. |
| 835 | 837 |
| 836 // epoch_delta is the delta between epochs the sequence number was serialized | 838 // epoch_delta is the delta between epochs the sequence number was serialized |
| 837 // with, so the correct value is likely the same epoch as the last sequence | 839 // with, so the correct value is likely the same epoch as the last sequence |
| 838 // number or an adjacent epoch. | 840 // number or an adjacent epoch. |
| 839 const QuicPacketSequenceNumber epoch_delta = | 841 const QuicPacketSequenceNumber epoch_delta = |
| 840 GG_UINT64_C(1) << (8 * sequence_number_length); | 842 UINT64_C(1) << (8 * sequence_number_length); |
| 841 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; | 843 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; |
| 842 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); | 844 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); |
| 843 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; | 845 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; |
| 844 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; | 846 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; |
| 845 | 847 |
| 846 return ClosestTo(next_sequence_number, | 848 return ClosestTo(next_sequence_number, |
| 847 epoch + packet_sequence_number, | 849 epoch + packet_sequence_number, |
| 848 ClosestTo(next_sequence_number, | 850 ClosestTo(next_sequence_number, |
| 849 prev_epoch + packet_sequence_number, | 851 prev_epoch + packet_sequence_number, |
| 850 next_epoch + packet_sequence_number)); | 852 next_epoch + packet_sequence_number)); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 948 } | 950 } |
| 949 | 951 |
| 950 // static | 952 // static |
| 951 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( | 953 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( |
| 952 QuicPacketSequenceNumber sequence_number) { | 954 QuicPacketSequenceNumber sequence_number) { |
| 953 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { | 955 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { |
| 954 return PACKET_1BYTE_SEQUENCE_NUMBER; | 956 return PACKET_1BYTE_SEQUENCE_NUMBER; |
| 955 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { | 957 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { |
| 956 return PACKET_2BYTE_SEQUENCE_NUMBER; | 958 return PACKET_2BYTE_SEQUENCE_NUMBER; |
| 957 } else if (sequence_number < | 959 } else if (sequence_number < |
| 958 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { | 960 UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { |
| 959 return PACKET_4BYTE_SEQUENCE_NUMBER; | 961 return PACKET_4BYTE_SEQUENCE_NUMBER; |
| 960 } else { | 962 } else { |
| 961 return PACKET_6BYTE_SEQUENCE_NUMBER; | 963 return PACKET_6BYTE_SEQUENCE_NUMBER; |
| 962 } | 964 } |
| 963 } | 965 } |
| 964 | 966 |
| 965 // static | 967 // static |
| 966 uint8 QuicFramer::GetSequenceNumberFlags( | 968 uint8 QuicFramer::GetSequenceNumberFlags( |
| 967 QuicSequenceNumberLength sequence_number_length) { | 969 QuicSequenceNumberLength sequence_number_length) { |
| 968 switch (sequence_number_length) { | 970 switch (sequence_number_length) { |
| (...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2093 if (delta_from_largest_observed > numeric_limits<uint8>::max()) { | 2095 if (delta_from_largest_observed > numeric_limits<uint8>::max()) { |
| 2094 return false; | 2096 return false; |
| 2095 } | 2097 } |
| 2096 | 2098 |
| 2097 if (!writer->WriteUInt8( | 2099 if (!writer->WriteUInt8( |
| 2098 delta_from_largest_observed & k1ByteSequenceNumberMask)) { | 2100 delta_from_largest_observed & k1ByteSequenceNumberMask)) { |
| 2099 return false; | 2101 return false; |
| 2100 } | 2102 } |
| 2101 | 2103 |
| 2102 // Use the lowest 4 bytes of the time delta from the creation_time_. | 2104 // Use the lowest 4 bytes of the time delta from the creation_time_. |
| 2103 const uint64 time_epoch_delta_us = GG_UINT64_C(1) << 32; | 2105 const uint64 time_epoch_delta_us = UINT64_C(1) << 32; |
| 2104 uint32 time_delta_us = | 2106 uint32 time_delta_us = |
| 2105 static_cast<uint32>(it->second.Subtract(creation_time_).ToMicroseconds() | 2107 static_cast<uint32>(it->second.Subtract(creation_time_).ToMicroseconds() |
| 2106 & (time_epoch_delta_us - 1)); | 2108 & (time_epoch_delta_us - 1)); |
| 2107 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | 2109 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { |
| 2108 return false; | 2110 return false; |
| 2109 } | 2111 } |
| 2110 | 2112 |
| 2111 QuicTime prev_time = it->second; | 2113 QuicTime prev_time = it->second; |
| 2112 | 2114 |
| 2113 for (++it; it != frame.received_packet_times.end(); ++it) { | 2115 for (++it; it != frame.received_packet_times.end(); ++it) { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2240 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2242 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2241 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2243 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
| 2242 << " detail: " << detailed_error_; | 2244 << " detail: " << detailed_error_; |
| 2243 set_error(error); | 2245 set_error(error); |
| 2244 visitor_->OnError(this); | 2246 visitor_->OnError(this); |
| 2245 reader_.reset(nullptr); | 2247 reader_.reset(nullptr); |
| 2246 return false; | 2248 return false; |
| 2247 } | 2249 } |
| 2248 | 2250 |
| 2249 } // namespace net | 2251 } // namespace net |
| OLD | NEW |