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" |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { | 322 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { |
323 LOG(DFATAL) << "AppendTypeByte failed"; | 323 LOG(DFATAL) << "AppendTypeByte failed"; |
324 return kNoPacket; | 324 return kNoPacket; |
325 } | 325 } |
326 | 326 |
327 switch (frame.type) { | 327 switch (frame.type) { |
328 case PADDING_FRAME: | 328 case PADDING_FRAME: |
329 writer.WritePadding(); | 329 writer.WritePadding(); |
330 break; | 330 break; |
331 case STREAM_FRAME: | 331 case STREAM_FRAME: |
332 if (!AppendStreamFramePayload( | 332 if (!AppendStreamFrame( |
333 *frame.stream_frame, last_frame_in_packet, &writer)) { | 333 *frame.stream_frame, last_frame_in_packet, &writer)) { |
334 LOG(DFATAL) << "AppendStreamFramePayload failed"; | 334 LOG(DFATAL) << "AppendStreamFrame failed"; |
335 return kNoPacket; | 335 return kNoPacket; |
336 } | 336 } |
337 break; | 337 break; |
338 case ACK_FRAME: | 338 case ACK_FRAME: |
339 if (!AppendAckFramePayloadAndTypeByte( | 339 if (!AppendAckFrameAndTypeByte( |
340 header, *frame.ack_frame, &writer)) { | 340 header, *frame.ack_frame, &writer)) { |
341 LOG(DFATAL) << "AppendAckFramePayloadAndTypeByte failed"; | 341 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; |
342 return kNoPacket; | 342 return kNoPacket; |
343 } | 343 } |
344 break; | 344 break; |
345 case CONGESTION_FEEDBACK_FRAME: | 345 case CONGESTION_FEEDBACK_FRAME: |
346 if (!AppendQuicCongestionFeedbackFramePayload( | 346 if (!AppendQuicCongestionFeedbackFrame( |
347 *frame.congestion_feedback_frame, &writer)) { | 347 *frame.congestion_feedback_frame, &writer)) { |
348 LOG(DFATAL) << "AppendQuicCongestionFeedbackFramePayload failed"; | 348 LOG(DFATAL) << "AppendQuicCongestionFeedbackFrame failed"; |
349 return kNoPacket; | 349 return kNoPacket; |
350 } | 350 } |
351 break; | 351 break; |
352 case RST_STREAM_FRAME: | 352 case RST_STREAM_FRAME: |
353 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { | 353 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
354 LOG(DFATAL) << "AppendRstStreamFramePayload failed"; | 354 LOG(DFATAL) << "AppendRstStreamFrame failed"; |
355 return kNoPacket; | 355 return kNoPacket; |
356 } | 356 } |
357 break; | 357 break; |
358 case CONNECTION_CLOSE_FRAME: | 358 case CONNECTION_CLOSE_FRAME: |
359 if (!AppendConnectionCloseFramePayload( | 359 if (!AppendConnectionCloseFrame( |
360 *frame.connection_close_frame, &writer)) { | 360 *frame.connection_close_frame, &writer)) { |
361 LOG(DFATAL) << "AppendConnectionCloseFramePayload failed"; | 361 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; |
362 return kNoPacket; | 362 return kNoPacket; |
363 } | 363 } |
364 break; | 364 break; |
365 case GOAWAY_FRAME: | 365 case GOAWAY_FRAME: |
366 if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) { | 366 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { |
367 LOG(DFATAL) << "AppendGoAwayFramePayload failed"; | 367 LOG(DFATAL) << "AppendGoAwayFrame failed"; |
368 return kNoPacket; | 368 return kNoPacket; |
369 } | 369 } |
370 break; | 370 break; |
371 default: | 371 default: |
372 RaiseError(QUIC_INVALID_FRAME_DATA); | 372 RaiseError(QUIC_INVALID_FRAME_DATA); |
373 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; | 373 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; |
374 return kNoPacket; | 374 return kNoPacket; |
375 } | 375 } |
376 } | 376 } |
377 | 377 |
(...skipping 1365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1743 case PACKET_6BYTE_SEQUENCE_NUMBER: | 1743 case PACKET_6BYTE_SEQUENCE_NUMBER: |
1744 return writer->WriteUInt48( | 1744 return writer->WriteUInt48( |
1745 packet_sequence_number & k6ByteSequenceNumberMask); | 1745 packet_sequence_number & k6ByteSequenceNumberMask); |
1746 break; | 1746 break; |
1747 default: | 1747 default: |
1748 DCHECK(false) << "sequence_number_length: " << sequence_number_length; | 1748 DCHECK(false) << "sequence_number_length: " << sequence_number_length; |
1749 return false; | 1749 return false; |
1750 } | 1750 } |
1751 } | 1751 } |
1752 | 1752 |
1753 bool QuicFramer::AppendStreamFramePayload( | 1753 bool QuicFramer::AppendStreamFrame( |
1754 const QuicStreamFrame& frame, | 1754 const QuicStreamFrame& frame, |
1755 bool last_frame_in_packet, | 1755 bool last_frame_in_packet, |
1756 QuicDataWriter* writer) { | 1756 QuicDataWriter* writer) { |
1757 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1757 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
1758 return false; | 1758 return false; |
1759 } | 1759 } |
1760 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1760 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { |
1761 return false; | 1761 return false; |
1762 } | 1762 } |
1763 if (!last_frame_in_packet) { | 1763 if (!last_frame_in_packet) { |
1764 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { | 1764 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { |
1765 return false; | 1765 return false; |
1766 } | 1766 } |
1767 } | 1767 } |
1768 | 1768 |
1769 if (!writer->WriteIOVector(frame.data)) { | 1769 if (!writer->WriteIOVector(frame.data)) { |
1770 return false; | 1770 return false; |
1771 } | 1771 } |
1772 return true; | 1772 return true; |
1773 } | 1773 } |
1774 | 1774 |
1775 // static | 1775 // static |
1776 void QuicFramer::set_version(const QuicVersion version) { | 1776 void QuicFramer::set_version(const QuicVersion version) { |
1777 DCHECK(IsSupportedVersion(version)); | 1777 DCHECK(IsSupportedVersion(version)); |
1778 quic_version_ = version; | 1778 quic_version_ = version; |
1779 } | 1779 } |
1780 | 1780 |
1781 bool QuicFramer::AppendAckFramePayloadAndTypeByte( | 1781 bool QuicFramer::AppendAckFrameAndTypeByte( |
1782 const QuicPacketHeader& header, | 1782 const QuicPacketHeader& header, |
1783 const QuicAckFrame& frame, | 1783 const QuicAckFrame& frame, |
1784 QuicDataWriter* writer) { | 1784 QuicDataWriter* writer) { |
1785 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 1785 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
1786 QuicPacketSequenceNumber ack_largest_observed = | 1786 QuicPacketSequenceNumber ack_largest_observed = |
1787 frame.received_info.largest_observed; | 1787 frame.received_info.largest_observed; |
1788 QuicSequenceNumberLength largest_observed_length = | 1788 QuicSequenceNumberLength largest_observed_length = |
1789 GetMinSequenceNumberLength(ack_largest_observed); | 1789 GetMinSequenceNumberLength(ack_largest_observed); |
1790 QuicSequenceNumberLength missing_sequence_number_length = | 1790 QuicSequenceNumberLength missing_sequence_number_length = |
1791 GetMinSequenceNumberLength(ack_info.max_delta); | 1791 GetMinSequenceNumberLength(ack_info.max_delta); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1906 } | 1906 } |
1907 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 1907 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
1908 last_sequence_written = ack_iter->first - 1; | 1908 last_sequence_written = ack_iter->first - 1; |
1909 ++num_ranges_written; | 1909 ++num_ranges_written; |
1910 } | 1910 } |
1911 | 1911 |
1912 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 1912 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
1913 return true; | 1913 return true; |
1914 } | 1914 } |
1915 | 1915 |
1916 bool QuicFramer::AppendQuicCongestionFeedbackFramePayload( | 1916 bool QuicFramer::AppendQuicCongestionFeedbackFrame( |
1917 const QuicCongestionFeedbackFrame& frame, | 1917 const QuicCongestionFeedbackFrame& frame, |
1918 QuicDataWriter* writer) { | 1918 QuicDataWriter* writer) { |
1919 if (!writer->WriteBytes(&frame.type, 1)) { | 1919 if (!writer->WriteBytes(&frame.type, 1)) { |
1920 return false; | 1920 return false; |
1921 } | 1921 } |
1922 | 1922 |
1923 switch (frame.type) { | 1923 switch (frame.type) { |
1924 case kInterArrival: { | 1924 case kInterArrival: { |
1925 const CongestionFeedbackMessageInterArrival& inter_arrival = | 1925 const CongestionFeedbackMessageInterArrival& inter_arrival = |
1926 frame.inter_arrival; | 1926 frame.inter_arrival; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1996 } | 1996 } |
1997 break; | 1997 break; |
1998 } | 1998 } |
1999 default: | 1999 default: |
2000 return false; | 2000 return false; |
2001 } | 2001 } |
2002 | 2002 |
2003 return true; | 2003 return true; |
2004 } | 2004 } |
2005 | 2005 |
2006 bool QuicFramer::AppendRstStreamFramePayload( | 2006 bool QuicFramer::AppendRstStreamFrame( |
2007 const QuicRstStreamFrame& frame, | 2007 const QuicRstStreamFrame& frame, |
2008 QuicDataWriter* writer) { | 2008 QuicDataWriter* writer) { |
2009 if (!writer->WriteUInt32(frame.stream_id)) { | 2009 if (!writer->WriteUInt32(frame.stream_id)) { |
2010 return false; | 2010 return false; |
2011 } | 2011 } |
2012 | 2012 |
2013 uint32 error_code = static_cast<uint32>(frame.error_code); | 2013 uint32 error_code = static_cast<uint32>(frame.error_code); |
2014 if (!writer->WriteUInt32(error_code)) { | 2014 if (!writer->WriteUInt32(error_code)) { |
2015 return false; | 2015 return false; |
2016 } | 2016 } |
2017 | 2017 |
2018 if (!writer->WriteStringPiece16(frame.error_details)) { | 2018 if (!writer->WriteStringPiece16(frame.error_details)) { |
2019 return false; | 2019 return false; |
2020 } | 2020 } |
2021 return true; | 2021 return true; |
2022 } | 2022 } |
2023 | 2023 |
2024 bool QuicFramer::AppendConnectionCloseFramePayload( | 2024 bool QuicFramer::AppendConnectionCloseFrame( |
2025 const QuicConnectionCloseFrame& frame, | 2025 const QuicConnectionCloseFrame& frame, |
2026 QuicDataWriter* writer) { | 2026 QuicDataWriter* writer) { |
2027 uint32 error_code = static_cast<uint32>(frame.error_code); | 2027 uint32 error_code = static_cast<uint32>(frame.error_code); |
2028 if (!writer->WriteUInt32(error_code)) { | 2028 if (!writer->WriteUInt32(error_code)) { |
2029 return false; | 2029 return false; |
2030 } | 2030 } |
2031 if (!writer->WriteStringPiece16(frame.error_details)) { | 2031 if (!writer->WriteStringPiece16(frame.error_details)) { |
2032 return false; | 2032 return false; |
2033 } | 2033 } |
2034 return true; | 2034 return true; |
2035 } | 2035 } |
2036 | 2036 |
2037 bool QuicFramer::AppendGoAwayFramePayload(const QuicGoAwayFrame& frame, | 2037 bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame, |
2038 QuicDataWriter* writer) { | 2038 QuicDataWriter* writer) { |
2039 uint32 error_code = static_cast<uint32>(frame.error_code); | 2039 uint32 error_code = static_cast<uint32>(frame.error_code); |
2040 if (!writer->WriteUInt32(error_code)) { | 2040 if (!writer->WriteUInt32(error_code)) { |
2041 return false; | 2041 return false; |
2042 } | 2042 } |
2043 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); | 2043 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); |
2044 if (!writer->WriteUInt32(stream_id)) { | 2044 if (!writer->WriteUInt32(stream_id)) { |
2045 return false; | 2045 return false; |
2046 } | 2046 } |
2047 if (!writer->WriteStringPiece16(frame.reason_phrase)) { | 2047 if (!writer->WriteStringPiece16(frame.reason_phrase)) { |
2048 return false; | 2048 return false; |
2049 } | 2049 } |
2050 return true; | 2050 return true; |
2051 } | 2051 } |
2052 | 2052 |
2053 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2053 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2054 DVLOG(1) << "Error detail: " << detailed_error_; | 2054 DVLOG(1) << "Error detail: " << detailed_error_; |
2055 set_error(error); | 2055 set_error(error); |
2056 visitor_->OnError(this); | 2056 visitor_->OnError(this); |
2057 reader_.reset(NULL); | 2057 reader_.reset(NULL); |
2058 return false; | 2058 return false; |
2059 } | 2059 } |
2060 | 2060 |
2061 } // namespace net | 2061 } // namespace net |
OLD | NEW |