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

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

Issue 932723002: Land Recent QUIC Changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
« 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 "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/quic/crypto/crypto_framer.h" 9 #include "net/quic/crypto/crypto_framer.h"
10 #include "net/quic/crypto/crypto_handshake_message.h" 10 #include "net/quic/crypto/crypto_handshake_message.h"
11 #include "net/quic/crypto/crypto_protocol.h" 11 #include "net/quic/crypto/crypto_protocol.h"
12 #include "net/quic/crypto/quic_decrypter.h" 12 #include "net/quic/crypto/quic_decrypter.h"
13 #include "net/quic/crypto/quic_encrypter.h" 13 #include "net/quic/crypto/quic_encrypter.h"
14 #include "net/quic/quic_data_reader.h" 14 #include "net/quic/quic_data_reader.h"
15 #include "net/quic/quic_data_writer.h" 15 #include "net/quic/quic_data_writer.h"
16 #include "net/quic/quic_flags.h" 16 #include "net/quic/quic_flags.h"
17 #include "net/quic/quic_socket_address_coder.h" 17 #include "net/quic/quic_socket_address_coder.h"
18 18
19 using base::StringPiece; 19 using base::StringPiece;
20 using std::make_pair;
21 using std::map; 20 using std::map;
22 using std::max; 21 using std::max;
23 using std::min; 22 using std::min;
24 using std::numeric_limits; 23 using std::numeric_limits;
25 using std::string; 24 using std::string;
26 25
27 namespace net { 26 namespace net {
28 27
29 namespace { 28 namespace {
30 29
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 QuicFramer::AckFrameInfo::~AckFrameInfo() {} 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
312 311
313 // static 312 // static
314 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 313 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
315 const QuicPacketHeader& header) { 314 const QuicPacketHeader& header) {
316 return header.entropy_flag << (header.packet_sequence_number % 8); 315 return header.entropy_flag << (header.packet_sequence_number % 8);
317 } 316 }
318 317
319 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header, 318 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
320 const QuicFrames& frames, 319 const QuicFrames& frames,
321 size_t packet_size) { 320 char* buffer,
322 QuicDataWriter writer(packet_size); 321 size_t packet_length) {
322 QuicDataWriter writer(packet_length, buffer);
323 if (!AppendPacketHeader(header, &writer)) { 323 if (!AppendPacketHeader(header, &writer)) {
324 LOG(DFATAL) << "AppendPacketHeader failed"; 324 LOG(DFATAL) << "AppendPacketHeader failed";
325 return nullptr; 325 return nullptr;
326 } 326 }
327 327
328 size_t i = 0; 328 size_t i = 0;
329 for (const QuicFrame& frame : frames) { 329 for (const QuicFrame& frame : frames) {
330 // Determine if we should write stream frame length in header. 330 // Determine if we should write stream frame length in header.
331 const bool no_stream_frame_length = 331 const bool no_stream_frame_length =
332 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && 332 (header.is_in_fec_group == NOT_IN_FEC_GROUP) &&
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 } 396 }
397 break; 397 break;
398 default: 398 default:
399 RaiseError(QUIC_INVALID_FRAME_DATA); 399 RaiseError(QUIC_INVALID_FRAME_DATA);
400 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; 400 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA";
401 return nullptr; 401 return nullptr;
402 } 402 }
403 ++i; 403 ++i;
404 } 404 }
405 405
406 // Save the length before writing, because take clears it. 406 QuicPacket* packet =
407 const size_t len = writer.length(); 407 new QuicPacket(writer.data(), writer.length(), false,
408 // Less than or equal because truncated acks end up with max_plaintex_size 408 header.public_header.connection_id_length,
409 // length, even though they're typically slightly shorter. 409 header.public_header.version_flag,
410 DCHECK_LE(len, packet_size); 410 header.public_header.sequence_number_length);
411 QuicPacket* packet = new QuicPacket(
412 writer.take(), len, true, header.public_header.connection_id_length,
413 header.public_header.version_flag,
414 header.public_header.sequence_number_length);
415 411
416 if (fec_builder_) { 412 if (fec_builder_) {
417 fec_builder_->OnBuiltFecProtectedPayload(header, 413 fec_builder_->OnBuiltFecProtectedPayload(header,
418 packet->FecProtectedData()); 414 packet->FecProtectedData());
419 } 415 }
420 416
421 return packet; 417 return packet;
422 } 418 }
423 419
424 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header, 420 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header,
425 const QuicFecData& fec) { 421 const QuicFecData& fec) {
426 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); 422 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
427 DCHECK_NE(0u, header.fec_group); 423 DCHECK_NE(0u, header.fec_group);
428 size_t len = GetPacketHeaderSize(header); 424 size_t len = GetPacketHeaderSize(header);
429 len += fec.redundancy.length(); 425 len += fec.redundancy.length();
430 426
431 QuicDataWriter writer(len); 427 scoped_ptr<char[]> buffer(new char[len]);
428 QuicDataWriter writer(len, buffer.get());
432 if (!AppendPacketHeader(header, &writer)) { 429 if (!AppendPacketHeader(header, &writer)) {
433 LOG(DFATAL) << "AppendPacketHeader failed"; 430 LOG(DFATAL) << "AppendPacketHeader failed";
434 return nullptr; 431 return nullptr;
435 } 432 }
436 433
437 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 434 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
438 LOG(DFATAL) << "Failed to add FEC"; 435 LOG(DFATAL) << "Failed to add FEC";
439 return nullptr; 436 return nullptr;
440 } 437 }
441 438
442 return new QuicPacket(writer.take(), len, true, 439 return new QuicPacket(buffer.release(), len, true,
443 header.public_header.connection_id_length, 440 header.public_header.connection_id_length,
444 header.public_header.version_flag, 441 header.public_header.version_flag,
445 header.public_header.sequence_number_length); 442 header.public_header.sequence_number_length);
446 } 443 }
447 444
448 // static 445 // static
449 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( 446 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket(
450 const QuicPublicResetPacket& packet) { 447 const QuicPublicResetPacket& packet) {
451 DCHECK(packet.public_header.reset_flag); 448 DCHECK(packet.public_header.reset_flag);
452 449
453 CryptoHandshakeMessage reset; 450 CryptoHandshakeMessage reset;
454 reset.set_tag(kPRST); 451 reset.set_tag(kPRST);
455 reset.SetValue(kRNON, packet.nonce_proof); 452 reset.SetValue(kRNON, packet.nonce_proof);
456 reset.SetValue(kRSEQ, packet.rejected_sequence_number); 453 reset.SetValue(kRSEQ, packet.rejected_sequence_number);
457 if (!packet.client_address.address().empty()) { 454 if (!packet.client_address.address().empty()) {
458 // packet.client_address is non-empty. 455 // packet.client_address is non-empty.
459 QuicSocketAddressCoder address_coder(packet.client_address); 456 QuicSocketAddressCoder address_coder(packet.client_address);
460 string serialized_address = address_coder.Encode(); 457 string serialized_address = address_coder.Encode();
461 if (serialized_address.empty()) { 458 if (serialized_address.empty()) {
462 return nullptr; 459 return nullptr;
463 } 460 }
464 reset.SetStringPiece(kCADR, serialized_address); 461 reset.SetStringPiece(kCADR, serialized_address);
465 } 462 }
466 const QuicData& reset_serialized = reset.GetSerialized(); 463 const QuicData& reset_serialized = reset.GetSerialized();
467 464
468 size_t len = 465 size_t len =
469 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); 466 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length();
470 QuicDataWriter writer(len); 467 scoped_ptr<char[]> buffer(new char[len]);
468 QuicDataWriter writer(len, buffer.get());
471 469
472 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | 470 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
473 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
474 if (!writer.WriteUInt8(flags)) { 472 if (!writer.WriteUInt8(flags)) {
475 return nullptr; 473 return nullptr;
476 } 474 }
477 475
478 if (!writer.WriteUInt64(packet.public_header.connection_id)) { 476 if (!writer.WriteUInt64(packet.public_header.connection_id)) {
479 return nullptr; 477 return nullptr;
480 } 478 }
481 479
482 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { 480 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
483 return nullptr; 481 return nullptr;
484 } 482 }
485 483
486 return new QuicEncryptedPacket(writer.take(), len, true); 484 return new QuicEncryptedPacket(buffer.release(), len, true);
487 } 485 }
488 486
489 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( 487 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket(
490 const QuicPacketPublicHeader& header, 488 const QuicPacketPublicHeader& header,
491 const QuicVersionVector& supported_versions) { 489 const QuicVersionVector& supported_versions) {
492 DCHECK(header.version_flag); 490 DCHECK(header.version_flag);
493 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); 491 size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
494 QuicDataWriter writer(len); 492 scoped_ptr<char[]> buffer(new char[len]);
493 QuicDataWriter writer(len, buffer.get());
495 494
496 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | 495 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION |
497 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 496 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
498 if (!writer.WriteUInt8(flags)) { 497 if (!writer.WriteUInt8(flags)) {
499 return nullptr; 498 return nullptr;
500 } 499 }
501 500
502 if (!writer.WriteUInt64(header.connection_id)) { 501 if (!writer.WriteUInt64(header.connection_id)) {
503 return nullptr; 502 return nullptr;
504 } 503 }
505 504
506 for (size_t i = 0; i < supported_versions.size(); ++i) { 505 for (size_t i = 0; i < supported_versions.size(); ++i) {
507 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { 506 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) {
508 return nullptr; 507 return nullptr;
509 } 508 }
510 } 509 }
511 510
512 return new QuicEncryptedPacket(writer.take(), len, true); 511 return new QuicEncryptedPacket(buffer.release(), len, true);
513 } 512 }
514 513
515 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 514 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
516 DCHECK(!reader_.get()); 515 DCHECK(!reader_.get());
517 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 516 reader_.reset(new QuicDataReader(packet.data(), packet.length()));
518 517
519 visitor_->OnPacket(); 518 visitor_->OnPacket();
520 519
521 // First parse the public header. 520 // First parse the public header.
522 QuicPacketPublicHeader public_header; 521 QuicPacketPublicHeader public_header;
(...skipping 15 matching lines...) Expand all
538 reader_.reset(nullptr); 537 reader_.reset(nullptr);
539 return true; 538 return true;
540 } 539 }
541 } 540 }
542 541
543 bool rv; 542 bool rv;
544 if (!is_server_ && public_header.version_flag) { 543 if (!is_server_ && public_header.version_flag) {
545 rv = ProcessVersionNegotiationPacket(&public_header); 544 rv = ProcessVersionNegotiationPacket(&public_header);
546 } else if (public_header.reset_flag) { 545 } else if (public_header.reset_flag) {
547 rv = ProcessPublicResetPacket(public_header); 546 rv = ProcessPublicResetPacket(public_header);
547 } else if (packet.length() <= kMaxPacketSize) {
548 char buffer[kMaxPacketSize];
549 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize);
548 } else { 550 } else {
549 if (packet.length() <= kMaxPacketSize) { 551 scoped_ptr<char[]> large_buffer(new char[packet.length()]);
550 char buffer[kMaxPacketSize]; 552 rv = ProcessDataPacket(public_header, packet, large_buffer.get(),
551 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize); 553 packet.length());
552 } else { 554 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets "
553 scoped_ptr<char[]> buffer(new char[packet.length()]); 555 << "larger than kMaxPacketSize. packet size:"
554 rv = ProcessDataPacket(public_header, packet, buffer.get(), 556 << packet.length();
555 packet.length());
556 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets "
557 << "larger than kMaxPacketSize. packet size:"
558 << packet.length();
559 }
560 } 557 }
561 558
562 reader_.reset(nullptr); 559 reader_.reset(nullptr);
563 return rv; 560 return rv;
564 } 561 }
565 562
566 bool QuicFramer::ProcessVersionNegotiationPacket( 563 bool QuicFramer::ProcessVersionNegotiationPacket(
567 QuicPacketPublicHeader* public_header) { 564 QuicPacketPublicHeader* public_header) {
568 DCHECK(!is_server_); 565 DCHECK(!is_server_);
569 // Try reading at least once to raise error if the packet is invalid. 566 // Try reading at least once to raise error if the packet is invalid.
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 // Time delta from the framer creation. 1399 // Time delta from the framer creation.
1403 uint32 time_delta_us; 1400 uint32 time_delta_us;
1404 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1401 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1405 set_detailed_error("Unable to read time delta in received packets."); 1402 set_detailed_error("Unable to read time delta in received packets.");
1406 return false; 1403 return false;
1407 } 1404 }
1408 1405
1409 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); 1406 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
1410 1407
1411 ack_frame->received_packet_times.push_back( 1408 ack_frame->received_packet_times.push_back(
1412 make_pair(seq_num, creation_time_.Add(last_timestamp_))); 1409 std::make_pair(seq_num, creation_time_.Add(last_timestamp_)));
1413 1410
1414 for (uint8 i = 1; i < num_received_packets; ++i) { 1411 for (uint8 i = 1; i < num_received_packets; ++i) {
1415 if (!reader_->ReadBytes(&delta_from_largest_observed, 1412 if (!reader_->ReadBytes(&delta_from_largest_observed,
1416 PACKET_1BYTE_SEQUENCE_NUMBER)) { 1413 PACKET_1BYTE_SEQUENCE_NUMBER)) {
1417 set_detailed_error( 1414 set_detailed_error(
1418 "Unable to read sequence delta in received packets."); 1415 "Unable to read sequence delta in received packets.");
1419 return false; 1416 return false;
1420 } 1417 }
1421 seq_num = ack_frame->largest_observed - delta_from_largest_observed; 1418 seq_num = ack_frame->largest_observed - delta_from_largest_observed;
1422 1419
1423 // Time delta from the previous timestamp. 1420 // Time delta from the previous timestamp.
1424 uint64 incremental_time_delta_us; 1421 uint64 incremental_time_delta_us;
1425 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) { 1422 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) {
1426 set_detailed_error( 1423 set_detailed_error(
1427 "Unable to read incremental time delta in received packets."); 1424 "Unable to read incremental time delta in received packets.");
1428 return false; 1425 return false;
1429 } 1426 }
1430 1427
1431 last_timestamp_ = last_timestamp_.Add( 1428 last_timestamp_ = last_timestamp_.Add(
1432 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us)); 1429 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us));
1433 ack_frame->received_packet_times.push_back( 1430 ack_frame->received_packet_times.push_back(
1434 make_pair(seq_num, creation_time_.Add(last_timestamp_))); 1431 std::make_pair(seq_num, creation_time_.Add(last_timestamp_)));
1435 } 1432 }
1436 } 1433 }
1437 } 1434 }
1438 return true; 1435 return true;
1439 } 1436 }
1440 1437
1441 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, 1438 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header,
1442 QuicStopWaitingFrame* stop_waiting) { 1439 QuicStopWaitingFrame* stop_waiting) {
1443 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { 1440 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) {
1444 set_detailed_error("Unable to read entropy hash for sent packets."); 1441 set_detailed_error("Unable to read entropy hash for sent packets.");
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after
2216 2213
2217 bool QuicFramer::RaiseError(QuicErrorCode error) { 2214 bool QuicFramer::RaiseError(QuicErrorCode error) {
2218 DVLOG(1) << "Error detail: " << detailed_error_; 2215 DVLOG(1) << "Error detail: " << detailed_error_;
2219 set_error(error); 2216 set_error(error);
2220 visitor_->OnError(this); 2217 visitor_->OnError(this);
2221 reader_.reset(nullptr); 2218 reader_.reset(nullptr);
2222 return false; 2219 return false;
2223 } 2220 }
2224 2221
2225 } // namespace net 2222 } // 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