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/containers/hash_tables.h" | 7 #include "base/containers/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 | 12 |
13 using base::StringPiece; | 13 using base::StringPiece; |
14 using std::make_pair; | 14 using std::make_pair; |
15 using std::map; | 15 using std::map; |
16 using std::max; | 16 using std::max; |
17 using std::min; | 17 using std::min; |
18 using std::numeric_limits; | 18 using std::numeric_limits; |
19 using std::string; | 19 using std::string; |
20 | 20 |
| 21 bool FLAGS_quic_allow_oversized_packets_for_test = false; |
| 22 |
21 namespace net { | 23 namespace net { |
22 | 24 |
23 namespace { | 25 namespace { |
24 | 26 |
25 // Mask to select the lowest 48 bits of a sequence number. | 27 // Mask to select the lowest 48 bits of a sequence number. |
26 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = | 28 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = |
27 GG_UINT64_C(0x0000FFFFFFFFFFFF); | 29 GG_UINT64_C(0x0000FFFFFFFFFFFF); |
28 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = | 30 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = |
29 GG_UINT64_C(0x00000000FFFFFFFF); | 31 GG_UINT64_C(0x00000000FFFFFFFF); |
30 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = | 32 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 // Only truncate the first frame in a packet, so if subsequent ones go | 261 // Only truncate the first frame in a packet, so if subsequent ones go |
260 // over, stop including more frames. | 262 // over, stop including more frames. |
261 if (!first_frame) { | 263 if (!first_frame) { |
262 return 0; | 264 return 0; |
263 } | 265 } |
264 if (CanTruncate(quic_version_, frame, free_bytes)) { | 266 if (CanTruncate(quic_version_, frame, free_bytes)) { |
265 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 267 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
266 // Note that we may not use every byte of the writer in this case. | 268 // Note that we may not use every byte of the writer in this case. |
267 DVLOG(1) << "Truncating large frame"; | 269 DVLOG(1) << "Truncating large frame"; |
268 return free_bytes; | 270 return free_bytes; |
| 271 } else if (!FLAGS_quic_allow_oversized_packets_for_test) { |
| 272 return 0; |
269 } | 273 } |
270 } | 274 } |
271 return frame_len; | 275 return frame_len; |
272 } | 276 } |
273 | 277 |
274 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } | 278 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } |
275 | 279 |
276 QuicFramer::AckFrameInfo::~AckFrameInfo() { } | 280 QuicFramer::AckFrameInfo::~AckFrameInfo() { } |
277 | 281 |
278 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | 282 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1722 break; | 1726 break; |
1723 case PACKET_4BYTE_SEQUENCE_NUMBER: | 1727 case PACKET_4BYTE_SEQUENCE_NUMBER: |
1724 return writer->WriteUInt32( | 1728 return writer->WriteUInt32( |
1725 packet_sequence_number & k4ByteSequenceNumberMask); | 1729 packet_sequence_number & k4ByteSequenceNumberMask); |
1726 break; | 1730 break; |
1727 case PACKET_6BYTE_SEQUENCE_NUMBER: | 1731 case PACKET_6BYTE_SEQUENCE_NUMBER: |
1728 return writer->WriteUInt48( | 1732 return writer->WriteUInt48( |
1729 packet_sequence_number & k6ByteSequenceNumberMask); | 1733 packet_sequence_number & k6ByteSequenceNumberMask); |
1730 break; | 1734 break; |
1731 default: | 1735 default: |
1732 NOTREACHED() << "sequence_number_length: " << sequence_number_length; | 1736 DCHECK(false) << "sequence_number_length: " << sequence_number_length; |
1733 return false; | 1737 return false; |
1734 } | 1738 } |
1735 } | 1739 } |
1736 | 1740 |
1737 bool QuicFramer::AppendStreamFramePayload( | 1741 bool QuicFramer::AppendStreamFramePayload( |
1738 const QuicStreamFrame& frame, | 1742 const QuicStreamFrame& frame, |
1739 bool last_frame_in_packet, | 1743 bool last_frame_in_packet, |
1740 QuicDataWriter* writer) { | 1744 QuicDataWriter* writer) { |
1741 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1745 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
1742 return false; | 1746 return false; |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2036 | 2040 |
2037 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2041 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2038 DVLOG(1) << "Error detail: " << detailed_error_; | 2042 DVLOG(1) << "Error detail: " << detailed_error_; |
2039 set_error(error); | 2043 set_error(error); |
2040 visitor_->OnError(this); | 2044 visitor_->OnError(this); |
2041 reader_.reset(NULL); | 2045 reader_.reset(NULL); |
2042 return false; | 2046 return false; |
2043 } | 2047 } |
2044 | 2048 |
2045 } // namespace net | 2049 } // namespace net |
OLD | NEW |