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 |