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

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

Issue 11377096: Change from re-transmitting an packet with a retransmit number to sending a new packet with a new s… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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/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"
11 #include "net/quic/quic_data_writer.h" 11 #include "net/quic/quic_data_writer.h"
12 #include "net/quic/quic_utils.h" 12 #include "net/quic/quic_utils.h"
13 13
14 using base::hash_set; 14 using base::hash_set;
15 using base::StringPiece; 15 using base::StringPiece;
16 16
17 namespace net { 17 namespace net {
18 18
19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) 19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter)
20 : visitor_(NULL), 20 : visitor_(NULL),
21 fec_builder_(NULL), 21 fec_builder_(NULL),
22 error_(QUIC_NO_ERROR), 22 error_(QUIC_NO_ERROR),
23 decrypter_(decrypter), 23 decrypter_(decrypter),
24 encrypter_(encrypter) { 24 encrypter_(encrypter) {
25 } 25 }
26 26
27 QuicFramer::~QuicFramer() {} 27 QuicFramer::~QuicFramer() {}
28 28
29 bool QuicFramer::ConstructFragementDataPacket( 29 bool QuicFramer::ConstructFrameDataPacket(
30 const QuicPacketHeader& header, 30 const QuicPacketHeader& header,
31 const QuicFrames& frames, 31 const QuicFrames& frames,
32 QuicPacket** packet) { 32 QuicPacket** packet) {
33 // Compute the length of the packet. We use "magic numbers" here because 33 // Compute the length of the packet. We use "magic numbers" here because
34 // sizeof(member_) is not necessairly the same as sizeof(member_wire_format). 34 // sizeof(member_) is not necessairly the same as sizeof(member_wire_format).
35 size_t len = kPacketHeaderSize; 35 size_t len = kPacketHeaderSize;
36 len += 1; // frame count 36 len += 1; // frame count
37 for (size_t i = 0; i < frames.size(); ++i) { 37 for (size_t i = 0; i < frames.size(); ++i) {
38 len += 1; // space for the 8 bit type 38 len += 1; // space for the 8 bit type
39 len += ComputeFramePayloadLength(frames[i]); 39 len += ComputeFramePayloadLength(frames[i]);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 case CONNECTION_CLOSE_FRAME: 82 case CONNECTION_CLOSE_FRAME:
83 if (!AppendConnectionCloseFramePayload( 83 if (!AppendConnectionCloseFramePayload(
84 *frame.connection_close_frame, &writer)) { 84 *frame.connection_close_frame, &writer)) {
85 return false; 85 return false;
86 } 86 }
87 break; 87 break;
88 default: 88 default:
89 return RaiseError(QUIC_INVALID_FRAME_DATA); 89 return RaiseError(QUIC_INVALID_FRAME_DATA);
90 } 90 }
91 } 91 }
92
92 DCHECK_EQ(len, writer.length()); 93 DCHECK_EQ(len, writer.length());
93 *packet = new QuicPacket(writer.take(), len, true); 94 *packet = new QuicPacket(writer.take(), len, true, PACKET_FLAGS_NONE);
94 if (fec_builder_) { 95 if (fec_builder_) {
95 fec_builder_->OnBuiltFecProtectedPayload(header, 96 fec_builder_->OnBuiltFecProtectedPayload(header,
96 (*packet)->FecProtectedData()); 97 (*packet)->FecProtectedData());
97 } 98 }
98 99
99 return true; 100 return true;
100 } 101 }
101 102
102 bool QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, 103 bool QuicFramer::ConstructFecPacket(const QuicPacketHeader& header,
103 const QuicFecData& fec, 104 const QuicFecData& fec,
(...skipping 11 matching lines...) Expand all
115 } 116 }
116 117
117 if (!writer.WriteUInt48(fec.min_protected_packet_sequence_number)) { 118 if (!writer.WriteUInt48(fec.min_protected_packet_sequence_number)) {
118 return false; 119 return false;
119 } 120 }
120 121
121 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 122 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
122 return false; 123 return false;
123 } 124 }
124 125
125 *packet = new QuicPacket(writer.take(), len, true); 126 *packet = new QuicPacket(writer.take(), len, true, PACKET_FLAGS_FEC);
126 127
127 return true; 128 return true;
128 } 129 }
129 130
130 void QuicFramer::IncrementRetransmitCount(QuicPacket* packet) {
131 CHECK_GT(packet->length(), kPacketHeaderSize);
132
133 ++packet->mutable_data()[kRetransmissionOffset];
134 }
135
136 uint8 QuicFramer::GetRetransmitCount(QuicPacket* packet) {
137 CHECK_GT(packet->length(), kPacketHeaderSize);
138
139 return packet->mutable_data()[kRetransmissionOffset];
140 }
141
142 bool QuicFramer::ProcessPacket(const IPEndPoint& self_address, 131 bool QuicFramer::ProcessPacket(const IPEndPoint& self_address,
143 const IPEndPoint& peer_address, 132 const IPEndPoint& peer_address,
144 const QuicEncryptedPacket& packet) { 133 const QuicEncryptedPacket& packet) {
145 DCHECK(!reader_.get()); 134 DCHECK(!reader_.get());
146 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 135 reader_.reset(new QuicDataReader(packet.data(), packet.length()));
147 visitor_->OnPacket(self_address, peer_address); 136 visitor_->OnPacket(self_address, peer_address);
148 137
149 // First parse the packet header. 138 // First parse the packet header.
150 QuicPacketHeader header; 139 QuicPacketHeader header;
151 if (!ProcessPacketHeader(&header, packet)) { 140 if (!ProcessPacketHeader(&header, packet)) {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 QuicDataWriter* writer) { 210 QuicDataWriter* writer) {
222 // ConnectionHeader 211 // ConnectionHeader
223 if (!writer->WriteUInt64(header.guid)) { 212 if (!writer->WriteUInt64(header.guid)) {
224 return false; 213 return false;
225 } 214 }
226 215
227 if (!writer->WriteUInt48(header.packet_sequence_number)) { 216 if (!writer->WriteUInt48(header.packet_sequence_number)) {
228 return false; 217 return false;
229 } 218 }
230 219
231 if (!writer->WriteBytes(&header.retransmission_count, 1)) {
232 return false;
233 }
234
235 // CongestionMonitoredHeader 220 // CongestionMonitoredHeader
236 if (!writer->WriteUInt64(header.transmission_time)) { 221 if (!writer->WriteUInt64(header.transmission_time)) {
237 return false; 222 return false;
238 } 223 }
239 224
240 uint8 flags = static_cast<uint8>(header.flags); 225 uint8 flags = static_cast<uint8>(header.flags);
241 if (!writer->WriteBytes(&flags, 1)) { 226 if (!writer->WriteBytes(&flags, 1)) {
242 return false; 227 return false;
243 } 228 }
244 229
(...skipping 10 matching lines...) Expand all
255 if (!reader_->ReadUInt64(&header->guid)) { 240 if (!reader_->ReadUInt64(&header->guid)) {
256 set_detailed_error("Unable to read GUID."); 241 set_detailed_error("Unable to read GUID.");
257 return false; 242 return false;
258 } 243 }
259 244
260 if (!reader_->ReadUInt48(&header->packet_sequence_number)) { 245 if (!reader_->ReadUInt48(&header->packet_sequence_number)) {
261 set_detailed_error("Unable to read sequence number."); 246 set_detailed_error("Unable to read sequence number.");
262 return false; 247 return false;
263 } 248 }
264 249
265 if (!reader_->ReadBytes(&header->retransmission_count, 1)) {
266 set_detailed_error("Unable to read retransmission count.");
267 return false;
268 }
269
270 // CongestionMonitoredHeader 250 // CongestionMonitoredHeader
271 if (!reader_->ReadUInt64(&header->transmission_time)) { 251 if (!reader_->ReadUInt64(&header->transmission_time)) {
272 set_detailed_error("Unable to read transmission time."); 252 set_detailed_error("Unable to read transmission time.");
273 return false; 253 return false;
274 } 254 }
275 255
276 unsigned char flags; 256 unsigned char flags;
277 if (!reader_->ReadBytes(&flags, 1)) { 257 if (!reader_->ReadBytes(&flags, 1)) {
278 set_detailed_error("Unable to read flags."); 258 set_detailed_error("Unable to read flags.");
279 return false; 259 return false;
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 visitor_->OnConnectionCloseFrame(frame); 530 visitor_->OnConnectionCloseFrame(frame);
551 return true; 531 return true;
552 } 532 }
553 533
554 void QuicFramer::WriteTransmissionTime(QuicTransmissionTime time, 534 void QuicFramer::WriteTransmissionTime(QuicTransmissionTime time,
555 QuicPacket* packet) { 535 QuicPacket* packet) {
556 QuicDataWriter::WriteUint64ToBuffer( 536 QuicDataWriter::WriteUint64ToBuffer(
557 time, packet->mutable_data() + kTransmissionTimeOffset); 537 time, packet->mutable_data() + kTransmissionTimeOffset);
558 } 538 }
559 539
540 void QuicFramer::WriteSequenceNumber(QuicPacketSequenceNumber sequence_number,
541 QuicPacket* packet) {
542 QuicDataWriter::WriteUint48ToBuffer(
543 sequence_number, packet->mutable_data() + kSequenceNumberOffset);
544 }
545
546 void QuicFramer::WriteFecGroup(QuicFecGroupNumber fec_group,
547 QuicPacket* packet) {
548 QuicDataWriter::WriteUint8ToBuffer(
549 fec_group, packet->mutable_data() + kFecGroupOffset);
550 }
551
560 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) { 552 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) {
561 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(), 553 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(),
562 packet.Plaintext())); 554 packet.Plaintext()));
563 if (out.get() == NULL) { 555 if (out.get() == NULL) {
564 RaiseError(QUIC_ENCRYPTION_FAILURE); 556 RaiseError(QUIC_ENCRYPTION_FAILURE);
565 return NULL; 557 return NULL;
566 } 558 }
567 size_t len = kStartOfEncryptedData + out->length(); 559 size_t len = kStartOfEncryptedData + out->length();
568 char* buffer = new char[len]; 560 char* buffer = new char[len];
569 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). 561 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 796
805 bool QuicFramer::RaiseError(QuicErrorCode error) { 797 bool QuicFramer::RaiseError(QuicErrorCode error) {
806 DLOG(INFO) << detailed_error_; 798 DLOG(INFO) << detailed_error_;
807 set_error(error); 799 set_error(error);
808 visitor_->OnError(this); 800 visitor_->OnError(this);
809 reader_.reset(NULL); 801 reader_.reset(NULL);
810 return false; 802 return false;
811 } 803 }
812 804
813 } // namespace net 805 } // 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