| 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/core/quic_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 using base::StringPiece; | 28 using base::StringPiece; |
| 29 using std::max; | 29 using std::max; |
| 30 using std::min; | 30 using std::min; |
| 31 using std::string; | 31 using std::string; |
| 32 #define PREDICT_FALSE(x) (x) | 32 #define PREDICT_FALSE(x) (x) |
| 33 | 33 |
| 34 namespace net { | 34 namespace net { |
| 35 | 35 |
| 36 namespace { | 36 namespace { |
| 37 | 37 |
| 38 #define ENDPOINT \ |
| 39 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") |
| 40 |
| 38 // Mask to select the lowest 48 bits of a packet number. | 41 // Mask to select the lowest 48 bits of a packet number. |
| 39 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF); | 42 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF); |
| 40 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF); | 43 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF); |
| 41 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF); | 44 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF); |
| 42 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF); | 45 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF); |
| 43 | 46 |
| 44 // Number of bits the packet number length bits are shifted from the right | 47 // Number of bits the packet number length bits are shifted from the right |
| 45 // edge of the public header. | 48 // edge of the public header. |
| 46 const uint8_t kPublicHeaderSequenceNumberShift = 4; | 49 const uint8_t kPublicHeaderSequenceNumberShift = 4; |
| 47 | 50 |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 if (!first_frame) { | 301 if (!first_frame) { |
| 299 return 0; | 302 return 0; |
| 300 } | 303 } |
| 301 bool can_truncate = | 304 bool can_truncate = |
| 302 frame.type == ACK_FRAME && | 305 frame.type == ACK_FRAME && |
| 303 free_bytes >= | 306 free_bytes >= |
| 304 GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER); | 307 GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER); |
| 305 if (can_truncate) { | 308 if (can_truncate) { |
| 306 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 309 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 307 // Note that we may not use every byte of the writer in this case. | 310 // Note that we may not use every byte of the writer in this case. |
| 308 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; | 311 DVLOG(1) << ENDPOINT |
| 312 << "Truncating large frame, free bytes: " << free_bytes; |
| 309 return free_bytes; | 313 return free_bytes; |
| 310 } | 314 } |
| 311 return 0; | 315 return 0; |
| 312 } | 316 } |
| 313 | 317 |
| 314 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() | 318 QuicFramer::AckFrameInfo::AckFrameInfo() |
| 315 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} | 319 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
| 316 | 320 |
| 317 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = | 321 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; |
| 318 default; | |
| 319 | 322 |
| 320 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} | 323 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
| 321 | 324 |
| 322 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 325 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
| 323 const QuicFrames& frames, | 326 const QuicFrames& frames, |
| 324 char* buffer, | 327 char* buffer, |
| 325 size_t packet_length) { | 328 size_t packet_length) { |
| 326 QuicDataWriter writer(packet_length, buffer); | 329 QuicDataWriter writer(packet_length, buffer); |
| 327 if (!AppendPacketHeader(header, &writer)) { | 330 if (!AppendPacketHeader(header, &writer)) { |
| 328 QUIC_BUG << "AppendPacketHeader failed"; | 331 QUIC_BUG << "AppendPacketHeader failed"; |
| 329 return 0; | 332 return 0; |
| 330 } | 333 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 343 writer.WritePadding(); | 346 writer.WritePadding(); |
| 344 break; | 347 break; |
| 345 case STREAM_FRAME: | 348 case STREAM_FRAME: |
| 346 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 349 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
| 347 &writer)) { | 350 &writer)) { |
| 348 QUIC_BUG << "AppendStreamFrame failed"; | 351 QUIC_BUG << "AppendStreamFrame failed"; |
| 349 return 0; | 352 return 0; |
| 350 } | 353 } |
| 351 break; | 354 break; |
| 352 case ACK_FRAME: | 355 case ACK_FRAME: |
| 353 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { | 356 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) { |
| 354 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; | 357 QUIC_BUG << "AppendAckFrameAndTypeByte failed"; |
| 355 return 0; | 358 return 0; |
| 356 } | 359 } |
| 357 break; | 360 break; |
| 358 case STOP_WAITING_FRAME: | 361 case STOP_WAITING_FRAME: |
| 359 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, | 362 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, |
| 360 &writer)) { | 363 &writer)) { |
| 361 QUIC_BUG << "AppendStopWaitingFrame failed"; | 364 QUIC_BUG << "AppendStopWaitingFrame failed"; |
| 362 return 0; | 365 return 0; |
| 363 } | 366 } |
| 364 break; | 367 break; |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 } | 498 } |
| 496 | 499 |
| 497 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 500 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 498 QuicDataReader reader(packet.data(), packet.length()); | 501 QuicDataReader reader(packet.data(), packet.length()); |
| 499 | 502 |
| 500 visitor_->OnPacket(); | 503 visitor_->OnPacket(); |
| 501 | 504 |
| 502 // First parse the public header. | 505 // First parse the public header. |
| 503 QuicPacketPublicHeader public_header; | 506 QuicPacketPublicHeader public_header; |
| 504 if (!ProcessPublicHeader(&reader, &public_header)) { | 507 if (!ProcessPublicHeader(&reader, &public_header)) { |
| 505 DVLOG(1) << "Unable to process public header."; | 508 DCHECK_NE("", detailed_error_); |
| 509 DVLOG(1) << ENDPOINT |
| 510 << "Unable to process public header. Error: " << detailed_error_; |
| 506 DCHECK_NE("", detailed_error_); | 511 DCHECK_NE("", detailed_error_); |
| 507 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 512 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 508 } | 513 } |
| 509 | 514 |
| 510 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | 515 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
| 511 // The visitor suppresses further processing of the packet. | 516 // The visitor suppresses further processing of the packet. |
| 512 return true; | 517 return true; |
| 513 } | 518 } |
| 514 | 519 |
| 515 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && | 520 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 return true; | 567 return true; |
| 563 } | 568 } |
| 564 | 569 |
| 565 bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader, | 570 bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader, |
| 566 const QuicPacketPublicHeader& public_header, | 571 const QuicPacketPublicHeader& public_header, |
| 567 const QuicEncryptedPacket& packet, | 572 const QuicEncryptedPacket& packet, |
| 568 char* decrypted_buffer, | 573 char* decrypted_buffer, |
| 569 size_t buffer_length) { | 574 size_t buffer_length) { |
| 570 QuicPacketHeader header(public_header); | 575 QuicPacketHeader header(public_header); |
| 571 if (!ProcessUnauthenticatedHeader(encrypted_reader, &header)) { | 576 if (!ProcessUnauthenticatedHeader(encrypted_reader, &header)) { |
| 572 DVLOG(1) << "Unable to process packet header. Stopping parsing."; | 577 DCHECK_NE("", detailed_error_); |
| 578 DVLOG(1) << ENDPOINT |
| 579 << "Unable to process packet header. Stopping parsing. Error: " |
| 580 << detailed_error_; |
| 573 return false; | 581 return false; |
| 574 } | 582 } |
| 575 | 583 |
| 576 size_t decrypted_length = 0; | 584 size_t decrypted_length = 0; |
| 577 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 585 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
| 578 buffer_length, &decrypted_length)) { | 586 buffer_length, &decrypted_length)) { |
| 579 set_detailed_error("Unable to decrypt payload."); | 587 set_detailed_error("Unable to decrypt payload."); |
| 580 return RaiseError(QUIC_DECRYPTION_FAILURE); | 588 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 581 } | 589 } |
| 582 | 590 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 593 | 601 |
| 594 if (packet.length() > kMaxPacketSize) { | 602 if (packet.length() > kMaxPacketSize) { |
| 595 // If the packet has gotten this far, it should not be too large. | 603 // If the packet has gotten this far, it should not be too large. |
| 596 QUIC_BUG << "Packet too large:" << packet.length(); | 604 QUIC_BUG << "Packet too large:" << packet.length(); |
| 597 return RaiseError(QUIC_PACKET_TOO_LARGE); | 605 return RaiseError(QUIC_PACKET_TOO_LARGE); |
| 598 } | 606 } |
| 599 | 607 |
| 600 // Handle the payload. | 608 // Handle the payload. |
| 601 if (!ProcessFrameData(&reader, header)) { | 609 if (!ProcessFrameData(&reader, header)) { |
| 602 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | 610 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. |
| 603 DLOG(WARNING) << "Unable to process frame data."; | 611 DCHECK_NE("", detailed_error_); |
| 612 DLOG(WARNING) << ENDPOINT |
| 613 << "Unable to process frame data. Error: " << detailed_error_; |
| 604 return false; | 614 return false; |
| 605 } | 615 } |
| 606 | 616 |
| 607 visitor_->OnPacketComplete(); | 617 visitor_->OnPacketComplete(); |
| 608 return true; | 618 return true; |
| 609 } | 619 } |
| 610 | 620 |
| 611 bool QuicFramer::ProcessPublicResetPacket( | 621 bool QuicFramer::ProcessPublicResetPacket( |
| 612 QuicDataReader* reader, | 622 QuicDataReader* reader, |
| 613 const QuicPacketPublicHeader& public_header) { | 623 const QuicPacketPublicHeader& public_header) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 638 QuicSocketAddress(address_coder.ip(), address_coder.port()); | 648 QuicSocketAddress(address_coder.ip(), address_coder.port()); |
| 639 } | 649 } |
| 640 } | 650 } |
| 641 | 651 |
| 642 visitor_->OnPublicResetPacket(packet); | 652 visitor_->OnPublicResetPacket(packet); |
| 643 return true; | 653 return true; |
| 644 } | 654 } |
| 645 | 655 |
| 646 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, | 656 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, |
| 647 QuicDataWriter* writer) { | 657 QuicDataWriter* writer) { |
| 648 DVLOG(1) << "Appending header: " << header; | 658 DVLOG(1) << ENDPOINT << "Appending header: " << header; |
| 649 uint8_t public_flags = 0; | 659 uint8_t public_flags = 0; |
| 650 if (header.public_header.reset_flag) { | 660 if (header.public_header.reset_flag) { |
| 651 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 661 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| 652 } | 662 } |
| 653 if (header.public_header.version_flag) { | 663 if (header.public_header.version_flag) { |
| 654 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 664 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 655 } | 665 } |
| 656 if (header.public_header.multipath_flag) { | 666 if (header.public_header.multipath_flag) { |
| 657 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; | 667 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; |
| 658 } | 668 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 684 return false; | 694 return false; |
| 685 } | 695 } |
| 686 break; | 696 break; |
| 687 } | 697 } |
| 688 last_serialized_connection_id_ = header.public_header.connection_id; | 698 last_serialized_connection_id_ = header.public_header.connection_id; |
| 689 | 699 |
| 690 if (header.public_header.version_flag) { | 700 if (header.public_header.version_flag) { |
| 691 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); | 701 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); |
| 692 QuicTag tag = QuicVersionToQuicTag(quic_version_); | 702 QuicTag tag = QuicVersionToQuicTag(quic_version_); |
| 693 writer->WriteUInt32(tag); | 703 writer->WriteUInt32(tag); |
| 694 DVLOG(1) << "version = " << quic_version_ << ", tag = '" | 704 DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" |
| 695 << QuicTagToString(tag) << "'"; | 705 << QuicTagToString(tag) << "'"; |
| 696 } | 706 } |
| 697 | 707 |
| 698 if (header.public_header.multipath_flag && | 708 if (header.public_header.multipath_flag && |
| 699 !writer->WriteUInt8(header.path_id)) { | 709 !writer->WriteUInt8(header.path_id)) { |
| 700 return false; | 710 return false; |
| 701 } | 711 } |
| 702 | 712 |
| 703 if (header.public_header.nonce != nullptr && | 713 if (header.public_header.nonce != nullptr && |
| 704 !writer->WriteBytes(header.public_header.nonce, | 714 !writer->WriteBytes(header.public_header.nonce, |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 return PACKET_FLAGS_4BYTE_PACKET; | 920 return PACKET_FLAGS_4BYTE_PACKET; |
| 911 case PACKET_6BYTE_PACKET_NUMBER: | 921 case PACKET_6BYTE_PACKET_NUMBER: |
| 912 return PACKET_FLAGS_6BYTE_PACKET; | 922 return PACKET_FLAGS_6BYTE_PACKET; |
| 913 default: | 923 default: |
| 914 QUIC_BUG << "Unreachable case statement."; | 924 QUIC_BUG << "Unreachable case statement."; |
| 915 return PACKET_FLAGS_6BYTE_PACKET; | 925 return PACKET_FLAGS_6BYTE_PACKET; |
| 916 } | 926 } |
| 917 } | 927 } |
| 918 | 928 |
| 919 // static | 929 // static |
| 920 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( | 930 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( |
| 921 const QuicAckFrame& frame) { | 931 const QuicAckFrame& frame) { |
| 922 NewAckFrameInfo new_ack_info; | 932 AckFrameInfo new_ack_info; |
| 923 if (frame.packets.Empty()) { | 933 if (frame.packets.Empty()) { |
| 924 return new_ack_info; | 934 return new_ack_info; |
| 925 } | 935 } |
| 926 // The first block is the last interval. It isn't encoded with the gap-length | 936 // The first block is the last interval. It isn't encoded with the gap-length |
| 927 // encoding, so skip it. | 937 // encoding, so skip it. |
| 928 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); | 938 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); |
| 929 auto itr = frame.packets.rbegin(); | 939 auto itr = frame.packets.rbegin(); |
| 930 QuicPacketNumber previous_start = itr->min(); | 940 QuicPacketNumber previous_start = itr->min(); |
| 931 new_ack_info.max_block_length = itr->Length(); | 941 new_ack_info.max_block_length = itr->Length(); |
| 932 ++itr; | 942 ++itr; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 953 if (header->public_header.multipath_flag && | 963 if (header->public_header.multipath_flag && |
| 954 !ProcessPathId(encrypted_reader, &header->path_id)) { | 964 !ProcessPathId(encrypted_reader, &header->path_id)) { |
| 955 set_detailed_error("Unable to read path id."); | 965 set_detailed_error("Unable to read path id."); |
| 956 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 966 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 957 } | 967 } |
| 958 | 968 |
| 959 QuicPacketNumber base_packet_number = largest_packet_number_; | 969 QuicPacketNumber base_packet_number = largest_packet_number_; |
| 960 if (header->public_header.multipath_flag && | 970 if (header->public_header.multipath_flag && |
| 961 !IsValidPath(header->path_id, &base_packet_number)) { | 971 !IsValidPath(header->path_id, &base_packet_number)) { |
| 962 // Stop processing because path is closed. | 972 // Stop processing because path is closed. |
| 973 set_detailed_error("Path is closed."); |
| 963 return false; | 974 return false; |
| 964 } | 975 } |
| 965 | 976 |
| 966 if (!ProcessPacketSequenceNumber( | 977 if (!ProcessPacketSequenceNumber( |
| 967 encrypted_reader, header->public_header.packet_number_length, | 978 encrypted_reader, header->public_header.packet_number_length, |
| 968 base_packet_number, &header->packet_number)) { | 979 base_packet_number, &header->packet_number)) { |
| 969 set_detailed_error("Unable to read packet number."); | 980 set_detailed_error("Unable to read packet number."); |
| 970 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 981 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 971 } | 982 } |
| 972 | 983 |
| 973 if (header->packet_number == 0u) { | 984 if (header->packet_number == 0u) { |
| 974 set_detailed_error("packet numbers cannot be 0."); | 985 set_detailed_error("packet numbers cannot be 0."); |
| 975 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 986 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 976 } | 987 } |
| 977 | 988 |
| 978 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 989 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| 990 set_detailed_error( |
| 991 "Visitor asked to stop processing of unauthenticated header."); |
| 979 return false; | 992 return false; |
| 980 } | 993 } |
| 981 return true; | 994 return true; |
| 982 } | 995 } |
| 983 | 996 |
| 984 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { | 997 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { |
| 985 if (!reader->ReadBytes(path_id, 1)) { | 998 if (!reader->ReadBytes(path_id, 1)) { |
| 986 return false; | 999 return false; |
| 987 } | 1000 } |
| 988 | 1001 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 } | 1033 } |
| 1021 | 1034 |
| 1022 if (frame_type & kQuicFrameTypeSpecialMask) { | 1035 if (frame_type & kQuicFrameTypeSpecialMask) { |
| 1023 // Stream Frame | 1036 // Stream Frame |
| 1024 if (frame_type & kQuicFrameTypeStreamMask) { | 1037 if (frame_type & kQuicFrameTypeStreamMask) { |
| 1025 QuicStreamFrame frame; | 1038 QuicStreamFrame frame; |
| 1026 if (!ProcessStreamFrame(reader, frame_type, &frame)) { | 1039 if (!ProcessStreamFrame(reader, frame_type, &frame)) { |
| 1027 return RaiseError(QUIC_INVALID_STREAM_DATA); | 1040 return RaiseError(QUIC_INVALID_STREAM_DATA); |
| 1028 } | 1041 } |
| 1029 if (!visitor_->OnStreamFrame(frame)) { | 1042 if (!visitor_->OnStreamFrame(frame)) { |
| 1030 DVLOG(1) << "Visitor asked to stop further processing."; | 1043 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1031 // Returning true since there was no parsing error. | 1044 // Returning true since there was no parsing error. |
| 1032 return true; | 1045 return true; |
| 1033 } | 1046 } |
| 1034 continue; | 1047 continue; |
| 1035 } | 1048 } |
| 1036 | 1049 |
| 1037 // Ack Frame | 1050 // Ack Frame |
| 1038 if (frame_type & kQuicFrameTypeAckMask) { | 1051 if (frame_type & kQuicFrameTypeAckMask) { |
| 1039 QuicAckFrame frame; | 1052 QuicAckFrame frame; |
| 1040 if (!ProcessNewAckFrame(reader, frame_type, &frame)) { | 1053 if (!ProcessAckFrame(reader, frame_type, &frame)) { |
| 1041 return RaiseError(QUIC_INVALID_ACK_DATA); | 1054 return RaiseError(QUIC_INVALID_ACK_DATA); |
| 1042 } | 1055 } |
| 1043 if (!visitor_->OnAckFrame(frame)) { | 1056 if (!visitor_->OnAckFrame(frame)) { |
| 1044 DVLOG(1) << "Visitor asked to stop further processing."; | 1057 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1045 // Returning true since there was no parsing error. | 1058 // Returning true since there was no parsing error. |
| 1046 return true; | 1059 return true; |
| 1047 } | 1060 } |
| 1048 continue; | 1061 continue; |
| 1049 } | 1062 } |
| 1050 | 1063 |
| 1051 // This was a special frame type that did not match any | 1064 // This was a special frame type that did not match any |
| 1052 // of the known ones. Error. | 1065 // of the known ones. Error. |
| 1053 set_detailed_error("Illegal frame type."); | 1066 set_detailed_error("Illegal frame type."); |
| 1054 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type); | 1067 DLOG(WARNING) << ENDPOINT |
| 1068 << "Illegal frame type: " << static_cast<int>(frame_type); |
| 1055 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1069 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 1056 } | 1070 } |
| 1057 | 1071 |
| 1058 switch (frame_type) { | 1072 switch (frame_type) { |
| 1059 case PADDING_FRAME: { | 1073 case PADDING_FRAME: { |
| 1060 QuicPaddingFrame frame(reader->BytesRemaining()); | 1074 QuicPaddingFrame frame(reader->BytesRemaining()); |
| 1061 if (!visitor_->OnPaddingFrame(frame)) { | 1075 if (!visitor_->OnPaddingFrame(frame)) { |
| 1062 DVLOG(1) << "Visitor asked to stop further processing."; | 1076 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1063 } | 1077 } |
| 1064 // We're done with the packet. | 1078 // We're done with the packet. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1078 continue; | 1092 continue; |
| 1079 } | 1093 } |
| 1080 | 1094 |
| 1081 case CONNECTION_CLOSE_FRAME: { | 1095 case CONNECTION_CLOSE_FRAME: { |
| 1082 QuicConnectionCloseFrame frame; | 1096 QuicConnectionCloseFrame frame; |
| 1083 if (!ProcessConnectionCloseFrame(reader, &frame)) { | 1097 if (!ProcessConnectionCloseFrame(reader, &frame)) { |
| 1084 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); | 1098 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); |
| 1085 } | 1099 } |
| 1086 | 1100 |
| 1087 if (!visitor_->OnConnectionCloseFrame(frame)) { | 1101 if (!visitor_->OnConnectionCloseFrame(frame)) { |
| 1088 DVLOG(1) << "Visitor asked to stop further processing."; | 1102 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1089 // Returning true since there was no parsing error. | 1103 // Returning true since there was no parsing error. |
| 1090 return true; | 1104 return true; |
| 1091 } | 1105 } |
| 1092 continue; | 1106 continue; |
| 1093 } | 1107 } |
| 1094 | 1108 |
| 1095 case GOAWAY_FRAME: { | 1109 case GOAWAY_FRAME: { |
| 1096 QuicGoAwayFrame goaway_frame; | 1110 QuicGoAwayFrame goaway_frame; |
| 1097 if (!ProcessGoAwayFrame(reader, &goaway_frame)) { | 1111 if (!ProcessGoAwayFrame(reader, &goaway_frame)) { |
| 1098 return RaiseError(QUIC_INVALID_GOAWAY_DATA); | 1112 return RaiseError(QUIC_INVALID_GOAWAY_DATA); |
| 1099 } | 1113 } |
| 1100 if (!visitor_->OnGoAwayFrame(goaway_frame)) { | 1114 if (!visitor_->OnGoAwayFrame(goaway_frame)) { |
| 1101 DVLOG(1) << "Visitor asked to stop further processing."; | 1115 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1102 // Returning true since there was no parsing error. | 1116 // Returning true since there was no parsing error. |
| 1103 return true; | 1117 return true; |
| 1104 } | 1118 } |
| 1105 continue; | 1119 continue; |
| 1106 } | 1120 } |
| 1107 | 1121 |
| 1108 case WINDOW_UPDATE_FRAME: { | 1122 case WINDOW_UPDATE_FRAME: { |
| 1109 QuicWindowUpdateFrame window_update_frame; | 1123 QuicWindowUpdateFrame window_update_frame; |
| 1110 if (!ProcessWindowUpdateFrame(reader, &window_update_frame)) { | 1124 if (!ProcessWindowUpdateFrame(reader, &window_update_frame)) { |
| 1111 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA); | 1125 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA); |
| 1112 } | 1126 } |
| 1113 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) { | 1127 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) { |
| 1114 DVLOG(1) << "Visitor asked to stop further processing."; | 1128 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1115 // Returning true since there was no parsing error. | 1129 // Returning true since there was no parsing error. |
| 1116 return true; | 1130 return true; |
| 1117 } | 1131 } |
| 1118 continue; | 1132 continue; |
| 1119 } | 1133 } |
| 1120 | 1134 |
| 1121 case BLOCKED_FRAME: { | 1135 case BLOCKED_FRAME: { |
| 1122 QuicBlockedFrame blocked_frame; | 1136 QuicBlockedFrame blocked_frame; |
| 1123 if (!ProcessBlockedFrame(reader, &blocked_frame)) { | 1137 if (!ProcessBlockedFrame(reader, &blocked_frame)) { |
| 1124 return RaiseError(QUIC_INVALID_BLOCKED_DATA); | 1138 return RaiseError(QUIC_INVALID_BLOCKED_DATA); |
| 1125 } | 1139 } |
| 1126 if (!visitor_->OnBlockedFrame(blocked_frame)) { | 1140 if (!visitor_->OnBlockedFrame(blocked_frame)) { |
| 1127 DVLOG(1) << "Visitor asked to stop further processing."; | 1141 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1128 // Returning true since there was no parsing error. | 1142 // Returning true since there was no parsing error. |
| 1129 return true; | 1143 return true; |
| 1130 } | 1144 } |
| 1131 continue; | 1145 continue; |
| 1132 } | 1146 } |
| 1133 | 1147 |
| 1134 case STOP_WAITING_FRAME: { | 1148 case STOP_WAITING_FRAME: { |
| 1135 QuicStopWaitingFrame stop_waiting_frame; | 1149 QuicStopWaitingFrame stop_waiting_frame; |
| 1136 if (!ProcessStopWaitingFrame(reader, header, &stop_waiting_frame)) { | 1150 if (!ProcessStopWaitingFrame(reader, header, &stop_waiting_frame)) { |
| 1137 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); | 1151 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); |
| 1138 } | 1152 } |
| 1139 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { | 1153 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { |
| 1140 DVLOG(1) << "Visitor asked to stop further processing."; | 1154 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1141 // Returning true since there was no parsing error. | 1155 // Returning true since there was no parsing error. |
| 1142 return true; | 1156 return true; |
| 1143 } | 1157 } |
| 1144 continue; | 1158 continue; |
| 1145 } | 1159 } |
| 1146 case PING_FRAME: { | 1160 case PING_FRAME: { |
| 1147 // Ping has no payload. | 1161 // Ping has no payload. |
| 1148 QuicPingFrame ping_frame; | 1162 QuicPingFrame ping_frame; |
| 1149 if (!visitor_->OnPingFrame(ping_frame)) { | 1163 if (!visitor_->OnPingFrame(ping_frame)) { |
| 1150 DVLOG(1) << "Visitor asked to stop further processing."; | 1164 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1151 // Returning true since there was no parsing error. | 1165 // Returning true since there was no parsing error. |
| 1152 return true; | 1166 return true; |
| 1153 } | 1167 } |
| 1154 continue; | 1168 continue; |
| 1155 } | 1169 } |
| 1156 case PATH_CLOSE_FRAME: { | 1170 case PATH_CLOSE_FRAME: { |
| 1157 QuicPathCloseFrame path_close_frame; | 1171 QuicPathCloseFrame path_close_frame; |
| 1158 if (!ProcessPathCloseFrame(reader, &path_close_frame)) { | 1172 if (!ProcessPathCloseFrame(reader, &path_close_frame)) { |
| 1159 return RaiseError(QUIC_INVALID_PATH_CLOSE_DATA); | 1173 return RaiseError(QUIC_INVALID_PATH_CLOSE_DATA); |
| 1160 } | 1174 } |
| 1161 if (!visitor_->OnPathCloseFrame(path_close_frame)) { | 1175 if (!visitor_->OnPathCloseFrame(path_close_frame)) { |
| 1162 DVLOG(1) << "Visitor asked to stop further processing."; | 1176 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1163 // Returning true since there was no parsing error. | 1177 // Returning true since there was no parsing error. |
| 1164 return true; | 1178 return true; |
| 1165 } | 1179 } |
| 1166 continue; | 1180 continue; |
| 1167 } | 1181 } |
| 1168 | 1182 |
| 1169 default: | 1183 default: |
| 1170 set_detailed_error("Illegal frame type."); | 1184 set_detailed_error("Illegal frame type."); |
| 1171 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type); | 1185 DLOG(WARNING) << ENDPOINT |
| 1186 << "Illegal frame type: " << static_cast<int>(frame_type); |
| 1172 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1187 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 1173 } | 1188 } |
| 1174 } | 1189 } |
| 1175 | 1190 |
| 1176 return true; | 1191 return true; |
| 1177 } | 1192 } |
| 1178 | 1193 |
| 1179 bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader, | 1194 bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader, |
| 1180 uint8_t frame_type, | 1195 uint8_t frame_type, |
| 1181 QuicStreamFrame* frame) { | 1196 QuicStreamFrame* frame) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 set_detailed_error("Unable to read frame data."); | 1239 set_detailed_error("Unable to read frame data."); |
| 1225 return false; | 1240 return false; |
| 1226 } | 1241 } |
| 1227 } | 1242 } |
| 1228 frame->data_buffer = data.data(); | 1243 frame->data_buffer = data.data(); |
| 1229 frame->data_length = static_cast<uint16_t>(data.length()); | 1244 frame->data_length = static_cast<uint16_t>(data.length()); |
| 1230 | 1245 |
| 1231 return true; | 1246 return true; |
| 1232 } | 1247 } |
| 1233 | 1248 |
| 1234 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, | 1249 bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, |
| 1235 uint8_t frame_type, | 1250 uint8_t frame_type, |
| 1236 QuicAckFrame* ack_frame) { | 1251 QuicAckFrame* ack_frame) { |
| 1237 // Determine the two lengths from the frame type: largest acked length, | 1252 // Determine the two lengths from the frame type: largest acked length, |
| 1238 // ack block length. | 1253 // ack block length. |
| 1239 const QuicPacketNumberLength ack_block_length = | 1254 const QuicPacketNumberLength ack_block_length = |
| 1240 ReadSequenceNumberLength(frame_type); | 1255 ReadSequenceNumberLength(frame_type); |
| 1241 frame_type >>= kQuicSequenceNumberLengthShift; | 1256 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1242 const QuicPacketNumberLength largest_acked_length = | 1257 const QuicPacketNumberLength largest_acked_length = |
| 1243 ReadSequenceNumberLength(frame_type); | 1258 ReadSequenceNumberLength(frame_type); |
| 1244 frame_type >>= kQuicSequenceNumberLengthShift; | 1259 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1245 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1260 frame_type >>= kQuicHasMultipleAckBlocksShift; |
| 1246 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1261 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1661 // Switch the alternative decrypter so that we use it first next time. | 1676 // Switch the alternative decrypter so that we use it first next time. |
| 1662 decrypter_.swap(alternative_decrypter_); | 1677 decrypter_.swap(alternative_decrypter_); |
| 1663 EncryptionLevel level = alternative_decrypter_level_; | 1678 EncryptionLevel level = alternative_decrypter_level_; |
| 1664 alternative_decrypter_level_ = decrypter_level_; | 1679 alternative_decrypter_level_ = decrypter_level_; |
| 1665 decrypter_level_ = level; | 1680 decrypter_level_ = level; |
| 1666 } | 1681 } |
| 1667 } | 1682 } |
| 1668 } | 1683 } |
| 1669 | 1684 |
| 1670 if (!success) { | 1685 if (!success) { |
| 1671 DVLOG(1) << "DecryptPacket failed for packet_number:" | 1686 DVLOG(1) << ENDPOINT << "DecryptPacket failed for packet_number:" |
| 1672 << header.packet_number; | 1687 << header.packet_number; |
| 1673 return false; | 1688 return false; |
| 1674 } | 1689 } |
| 1675 | 1690 |
| 1676 return true; | 1691 return true; |
| 1677 } | 1692 } |
| 1678 | 1693 |
| 1679 size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) { | 1694 size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) { |
| 1680 if (ack.received_packet_times.empty()) { | 1695 if (ack.received_packet_times.empty()) { |
| 1681 return 0; | 1696 return 0; |
| 1682 } | 1697 } |
| 1683 | 1698 |
| 1684 return 5 + 3 * (ack.received_packet_times.size() - 1); | 1699 return 5 + 3 * (ack.received_packet_times.size() - 1); |
| 1685 } | 1700 } |
| 1686 | 1701 |
| 1687 size_t QuicFramer::GetAckFrameSize( | 1702 size_t QuicFramer::GetAckFrameSize( |
| 1688 const QuicAckFrame& ack, | 1703 const QuicAckFrame& ack, |
| 1689 QuicPacketNumberLength packet_number_length) { | 1704 QuicPacketNumberLength packet_number_length) { |
| 1690 size_t ack_size = 0; | 1705 size_t ack_size = 0; |
| 1691 | 1706 |
| 1692 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); | 1707 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1693 QuicPacketNumberLength largest_acked_length = | 1708 QuicPacketNumberLength largest_acked_length = |
| 1694 GetMinSequenceNumberLength(ack.largest_observed); | 1709 GetMinSequenceNumberLength(ack.largest_observed); |
| 1695 QuicPacketNumberLength ack_block_length = | 1710 QuicPacketNumberLength ack_block_length = |
| 1696 GetMinSequenceNumberLength(ack_info.max_block_length); | 1711 GetMinSequenceNumberLength(ack_info.max_block_length); |
| 1697 | 1712 |
| 1698 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1713 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
| 1699 // First ack block length. | 1714 // First ack block length. |
| 1700 ack_size += ack_block_length; | 1715 ack_size += ack_block_length; |
| 1701 if (ack_info.num_ack_blocks != 0) { | 1716 if (ack_info.num_ack_blocks != 0) { |
| 1702 ack_size += kNumberOfAckBlocksSize; | 1717 ack_size += kNumberOfAckBlocksSize; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1860 return false; | 1875 return false; |
| 1861 } | 1876 } |
| 1862 return true; | 1877 return true; |
| 1863 } | 1878 } |
| 1864 | 1879 |
| 1865 void QuicFramer::set_version(const QuicVersion version) { | 1880 void QuicFramer::set_version(const QuicVersion version) { |
| 1866 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1881 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 1867 quic_version_ = version; | 1882 quic_version_ = version; |
| 1868 } | 1883 } |
| 1869 | 1884 |
| 1870 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 1885 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 1871 QuicDataWriter* writer) { | 1886 QuicDataWriter* writer) { |
| 1872 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 1887 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); |
| 1873 QuicPacketNumber largest_acked = frame.largest_observed; | 1888 QuicPacketNumber largest_acked = frame.largest_observed; |
| 1874 QuicPacketNumberLength largest_acked_length = | 1889 QuicPacketNumberLength largest_acked_length = |
| 1875 GetMinSequenceNumberLength(largest_acked); | 1890 GetMinSequenceNumberLength(largest_acked); |
| 1876 QuicPacketNumberLength ack_block_length = | 1891 QuicPacketNumberLength ack_block_length = |
| 1877 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1892 GetMinSequenceNumberLength(new_ack_info.max_block_length); |
| 1878 // Calculate available bytes for timestamps and ack blocks. | 1893 // Calculate available bytes for timestamps and ack blocks. |
| 1879 int32_t available_timestamp_and_ack_block_bytes = | 1894 int32_t available_timestamp_and_ack_block_bytes = |
| 1880 writer->capacity() - writer->length() - ack_block_length - | 1895 writer->capacity() - writer->length() - ack_block_length - |
| 1881 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 1896 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
| 1882 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); | 1897 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2178 bool QuicFramer::AppendPathCloseFrame(const QuicPathCloseFrame& frame, | 2193 bool QuicFramer::AppendPathCloseFrame(const QuicPathCloseFrame& frame, |
| 2179 QuicDataWriter* writer) { | 2194 QuicDataWriter* writer) { |
| 2180 uint8_t path_id = static_cast<uint8_t>(frame.path_id); | 2195 uint8_t path_id = static_cast<uint8_t>(frame.path_id); |
| 2181 if (!writer->WriteUInt8(path_id)) { | 2196 if (!writer->WriteUInt8(path_id)) { |
| 2182 return false; | 2197 return false; |
| 2183 } | 2198 } |
| 2184 return true; | 2199 return true; |
| 2185 } | 2200 } |
| 2186 | 2201 |
| 2187 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2202 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2188 DVLOG(1) << "Error: " << QuicErrorCodeToString(error) | 2203 DVLOG(1) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
| 2189 << " detail: " << detailed_error_; | 2204 << " detail: " << detailed_error_; |
| 2190 set_error(error); | 2205 set_error(error); |
| 2191 visitor_->OnError(this); | 2206 visitor_->OnError(this); |
| 2192 return false; | 2207 return false; |
| 2193 } | 2208 } |
| 2194 | 2209 |
| 2195 } // namespace net | 2210 } // namespace net |
| OLD | NEW |