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 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
11 #include "net/quic/core/crypto/crypto_framer.h" | 11 #include "net/quic/core/crypto/crypto_framer.h" |
12 #include "net/quic/core/crypto/crypto_handshake_message.h" | 12 #include "net/quic/core/crypto/crypto_handshake_message.h" |
13 #include "net/quic/core/crypto/crypto_protocol.h" | 13 #include "net/quic/core/crypto/crypto_protocol.h" |
14 #include "net/quic/core/crypto/null_decrypter.h" | 14 #include "net/quic/core/crypto/null_decrypter.h" |
15 #include "net/quic/core/crypto/null_encrypter.h" | 15 #include "net/quic/core/crypto/null_encrypter.h" |
16 #include "net/quic/core/crypto/quic_decrypter.h" | 16 #include "net/quic/core/crypto/quic_decrypter.h" |
17 #include "net/quic/core/crypto/quic_encrypter.h" | 17 #include "net/quic/core/crypto/quic_encrypter.h" |
18 #include "net/quic/core/quic_data_reader.h" | 18 #include "net/quic/core/quic_data_reader.h" |
19 #include "net/quic/core/quic_data_writer.h" | 19 #include "net/quic/core/quic_data_writer.h" |
20 #include "net/quic/core/quic_socket_address_coder.h" | 20 #include "net/quic/core/quic_socket_address_coder.h" |
| 21 #include "net/quic/core/quic_stream_frame_data_producer.h" |
21 #include "net/quic/core/quic_utils.h" | 22 #include "net/quic/core/quic_utils.h" |
22 #include "net/quic/platform/api/quic_aligned.h" | 23 #include "net/quic/platform/api/quic_aligned.h" |
23 #include "net/quic/platform/api/quic_bug_tracker.h" | 24 #include "net/quic/platform/api/quic_bug_tracker.h" |
24 #include "net/quic/platform/api/quic_flag_utils.h" | 25 #include "net/quic/platform/api/quic_flag_utils.h" |
25 #include "net/quic/platform/api/quic_flags.h" | 26 #include "net/quic/platform/api/quic_flags.h" |
26 #include "net/quic/platform/api/quic_logging.h" | 27 #include "net/quic/platform/api/quic_logging.h" |
27 #include "net/quic/platform/api/quic_map_util.h" | 28 #include "net/quic/platform/api/quic_map_util.h" |
28 #include "net/quic/platform/api/quic_ptr_util.h" | 29 #include "net/quic/platform/api/quic_ptr_util.h" |
29 | 30 |
30 using std::string; | 31 using std::string; |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 QuicFramer::AckFrameInfo::AckFrameInfo() | 306 QuicFramer::AckFrameInfo::AckFrameInfo() |
306 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} | 307 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
307 | 308 |
308 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; | 309 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; |
309 | 310 |
310 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | 311 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
311 | 312 |
312 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 313 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
313 const QuicFrames& frames, | 314 const QuicFrames& frames, |
314 char* buffer, | 315 char* buffer, |
315 size_t packet_length) { | 316 size_t packet_length, |
| 317 QuicStreamFrameDataProducer* data_producer) { |
316 QuicDataWriter writer(packet_length, buffer, perspective_, endianness()); | 318 QuicDataWriter writer(packet_length, buffer, perspective_, endianness()); |
317 if (!AppendPacketHeader(header, &writer)) { | 319 if (!AppendPacketHeader(header, &writer)) { |
318 QUIC_BUG << "AppendPacketHeader failed"; | 320 QUIC_BUG << "AppendPacketHeader failed"; |
319 return 0; | 321 return 0; |
320 } | 322 } |
321 | 323 |
322 size_t i = 0; | 324 size_t i = 0; |
323 for (const QuicFrame& frame : frames) { | 325 for (const QuicFrame& frame : frames) { |
324 // Determine if we should write stream frame length in header. | 326 // Determine if we should write stream frame length in header. |
325 const bool no_stream_frame_length = i == frames.size() - 1; | 327 const bool no_stream_frame_length = i == frames.size() - 1; |
326 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | 328 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { |
327 QUIC_BUG << "AppendTypeByte failed"; | 329 QUIC_BUG << "AppendTypeByte failed"; |
328 return 0; | 330 return 0; |
329 } | 331 } |
330 | 332 |
331 switch (frame.type) { | 333 switch (frame.type) { |
332 case PADDING_FRAME: | 334 case PADDING_FRAME: |
333 if (!AppendPaddingFrame(frame.padding_frame, &writer)) { | 335 if (!AppendPaddingFrame(frame.padding_frame, &writer)) { |
334 QUIC_BUG << "AppendPaddingFrame of " | 336 QUIC_BUG << "AppendPaddingFrame of " |
335 << frame.padding_frame.num_padding_bytes << " failed"; | 337 << frame.padding_frame.num_padding_bytes << " failed"; |
336 return 0; | 338 return 0; |
337 } | 339 } |
338 break; | 340 break; |
339 case STREAM_FRAME: | 341 case STREAM_FRAME: |
340 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 342 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
341 &writer)) { | 343 &writer, data_producer)) { |
342 QUIC_BUG << "AppendStreamFrame failed"; | 344 QUIC_BUG << "AppendStreamFrame failed"; |
343 return 0; | 345 return 0; |
344 } | 346 } |
345 break; | 347 break; |
346 case ACK_FRAME: | 348 case ACK_FRAME: |
347 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) { | 349 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) { |
348 QUIC_BUG << "AppendAckFrameAndTypeByte failed"; | 350 QUIC_BUG << "AppendAckFrameAndTypeByte failed"; |
349 return 0; | 351 return 0; |
350 } | 352 } |
351 break; | 353 break; |
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1781 bool QuicFramer::AppendAckBlock(uint8_t gap, | 1783 bool QuicFramer::AppendAckBlock(uint8_t gap, |
1782 QuicPacketNumberLength length_length, | 1784 QuicPacketNumberLength length_length, |
1783 QuicPacketNumber length, | 1785 QuicPacketNumber length, |
1784 QuicDataWriter* writer) { | 1786 QuicDataWriter* writer) { |
1785 return writer->WriteUInt8(gap) && | 1787 return writer->WriteUInt8(gap) && |
1786 AppendPacketNumber(length_length, length, writer); | 1788 AppendPacketNumber(length_length, length, writer); |
1787 } | 1789 } |
1788 | 1790 |
1789 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 1791 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
1790 bool no_stream_frame_length, | 1792 bool no_stream_frame_length, |
1791 QuicDataWriter* writer) { | 1793 QuicDataWriter* writer, |
| 1794 QuicStreamFrameDataProducer* data_producer) { |
1792 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id, | 1795 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id, |
1793 writer)) { | 1796 writer)) { |
1794 QUIC_BUG << "Writing stream id size failed."; | 1797 QUIC_BUG << "Writing stream id size failed."; |
1795 return false; | 1798 return false; |
1796 } | 1799 } |
1797 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset, | 1800 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset, |
1798 writer)) { | 1801 writer)) { |
1799 QUIC_BUG << "Writing offset size failed."; | 1802 QUIC_BUG << "Writing offset size failed."; |
1800 return false; | 1803 return false; |
1801 } | 1804 } |
1802 if (!no_stream_frame_length) { | 1805 if (!no_stream_frame_length) { |
1803 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || | 1806 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || |
1804 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { | 1807 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { |
1805 QUIC_BUG << "Writing stream frame length failed"; | 1808 QUIC_BUG << "Writing stream frame length failed"; |
1806 return false; | 1809 return false; |
1807 } | 1810 } |
1808 } | 1811 } |
1809 | 1812 |
| 1813 if (data_producer != nullptr) { |
| 1814 DCHECK_EQ(nullptr, frame.data_buffer); |
| 1815 if (frame.data_length == 0) { |
| 1816 return true; |
| 1817 } |
| 1818 if (!data_producer->WriteStreamData(frame.stream_id, frame.offset, |
| 1819 frame.data_length, writer)) { |
| 1820 QUIC_BUG << "Writing frame data failed."; |
| 1821 return false; |
| 1822 } |
| 1823 return true; |
| 1824 } |
| 1825 |
1810 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { | 1826 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { |
1811 QUIC_BUG << "Writing frame data failed."; | 1827 QUIC_BUG << "Writing frame data failed."; |
1812 return false; | 1828 return false; |
1813 } | 1829 } |
1814 return true; | 1830 return true; |
1815 } | 1831 } |
1816 | 1832 |
1817 void QuicFramer::set_version(const QuicVersion version) { | 1833 void QuicFramer::set_version(const QuicVersion version) { |
1818 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1834 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
1819 quic_version_ = version; | 1835 quic_version_ = version; |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2150 set_error(error); | 2166 set_error(error); |
2151 visitor_->OnError(this); | 2167 visitor_->OnError(this); |
2152 return false; | 2168 return false; |
2153 } | 2169 } |
2154 | 2170 |
2155 Endianness QuicFramer::endianness() const { | 2171 Endianness QuicFramer::endianness() const { |
2156 return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER; | 2172 return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER; |
2157 } | 2173 } |
2158 | 2174 |
2159 } // namespace net | 2175 } // namespace net |
OLD | NEW |