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 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 size_t QuicFramer::GetWindowUpdateFrameSize() { | 200 size_t QuicFramer::GetWindowUpdateFrameSize() { |
201 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; | 201 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; |
202 } | 202 } |
203 | 203 |
204 // static | 204 // static |
205 size_t QuicFramer::GetBlockedFrameSize() { | 205 size_t QuicFramer::GetBlockedFrameSize() { |
206 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; | 206 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; |
207 } | 207 } |
208 | 208 |
209 // static | 209 // static |
210 size_t QuicFramer::GetPathCloseFrameSize() { | |
211 return kQuicFrameTypeSize + kQuicPathIdSize; | |
212 } | |
213 | |
214 // static | |
215 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) { | 210 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) { |
216 // Sizes are 1 through 4 bytes. | 211 // Sizes are 1 through 4 bytes. |
217 for (int i = 1; i <= 4; ++i) { | 212 for (int i = 1; i <= 4; ++i) { |
218 stream_id >>= 8; | 213 stream_id >>= 8; |
219 if (stream_id == 0) { | 214 if (stream_id == 0) { |
220 return i; | 215 return i; |
221 } | 216 } |
222 } | 217 } |
223 QUIC_BUG << "Failed to determine StreamIDSize."; | 218 QUIC_BUG << "Failed to determine StreamIDSize."; |
224 return 4; | 219 return 4; |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 QUIC_BUG << "AppendWindowUpdateFrame failed"; | 386 QUIC_BUG << "AppendWindowUpdateFrame failed"; |
392 return 0; | 387 return 0; |
393 } | 388 } |
394 break; | 389 break; |
395 case BLOCKED_FRAME: | 390 case BLOCKED_FRAME: |
396 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { | 391 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { |
397 QUIC_BUG << "AppendBlockedFrame failed"; | 392 QUIC_BUG << "AppendBlockedFrame failed"; |
398 return 0; | 393 return 0; |
399 } | 394 } |
400 break; | 395 break; |
401 case PATH_CLOSE_FRAME: | |
402 if (!AppendPathCloseFrame(*frame.path_close_frame, &writer)) { | |
403 QUIC_BUG << "AppendPathCloseFrame failed"; | |
404 return 0; | |
405 } | |
406 break; | |
407 default: | 396 default: |
408 RaiseError(QUIC_INVALID_FRAME_DATA); | 397 RaiseError(QUIC_INVALID_FRAME_DATA); |
409 QUIC_BUG << "QUIC_INVALID_FRAME_DATA"; | 398 QUIC_BUG << "QUIC_INVALID_FRAME_DATA"; |
410 return 0; | 399 return 0; |
411 } | 400 } |
412 ++i; | 401 ++i; |
413 } | 402 } |
414 | 403 |
415 return writer.length(); | 404 return writer.length(); |
416 } | 405 } |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 return false; | 766 return false; |
778 } | 767 } |
779 | 768 |
780 public_header->multipath_flag = | 769 public_header->multipath_flag = |
781 (public_flags & PACKET_PUBLIC_FLAGS_MULTIPATH) != 0; | 770 (public_flags & PACKET_PUBLIC_FLAGS_MULTIPATH) != 0; |
782 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; | 771 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; |
783 public_header->version_flag = | 772 public_header->version_flag = |
784 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; | 773 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; |
785 | 774 |
786 if (validate_flags_ && !public_header->version_flag && | 775 if (validate_flags_ && !public_header->version_flag && |
787 public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 776 public_flags > (FLAGS_quic_reloadable_flag_quic_remove_multipath_bit |
| 777 ? PACKET_PUBLIC_FLAGS_MAX_WITHOUT_MULTIPATH_FLAG |
| 778 : PACKET_PUBLIC_FLAGS_MAX)) { |
788 set_detailed_error("Illegal public flags value."); | 779 set_detailed_error("Illegal public flags value."); |
789 return false; | 780 return false; |
790 } | 781 } |
791 | 782 |
792 if (public_header->reset_flag && public_header->version_flag) { | 783 if (public_header->reset_flag && public_header->version_flag) { |
793 set_detailed_error("Got version flag in reset packet"); | 784 set_detailed_error("Got version flag in reset packet"); |
794 return false; | 785 return false; |
795 } | 786 } |
796 | 787 |
797 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { | 788 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { |
(...skipping 20 matching lines...) Expand all Loading... |
818 if (!reader->ReadUInt32(&version_tag)) { | 809 if (!reader->ReadUInt32(&version_tag)) { |
819 set_detailed_error("Unable to read protocol version."); | 810 set_detailed_error("Unable to read protocol version."); |
820 return false; | 811 return false; |
821 } | 812 } |
822 | 813 |
823 // If the version from the new packet is the same as the version of this | 814 // If the version from the new packet is the same as the version of this |
824 // framer, then the public flags should be set to something we understand. | 815 // framer, then the public flags should be set to something we understand. |
825 // If not, this raises an error. | 816 // If not, this raises an error. |
826 last_version_tag_ = version_tag; | 817 last_version_tag_ = version_tag; |
827 QuicVersion version = QuicTagToQuicVersion(version_tag); | 818 QuicVersion version = QuicTagToQuicVersion(version_tag); |
828 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 819 if (version == quic_version_ && |
| 820 public_flags > (FLAGS_quic_reloadable_flag_quic_remove_multipath_bit |
| 821 ? PACKET_PUBLIC_FLAGS_MAX_WITHOUT_MULTIPATH_FLAG |
| 822 : PACKET_PUBLIC_FLAGS_MAX)) { |
829 set_detailed_error("Illegal public flags value."); | 823 set_detailed_error("Illegal public flags value."); |
830 return false; | 824 return false; |
831 } | 825 } |
832 public_header->versions.push_back(version); | 826 public_header->versions.push_back(version); |
833 } | 827 } |
834 | 828 |
835 // A nonce should only be present in packets from the server to the client, | 829 // A nonce should only be present in packets from the server to the client, |
836 // which are neither version negotiation nor public reset packets. | 830 // which are neither version negotiation nor public reset packets. |
837 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE && | 831 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE && |
838 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && | 832 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 // Ping has no payload. | 1100 // Ping has no payload. |
1107 QuicPingFrame ping_frame; | 1101 QuicPingFrame ping_frame; |
1108 if (!visitor_->OnPingFrame(ping_frame)) { | 1102 if (!visitor_->OnPingFrame(ping_frame)) { |
1109 QUIC_DVLOG(1) << ENDPOINT | 1103 QUIC_DVLOG(1) << ENDPOINT |
1110 << "Visitor asked to stop further processing."; | 1104 << "Visitor asked to stop further processing."; |
1111 // Returning true since there was no parsing error. | 1105 // Returning true since there was no parsing error. |
1112 return true; | 1106 return true; |
1113 } | 1107 } |
1114 continue; | 1108 continue; |
1115 } | 1109 } |
1116 case PATH_CLOSE_FRAME: { | |
1117 QuicPathCloseFrame path_close_frame; | |
1118 if (!ProcessPathCloseFrame(reader, &path_close_frame)) { | |
1119 return RaiseError(QUIC_INVALID_PATH_CLOSE_DATA); | |
1120 } | |
1121 if (!visitor_->OnPathCloseFrame(path_close_frame)) { | |
1122 QUIC_DVLOG(1) << ENDPOINT | |
1123 << "Visitor asked to stop further processing."; | |
1124 // Returning true since there was no parsing error. | |
1125 return true; | |
1126 } | |
1127 continue; | |
1128 } | |
1129 | 1110 |
1130 default: | 1111 default: |
1131 set_detailed_error("Illegal frame type."); | 1112 set_detailed_error("Illegal frame type."); |
1132 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: " | 1113 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: " |
1133 << static_cast<int>(frame_type); | 1114 << static_cast<int>(frame_type); |
1134 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1115 return RaiseError(QUIC_INVALID_FRAME_DATA); |
1135 } | 1116 } |
1136 } | 1117 } |
1137 | 1118 |
1138 return true; | 1119 return true; |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 bool QuicFramer::ProcessBlockedFrame(QuicDataReader* reader, | 1423 bool QuicFramer::ProcessBlockedFrame(QuicDataReader* reader, |
1443 QuicBlockedFrame* frame) { | 1424 QuicBlockedFrame* frame) { |
1444 if (!reader->ReadUInt32(&frame->stream_id)) { | 1425 if (!reader->ReadUInt32(&frame->stream_id)) { |
1445 set_detailed_error("Unable to read stream_id."); | 1426 set_detailed_error("Unable to read stream_id."); |
1446 return false; | 1427 return false; |
1447 } | 1428 } |
1448 | 1429 |
1449 return true; | 1430 return true; |
1450 } | 1431 } |
1451 | 1432 |
1452 bool QuicFramer::ProcessPathCloseFrame(QuicDataReader* reader, | |
1453 QuicPathCloseFrame* frame) { | |
1454 if (!reader->ReadBytes(&frame->path_id, 1)) { | |
1455 set_detailed_error("Unable to read path_id."); | |
1456 return false; | |
1457 } | |
1458 | |
1459 return true; | |
1460 } | |
1461 | |
1462 // static | 1433 // static |
1463 QuicStringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( | 1434 QuicStringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( |
1464 QuicVersion version, | 1435 QuicVersion version, |
1465 const QuicEncryptedPacket& encrypted, | 1436 const QuicEncryptedPacket& encrypted, |
1466 QuicConnectionIdLength connection_id_length, | 1437 QuicConnectionIdLength connection_id_length, |
1467 bool includes_version, | 1438 bool includes_version, |
1468 bool includes_diversification_nonce, | 1439 bool includes_diversification_nonce, |
1469 QuicPacketNumberLength packet_number_length) { | 1440 QuicPacketNumberLength packet_number_length) { |
1470 // TODO(ianswett): This is identical to QuicData::AssociatedData. | 1441 // TODO(ianswett): This is identical to QuicData::AssociatedData. |
1471 return QuicStringPiece( | 1442 return QuicStringPiece( |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 return GetRstStreamFrameSize(); | 1663 return GetRstStreamFrameSize(); |
1693 case CONNECTION_CLOSE_FRAME: | 1664 case CONNECTION_CLOSE_FRAME: |
1694 return GetMinConnectionCloseFrameSize() + | 1665 return GetMinConnectionCloseFrameSize() + |
1695 frame.connection_close_frame->error_details.size(); | 1666 frame.connection_close_frame->error_details.size(); |
1696 case GOAWAY_FRAME: | 1667 case GOAWAY_FRAME: |
1697 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); | 1668 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); |
1698 case WINDOW_UPDATE_FRAME: | 1669 case WINDOW_UPDATE_FRAME: |
1699 return GetWindowUpdateFrameSize(); | 1670 return GetWindowUpdateFrameSize(); |
1700 case BLOCKED_FRAME: | 1671 case BLOCKED_FRAME: |
1701 return GetBlockedFrameSize(); | 1672 return GetBlockedFrameSize(); |
1702 case PATH_CLOSE_FRAME: | |
1703 return GetPathCloseFrameSize(); | |
1704 case PADDING_FRAME: | 1673 case PADDING_FRAME: |
1705 DCHECK(false); | 1674 DCHECK(false); |
1706 return 0; | 1675 return 0; |
1707 case NUM_FRAME_TYPES: | 1676 case NUM_FRAME_TYPES: |
1708 DCHECK(false); | 1677 DCHECK(false); |
1709 return 0; | 1678 return 0; |
1710 } | 1679 } |
1711 | 1680 |
1712 // Not reachable, but some Chrome compilers can't figure that out. *sigh* | 1681 // Not reachable, but some Chrome compilers can't figure that out. *sigh* |
1713 DCHECK(false); | 1682 DCHECK(false); |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2127 | 2096 |
2128 bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame, | 2097 bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame, |
2129 QuicDataWriter* writer) { | 2098 QuicDataWriter* writer) { |
2130 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id); | 2099 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id); |
2131 if (!writer->WriteUInt32(stream_id)) { | 2100 if (!writer->WriteUInt32(stream_id)) { |
2132 return false; | 2101 return false; |
2133 } | 2102 } |
2134 return true; | 2103 return true; |
2135 } | 2104 } |
2136 | 2105 |
2137 bool QuicFramer::AppendPathCloseFrame(const QuicPathCloseFrame& frame, | |
2138 QuicDataWriter* writer) { | |
2139 uint8_t path_id = static_cast<uint8_t>(frame.path_id); | |
2140 if (!writer->WriteUInt8(path_id)) { | |
2141 return false; | |
2142 } | |
2143 return true; | |
2144 } | |
2145 | |
2146 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2106 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2147 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2107 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
2148 << " detail: " << detailed_error_; | 2108 << " detail: " << detailed_error_; |
2149 set_error(error); | 2109 set_error(error); |
2150 visitor_->OnError(this); | 2110 visitor_->OnError(this); |
2151 return false; | 2111 return false; |
2152 } | 2112 } |
2153 | 2113 |
2154 } // namespace net | 2114 } // namespace net |
OLD | NEW |