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

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

Issue 921883003: Change QuicFramer so it accepts a QuicDataWriter rather than allocating (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Deprecate_flag_quic_use_std_cbrt
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"
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 QuicFramer::AckFrameInfo::~AckFrameInfo() {} 311 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
312 312
313 // static 313 // static
314 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 314 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
315 const QuicPacketHeader& header) { 315 const QuicPacketHeader& header) {
316 return header.entropy_flag << (header.packet_sequence_number % 8); 316 return header.entropy_flag << (header.packet_sequence_number % 8);
317 } 317 }
318 318
319 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header, 319 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
320 const QuicFrames& frames, 320 const QuicFrames& frames,
321 size_t packet_size) { 321 char* buffer,
322 QuicDataWriter writer(packet_size); 322 size_t packet_length) {
323 QuicDataWriter writer(packet_length, buffer);
323 if (!AppendPacketHeader(header, &writer)) { 324 if (!AppendPacketHeader(header, &writer)) {
324 LOG(DFATAL) << "AppendPacketHeader failed"; 325 LOG(DFATAL) << "AppendPacketHeader failed";
325 return nullptr; 326 return nullptr;
326 } 327 }
327 328
328 size_t i = 0; 329 size_t i = 0;
329 for (const QuicFrame& frame : frames) { 330 for (const QuicFrame& frame : frames) {
330 // Determine if we should write stream frame length in header. 331 // Determine if we should write stream frame length in header.
331 const bool no_stream_frame_length = 332 const bool no_stream_frame_length =
332 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && 333 (header.is_in_fec_group == NOT_IN_FEC_GROUP) &&
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 } 397 }
397 break; 398 break;
398 default: 399 default:
399 RaiseError(QUIC_INVALID_FRAME_DATA); 400 RaiseError(QUIC_INVALID_FRAME_DATA);
400 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; 401 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA";
401 return nullptr; 402 return nullptr;
402 } 403 }
403 ++i; 404 ++i;
404 } 405 }
405 406
406 // Save the length before writing, because take clears it. 407 QuicPacket* packet =
407 const size_t len = writer.length(); 408 new QuicPacket(writer.data(), writer.length(), false,
408 // Less than or equal because truncated acks end up with max_plaintex_size 409 header.public_header.connection_id_length,
409 // length, even though they're typically slightly shorter. 410 header.public_header.version_flag,
410 DCHECK_LE(len, packet_size); 411 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 412
416 if (fec_builder_) { 413 if (fec_builder_) {
417 fec_builder_->OnBuiltFecProtectedPayload(header, 414 fec_builder_->OnBuiltFecProtectedPayload(header,
418 packet->FecProtectedData()); 415 packet->FecProtectedData());
419 } 416 }
420 417
421 return packet; 418 return packet;
422 } 419 }
423 420
424 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header, 421 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header,
425 const QuicFecData& fec) { 422 const QuicFecData& fec) {
426 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); 423 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
427 DCHECK_NE(0u, header.fec_group); 424 DCHECK_NE(0u, header.fec_group);
428 size_t len = GetPacketHeaderSize(header); 425 size_t len = GetPacketHeaderSize(header);
429 len += fec.redundancy.length(); 426 len += fec.redundancy.length();
430 427
431 QuicDataWriter writer(len); 428 scoped_ptr<char[]> buffer(new char[len]);
429 QuicDataWriter writer(len, buffer.get());
432 if (!AppendPacketHeader(header, &writer)) { 430 if (!AppendPacketHeader(header, &writer)) {
433 LOG(DFATAL) << "AppendPacketHeader failed"; 431 LOG(DFATAL) << "AppendPacketHeader failed";
434 return nullptr; 432 return nullptr;
435 } 433 }
436 434
437 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 435 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
438 LOG(DFATAL) << "Failed to add FEC"; 436 LOG(DFATAL) << "Failed to add FEC";
439 return nullptr; 437 return nullptr;
440 } 438 }
441 439
442 return new QuicPacket(writer.take(), len, true, 440 return new QuicPacket(buffer.release(), len, true,
443 header.public_header.connection_id_length, 441 header.public_header.connection_id_length,
444 header.public_header.version_flag, 442 header.public_header.version_flag,
445 header.public_header.sequence_number_length); 443 header.public_header.sequence_number_length);
446 } 444 }
447 445
448 // static 446 // static
449 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( 447 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket(
450 const QuicPublicResetPacket& packet) { 448 const QuicPublicResetPacket& packet) {
451 DCHECK(packet.public_header.reset_flag); 449 DCHECK(packet.public_header.reset_flag);
452 450
453 CryptoHandshakeMessage reset; 451 CryptoHandshakeMessage reset;
454 reset.set_tag(kPRST); 452 reset.set_tag(kPRST);
455 reset.SetValue(kRNON, packet.nonce_proof); 453 reset.SetValue(kRNON, packet.nonce_proof);
456 reset.SetValue(kRSEQ, packet.rejected_sequence_number); 454 reset.SetValue(kRSEQ, packet.rejected_sequence_number);
457 if (!packet.client_address.address().empty()) { 455 if (!packet.client_address.address().empty()) {
458 // packet.client_address is non-empty. 456 // packet.client_address is non-empty.
459 QuicSocketAddressCoder address_coder(packet.client_address); 457 QuicSocketAddressCoder address_coder(packet.client_address);
460 string serialized_address = address_coder.Encode(); 458 string serialized_address = address_coder.Encode();
461 if (serialized_address.empty()) { 459 if (serialized_address.empty()) {
462 return nullptr; 460 return nullptr;
463 } 461 }
464 reset.SetStringPiece(kCADR, serialized_address); 462 reset.SetStringPiece(kCADR, serialized_address);
465 } 463 }
466 const QuicData& reset_serialized = reset.GetSerialized(); 464 const QuicData& reset_serialized = reset.GetSerialized();
467 465
468 size_t len = 466 size_t len =
469 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); 467 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length();
470 QuicDataWriter writer(len); 468 scoped_ptr<char[]> buffer(new char[len]);
469 QuicDataWriter writer(len, buffer.get());
471 470
472 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | 471 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
473 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 472 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
474 if (!writer.WriteUInt8(flags)) { 473 if (!writer.WriteUInt8(flags)) {
475 return nullptr; 474 return nullptr;
476 } 475 }
477 476
478 if (!writer.WriteUInt64(packet.public_header.connection_id)) { 477 if (!writer.WriteUInt64(packet.public_header.connection_id)) {
479 return nullptr; 478 return nullptr;
480 } 479 }
481 480
482 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { 481 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
483 return nullptr; 482 return nullptr;
484 } 483 }
485 484
486 return new QuicEncryptedPacket(writer.take(), len, true); 485 return new QuicEncryptedPacket(buffer.release(), len, true);
487 } 486 }
488 487
489 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( 488 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket(
490 const QuicPacketPublicHeader& header, 489 const QuicPacketPublicHeader& header,
491 const QuicVersionVector& supported_versions) { 490 const QuicVersionVector& supported_versions) {
492 DCHECK(header.version_flag); 491 DCHECK(header.version_flag);
493 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); 492 size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
494 QuicDataWriter writer(len); 493 scoped_ptr<char[]> buffer(new char[len]);
494 QuicDataWriter writer(len, buffer.get());
495 495
496 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | 496 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION |
497 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 497 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
498 if (!writer.WriteUInt8(flags)) { 498 if (!writer.WriteUInt8(flags)) {
499 return nullptr; 499 return nullptr;
500 } 500 }
501 501
502 if (!writer.WriteUInt64(header.connection_id)) { 502 if (!writer.WriteUInt64(header.connection_id)) {
503 return nullptr; 503 return nullptr;
504 } 504 }
505 505
506 for (size_t i = 0; i < supported_versions.size(); ++i) { 506 for (size_t i = 0; i < supported_versions.size(); ++i) {
507 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { 507 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) {
508 return nullptr; 508 return nullptr;
509 } 509 }
510 } 510 }
511 511
512 return new QuicEncryptedPacket(writer.take(), len, true); 512 return new QuicEncryptedPacket(buffer.release(), len, true);
513 } 513 }
514 514
515 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 515 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
516 DCHECK(!reader_.get()); 516 DCHECK(!reader_.get());
517 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 517 reader_.reset(new QuicDataReader(packet.data(), packet.length()));
518 518
519 visitor_->OnPacket(); 519 visitor_->OnPacket();
520 520
521 // First parse the public header. 521 // First parse the public header.
522 QuicPacketPublicHeader public_header; 522 QuicPacketPublicHeader public_header;
(...skipping 15 matching lines...) Expand all
538 reader_.reset(nullptr); 538 reader_.reset(nullptr);
539 return true; 539 return true;
540 } 540 }
541 } 541 }
542 542
543 bool rv; 543 bool rv;
544 if (!is_server_ && public_header.version_flag) { 544 if (!is_server_ && public_header.version_flag) {
545 rv = ProcessVersionNegotiationPacket(&public_header); 545 rv = ProcessVersionNegotiationPacket(&public_header);
546 } else if (public_header.reset_flag) { 546 } else if (public_header.reset_flag) {
547 rv = ProcessPublicResetPacket(public_header); 547 rv = ProcessPublicResetPacket(public_header);
548 } else if (packet.length() <= kMaxPacketSize) {
549 char buffer[kMaxPacketSize];
550 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize);
548 } else { 551 } else {
549 if (packet.length() <= kMaxPacketSize) { 552 scoped_ptr<char[]> large_buffer(new char[packet.length()]);
550 char buffer[kMaxPacketSize]; 553 rv = ProcessDataPacket(public_header, packet, large_buffer.get(),
551 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize); 554 packet.length());
552 } else { 555 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets "
553 scoped_ptr<char[]> buffer(new char[packet.length()]); 556 << "larger than kMaxPacketSize. packet size:"
554 rv = ProcessDataPacket(public_header, packet, buffer.get(), 557 << 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 } 558 }
561 559
562 reader_.reset(nullptr); 560 reader_.reset(nullptr);
563 return rv; 561 return rv;
564 } 562 }
565 563
566 bool QuicFramer::ProcessVersionNegotiationPacket( 564 bool QuicFramer::ProcessVersionNegotiationPacket(
567 QuicPacketPublicHeader* public_header) { 565 QuicPacketPublicHeader* public_header) {
568 DCHECK(!is_server_); 566 DCHECK(!is_server_);
569 // Try reading at least once to raise error if the packet is invalid. 567 // Try reading at least once to raise error if the packet is invalid.
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after
2216 2214
2217 bool QuicFramer::RaiseError(QuicErrorCode error) { 2215 bool QuicFramer::RaiseError(QuicErrorCode error) {
2218 DVLOG(1) << "Error detail: " << detailed_error_; 2216 DVLOG(1) << "Error detail: " << detailed_error_;
2219 set_error(error); 2217 set_error(error);
2220 visitor_->OnError(this); 2218 visitor_->OnError(this);
2221 reader_.reset(nullptr); 2219 reader_.reset(nullptr);
2222 return false; 2220 return false;
2223 } 2221 }
2224 2222
2225 } // namespace net 2223 } // 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