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

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

Issue 2547583002: Landing Recent QUIC changes until Fri Nov 18 23:21:04 2016 +0000 (Closed)
Patch Set: Remove explicit HTTP/2 enum usage Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698