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

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

Issue 12334063: Land recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more EXPECT_FALSE Created 7 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/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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 if (CanTruncate(frame)) { 79 if (CanTruncate(frame)) {
80 // Truncate the frame so the packet will not exceed kMaxPacketSize. 80 // Truncate the frame so the packet will not exceed kMaxPacketSize.
81 // Note that we may not use every byte of the writer in this case. 81 // Note that we may not use every byte of the writer in this case.
82 DLOG(INFO) << "Truncating large frame"; 82 DLOG(INFO) << "Truncating large frame";
83 return free_bytes; 83 return free_bytes;
84 } 84 }
85 } 85 }
86 return frame_len; 86 return frame_len;
87 } 87 }
88 88
89 QuicPacket* QuicFramer::ConstructFrameDataPacket(const QuicPacketHeader& header, 89 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
90 const QuicFrames& frames) { 90 const QuicPacketHeader& header) const {
91 if (!header.entropy_flag) {
92 // TODO(satyamshekhar): Return some more better value here (something that
93 // is not a constant).
94 return 0;
95 }
96 return 1 << (header.packet_sequence_number % 8);
97 }
98
99 SerializedPacket QuicFramer::ConstructFrameDataPacket(
100 const QuicPacketHeader& header,
101 const QuicFrames& frames) {
91 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); 102 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize);
92 size_t packet_size = kPacketHeaderSize; 103 size_t packet_size = kPacketHeaderSize;
93 for (size_t i = 0; i < frames.size(); ++i) { 104 for (size_t i = 0; i < frames.size(); ++i) {
94 DCHECK_LE(packet_size, max_plaintext_size); 105 DCHECK_LE(packet_size, max_plaintext_size);
95 const size_t frame_size = GetSerializedFrameLength( 106 const size_t frame_size = GetSerializedFrameLength(
96 frames[i], max_plaintext_size - packet_size, i == 0); 107 frames[i], max_plaintext_size - packet_size, i == 0);
97 DCHECK(frame_size); 108 DCHECK(frame_size);
98 packet_size += frame_size; 109 packet_size += frame_size;
99 } 110 }
100 return ConstructFrameDataPacket(header, frames, packet_size); 111 return ConstructFrameDataPacket(header, frames, packet_size);
101 } 112 }
102 113
103 QuicPacket* QuicFramer::ConstructFrameDataPacket(const QuicPacketHeader& header, 114 SerializedPacket QuicFramer::ConstructFrameDataPacket(
104 const QuicFrames& frames, 115 const QuicPacketHeader& header,
105 size_t packet_size) { 116 const QuicFrames& frames,
117 size_t packet_size) {
106 QuicDataWriter writer(packet_size); 118 QuicDataWriter writer(packet_size);
119 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL);
107 if (!WritePacketHeader(header, &writer)) { 120 if (!WritePacketHeader(header, &writer)) {
108 return NULL; 121 return kNoPacket;
109 } 122 }
110 123
111 for (size_t i = 0; i < frames.size(); ++i) { 124 for (size_t i = 0; i < frames.size(); ++i) {
112 const QuicFrame& frame = frames[i]; 125 const QuicFrame& frame = frames[i];
113 if (!writer.WriteUInt8(frame.type)) { 126 if (!writer.WriteUInt8(frame.type)) {
114 return NULL; 127 return kNoPacket;
115 } 128 }
116 129
117 switch (frame.type) { 130 switch (frame.type) {
118 case PADDING_FRAME: 131 case PADDING_FRAME:
119 writer.WritePadding(); 132 writer.WritePadding();
120 break; 133 break;
121 case STREAM_FRAME: 134 case STREAM_FRAME:
122 if (!AppendStreamFramePayload(*frame.stream_frame, &writer)) { 135 if (!AppendStreamFramePayload(*frame.stream_frame, &writer)) {
123 return NULL; 136 return kNoPacket;
124 } 137 }
125 break; 138 break;
126 case ACK_FRAME: 139 case ACK_FRAME:
127 if (!AppendAckFramePayload(*frame.ack_frame, &writer)) { 140 if (!AppendAckFramePayload(*frame.ack_frame, &writer)) {
128 return NULL; 141 return kNoPacket;
129 } 142 }
130 break; 143 break;
131 case CONGESTION_FEEDBACK_FRAME: 144 case CONGESTION_FEEDBACK_FRAME:
132 if (!AppendQuicCongestionFeedbackFramePayload( 145 if (!AppendQuicCongestionFeedbackFramePayload(
133 *frame.congestion_feedback_frame, &writer)) { 146 *frame.congestion_feedback_frame, &writer)) {
134 return NULL; 147 return kNoPacket;
135 } 148 }
136 break; 149 break;
137 case RST_STREAM_FRAME: 150 case RST_STREAM_FRAME:
138 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { 151 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) {
139 return NULL; 152 return kNoPacket;
140 } 153 }
141 break; 154 break;
142 case CONNECTION_CLOSE_FRAME: 155 case CONNECTION_CLOSE_FRAME:
143 if (!AppendConnectionCloseFramePayload( 156 if (!AppendConnectionCloseFramePayload(
144 *frame.connection_close_frame, &writer)) { 157 *frame.connection_close_frame, &writer)) {
145 return NULL; 158 return kNoPacket;
159 }
160 break;
161 case GOAWAY_FRAME:
162 if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) {
163 return kNoPacket;
146 } 164 }
147 break; 165 break;
148 default: 166 default:
149 RaiseError(QUIC_INVALID_FRAME_DATA); 167 RaiseError(QUIC_INVALID_FRAME_DATA);
150 return NULL; 168 return kNoPacket;
151 } 169 }
152 } 170 }
153 171
154 // Save the length before writing, because take clears it. 172 // Save the length before writing, because take clears it.
155 const size_t len = writer.length(); 173 const size_t len = writer.length();
156 // Less than or equal because truncated acks end up with max_plaintex_size 174 // Less than or equal because truncated acks end up with max_plaintex_size
157 // length, even though they're typically slightly shorter. 175 // length, even though they're typically slightly shorter.
158 DCHECK_LE(len, packet_size); 176 DCHECK_LE(len, packet_size);
159 QuicPacket* packet = QuicPacket::NewDataPacket(writer.take(), len, true); 177 QuicPacket* packet = QuicPacket::NewDataPacket(writer.take(), len, true);
160 178
161 if (fec_builder_) { 179 if (fec_builder_) {
162 fec_builder_->OnBuiltFecProtectedPayload(header, 180 fec_builder_->OnBuiltFecProtectedPayload(header,
163 packet->FecProtectedData()); 181 packet->FecProtectedData());
164 } 182 }
165 183
166 return packet; 184 return SerializedPacket(header.packet_sequence_number, packet,
185 GetPacketEntropyHash(header), NULL);
167 } 186 }
168 187
169 QuicPacket* QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, 188 SerializedPacket QuicFramer::ConstructFecPacket(const QuicPacketHeader& header,
170 const QuicFecData& fec) { 189 const QuicFecData& fec) {
171 size_t len = kPacketHeaderSize; 190 size_t len = kPacketHeaderSize;
172 len += fec.redundancy.length(); 191 len += fec.redundancy.length();
173 192
174 QuicDataWriter writer(len); 193 QuicDataWriter writer(len);
175 194 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL);
176 if (!WritePacketHeader(header, &writer)) { 195 if (!WritePacketHeader(header, &writer)) {
177 return NULL; 196 return kNoPacket;
178 } 197 }
179 198
180 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 199 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
181 return NULL; 200 return kNoPacket;
182 } 201 }
183 202
184 return QuicPacket::NewFecPacket(writer.take(), len, true); 203 return SerializedPacket(header.packet_sequence_number,
204 QuicPacket::NewFecPacket(writer.take(), len, true),
205 GetPacketEntropyHash(header), NULL);
185 } 206 }
186 207
187 // static 208 // static
188 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( 209 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket(
189 const QuicPublicResetPacket& packet) { 210 const QuicPublicResetPacket& packet) {
190 DCHECK_EQ(PACKET_PUBLIC_FLAGS_RST, 211 DCHECK(packet.public_header.reset_flag);
191 PACKET_PUBLIC_FLAGS_RST & packet.public_header.flags); 212 DCHECK(!packet.public_header.version_flag);
192 size_t len = kPublicResetPacketSize; 213 size_t len = kPublicResetPacketSize;
193 QuicDataWriter writer(len); 214 QuicDataWriter writer(len);
194 215
195 if (!writer.WriteUInt64(packet.public_header.guid)) { 216 if (!writer.WriteUInt64(packet.public_header.guid)) {
196 return NULL; 217 return NULL;
197 } 218 }
198 219
199 uint8 flags = static_cast<uint8>(packet.public_header.flags); 220 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST);
200 if (!writer.WriteUInt8(flags)) { 221 if (!writer.WriteUInt8(flags)) {
201 return NULL; 222 return NULL;
202 } 223 }
203 224
204 if (!writer.WriteUInt64(packet.nonce_proof)) { 225 if (!writer.WriteUInt64(packet.nonce_proof)) {
205 return NULL; 226 return NULL;
206 } 227 }
207 228
208 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, 229 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number,
209 &writer)) { 230 &writer)) {
210 return NULL; 231 return NULL;
211 } 232 }
212 233
213 return new QuicEncryptedPacket(writer.take(), len, true); 234 return new QuicEncryptedPacket(writer.take(), len, true);
214 } 235 }
215 236
216 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 237 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
217 DCHECK(!reader_.get()); 238 DCHECK(!reader_.get());
218 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 239 reader_.reset(new QuicDataReader(packet.data(), packet.length()));
219 240
220 // First parse the public header. 241 // First parse the public header.
221 QuicPacketPublicHeader public_header; 242 QuicPacketPublicHeader public_header;
222 if (!ProcessPublicHeader(&public_header)) { 243 if (!ProcessPublicHeader(&public_header)) {
223 DLOG(WARNING) << "Unable to process public header."; 244 DLOG(WARNING) << "Unable to process public header.";
224 reader_.reset(NULL); 245 reader_.reset(NULL);
225 return RaiseError(QUIC_INVALID_PACKET_HEADER); 246 return RaiseError(QUIC_INVALID_PACKET_HEADER);
226 } 247 }
227 248
228 bool rv; 249 bool rv;
229 if (public_header.flags & PACKET_PUBLIC_FLAGS_RST) { 250 if (public_header.reset_flag) {
230 rv = ProcessPublicResetPacket(public_header); 251 rv = ProcessPublicResetPacket(public_header);
231 } else { 252 } else {
232 rv = ProcessDataPacket(public_header, packet); 253 rv = ProcessDataPacket(public_header, packet);
233 } 254 }
234 255
235 reader_.reset(NULL); 256 reader_.reset(NULL);
236 return rv; 257 return rv;
237 } 258 }
238 259
239 bool QuicFramer::ProcessDataPacket( 260 bool QuicFramer::ProcessDataPacket(
(...skipping 10 matching lines...) Expand all
250 if (!visitor_->OnPacketHeader(header)) { 271 if (!visitor_->OnPacketHeader(header)) {
251 return true; 272 return true;
252 } 273 }
253 274
254 if (packet.length() > kMaxPacketSize) { 275 if (packet.length() > kMaxPacketSize) {
255 DLOG(WARNING) << "Packet too large: " << packet.length(); 276 DLOG(WARNING) << "Packet too large: " << packet.length();
256 return RaiseError(QUIC_PACKET_TOO_LARGE); 277 return RaiseError(QUIC_PACKET_TOO_LARGE);
257 } 278 }
258 279
259 // Handle the payload. 280 // Handle the payload.
260 if ((header.private_flags & PACKET_PRIVATE_FLAGS_FEC) == 0) { 281 if (!header.fec_flag) {
261 if (header.fec_group != 0) { 282 if (header.fec_group != 0) {
262 StringPiece payload = reader_->PeekRemainingPayload(); 283 StringPiece payload = reader_->PeekRemainingPayload();
263 visitor_->OnFecProtectedPayload(payload); 284 visitor_->OnFecProtectedPayload(payload);
264 } 285 }
265 if (!ProcessFrameData()) { 286 if (!ProcessFrameData()) {
266 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. 287 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
267 DLOG(WARNING) << "Unable to process frame data."; 288 DLOG(WARNING) << "Unable to process frame data.";
268 return false; 289 return false;
269 } 290 }
270 } else { 291 } else {
(...skipping 17 matching lines...) Expand all
288 // TODO(satyamshekhar): validate nonce to protect against DoS. 309 // TODO(satyamshekhar): validate nonce to protect against DoS.
289 310
290 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { 311 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) {
291 set_detailed_error("Unable to read rejected sequence number."); 312 set_detailed_error("Unable to read rejected sequence number.");
292 return false; 313 return false;
293 } 314 }
294 visitor_->OnPublicResetPacket(packet); 315 visitor_->OnPublicResetPacket(packet);
295 return true; 316 return true;
296 } 317 }
297 318
298 bool QuicFramer::ProcessRevivedPacket(const QuicPacketHeader& header, 319 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header,
299 StringPiece payload) { 320 StringPiece payload) {
300 DCHECK(!reader_.get()); 321 DCHECK(!reader_.get());
301 322
302 visitor_->OnRevivedPacket(); 323 visitor_->OnRevivedPacket();
303 324
304 visitor_->OnPacketHeader(header); 325 header->entropy_hash = GetPacketEntropyHash(*header);
326
327 // TODO(satyamshekhar): Don't process if the visitor refuses the header.
328 visitor_->OnPacketHeader(*header);
305 329
306 if (payload.length() > kMaxPacketSize) { 330 if (payload.length() > kMaxPacketSize) {
307 set_detailed_error("Revived packet too large."); 331 set_detailed_error("Revived packet too large.");
308 return RaiseError(QUIC_PACKET_TOO_LARGE); 332 return RaiseError(QUIC_PACKET_TOO_LARGE);
309 } 333 }
310 334
311 reader_.reset(new QuicDataReader(payload.data(), payload.length())); 335 reader_.reset(new QuicDataReader(payload.data(), payload.length()));
312 if (!ProcessFrameData()) { 336 if (!ProcessFrameData()) {
313 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. 337 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
314 DLOG(WARNING) << "Unable to process frame data."; 338 DLOG(WARNING) << "Unable to process frame data.";
315 return false; 339 return false;
316 } 340 }
317 341
318 visitor_->OnPacketComplete(); 342 visitor_->OnPacketComplete();
319 reader_.reset(NULL); 343 reader_.reset(NULL);
320 return true; 344 return true;
321 } 345 }
322 346
323 bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header, 347 bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header,
324 QuicDataWriter* writer) { 348 QuicDataWriter* writer) {
325 if (!writer->WriteUInt64(header.public_header.guid)) { 349 if (!writer->WriteUInt64(header.public_header.guid)) {
326 return false; 350 return false;
327 } 351 }
328 352
329 uint8 flags = static_cast<uint8>(header.public_header.flags); 353 uint8 flags = 0;
354 if (header.public_header.reset_flag) {
355 flags |= PACKET_PUBLIC_FLAGS_RST;
356 }
357 if (header.public_header.version_flag) {
358 flags |= PACKET_PUBLIC_FLAGS_VERSION;
359 }
330 if (!writer->WriteUInt8(flags)) { 360 if (!writer->WriteUInt8(flags)) {
331 return false; 361 return false;
332 } 362 }
333 363
334 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { 364 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) {
335 return false; 365 return false;
336 } 366 }
337 367
338 flags = static_cast<uint8>(header.private_flags); 368 flags = 0;
369 if (header.fec_flag) {
370 flags |= PACKET_PRIVATE_FLAGS_FEC;
371 }
372 if (header.entropy_flag) {
373 flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
374 }
375 if (header.fec_entropy_flag) {
376 flags |= PACKET_PRIVATE_FLAGS_FEC_ENTROPY;
377 }
339 if (!writer->WriteUInt8(flags)) { 378 if (!writer->WriteUInt8(flags)) {
340 return false; 379 return false;
341 } 380 }
342 381
343 // Offset from the current packet sequence number to the first fec 382 // Offset from the current packet sequence number to the first fec
344 // protected packet, or kNoFecOffset to signal no FEC protection. 383 // protected packet, or kNoFecOffset to signal no FEC protection.
345 uint8 first_fec_protected_packet_offset = kNoFecOffset; 384 uint8 first_fec_protected_packet_offset = kNoFecOffset;
346 385
347 // The FEC group number is the sequence number of the first fec 386 // The FEC group number is the sequence number of the first fec
348 // protected packet, or 0 if this packet is not protected. 387 // protected packet, or 0 if this packet is not protected.
349 if (header.fec_group != 0) { 388 if (header.fec_group != 0) {
350 DCHECK_GE(header.packet_sequence_number, header.fec_group); 389 DCHECK_GE(header.packet_sequence_number, header.fec_group);
351 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group); 390 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group);
352 first_fec_protected_packet_offset = 391 first_fec_protected_packet_offset =
353 header.packet_sequence_number - header.fec_group; 392 header.packet_sequence_number - header.fec_group;
354 } 393 }
355 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { 394 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
356 return false; 395 return false;
357 } 396 }
358 397
359 return true; 398 return true;
360 } 399 }
361 400
362 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( 401 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
363 QuicPacketSequenceNumber packet_sequence_number) const { 402 QuicPacketSequenceNumber packet_sequence_number) const {
364 // The new sequence number might have wrapped to the next epoc, or 403 // The new sequence number might have wrapped to the next epoch, or
365 // it might have reverse wrapped to the previous epoch, or it might 404 // it might have reverse wrapped to the previous epoch, or it might
366 // remain in the same epoch. Select the sequence number closest to the 405 // remain in the same epoch. Select the sequence number closest to the
367 // previous sequence number. 406 // previous sequence number.
368 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask; 407 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask;
369 QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48); 408 QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48);
370 QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48); 409 QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48);
371 410
372 return ClosestTo(last_sequence_number_, 411 return ClosestTo(last_sequence_number_,
373 epoch + packet_sequence_number, 412 epoch + packet_sequence_number,
374 ClosestTo(last_sequence_number_, 413 ClosestTo(last_sequence_number_,
(...skipping 11 matching lines...) Expand all
386 if (!reader_->ReadBytes(&public_flags, 1)) { 425 if (!reader_->ReadBytes(&public_flags, 1)) {
387 set_detailed_error("Unable to read public flags."); 426 set_detailed_error("Unable to read public flags.");
388 return false; 427 return false;
389 } 428 }
390 429
391 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { 430 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) {
392 set_detailed_error("Illegal public flags value."); 431 set_detailed_error("Illegal public flags value.");
393 return false; 432 return false;
394 } 433 }
395 434
396 public_header->flags = static_cast<QuicPacketPublicFlags>(public_flags); 435 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
436 public_header->version_flag =
437 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
438
397 return true; 439 return true;
398 } 440 }
399 441
400 // static 442 // static
401 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, 443 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet,
402 QuicGuid* guid) { 444 QuicGuid* guid) {
403 QuicDataReader reader(packet.data(), packet.length()); 445 QuicDataReader reader(packet.data(), packet.length());
404 return reader.ReadUInt64(guid); 446 return reader.ReadUInt64(guid);
405 } 447 }
406 448
407 bool QuicFramer::ProcessPacketHeader( 449 bool QuicFramer::ProcessPacketHeader(
408 QuicPacketHeader* header, 450 QuicPacketHeader* header,
409 const QuicEncryptedPacket& packet) { 451 const QuicEncryptedPacket& packet) {
410 if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) { 452 if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) {
411 set_detailed_error("Unable to read sequence number."); 453 set_detailed_error("Unable to read sequence number.");
412 return false; 454 return false;
413 } 455 }
414 456
415 if (header->packet_sequence_number == 0u) { 457 if (header->packet_sequence_number == 0u) {
416 set_detailed_error("Packet sequence numbers cannot be 0."); 458 set_detailed_error("Packet sequence numbers cannot be 0.");
417 return false; 459 return false;
418 } 460 }
419 461
420 if (!DecryptPayload(packet)) { 462 if (!DecryptPayload(header->packet_sequence_number, packet)) {
421 DLOG(WARNING) << "Unable to decrypt payload."; 463 DLOG(WARNING) << "Unable to decrypt payload.";
422 return RaiseError(QUIC_DECRYPTION_FAILURE); 464 return RaiseError(QUIC_DECRYPTION_FAILURE);
423 } 465 }
424 466
425 uint8 private_flags; 467 uint8 private_flags;
426 if (!reader_->ReadBytes(&private_flags, 1)) { 468 if (!reader_->ReadBytes(&private_flags, 1)) {
427 set_detailed_error("Unable to read private flags."); 469 set_detailed_error("Unable to read private flags.");
428 return false; 470 return false;
429 } 471 }
430 472
431 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { 473 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) {
432 set_detailed_error("Illegal private flags value."); 474 set_detailed_error("Illegal private flags value.");
433 return false; 475 return false;
434 } 476 }
435 477
436 header->private_flags = static_cast<QuicPacketPrivateFlags>(private_flags); 478 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0;
479 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0;
480 header->fec_entropy_flag =
481 (private_flags & PACKET_PRIVATE_FLAGS_FEC_ENTROPY) != 0;
437 482
438 uint8 first_fec_protected_packet_offset; 483 uint8 first_fec_protected_packet_offset;
439 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { 484 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) {
440 set_detailed_error("Unable to read first fec protected packet offset."); 485 set_detailed_error("Unable to read first fec protected packet offset.");
441 return false; 486 return false;
442 } 487 }
443 header->fec_group = first_fec_protected_packet_offset == kNoFecOffset ? 0 : 488 header->fec_group = first_fec_protected_packet_offset == kNoFecOffset ? 0 :
444 header->packet_sequence_number - first_fec_protected_packet_offset; 489 header->packet_sequence_number - first_fec_protected_packet_offset;
445 490
491 header->entropy_hash = GetPacketEntropyHash(*header);
446 // Set the last sequence number after we have decrypted the packet 492 // Set the last sequence number after we have decrypted the packet
447 // so we are confident is not attacker controlled. 493 // so we are confident is not attacker controlled.
448 last_sequence_number_ = header->packet_sequence_number; 494 last_sequence_number_ = header->packet_sequence_number;
449 return true; 495 return true;
450 } 496 }
451 497
452 bool QuicFramer::ProcessPacketSequenceNumber( 498 bool QuicFramer::ProcessPacketSequenceNumber(
453 QuicPacketSequenceNumber* sequence_number) { 499 QuicPacketSequenceNumber* sequence_number) {
454 QuicPacketSequenceNumber wire_sequence_number; 500 QuicPacketSequenceNumber wire_sequence_number;
455 if (!reader_->ReadUInt48(&wire_sequence_number)) { 501 if (!reader_->ReadUInt48(&wire_sequence_number)) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 case RST_STREAM_FRAME: 544 case RST_STREAM_FRAME:
499 if (!ProcessRstStreamFrame()) { 545 if (!ProcessRstStreamFrame()) {
500 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); 546 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
501 } 547 }
502 break; 548 break;
503 case CONNECTION_CLOSE_FRAME: 549 case CONNECTION_CLOSE_FRAME:
504 if (!ProcessConnectionCloseFrame()) { 550 if (!ProcessConnectionCloseFrame()) {
505 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); 551 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
506 } 552 }
507 break; 553 break;
554 case GOAWAY_FRAME:
555 if (!ProcessGoAwayFrame()) {
556 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
557 }
558 break;
508 default: 559 default:
509 set_detailed_error("Illegal frame type."); 560 set_detailed_error("Illegal frame type.");
510 DLOG(WARNING) << "Illegal frame type: " 561 DLOG(WARNING) << "Illegal frame type: "
511 << static_cast<int>(frame_type); 562 << static_cast<int>(frame_type);
512 return RaiseError(QUIC_INVALID_FRAME_DATA); 563 return RaiseError(QUIC_INVALID_FRAME_DATA);
513 } 564 }
514 } 565 }
515 566
516 return true; 567 return true;
517 } 568 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 return false; 604 return false;
554 } 605 }
555 if (!ProcessReceivedInfo(&frame->received_info)) { 606 if (!ProcessReceivedInfo(&frame->received_info)) {
556 return false; 607 return false;
557 } 608 }
558 visitor_->OnAckFrame(*frame); 609 visitor_->OnAckFrame(*frame);
559 return true; 610 return true;
560 } 611 }
561 612
562 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { 613 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) {
614 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) {
615 set_detailed_error("Unable to read entropy hash for received packets.");
616 return false;
617 }
618
563 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { 619 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) {
564 set_detailed_error("Unable to read largest observed."); 620 set_detailed_error("Unable to read largest observed.");
565 return false; 621 return false;
566 } 622 }
567 623
568 uint8 num_missing_packets; 624 uint8 num_missing_packets;
569 if (!reader_->ReadBytes(&num_missing_packets, 1)) { 625 if (!reader_->ReadBytes(&num_missing_packets, 1)) {
570 set_detailed_error("Unable to read num missing packets."); 626 set_detailed_error("Unable to read num missing packets.");
571 return false; 627 return false;
572 } 628 }
573 629
574 for (int i = 0; i < num_missing_packets; ++i) { 630 for (int i = 0; i < num_missing_packets; ++i) {
575 QuicPacketSequenceNumber sequence_number; 631 QuicPacketSequenceNumber sequence_number;
576 if (!ProcessPacketSequenceNumber(&sequence_number)) { 632 if (!ProcessPacketSequenceNumber(&sequence_number)) {
577 set_detailed_error("Unable to read sequence number in missing packets."); 633 set_detailed_error("Unable to read sequence number in missing packets.");
578 return false; 634 return false;
579 } 635 }
580 received_info->missing_packets.insert(sequence_number); 636 received_info->missing_packets.insert(sequence_number);
581 } 637 }
582 638
583 return true; 639 return true;
584 } 640 }
585 641
586 bool QuicFramer::ProcessSentInfo(SentPacketInfo* sent_info) { 642 bool QuicFramer::ProcessSentInfo(SentPacketInfo* sent_info) {
643 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) {
644 set_detailed_error("Unable to read entropy hash for sent packets.");
645 return false;
646 }
647
587 if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) { 648 if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) {
588 set_detailed_error("Unable to read least unacked."); 649 set_detailed_error("Unable to read least unacked.");
589 return false; 650 return false;
590 } 651 }
591 652
592 return true; 653 return true;
593 } 654 }
594 655
595 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( 656 bool QuicFramer::ProcessQuicCongestionFeedbackFrame(
596 QuicCongestionFeedbackFrame* frame) { 657 QuicCongestionFeedbackFrame* frame) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 return true; 754 return true;
694 } 755 }
695 756
696 bool QuicFramer::ProcessRstStreamFrame() { 757 bool QuicFramer::ProcessRstStreamFrame() {
697 QuicRstStreamFrame frame; 758 QuicRstStreamFrame frame;
698 if (!reader_->ReadUInt32(&frame.stream_id)) { 759 if (!reader_->ReadUInt32(&frame.stream_id)) {
699 set_detailed_error("Unable to read stream_id."); 760 set_detailed_error("Unable to read stream_id.");
700 return false; 761 return false;
701 } 762 }
702 763
703 if (!reader_->ReadUInt64(&frame.offset)) {
704 set_detailed_error("Unable to read offset in rst frame.");
705 return false;
706 }
707
708 uint32 error_code; 764 uint32 error_code;
709 if (!reader_->ReadUInt32(&error_code)) { 765 if (!reader_->ReadUInt32(&error_code)) {
710 set_detailed_error("Unable to read rst stream error code."); 766 set_detailed_error("Unable to read rst stream error code.");
711 return false; 767 return false;
712 } 768 }
713 frame.error_code = static_cast<QuicErrorCode>(error_code); 769 frame.error_code = static_cast<QuicErrorCode>(error_code);
714 770
715 StringPiece error_details; 771 StringPiece error_details;
716 if (!reader_->ReadStringPiece16(&error_details)) { 772 if (!reader_->ReadStringPiece16(&error_details)) {
717 set_detailed_error("Unable to read rst stream error details."); 773 set_detailed_error("Unable to read rst stream error details.");
(...skipping 24 matching lines...) Expand all
742 798
743 if (!ProcessAckFrame(&frame.ack_frame)) { 799 if (!ProcessAckFrame(&frame.ack_frame)) {
744 DLOG(WARNING) << "Unable to process ack frame."; 800 DLOG(WARNING) << "Unable to process ack frame.";
745 return false; 801 return false;
746 } 802 }
747 803
748 visitor_->OnConnectionCloseFrame(frame); 804 visitor_->OnConnectionCloseFrame(frame);
749 return true; 805 return true;
750 } 806 }
751 807
752 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) { 808 bool QuicFramer::ProcessGoAwayFrame() {
753 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(), 809 QuicGoAwayFrame frame;
810
811 uint32 error_code;
812 if (!reader_->ReadUInt32(&error_code)) {
813 set_detailed_error("Unable to read go away error code.");
814 return false;
815 }
816 frame.error_code = static_cast<QuicErrorCode>(error_code);
817
818 uint32 stream_id;
819 if (!reader_->ReadUInt32(&stream_id)) {
820 set_detailed_error("Unable to read last good stream id.");
821 return false;
822 }
823 frame.last_good_stream_id = static_cast<QuicErrorCode>(stream_id);
824
825 StringPiece reason_phrase;
826 if (!reader_->ReadStringPiece16(&reason_phrase)) {
827 set_detailed_error("Unable to read goaway reason.");
828 return false;
829 }
830 frame.reason_phrase = reason_phrase.as_string();
831
832 visitor_->OnGoAwayFrame(frame);
833 return true;
834 }
835
836 QuicEncryptedPacket* QuicFramer::EncryptPacket(
837 QuicPacketSequenceNumber packet_sequence_number,
838 const QuicPacket& packet) {
839 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet_sequence_number,
840 packet.AssociatedData(),
754 packet.Plaintext())); 841 packet.Plaintext()));
755 if (out.get() == NULL) { 842 if (out.get() == NULL) {
756 RaiseError(QUIC_ENCRYPTION_FAILURE); 843 RaiseError(QUIC_ENCRYPTION_FAILURE);
757 return NULL; 844 return NULL;
758 } 845 }
759 size_t len = kStartOfEncryptedData + out->length(); 846 size_t len = kStartOfEncryptedData + out->length();
760 char* buffer = new char[len]; 847 char* buffer = new char[len];
761 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). 848 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
762 memcpy(buffer, packet.data(), kStartOfEncryptedData); 849 memcpy(buffer, packet.data(), kStartOfEncryptedData);
763 memcpy(buffer + kStartOfEncryptedData, out->data(), out->length()); 850 memcpy(buffer + kStartOfEncryptedData, out->data(), out->length());
764 return new QuicEncryptedPacket(buffer, len, true); 851 return new QuicEncryptedPacket(buffer, len, true);
765 } 852 }
766 853
767 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { 854 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
768 return encrypter_->GetMaxPlaintextSize(ciphertext_size); 855 return encrypter_->GetMaxPlaintextSize(ciphertext_size);
769 } 856 }
770 857
771 bool QuicFramer::DecryptPayload(const QuicEncryptedPacket& packet) { 858 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
859 const QuicEncryptedPacket& packet) {
772 StringPiece encrypted; 860 StringPiece encrypted;
773 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { 861 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
774 return false; 862 return false;
775 } 863 }
776 DCHECK(decrypter_.get() != NULL); 864 DCHECK(decrypter_.get() != NULL);
777 decrypted_.reset(decrypter_->Decrypt(packet.AssociatedData(), encrypted)); 865 decrypted_.reset(decrypter_->Decrypt(sequence_number,
866 packet.AssociatedData(), encrypted));
778 if (decrypted_.get() == NULL) { 867 if (decrypted_.get() == NULL) {
779 return false; 868 return false;
780 } 869 }
781 870
782 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); 871 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length()));
783 return true; 872 return true;
784 } 873 }
785 874
786 size_t QuicFramer::ComputeFramePayloadLength(const QuicFrame& frame) { 875 size_t QuicFramer::ComputeFramePayloadLength(const QuicFrame& frame) {
787 size_t len = 0; 876 size_t len = 0;
788 // We use "magic numbers" here because sizeof(member_) is not necessarily the 877 // We use "magic numbers" here because sizeof(member_) is not necessarily the
789 // same as sizeof(member_wire_format). 878 // same as sizeof(member_wire_format).
790 switch (frame.type) { 879 switch (frame.type) {
791 case STREAM_FRAME: 880 case STREAM_FRAME:
792 len += 4; // stream id 881 len += 4; // Stream id of the frame.
793 len += 1; // fin 882 len += 1; // A byte for fin.
794 len += 8; // offset 883 len += 8; // Byte offset.
795 len += 2; // space for the 16 bit length 884 len += 2; // Space for the 16 bit length.
796 len += frame.stream_frame->data.size(); 885 len += frame.stream_frame->data.size();
797 break; 886 break;
798 case ACK_FRAME: { 887 case ACK_FRAME: {
799 const QuicAckFrame& ack = *frame.ack_frame; 888 const QuicAckFrame& ack = *frame.ack_frame;
800 len += 6; // largest observed packet sequence number 889 len += 1; // Commutative hash of entropy of the packets received.
801 len += 1; // num missing packets 890 len += 6; // Least packet sequence number awaiting an ack.
891 len += 1; // Hash of entropy of the packets sent up to largest observed.
892 len += 6; // Largest observed packet sequence number.
893 len += 1; // Number of missing packets.
802 len += 6 * ack.received_info.missing_packets.size(); 894 len += 6 * ack.received_info.missing_packets.size();
803 len += 6; // least packet sequence number awaiting an ack
804 break; 895 break;
805 } 896 }
806 case CONGESTION_FEEDBACK_FRAME: { 897 case CONGESTION_FEEDBACK_FRAME: {
807 const QuicCongestionFeedbackFrame& congestion_feedback = 898 const QuicCongestionFeedbackFrame& congestion_feedback =
808 *frame.congestion_feedback_frame; 899 *frame.congestion_feedback_frame;
809 len += 1; // congestion feedback type 900 len += 1; // Congestion feedback type.
810 901
811 switch (congestion_feedback.type) { 902 switch (congestion_feedback.type) {
812 case kInterArrival: { 903 case kInterArrival: {
813 const CongestionFeedbackMessageInterArrival& inter_arrival = 904 const CongestionFeedbackMessageInterArrival& inter_arrival =
814 congestion_feedback.inter_arrival; 905 congestion_feedback.inter_arrival;
815 len += 2; 906 len += 2;
816 len += 1; // num received packets 907 len += 1; // Number received packets.
817 if (inter_arrival.received_packet_times.size() > 0) { 908 if (inter_arrival.received_packet_times.size() > 0) {
818 len += 6; // smallest received 909 len += 6; // Smallest received.
819 len += 8; // time 910 len += 8; // Time.
820 // 2 bytes per sequence number delta plus 4 bytes per delta time. 911 // 2 bytes per sequence number delta plus 4 bytes per delta time.
821 len += 6 * (inter_arrival.received_packet_times.size() - 1); 912 len += 6 * (inter_arrival.received_packet_times.size() - 1);
822 } 913 }
823 break; 914 break;
824 } 915 }
825 case kFixRate: 916 case kFixRate:
826 len += 4; 917 len += 4;
827 break; 918 break;
828 case kTCP: 919 case kTCP:
829 len += 4; 920 len += 4;
830 break; 921 break;
831 default: 922 default:
832 set_detailed_error("Illegal feedback type."); 923 set_detailed_error("Illegal feedback type.");
833 DLOG(INFO) << "Illegal feedback type: " << congestion_feedback.type; 924 DLOG(INFO) << "Illegal feedback type: " << congestion_feedback.type;
834 break; 925 break;
835 } 926 }
836 break; 927 break;
837 } 928 }
838 case RST_STREAM_FRAME: 929 case RST_STREAM_FRAME:
839 len += 4; // stream id 930 len += 4; // Stream id of the frame.
840 len += 8; // offset 931 len += 4; // Error code.
841 len += 4; // error code 932 len += 2; // Error details size.
842 len += 2; // error details size
843 len += frame.rst_stream_frame->error_details.size(); 933 len += frame.rst_stream_frame->error_details.size();
844 break; 934 break;
845 case CONNECTION_CLOSE_FRAME: 935 case CONNECTION_CLOSE_FRAME:
846 len += 4; // error code 936 len += 4; // Error code.
847 len += 2; // error details size 937 len += 2; // Error details size.
848 len += frame.connection_close_frame->error_details.size(); 938 len += frame.connection_close_frame->error_details.size();
849 len += ComputeFramePayloadLength( 939 len += ComputeFramePayloadLength(
850 QuicFrame(&frame.connection_close_frame->ack_frame)); 940 QuicFrame(&frame.connection_close_frame->ack_frame));
851 break; 941 break;
942 case GOAWAY_FRAME:
943 len += 4; // error code
944 len += 4; // last good stream id
945 len += 2; // reason phrase length
946 len += frame.goaway_frame->reason_phrase.size();
947 break;
852 default: 948 default:
853 set_detailed_error("Illegal frame type."); 949 set_detailed_error("Illegal frame type.");
854 DLOG(INFO) << "Illegal frame type: " << frame.type; 950 DLOG(INFO) << "Illegal frame type: " << frame.type;
855 break; 951 break;
856 } 952 }
857 return len; 953 return len;
858 } 954 }
859 955
860 // static 956 // static
861 bool QuicFramer::AppendPacketSequenceNumber( 957 bool QuicFramer::AppendPacketSequenceNumber(
(...skipping 22 matching lines...) Expand all
884 return false; 980 return false;
885 } 981 }
886 if (!writer->WriteBytes(frame.data.data(), 982 if (!writer->WriteBytes(frame.data.data(),
887 frame.data.size())) { 983 frame.data.size())) {
888 return false; 984 return false;
889 } 985 }
890 return true; 986 return true;
891 } 987 }
892 988
893 QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved( 989 QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved(
894 const SequenceSet& missing_packets, 990 const SequenceNumberSet& missing_packets,
895 SequenceSet::const_iterator largest_written) { 991 SequenceNumberSet::const_iterator largest_written) {
896 SequenceSet::const_iterator it = largest_written; 992 SequenceNumberSet::const_iterator it = largest_written;
897 QuicPacketSequenceNumber previous_missing = *it; 993 QuicPacketSequenceNumber previous_missing = *it;
898 ++it; 994 ++it;
899 995
900 // See if the next thing is a gap in the missing packets: if it's a 996 // See if the next thing is a gap in the missing packets: if it's a
901 // non-missing packet we can return it. 997 // non-missing packet we can return it.
902 if (it != missing_packets.end() && previous_missing + 1 != *it) { 998 if (it != missing_packets.end() && previous_missing + 1 != *it) {
903 return *it - 1; 999 return *it - 1;
904 } 1000 }
905 1001
906 // Otherwise return the largest missing packet, as indirectly observed. 1002 // Otherwise return the largest missing packet, as indirectly observed.
907 return *largest_written; 1003 return *largest_written;
908 } 1004 }
909 1005
910 // TODO(ianswett): Use varints or another more compact approach for all deltas. 1006 // TODO(ianswett): Use varints or another more compact approach for all deltas.
911 bool QuicFramer::AppendAckFramePayload( 1007 bool QuicFramer::AppendAckFramePayload(
912 const QuicAckFrame& frame, 1008 const QuicAckFrame& frame,
913 QuicDataWriter* writer) { 1009 QuicDataWriter* writer) {
1010 // TODO(satyamshekhar): Decide how often we really should send this
1011 // entropy_hash update.
1012 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) {
1013 return false;
1014 }
1015
914 if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) { 1016 if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) {
915 return false; 1017 return false;
916 } 1018 }
917 1019
1020 size_t received_entropy_offset = writer->length();
1021 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) {
1022 return false;
1023 }
1024
918 size_t largest_observed_offset = writer->length(); 1025 size_t largest_observed_offset = writer->length();
919 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, 1026 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed,
920 writer)) { 1027 writer)) {
921 return false; 1028 return false;
922 } 1029 }
923 1030
924 // We don't check for overflowing uint8 here, because we only can fit 192 acks 1031 // We don't check for overflowing uint8 here, because we only can fit 192 acks
925 // per packet, so if we overflow we will be truncated. 1032 // per packet, so if we overflow we will be truncated.
926 uint8 num_missing_packets = frame.received_info.missing_packets.size(); 1033 uint8 num_missing_packets = frame.received_info.missing_packets.size();
927 size_t num_missing_packets_offset = writer->length(); 1034 size_t num_missing_packets_offset = writer->length();
928 if (!writer->WriteBytes(&num_missing_packets, 1)) { 1035 if (!writer->WriteBytes(&num_missing_packets, 1)) {
929 return false; 1036 return false;
930 } 1037 }
931 1038
932 SequenceSet::const_iterator it = frame.received_info.missing_packets.begin(); 1039 SequenceNumberSet::const_iterator it =
1040 frame.received_info.missing_packets.begin();
933 int num_missing_packets_written = 0; 1041 int num_missing_packets_written = 0;
934 for (; it != frame.received_info.missing_packets.end(); ++it) { 1042 for (; it != frame.received_info.missing_packets.end(); ++it) {
935 if (!AppendPacketSequenceNumber(*it, writer)) { 1043 if (!AppendPacketSequenceNumber(*it, writer)) {
936 // We are truncating. Overwrite largest_observed. 1044 // We are truncating.
937 QuicPacketSequenceNumber largest_observed = 1045 QuicPacketSequenceNumber largest_observed =
938 CalculateLargestObserved(frame.received_info.missing_packets, --it); 1046 CalculateLargestObserved(frame.received_info.missing_packets, --it);
1047 // Overwrite entropy hash for received packets.
1048 writer->WriteUInt8ToOffset(
1049 entropy_calculator_->ReceivedEntropyHash(largest_observed),
1050 received_entropy_offset);
1051 // Overwrite largest_observed.
939 writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask, 1052 writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask,
940 largest_observed_offset); 1053 largest_observed_offset);
941 writer->WriteUInt8ToOffset(num_missing_packets_written, 1054 writer->WriteUInt8ToOffset(num_missing_packets_written,
942 num_missing_packets_offset); 1055 num_missing_packets_offset);
943 return true; 1056 return true;
944 } 1057 }
945 ++num_missing_packets_written; 1058 ++num_missing_packets_written;
946 DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written); 1059 DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written);
947 } 1060 }
948 1061
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 1151
1039 return true; 1152 return true;
1040 } 1153 }
1041 1154
1042 bool QuicFramer::AppendRstStreamFramePayload( 1155 bool QuicFramer::AppendRstStreamFramePayload(
1043 const QuicRstStreamFrame& frame, 1156 const QuicRstStreamFrame& frame,
1044 QuicDataWriter* writer) { 1157 QuicDataWriter* writer) {
1045 if (!writer->WriteUInt32(frame.stream_id)) { 1158 if (!writer->WriteUInt32(frame.stream_id)) {
1046 return false; 1159 return false;
1047 } 1160 }
1048 if (!writer->WriteUInt64(frame.offset)) {
1049 return false;
1050 }
1051 1161
1052 uint32 error_code = static_cast<uint32>(frame.error_code); 1162 uint32 error_code = static_cast<uint32>(frame.error_code);
1053 if (!writer->WriteUInt32(error_code)) { 1163 if (!writer->WriteUInt32(error_code)) {
1054 return false; 1164 return false;
1055 } 1165 }
1056 1166
1057 if (!writer->WriteStringPiece16(frame.error_details)) { 1167 if (!writer->WriteStringPiece16(frame.error_details)) {
1058 return false; 1168 return false;
1059 } 1169 }
1060 return true; 1170 return true;
1061 } 1171 }
1062 1172
1063 bool QuicFramer::AppendConnectionCloseFramePayload( 1173 bool QuicFramer::AppendConnectionCloseFramePayload(
1064 const QuicConnectionCloseFrame& frame, 1174 const QuicConnectionCloseFrame& frame,
1065 QuicDataWriter* writer) { 1175 QuicDataWriter* writer) {
1066 uint32 error_code = static_cast<uint32>(frame.error_code); 1176 uint32 error_code = static_cast<uint32>(frame.error_code);
1067 if (!writer->WriteUInt32(error_code)) { 1177 if (!writer->WriteUInt32(error_code)) {
1068 return false; 1178 return false;
1069 } 1179 }
1070 if (!writer->WriteStringPiece16(frame.error_details)) { 1180 if (!writer->WriteStringPiece16(frame.error_details)) {
1071 return false; 1181 return false;
1072 } 1182 }
1073 AppendAckFramePayload(frame.ack_frame, writer); 1183 AppendAckFramePayload(frame.ack_frame, writer);
1074 return true; 1184 return true;
1075 } 1185 }
1076 1186
1187 bool QuicFramer::AppendGoAwayFramePayload(const QuicGoAwayFrame& frame,
1188 QuicDataWriter* writer) {
1189 uint32 error_code = static_cast<uint32>(frame.error_code);
1190 if (!writer->WriteUInt32(error_code)) {
1191 return false;
1192 }
1193 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id);
1194 if (!writer->WriteUInt32(stream_id)) {
1195 return false;
1196 }
1197 if (!writer->WriteStringPiece16(frame.reason_phrase)) {
1198 return false;
1199 }
1200 return true;
1201 }
1202
1077 bool QuicFramer::RaiseError(QuicErrorCode error) { 1203 bool QuicFramer::RaiseError(QuicErrorCode error) {
1078 DLOG(INFO) << detailed_error_; 1204 DLOG(INFO) << detailed_error_;
1079 set_error(error); 1205 set_error(error);
1080 visitor_->OnError(this); 1206 visitor_->OnError(this);
1081 reader_.reset(NULL); 1207 reader_.reset(NULL);
1082 return false; 1208 return false;
1083 } 1209 }
1084 1210
1085 } // namespace net 1211 } // 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