| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |