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 |