Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1721)

Side by Side Diff: net/quic/quic_framer.cc

Issue 146033003: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compile error Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698