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