| 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 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 } | 304 } |
| 305 | 305 |
| 306 SerializedPacket QuicFramer::BuildDataPacket( | 306 SerializedPacket QuicFramer::BuildDataPacket( |
| 307 const QuicPacketHeader& header, | 307 const QuicPacketHeader& header, |
| 308 const QuicFrames& frames, | 308 const QuicFrames& frames, |
| 309 size_t packet_size) { | 309 size_t packet_size) { |
| 310 QuicDataWriter writer(packet_size); | 310 QuicDataWriter writer(packet_size); |
| 311 const SerializedPacket kNoPacket( | 311 const SerializedPacket kNoPacket( |
| 312 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 312 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
| 313 if (!AppendPacketHeader(header, &writer)) { | 313 if (!AppendPacketHeader(header, &writer)) { |
| 314 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 314 return kNoPacket; | 315 return kNoPacket; |
| 315 } | 316 } |
| 316 | 317 |
| 317 for (size_t i = 0; i < frames.size(); ++i) { | 318 for (size_t i = 0; i < frames.size(); ++i) { |
| 318 const QuicFrame& frame = frames[i]; | 319 const QuicFrame& frame = frames[i]; |
| 319 | 320 |
| 320 const bool last_frame_in_packet = i == (frames.size() - 1); | 321 const bool last_frame_in_packet = i == (frames.size() - 1); |
| 321 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { | 322 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { |
| 323 LOG(DFATAL) << "AppendTypeByte failed"; |
| 322 return kNoPacket; | 324 return kNoPacket; |
| 323 } | 325 } |
| 324 | 326 |
| 325 switch (frame.type) { | 327 switch (frame.type) { |
| 326 case PADDING_FRAME: | 328 case PADDING_FRAME: |
| 327 writer.WritePadding(); | 329 writer.WritePadding(); |
| 328 break; | 330 break; |
| 329 case STREAM_FRAME: | 331 case STREAM_FRAME: |
| 330 if (!AppendStreamFramePayload( | 332 if (!AppendStreamFrame( |
| 331 *frame.stream_frame, last_frame_in_packet, &writer)) { | 333 *frame.stream_frame, last_frame_in_packet, &writer)) { |
| 334 LOG(DFATAL) << "AppendStreamFrame failed"; |
| 332 return kNoPacket; | 335 return kNoPacket; |
| 333 } | 336 } |
| 334 break; | 337 break; |
| 335 case ACK_FRAME: | 338 case ACK_FRAME: |
| 336 if (!AppendAckFramePayloadAndTypeByte( | 339 if (!AppendAckFrameAndTypeByte( |
| 337 header, *frame.ack_frame, &writer)) { | 340 header, *frame.ack_frame, &writer)) { |
| 341 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; |
| 338 return kNoPacket; | 342 return kNoPacket; |
| 339 } | 343 } |
| 340 break; | 344 break; |
| 341 case CONGESTION_FEEDBACK_FRAME: | 345 case CONGESTION_FEEDBACK_FRAME: |
| 342 if (!AppendQuicCongestionFeedbackFramePayload( | 346 if (!AppendQuicCongestionFeedbackFrame( |
| 343 *frame.congestion_feedback_frame, &writer)) { | 347 *frame.congestion_feedback_frame, &writer)) { |
| 348 LOG(DFATAL) << "AppendQuicCongestionFeedbackFrame failed"; |
| 344 return kNoPacket; | 349 return kNoPacket; |
| 345 } | 350 } |
| 346 break; | 351 break; |
| 347 case RST_STREAM_FRAME: | 352 case RST_STREAM_FRAME: |
| 348 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { | 353 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
| 354 LOG(DFATAL) << "AppendRstStreamFrame failed"; |
| 349 return kNoPacket; | 355 return kNoPacket; |
| 350 } | 356 } |
| 351 break; | 357 break; |
| 352 case CONNECTION_CLOSE_FRAME: | 358 case CONNECTION_CLOSE_FRAME: |
| 353 if (!AppendConnectionCloseFramePayload( | 359 if (!AppendConnectionCloseFrame( |
| 354 *frame.connection_close_frame, &writer)) { | 360 *frame.connection_close_frame, &writer)) { |
| 361 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; |
| 355 return kNoPacket; | 362 return kNoPacket; |
| 356 } | 363 } |
| 357 break; | 364 break; |
| 358 case GOAWAY_FRAME: | 365 case GOAWAY_FRAME: |
| 359 if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) { | 366 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { |
| 367 LOG(DFATAL) << "AppendGoAwayFrame failed"; |
| 360 return kNoPacket; | 368 return kNoPacket; |
| 361 } | 369 } |
| 362 break; | 370 break; |
| 363 default: | 371 default: |
| 364 RaiseError(QUIC_INVALID_FRAME_DATA); | 372 RaiseError(QUIC_INVALID_FRAME_DATA); |
| 373 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; |
| 365 return kNoPacket; | 374 return kNoPacket; |
| 366 } | 375 } |
| 367 } | 376 } |
| 368 | 377 |
| 369 // Save the length before writing, because take clears it. | 378 // Save the length before writing, because take clears it. |
| 370 const size_t len = writer.length(); | 379 const size_t len = writer.length(); |
| 371 // Less than or equal because truncated acks end up with max_plaintex_size | 380 // Less than or equal because truncated acks end up with max_plaintex_size |
| 372 // length, even though they're typically slightly shorter. | 381 // length, even though they're typically slightly shorter. |
| 373 DCHECK_LE(len, packet_size); | 382 DCHECK_LE(len, packet_size); |
| 374 QuicPacket* packet = QuicPacket::NewDataPacket( | 383 QuicPacket* packet = QuicPacket::NewDataPacket( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 390 const QuicFecData& fec) { | 399 const QuicFecData& fec) { |
| 391 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | 400 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); |
| 392 DCHECK_NE(0u, header.fec_group); | 401 DCHECK_NE(0u, header.fec_group); |
| 393 size_t len = GetPacketHeaderSize(header); | 402 size_t len = GetPacketHeaderSize(header); |
| 394 len += fec.redundancy.length(); | 403 len += fec.redundancy.length(); |
| 395 | 404 |
| 396 QuicDataWriter writer(len); | 405 QuicDataWriter writer(len); |
| 397 const SerializedPacket kNoPacket( | 406 const SerializedPacket kNoPacket( |
| 398 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 407 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
| 399 if (!AppendPacketHeader(header, &writer)) { | 408 if (!AppendPacketHeader(header, &writer)) { |
| 409 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 400 return kNoPacket; | 410 return kNoPacket; |
| 401 } | 411 } |
| 402 | 412 |
| 403 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 413 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 414 LOG(DFATAL) << "Failed to add FEC"; |
| 404 return kNoPacket; | 415 return kNoPacket; |
| 405 } | 416 } |
| 406 | 417 |
| 407 return SerializedPacket( | 418 return SerializedPacket( |
| 408 header.packet_sequence_number, | 419 header.packet_sequence_number, |
| 409 header.public_header.sequence_number_length, | 420 header.public_header.sequence_number_length, |
| 410 QuicPacket::NewFecPacket(writer.take(), len, true, | 421 QuicPacket::NewFecPacket(writer.take(), len, true, |
| 411 header.public_header.guid_length, | 422 header.public_header.guid_length, |
| 412 header.public_header.version_flag, | 423 header.public_header.version_flag, |
| 413 header.public_header.sequence_number_length), | 424 header.public_header.sequence_number_length), |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 return false; | 623 return false; |
| 613 } | 624 } |
| 614 | 625 |
| 615 visitor_->OnPacketComplete(); | 626 visitor_->OnPacketComplete(); |
| 616 reader_.reset(NULL); | 627 reader_.reset(NULL); |
| 617 return true; | 628 return true; |
| 618 } | 629 } |
| 619 | 630 |
| 620 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, | 631 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, |
| 621 QuicDataWriter* writer) { | 632 QuicDataWriter* writer) { |
| 633 DVLOG(1) << "Appending header: " << header; |
| 622 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP); | 634 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP); |
| 623 uint8 public_flags = 0; | 635 uint8 public_flags = 0; |
| 624 if (header.public_header.reset_flag) { | 636 if (header.public_header.reset_flag) { |
| 625 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 637 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| 626 } | 638 } |
| 627 if (header.public_header.version_flag) { | 639 if (header.public_header.version_flag) { |
| 628 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 640 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 629 } | 641 } |
| 630 | 642 |
| 631 public_flags |= | 643 public_flags |= |
| (...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1731 case PACKET_6BYTE_SEQUENCE_NUMBER: | 1743 case PACKET_6BYTE_SEQUENCE_NUMBER: |
| 1732 return writer->WriteUInt48( | 1744 return writer->WriteUInt48( |
| 1733 packet_sequence_number & k6ByteSequenceNumberMask); | 1745 packet_sequence_number & k6ByteSequenceNumberMask); |
| 1734 break; | 1746 break; |
| 1735 default: | 1747 default: |
| 1736 DCHECK(false) << "sequence_number_length: " << sequence_number_length; | 1748 DCHECK(false) << "sequence_number_length: " << sequence_number_length; |
| 1737 return false; | 1749 return false; |
| 1738 } | 1750 } |
| 1739 } | 1751 } |
| 1740 | 1752 |
| 1741 bool QuicFramer::AppendStreamFramePayload( | 1753 bool QuicFramer::AppendStreamFrame( |
| 1742 const QuicStreamFrame& frame, | 1754 const QuicStreamFrame& frame, |
| 1743 bool last_frame_in_packet, | 1755 bool last_frame_in_packet, |
| 1744 QuicDataWriter* writer) { | 1756 QuicDataWriter* writer) { |
| 1745 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1757 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
| 1746 return false; | 1758 return false; |
| 1747 } | 1759 } |
| 1748 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1760 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { |
| 1749 return false; | 1761 return false; |
| 1750 } | 1762 } |
| 1751 if (!last_frame_in_packet) { | 1763 if (!last_frame_in_packet) { |
| 1752 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { | 1764 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { |
| 1753 return false; | 1765 return false; |
| 1754 } | 1766 } |
| 1755 } | 1767 } |
| 1756 | 1768 |
| 1757 if (!writer->WriteIOVector(frame.data)) { | 1769 if (!writer->WriteIOVector(frame.data)) { |
| 1758 return false; | 1770 return false; |
| 1759 } | 1771 } |
| 1760 return true; | 1772 return true; |
| 1761 } | 1773 } |
| 1762 | 1774 |
| 1763 // static | 1775 // static |
| 1764 void QuicFramer::set_version(const QuicVersion version) { | 1776 void QuicFramer::set_version(const QuicVersion version) { |
| 1765 DCHECK(IsSupportedVersion(version)); | 1777 DCHECK(IsSupportedVersion(version)); |
| 1766 quic_version_ = version; | 1778 quic_version_ = version; |
| 1767 } | 1779 } |
| 1768 | 1780 |
| 1769 bool QuicFramer::AppendAckFramePayloadAndTypeByte( | 1781 bool QuicFramer::AppendAckFrameAndTypeByte( |
| 1770 const QuicPacketHeader& header, | 1782 const QuicPacketHeader& header, |
| 1771 const QuicAckFrame& frame, | 1783 const QuicAckFrame& frame, |
| 1772 QuicDataWriter* writer) { | 1784 QuicDataWriter* writer) { |
| 1773 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 1785 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
| 1774 QuicPacketSequenceNumber ack_largest_observed = | 1786 QuicPacketSequenceNumber ack_largest_observed = |
| 1775 frame.received_info.largest_observed; | 1787 frame.received_info.largest_observed; |
| 1776 QuicSequenceNumberLength largest_observed_length = | 1788 QuicSequenceNumberLength largest_observed_length = |
| 1777 GetMinSequenceNumberLength(ack_largest_observed); | 1789 GetMinSequenceNumberLength(ack_largest_observed); |
| 1778 QuicSequenceNumberLength missing_sequence_number_length = | 1790 QuicSequenceNumberLength missing_sequence_number_length = |
| 1779 GetMinSequenceNumberLength(ack_info.max_delta); | 1791 GetMinSequenceNumberLength(ack_info.max_delta); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1894 } | 1906 } |
| 1895 // 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. |
| 1896 last_sequence_written = ack_iter->first - 1; | 1908 last_sequence_written = ack_iter->first - 1; |
| 1897 ++num_ranges_written; | 1909 ++num_ranges_written; |
| 1898 } | 1910 } |
| 1899 | 1911 |
| 1900 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 1912 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 1901 return true; | 1913 return true; |
| 1902 } | 1914 } |
| 1903 | 1915 |
| 1904 bool QuicFramer::AppendQuicCongestionFeedbackFramePayload( | 1916 bool QuicFramer::AppendQuicCongestionFeedbackFrame( |
| 1905 const QuicCongestionFeedbackFrame& frame, | 1917 const QuicCongestionFeedbackFrame& frame, |
| 1906 QuicDataWriter* writer) { | 1918 QuicDataWriter* writer) { |
| 1907 if (!writer->WriteBytes(&frame.type, 1)) { | 1919 if (!writer->WriteBytes(&frame.type, 1)) { |
| 1908 return false; | 1920 return false; |
| 1909 } | 1921 } |
| 1910 | 1922 |
| 1911 switch (frame.type) { | 1923 switch (frame.type) { |
| 1912 case kInterArrival: { | 1924 case kInterArrival: { |
| 1913 const CongestionFeedbackMessageInterArrival& inter_arrival = | 1925 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 1914 frame.inter_arrival; | 1926 frame.inter_arrival; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1984 } | 1996 } |
| 1985 break; | 1997 break; |
| 1986 } | 1998 } |
| 1987 default: | 1999 default: |
| 1988 return false; | 2000 return false; |
| 1989 } | 2001 } |
| 1990 | 2002 |
| 1991 return true; | 2003 return true; |
| 1992 } | 2004 } |
| 1993 | 2005 |
| 1994 bool QuicFramer::AppendRstStreamFramePayload( | 2006 bool QuicFramer::AppendRstStreamFrame( |
| 1995 const QuicRstStreamFrame& frame, | 2007 const QuicRstStreamFrame& frame, |
| 1996 QuicDataWriter* writer) { | 2008 QuicDataWriter* writer) { |
| 1997 if (!writer->WriteUInt32(frame.stream_id)) { | 2009 if (!writer->WriteUInt32(frame.stream_id)) { |
| 1998 return false; | 2010 return false; |
| 1999 } | 2011 } |
| 2000 | 2012 |
| 2001 uint32 error_code = static_cast<uint32>(frame.error_code); | 2013 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 2002 if (!writer->WriteUInt32(error_code)) { | 2014 if (!writer->WriteUInt32(error_code)) { |
| 2003 return false; | 2015 return false; |
| 2004 } | 2016 } |
| 2005 | 2017 |
| 2006 if (!writer->WriteStringPiece16(frame.error_details)) { | 2018 if (!writer->WriteStringPiece16(frame.error_details)) { |
| 2007 return false; | 2019 return false; |
| 2008 } | 2020 } |
| 2009 return true; | 2021 return true; |
| 2010 } | 2022 } |
| 2011 | 2023 |
| 2012 bool QuicFramer::AppendConnectionCloseFramePayload( | 2024 bool QuicFramer::AppendConnectionCloseFrame( |
| 2013 const QuicConnectionCloseFrame& frame, | 2025 const QuicConnectionCloseFrame& frame, |
| 2014 QuicDataWriter* writer) { | 2026 QuicDataWriter* writer) { |
| 2015 uint32 error_code = static_cast<uint32>(frame.error_code); | 2027 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 2016 if (!writer->WriteUInt32(error_code)) { | 2028 if (!writer->WriteUInt32(error_code)) { |
| 2017 return false; | 2029 return false; |
| 2018 } | 2030 } |
| 2019 if (!writer->WriteStringPiece16(frame.error_details)) { | 2031 if (!writer->WriteStringPiece16(frame.error_details)) { |
| 2020 return false; | 2032 return false; |
| 2021 } | 2033 } |
| 2022 return true; | 2034 return true; |
| 2023 } | 2035 } |
| 2024 | 2036 |
| 2025 bool QuicFramer::AppendGoAwayFramePayload(const QuicGoAwayFrame& frame, | 2037 bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame, |
| 2026 QuicDataWriter* writer) { | 2038 QuicDataWriter* writer) { |
| 2027 uint32 error_code = static_cast<uint32>(frame.error_code); | 2039 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 2028 if (!writer->WriteUInt32(error_code)) { | 2040 if (!writer->WriteUInt32(error_code)) { |
| 2029 return false; | 2041 return false; |
| 2030 } | 2042 } |
| 2031 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); | 2043 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); |
| 2032 if (!writer->WriteUInt32(stream_id)) { | 2044 if (!writer->WriteUInt32(stream_id)) { |
| 2033 return false; | 2045 return false; |
| 2034 } | 2046 } |
| 2035 if (!writer->WriteStringPiece16(frame.reason_phrase)) { | 2047 if (!writer->WriteStringPiece16(frame.reason_phrase)) { |
| 2036 return false; | 2048 return false; |
| 2037 } | 2049 } |
| 2038 return true; | 2050 return true; |
| 2039 } | 2051 } |
| 2040 | 2052 |
| 2041 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2053 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2042 DVLOG(1) << "Error detail: " << detailed_error_; | 2054 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2043 set_error(error); | 2055 set_error(error); |
| 2044 visitor_->OnError(this); | 2056 visitor_->OnError(this); |
| 2045 reader_.reset(NULL); | 2057 reader_.reset(NULL); |
| 2046 return false; | 2058 return false; |
| 2047 } | 2059 } |
| 2048 | 2060 |
| 2049 } // namespace net | 2061 } // namespace net |
| OLD | NEW |