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

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

Issue 11958018: Queueing QUIC frames to be resent instead of packets and packing RST frames with acks and congestio… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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
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/hash_tables.h" 7 #include "base/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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 QuicPacket* packet = 44 QuicPacket* packet =
45 ConstructMaxFrameDataPacket(header, frames, &num_consumed); 45 ConstructMaxFrameDataPacket(header, frames, &num_consumed);
46 DCHECK_EQ(frames.size(), num_consumed); 46 DCHECK_EQ(frames.size(), num_consumed);
47 return packet; 47 return packet;
48 } 48 }
49 49
50 QuicPacket* QuicFramer::ConstructMaxFrameDataPacket( 50 QuicPacket* QuicFramer::ConstructMaxFrameDataPacket(
51 const QuicPacketHeader& header, 51 const QuicPacketHeader& header,
52 const QuicFrames& frames, 52 const QuicFrames& frames,
53 size_t* num_consumed) { 53 size_t* num_consumed) {
54 DCHECK(!frames.empty());
54 // Compute the length of the packet. We use "magic numbers" here because 55 // Compute the length of the packet. We use "magic numbers" here because
55 // sizeof(member_) is not necessarily the same as sizeof(member_wire_format). 56 // sizeof(member_) is not necessarily the same as sizeof(member_wire_format).
56 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); 57 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize);
57 size_t len = kPacketHeaderSize; 58 size_t len = kPacketHeaderSize;
58 len += 1; // frame count 59 len += 1; // frame count
59 bool truncating = false; 60 bool truncating = false;
60 for (size_t i = 0; i < frames.size(); ++i) { 61 for (size_t i = 0; i < frames.size(); ++i) {
61 size_t frame_len = 1; // Space for the 8 bit type. 62 size_t frame_len = 1; // Space for the 8 bit type.
62 frame_len += ComputeFramePayloadLength(frames[i]); 63 frame_len += ComputeFramePayloadLength(frames[i]);
63 if (len + frame_len > max_plaintext_size) { 64 if (len + frame_len > max_plaintext_size) {
(...skipping 18 matching lines...) Expand all
82 *num_consumed = i + 1; 83 *num_consumed = i + 1;
83 } 84 }
84 85
85 QuicDataWriter writer(len); 86 QuicDataWriter writer(len);
86 87
87 if (!WritePacketHeader(header, &writer)) { 88 if (!WritePacketHeader(header, &writer)) {
88 return NULL; 89 return NULL;
89 } 90 }
90 91
91 // frame count 92 // frame count
92 if (frames.size() > 256u) { 93 if (*num_consumed > 256u) {
93 return NULL; 94 return NULL;
94 } 95 }
95 if (!writer.WriteUInt8(*num_consumed)) { 96 if (!writer.WriteUInt8(*num_consumed)) {
96 return NULL; 97 return NULL;
97 } 98 }
98 99
99 for (size_t i = 0; i < *num_consumed; ++i) { 100 for (size_t i = 0; i < *num_consumed; ++i) {
100 const QuicFrame& frame = frames[i]; 101 const QuicFrame& frame = frames[i];
101 if (!writer.WriteUInt8(frame.type)) { 102 if (!writer.WriteUInt8(frame.type)) {
102 return NULL; 103 return NULL;
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 602
602 if (!ProcessAckFrame(&frame.ack_frame)) { 603 if (!ProcessAckFrame(&frame.ack_frame)) {
603 DLOG(WARNING) << "Unable to process ack frame."; 604 DLOG(WARNING) << "Unable to process ack frame.";
604 return false; 605 return false;
605 } 606 }
606 607
607 visitor_->OnConnectionCloseFrame(frame); 608 visitor_->OnConnectionCloseFrame(frame);
608 return true; 609 return true;
609 } 610 }
610 611
611 void QuicFramer::WriteSequenceNumber(QuicPacketSequenceNumber sequence_number,
612 QuicPacket* packet) {
613 QuicDataWriter::WriteUint48ToBuffer(
614 sequence_number, packet->mutable_data() + kSequenceNumberOffset);
615 }
616
617 void QuicFramer::WriteFecGroup(QuicFecGroupNumber fec_group,
618 QuicPacket* packet) {
619 QuicDataWriter::WriteUint8ToBuffer(
620 fec_group, packet->mutable_data() + kFecGroupOffset);
621 }
622
623 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) { 612 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) {
624 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(), 613 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(),
625 packet.Plaintext())); 614 packet.Plaintext()));
626 if (out.get() == NULL) { 615 if (out.get() == NULL) {
627 RaiseError(QUIC_ENCRYPTION_FAILURE); 616 RaiseError(QUIC_ENCRYPTION_FAILURE);
628 return NULL; 617 return NULL;
629 } 618 }
630 size_t len = kStartOfEncryptedData + out->length(); 619 size_t len = kStartOfEncryptedData + out->length();
631 char* buffer = new char[len]; 620 char* buffer = new char[len];
632 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). 621 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 923
935 bool QuicFramer::RaiseError(QuicErrorCode error) { 924 bool QuicFramer::RaiseError(QuicErrorCode error) {
936 DLOG(INFO) << detailed_error_; 925 DLOG(INFO) << detailed_error_;
937 set_error(error); 926 set_error(error);
938 visitor_->OnError(this); 927 visitor_->OnError(this);
939 reader_.reset(NULL); 928 reader_.reset(NULL);
940 return false; 929 return false;
941 } 930 }
942 931
943 } // namespace net 932 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698