| 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 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 if (can_truncate) { | 308 if (can_truncate) { |
| 309 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 309 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 310 // 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. |
| 311 DVLOG(1) << ENDPOINT | 311 DVLOG(1) << ENDPOINT |
| 312 << "Truncating large frame, free bytes: " << free_bytes; | 312 << "Truncating large frame, free bytes: " << free_bytes; |
| 313 return free_bytes; | 313 return free_bytes; |
| 314 } | 314 } |
| 315 return 0; | 315 return 0; |
| 316 } | 316 } |
| 317 | 317 |
| 318 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() | 318 QuicFramer::AckFrameInfo::AckFrameInfo() |
| 319 : 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) {} |
| 320 | 320 |
| 321 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = | 321 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; |
| 322 default; | |
| 323 | 322 |
| 324 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} | 323 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
| 325 | 324 |
| 326 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 325 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
| 327 const QuicFrames& frames, | 326 const QuicFrames& frames, |
| 328 char* buffer, | 327 char* buffer, |
| 329 size_t packet_length) { | 328 size_t packet_length) { |
| 330 QuicDataWriter writer(packet_length, buffer); | 329 QuicDataWriter writer(packet_length, buffer); |
| 331 if (!AppendPacketHeader(header, &writer)) { | 330 if (!AppendPacketHeader(header, &writer)) { |
| 332 QUIC_BUG << "AppendPacketHeader failed"; | 331 QUIC_BUG << "AppendPacketHeader failed"; |
| 333 return 0; | 332 return 0; |
| 334 } | 333 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 347 writer.WritePadding(); | 346 writer.WritePadding(); |
| 348 break; | 347 break; |
| 349 case STREAM_FRAME: | 348 case STREAM_FRAME: |
| 350 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 349 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
| 351 &writer)) { | 350 &writer)) { |
| 352 QUIC_BUG << "AppendStreamFrame failed"; | 351 QUIC_BUG << "AppendStreamFrame failed"; |
| 353 return 0; | 352 return 0; |
| 354 } | 353 } |
| 355 break; | 354 break; |
| 356 case ACK_FRAME: | 355 case ACK_FRAME: |
| 357 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { | 356 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) { |
| 358 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; | 357 QUIC_BUG << "AppendAckFrameAndTypeByte failed"; |
| 359 return 0; | 358 return 0; |
| 360 } | 359 } |
| 361 break; | 360 break; |
| 362 case STOP_WAITING_FRAME: | 361 case STOP_WAITING_FRAME: |
| 363 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, | 362 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, |
| 364 &writer)) { | 363 &writer)) { |
| 365 QUIC_BUG << "AppendStopWaitingFrame failed"; | 364 QUIC_BUG << "AppendStopWaitingFrame failed"; |
| 366 return 0; | 365 return 0; |
| 367 } | 366 } |
| 368 break; | 367 break; |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 return PACKET_FLAGS_4BYTE_PACKET; | 920 return PACKET_FLAGS_4BYTE_PACKET; |
| 922 case PACKET_6BYTE_PACKET_NUMBER: | 921 case PACKET_6BYTE_PACKET_NUMBER: |
| 923 return PACKET_FLAGS_6BYTE_PACKET; | 922 return PACKET_FLAGS_6BYTE_PACKET; |
| 924 default: | 923 default: |
| 925 QUIC_BUG << "Unreachable case statement."; | 924 QUIC_BUG << "Unreachable case statement."; |
| 926 return PACKET_FLAGS_6BYTE_PACKET; | 925 return PACKET_FLAGS_6BYTE_PACKET; |
| 927 } | 926 } |
| 928 } | 927 } |
| 929 | 928 |
| 930 // static | 929 // static |
| 931 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( | 930 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( |
| 932 const QuicAckFrame& frame) { | 931 const QuicAckFrame& frame) { |
| 933 NewAckFrameInfo new_ack_info; | 932 AckFrameInfo new_ack_info; |
| 934 if (frame.packets.Empty()) { | 933 if (frame.packets.Empty()) { |
| 935 return new_ack_info; | 934 return new_ack_info; |
| 936 } | 935 } |
| 937 // 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 |
| 938 // encoding, so skip it. | 937 // encoding, so skip it. |
| 939 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); | 938 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); |
| 940 auto itr = frame.packets.rbegin(); | 939 auto itr = frame.packets.rbegin(); |
| 941 QuicPacketNumber previous_start = itr->min(); | 940 QuicPacketNumber previous_start = itr->min(); |
| 942 new_ack_info.max_block_length = itr->Length(); | 941 new_ack_info.max_block_length = itr->Length(); |
| 943 ++itr; | 942 ++itr; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; | 1043 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1045 // Returning true since there was no parsing error. | 1044 // Returning true since there was no parsing error. |
| 1046 return true; | 1045 return true; |
| 1047 } | 1046 } |
| 1048 continue; | 1047 continue; |
| 1049 } | 1048 } |
| 1050 | 1049 |
| 1051 // Ack Frame | 1050 // Ack Frame |
| 1052 if (frame_type & kQuicFrameTypeAckMask) { | 1051 if (frame_type & kQuicFrameTypeAckMask) { |
| 1053 QuicAckFrame frame; | 1052 QuicAckFrame frame; |
| 1054 if (!ProcessNewAckFrame(reader, frame_type, &frame)) { | 1053 if (!ProcessAckFrame(reader, frame_type, &frame)) { |
| 1055 return RaiseError(QUIC_INVALID_ACK_DATA); | 1054 return RaiseError(QUIC_INVALID_ACK_DATA); |
| 1056 } | 1055 } |
| 1057 if (!visitor_->OnAckFrame(frame)) { | 1056 if (!visitor_->OnAckFrame(frame)) { |
| 1058 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; | 1057 DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; |
| 1059 // Returning true since there was no parsing error. | 1058 // Returning true since there was no parsing error. |
| 1060 return true; | 1059 return true; |
| 1061 } | 1060 } |
| 1062 continue; | 1061 continue; |
| 1063 } | 1062 } |
| 1064 | 1063 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 set_detailed_error("Unable to read frame data."); | 1239 set_detailed_error("Unable to read frame data."); |
| 1241 return false; | 1240 return false; |
| 1242 } | 1241 } |
| 1243 } | 1242 } |
| 1244 frame->data_buffer = data.data(); | 1243 frame->data_buffer = data.data(); |
| 1245 frame->data_length = static_cast<uint16_t>(data.length()); | 1244 frame->data_length = static_cast<uint16_t>(data.length()); |
| 1246 | 1245 |
| 1247 return true; | 1246 return true; |
| 1248 } | 1247 } |
| 1249 | 1248 |
| 1250 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, | 1249 bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, |
| 1251 uint8_t frame_type, | 1250 uint8_t frame_type, |
| 1252 QuicAckFrame* ack_frame) { | 1251 QuicAckFrame* ack_frame) { |
| 1253 // Determine the two lengths from the frame type: largest acked length, | 1252 // Determine the two lengths from the frame type: largest acked length, |
| 1254 // ack block length. | 1253 // ack block length. |
| 1255 const QuicPacketNumberLength ack_block_length = | 1254 const QuicPacketNumberLength ack_block_length = |
| 1256 ReadSequenceNumberLength(frame_type); | 1255 ReadSequenceNumberLength(frame_type); |
| 1257 frame_type >>= kQuicSequenceNumberLengthShift; | 1256 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1258 const QuicPacketNumberLength largest_acked_length = | 1257 const QuicPacketNumberLength largest_acked_length = |
| 1259 ReadSequenceNumberLength(frame_type); | 1258 ReadSequenceNumberLength(frame_type); |
| 1260 frame_type >>= kQuicSequenceNumberLengthShift; | 1259 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1261 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1260 frame_type >>= kQuicHasMultipleAckBlocksShift; |
| 1262 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1261 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1698 } | 1697 } |
| 1699 | 1698 |
| 1700 return 5 + 3 * (ack.received_packet_times.size() - 1); | 1699 return 5 + 3 * (ack.received_packet_times.size() - 1); |
| 1701 } | 1700 } |
| 1702 | 1701 |
| 1703 size_t QuicFramer::GetAckFrameSize( | 1702 size_t QuicFramer::GetAckFrameSize( |
| 1704 const QuicAckFrame& ack, | 1703 const QuicAckFrame& ack, |
| 1705 QuicPacketNumberLength packet_number_length) { | 1704 QuicPacketNumberLength packet_number_length) { |
| 1706 size_t ack_size = 0; | 1705 size_t ack_size = 0; |
| 1707 | 1706 |
| 1708 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); | 1707 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1709 QuicPacketNumberLength largest_acked_length = | 1708 QuicPacketNumberLength largest_acked_length = |
| 1710 GetMinSequenceNumberLength(ack.largest_observed); | 1709 GetMinSequenceNumberLength(ack.largest_observed); |
| 1711 QuicPacketNumberLength ack_block_length = | 1710 QuicPacketNumberLength ack_block_length = |
| 1712 GetMinSequenceNumberLength(ack_info.max_block_length); | 1711 GetMinSequenceNumberLength(ack_info.max_block_length); |
| 1713 | 1712 |
| 1714 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1713 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
| 1715 // First ack block length. | 1714 // First ack block length. |
| 1716 ack_size += ack_block_length; | 1715 ack_size += ack_block_length; |
| 1717 if (ack_info.num_ack_blocks != 0) { | 1716 if (ack_info.num_ack_blocks != 0) { |
| 1718 ack_size += kNumberOfAckBlocksSize; | 1717 ack_size += kNumberOfAckBlocksSize; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1876 return false; | 1875 return false; |
| 1877 } | 1876 } |
| 1878 return true; | 1877 return true; |
| 1879 } | 1878 } |
| 1880 | 1879 |
| 1881 void QuicFramer::set_version(const QuicVersion version) { | 1880 void QuicFramer::set_version(const QuicVersion version) { |
| 1882 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1881 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 1883 quic_version_ = version; | 1882 quic_version_ = version; |
| 1884 } | 1883 } |
| 1885 | 1884 |
| 1886 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 1885 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 1887 QuicDataWriter* writer) { | 1886 QuicDataWriter* writer) { |
| 1888 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 1887 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); |
| 1889 QuicPacketNumber largest_acked = frame.largest_observed; | 1888 QuicPacketNumber largest_acked = frame.largest_observed; |
| 1890 QuicPacketNumberLength largest_acked_length = | 1889 QuicPacketNumberLength largest_acked_length = |
| 1891 GetMinSequenceNumberLength(largest_acked); | 1890 GetMinSequenceNumberLength(largest_acked); |
| 1892 QuicPacketNumberLength ack_block_length = | 1891 QuicPacketNumberLength ack_block_length = |
| 1893 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1892 GetMinSequenceNumberLength(new_ack_info.max_block_length); |
| 1894 // Calculate available bytes for timestamps and ack blocks. | 1893 // Calculate available bytes for timestamps and ack blocks. |
| 1895 int32_t available_timestamp_and_ack_block_bytes = | 1894 int32_t available_timestamp_and_ack_block_bytes = |
| 1896 writer->capacity() - writer->length() - ack_block_length - | 1895 writer->capacity() - writer->length() - ack_block_length - |
| 1897 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 1896 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
| 1898 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); | 1897 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2202 | 2201 |
| 2203 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2202 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2204 DVLOG(1) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2203 DVLOG(1) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
| 2205 << " detail: " << detailed_error_; | 2204 << " detail: " << detailed_error_; |
| 2206 set_error(error); | 2205 set_error(error); |
| 2207 visitor_->OnError(this); | 2206 visitor_->OnError(this); |
| 2208 return false; | 2207 return false; |
| 2209 } | 2208 } |
| 2210 | 2209 |
| 2211 } // namespace net | 2210 } // namespace net |
| OLD | NEW |