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

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

Issue 1782143003: Remove FEC code from receive path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@115997404
Patch Set: Created 4 years, 9 months 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/quic_framer.h ('k') | net/quic/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/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 quic_version_ = supported_versions_[0]; 152 quic_version_ = supported_versions_[0];
153 decrypter_.reset(QuicDecrypter::Create(kNULL)); 153 decrypter_.reset(QuicDecrypter::Create(kNULL));
154 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); 154 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL));
155 } 155 }
156 156
157 QuicFramer::~QuicFramer() {} 157 QuicFramer::~QuicFramer() {}
158 158
159 // static 159 // static
160 size_t QuicFramer::GetMinStreamFrameSize(QuicStreamId stream_id, 160 size_t QuicFramer::GetMinStreamFrameSize(QuicStreamId stream_id,
161 QuicStreamOffset offset, 161 QuicStreamOffset offset,
162 bool last_frame_in_packet, 162 bool last_frame_in_packet) {
163 InFecGroup is_in_fec_group) {
164 bool no_stream_frame_length =
165 last_frame_in_packet && is_in_fec_group == NOT_IN_FEC_GROUP;
166 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + 163 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
167 GetStreamOffsetSize(offset) + 164 GetStreamOffsetSize(offset) +
168 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); 165 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize);
169 } 166 }
170 167
171 // static 168 // static
172 size_t QuicFramer::GetMinAckFrameSize( 169 size_t QuicFramer::GetMinAckFrameSize(
173 QuicPacketNumberLength largest_observed_length) { 170 QuicPacketNumberLength largest_observed_length) {
174 return kQuicFrameTypeSize + kQuicEntropyHashSize + largest_observed_length + 171 return kQuicFrameTypeSize + kQuicEntropyHashSize + largest_observed_length +
175 kQuicDeltaTimeLargestObservedSize; 172 kQuicDeltaTimeLargestObservedSize;
176 } 173 }
177 174
178 // static 175 // static
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 } 260 }
264 } 261 }
265 return false; 262 return false;
266 } 263 }
267 264
268 size_t QuicFramer::GetSerializedFrameLength( 265 size_t QuicFramer::GetSerializedFrameLength(
269 const QuicFrame& frame, 266 const QuicFrame& frame,
270 size_t free_bytes, 267 size_t free_bytes,
271 bool first_frame, 268 bool first_frame,
272 bool last_frame, 269 bool last_frame,
273 InFecGroup is_in_fec_group,
274 QuicPacketNumberLength packet_number_length) { 270 QuicPacketNumberLength packet_number_length) {
275 // Prevent a rare crash reported in b/19458523. 271 // Prevent a rare crash reported in b/19458523.
276 if ((frame.type == STREAM_FRAME || frame.type == ACK_FRAME) && 272 if ((frame.type == STREAM_FRAME || frame.type == ACK_FRAME) &&
277 frame.stream_frame == nullptr) { 273 frame.stream_frame == nullptr) {
278 QUIC_BUG << "Cannot compute the length of a null frame. " 274 QUIC_BUG << "Cannot compute the length of a null frame. "
279 << "type:" << frame.type << "free_bytes:" << free_bytes 275 << "type:" << frame.type << "free_bytes:" << free_bytes
280 << " first_frame:" << first_frame << " last_frame:" << last_frame 276 << " first_frame:" << first_frame << " last_frame:" << last_frame
281 << " is_in_fec:" << is_in_fec_group
282 << " seq num length:" << packet_number_length; 277 << " seq num length:" << packet_number_length;
283 set_error(QUIC_INTERNAL_ERROR); 278 set_error(QUIC_INTERNAL_ERROR);
284 visitor_->OnError(this); 279 visitor_->OnError(this);
285 return 0; 280 return 0;
286 } 281 }
287 if (frame.type == PADDING_FRAME) { 282 if (frame.type == PADDING_FRAME) {
288 // PADDING implies end of packet. 283 // PADDING implies end of packet.
289 return free_bytes; 284 return free_bytes;
290 } 285 }
291 size_t frame_len = ComputeFrameLength(frame, last_frame, is_in_fec_group, 286 size_t frame_len =
292 packet_number_length); 287 ComputeFrameLength(frame, last_frame, packet_number_length);
293 if (frame_len <= free_bytes) { 288 if (frame_len <= free_bytes) {
294 // Frame fits within packet. Note that acks may be truncated. 289 // Frame fits within packet. Note that acks may be truncated.
295 return frame_len; 290 return frame_len;
296 } 291 }
297 // Only truncate the first frame in a packet, so if subsequent ones go 292 // Only truncate the first frame in a packet, so if subsequent ones go
298 // over, stop including more frames. 293 // over, stop including more frames.
299 if (!first_frame) { 294 if (!first_frame) {
300 return 0; 295 return 0;
301 } 296 }
302 bool can_truncate = 297 bool can_truncate =
(...skipping 26 matching lines...) Expand all
329 size_t packet_length) { 324 size_t packet_length) {
330 QuicDataWriter writer(packet_length, buffer); 325 QuicDataWriter writer(packet_length, buffer);
331 if (!AppendPacketHeader(header, &writer)) { 326 if (!AppendPacketHeader(header, &writer)) {
332 QUIC_BUG << "AppendPacketHeader failed"; 327 QUIC_BUG << "AppendPacketHeader failed";
333 return 0; 328 return 0;
334 } 329 }
335 330
336 size_t i = 0; 331 size_t i = 0;
337 for (const QuicFrame& frame : frames) { 332 for (const QuicFrame& frame : frames) {
338 // Determine if we should write stream frame length in header. 333 // Determine if we should write stream frame length in header.
339 const bool no_stream_frame_length = 334 const bool no_stream_frame_length = i == frames.size() - 1;
340 (header.is_in_fec_group == NOT_IN_FEC_GROUP) &&
341 (i == frames.size() - 1);
342 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { 335 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) {
343 QUIC_BUG << "AppendTypeByte failed"; 336 QUIC_BUG << "AppendTypeByte failed";
344 return 0; 337 return 0;
345 } 338 }
346 339
347 switch (frame.type) { 340 switch (frame.type) {
348 case PADDING_FRAME: 341 case PADDING_FRAME:
349 writer.WritePadding(); 342 writer.WritePadding();
350 break; 343 break;
351 case STREAM_FRAME: 344 case STREAM_FRAME:
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 RaiseError(QUIC_INVALID_FRAME_DATA); 407 RaiseError(QUIC_INVALID_FRAME_DATA);
415 QUIC_BUG << "QUIC_INVALID_FRAME_DATA"; 408 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
416 return 0; 409 return 0;
417 } 410 }
418 ++i; 411 ++i;
419 } 412 }
420 413
421 return writer.length(); 414 return writer.length();
422 } 415 }
423 416
424 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header,
425 StringPiece redundancy) {
426 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
427 DCHECK_NE(0u, header.fec_group);
428 size_t len = GetPacketHeaderSize(header);
429 len += redundancy.length();
430
431 scoped_ptr<char[]> buffer(new char[len]);
432 QuicDataWriter writer(len, buffer.get());
433 if (!AppendPacketHeader(header, &writer)) {
434 QUIC_BUG << "AppendPacketHeader failed";
435 return nullptr;
436 }
437
438 if (!writer.WriteBytes(redundancy.data(), redundancy.length())) {
439 QUIC_BUG << "Failed to add FEC";
440 return nullptr;
441 }
442
443 return new QuicPacket(
444 buffer.release(), len, true, header.public_header.connection_id_length,
445 header.public_header.version_flag, header.public_header.multipath_flag,
446 header.public_header.packet_number_length);
447 }
448
449 // static 417 // static
450 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( 418 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket(
451 const QuicPublicResetPacket& packet) { 419 const QuicPublicResetPacket& packet) {
452 DCHECK(packet.public_header.reset_flag); 420 DCHECK(packet.public_header.reset_flag);
453 421
454 CryptoHandshakeMessage reset; 422 CryptoHandshakeMessage reset;
455 reset.set_tag(kPRST); 423 reset.set_tag(kPRST);
456 reset.SetValue(kRNON, packet.nonce_proof); 424 reset.SetValue(kRNON, packet.nonce_proof);
457 reset.SetValue(kRSEQ, packet.rejected_packet_number); 425 reset.SetValue(kRSEQ, packet.rejected_packet_number);
458 if (!packet.client_address.address().empty()) { 426 if (!packet.client_address.address().empty()) {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 // The visitor suppresses further processing of the packet. 580 // The visitor suppresses further processing of the packet.
613 return true; 581 return true;
614 } 582 }
615 583
616 if (packet.length() > kMaxPacketSize) { 584 if (packet.length() > kMaxPacketSize) {
617 // If the packet has gotten this far, it should not be too large. 585 // If the packet has gotten this far, it should not be too large.
618 QUIC_BUG << "Packet too large:" << packet.length(); 586 QUIC_BUG << "Packet too large:" << packet.length();
619 return RaiseError(QUIC_PACKET_TOO_LARGE); 587 return RaiseError(QUIC_PACKET_TOO_LARGE);
620 } 588 }
621 589
590 DCHECK(!header.fec_flag);
622 // Handle the payload. 591 // Handle the payload.
623 if (!header.fec_flag) { 592 if (!ProcessFrameData(&reader, header)) {
624 if (header.is_in_fec_group == IN_FEC_GROUP) { 593 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
625 StringPiece payload = reader.PeekRemainingPayload(); 594 DLOG(WARNING) << "Unable to process frame data.";
626 visitor_->OnFecProtectedPayload(payload); 595 return false;
627 }
628 if (!ProcessFrameData(&reader, header)) {
629 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
630 DLOG(WARNING) << "Unable to process frame data.";
631 return false;
632 }
633 } else {
634 visitor_->OnFecData(reader.ReadRemainingPayload());
635 } 596 }
636 597
637 visitor_->OnPacketComplete(); 598 visitor_->OnPacketComplete();
638 return true; 599 return true;
639 } 600 }
640 601
641 bool QuicFramer::ProcessPublicResetPacket( 602 bool QuicFramer::ProcessPublicResetPacket(
642 QuicDataReader* reader, 603 QuicDataReader* reader,
643 const QuicPacketPublicHeader& public_header) { 604 const QuicPacketPublicHeader& public_header) {
644 QuicPublicResetPacket packet(public_header); 605 QuicPublicResetPacket packet(public_header);
(...skipping 27 matching lines...) Expand all
672 if (address_coder.Decode(address.data(), address.length())) { 633 if (address_coder.Decode(address.data(), address.length())) {
673 packet.client_address = 634 packet.client_address =
674 IPEndPoint(address_coder.ip(), address_coder.port()); 635 IPEndPoint(address_coder.ip(), address_coder.port());
675 } 636 }
676 } 637 }
677 638
678 visitor_->OnPublicResetPacket(packet); 639 visitor_->OnPublicResetPacket(packet);
679 return true; 640 return true;
680 } 641 }
681 642
682 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header,
683 StringPiece payload) {
684 visitor_->OnRevivedPacket();
685
686 header->entropy_hash = GetPacketEntropyHash(*header);
687
688 if (!visitor_->OnPacketHeader(*header)) {
689 return true;
690 }
691
692 if (payload.length() > kMaxPacketSize) {
693 set_detailed_error("Revived packet too large.");
694 return RaiseError(QUIC_PACKET_TOO_LARGE);
695 }
696
697 QuicDataReader reader(payload.data(), payload.length());
698 if (!ProcessFrameData(&reader, *header)) {
699 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
700 DLOG(WARNING) << "Unable to process frame data.";
701 return false;
702 }
703
704 visitor_->OnPacketComplete();
705 return true;
706 }
707
708 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, 643 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
709 QuicDataWriter* writer) { 644 QuicDataWriter* writer) {
710 DVLOG(1) << "Appending header: " << header; 645 DVLOG(1) << "Appending header: " << header;
711 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP);
712 uint8_t public_flags = 0; 646 uint8_t public_flags = 0;
713 if (header.public_header.reset_flag) { 647 if (header.public_header.reset_flag) {
714 public_flags |= PACKET_PUBLIC_FLAGS_RST; 648 public_flags |= PACKET_PUBLIC_FLAGS_RST;
715 } 649 }
716 if (header.public_header.version_flag) { 650 if (header.public_header.version_flag) {
717 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; 651 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
718 } 652 }
719 if (header.public_header.multipath_flag) { 653 if (header.public_header.multipath_flag) {
720 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; 654 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH;
721 } 655 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 712
779 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, 713 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length,
780 header.packet_number, writer)) { 714 header.packet_number, writer)) {
781 return false; 715 return false;
782 } 716 }
783 717
784 uint8_t private_flags = 0; 718 uint8_t private_flags = 0;
785 if (header.entropy_flag) { 719 if (header.entropy_flag) {
786 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; 720 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
787 } 721 }
788 if (header.is_in_fec_group == IN_FEC_GROUP) {
789 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP;
790 }
791 if (header.fec_flag) {
792 private_flags |= PACKET_PRIVATE_FLAGS_FEC;
793 }
794 if (!writer->WriteUInt8(private_flags)) { 722 if (!writer->WriteUInt8(private_flags)) {
795 return false; 723 return false;
796 } 724 }
797 725
798 // The FEC group number is the packet number of the first fec
799 // protected packet, or 0 if this packet is not protected.
800 if (header.is_in_fec_group == IN_FEC_GROUP) {
801 DCHECK_LE(header.fec_group, header.packet_number);
802 DCHECK_LT(header.packet_number - header.fec_group, 255u);
803 // Offset from the current packet number to the first fec
804 // protected packet.
805 uint8_t first_fec_protected_packet_offset =
806 static_cast<uint8_t>(header.packet_number - header.fec_group);
807 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
808 return false;
809 }
810 }
811
812 return true; 726 return true;
813 } 727 }
814 728
815 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( 729 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
816 uint32_t time_delta_us) { 730 uint32_t time_delta_us) {
817 // The new time_delta might have wrapped to the next epoch, or it 731 // The new time_delta might have wrapped to the next epoch, or it
818 // might have reverse wrapped to the previous epoch, or it might 732 // might have reverse wrapped to the previous epoch, or it might
819 // remain in the same epoch. Select the time closest to the previous 733 // remain in the same epoch. Select the time closest to the previous
820 // time. 734 // time.
821 // 735 //
(...skipping 1020 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 ack_size += 3 * (ack.received_packet_times.size() - 1); 1756 ack_size += 3 * (ack.received_packet_times.size() - 1);
1843 } 1757 }
1844 } 1758 }
1845 1759
1846 return ack_size; 1760 return ack_size;
1847 } 1761 }
1848 1762
1849 size_t QuicFramer::ComputeFrameLength( 1763 size_t QuicFramer::ComputeFrameLength(
1850 const QuicFrame& frame, 1764 const QuicFrame& frame,
1851 bool last_frame_in_packet, 1765 bool last_frame_in_packet,
1852 InFecGroup is_in_fec_group,
1853 QuicPacketNumberLength packet_number_length) { 1766 QuicPacketNumberLength packet_number_length) {
1854 switch (frame.type) { 1767 switch (frame.type) {
1855 case STREAM_FRAME: 1768 case STREAM_FRAME:
1856 return GetMinStreamFrameSize(frame.stream_frame->stream_id, 1769 return GetMinStreamFrameSize(frame.stream_frame->stream_id,
1857 frame.stream_frame->offset, 1770 frame.stream_frame->offset,
1858 last_frame_in_packet, is_in_fec_group) + 1771 last_frame_in_packet) +
1859 frame.stream_frame->frame_length; 1772 frame.stream_frame->frame_length;
1860 case ACK_FRAME: { 1773 case ACK_FRAME: {
1861 return GetAckFrameSize(*frame.ack_frame, packet_number_length); 1774 return GetAckFrameSize(*frame.ack_frame, packet_number_length);
1862 } 1775 }
1863 case STOP_WAITING_FRAME: 1776 case STOP_WAITING_FRAME:
1864 return GetStopWaitingFrameSize(packet_number_length); 1777 return GetStopWaitingFrameSize(packet_number_length);
1865 case MTU_DISCOVERY_FRAME: 1778 case MTU_DISCOVERY_FRAME:
1866 // MTU discovery frames are serialized as ping frames. 1779 // MTU discovery frames are serialized as ping frames.
1867 case PING_FRAME: 1780 case PING_FRAME:
1868 // Ping has no payload. 1781 // Ping has no payload.
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
2308 2221
2309 bool QuicFramer::RaiseError(QuicErrorCode error) { 2222 bool QuicFramer::RaiseError(QuicErrorCode error) {
2310 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) 2223 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error)
2311 << " detail: " << detailed_error_; 2224 << " detail: " << detailed_error_;
2312 set_error(error); 2225 set_error(error);
2313 visitor_->OnError(this); 2226 visitor_->OnError(this);
2314 return false; 2227 return false;
2315 } 2228 }
2316 2229
2317 } // namespace net 2230 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698