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

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

Issue 11416155: Adding transmission times for every QUIC packet received in the AckFrame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Done Created 8 years, 1 month 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 | Annotate | Revision Log
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 "base/hash_tables.h" 7 #include "base/hash_tables.h"
8 #include "net/quic/crypto/quic_decrypter.h" 8 #include "net/quic/crypto/quic_decrypter.h"
9 #include "net/quic/crypto/quic_encrypter.h" 9 #include "net/quic/crypto/quic_encrypter.h"
10 #include "net/quic/quic_data_reader.h" 10 #include "net/quic/quic_data_reader.h"
11 #include "net/quic/quic_data_writer.h" 11 #include "net/quic/quic_data_writer.h"
12 #include "net/quic/quic_utils.h" 12 #include "net/quic/quic_utils.h"
13 13
14 using base::StringPiece; 14 using base::StringPiece;
15 using std::map;
15 16
16 namespace net { 17 namespace net {
17 18
18 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) 19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter)
19 : visitor_(NULL), 20 : visitor_(NULL),
20 fec_builder_(NULL), 21 fec_builder_(NULL),
21 error_(QUIC_NO_ERROR), 22 error_(QUIC_NO_ERROR),
22 decrypter_(decrypter), 23 decrypter_(decrypter),
23 encrypter_(encrypter) { 24 encrypter_(encrypter) {
24 } 25 }
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 347
347 visitor_->OnStreamFrame(frame); 348 visitor_->OnStreamFrame(frame);
348 return true; 349 return true;
349 } 350 }
350 351
351 bool QuicFramer::ProcessPDUFrame() { 352 bool QuicFramer::ProcessPDUFrame() {
352 return false; 353 return false;
353 } 354 }
354 355
355 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) { 356 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
356 if (!reader_->ReadUInt48(&frame->received_info.largest_received)) { 357 uint8 num_acked_packets;
357 set_detailed_error("Unable to read largest received."); 358 if (!reader_->ReadBytes(&num_acked_packets, 1)) {
358 return false; 359 set_detailed_error("Unable to read num acked packets.");
359 }
360 uint64 time_received;
361 if (!reader_->ReadUInt64(&time_received)) {
362 set_detailed_error("Unable to read time received.");
363 return false;
364 }
365 frame->received_info.time_received =
366 QuicTime::FromMicroseconds(time_received);
367
368 uint8 num_unacked_packets;
369 if (!reader_->ReadBytes(&num_unacked_packets, 1)) {
370 set_detailed_error("Unable to read num unacked packets.");
371 return false; 360 return false;
372 } 361 }
373 362
374 for (int i = 0; i < num_unacked_packets; ++i) { 363 uint64 smallest_received;
375 QuicPacketSequenceNumber sequence_number; 364 if (!reader_->ReadUInt48(&smallest_received)) {
376 if (!reader_->ReadUInt48(&sequence_number)) { 365 set_detailed_error("Unable to read smallest received.");
377 set_detailed_error("Unable to read sequence number in unacked packets."); 366 return false;
367 }
368
369 if (num_acked_packets == 0u) {
jar (doing other things) 2012/11/30 16:50:33 Do we really ever send a 0 for the number of acked
Ian Swett 2012/12/04 21:40:19 It would seem very odd in practice, and right now
370 // Ensures largest_received is set when no actual acks are transmitted.
371 frame->received_info.largest_received = smallest_received;
372 } else {
373 uint64 time_received_us;
374 if (!reader_->ReadUInt64(&time_received_us)) {
375 set_detailed_error("Unable to read time received.");
376 return false;
jar (doing other things) 2012/11/30 16:50:33 nit: indent by two more spaces.
Ryan Hamilton 2012/12/04 18:04:51 Weird, this appears to be a merge problem somehow.
377 }
jar (doing other things) 2012/11/30 16:50:33 nit: indent by two more spaces.
Ryan Hamilton 2012/12/04 18:04:51 Done.
378
379 frame->received_info.RecordAck(
380 smallest_received, QuicTime::FromMicroseconds(time_received_us));
381
382 for (int i = 0; i < num_acked_packets - 1; ++i) {
383 uint8 sequence_delta;
384 if (!reader_->ReadBytes(&sequence_delta, 1)) {
385 set_detailed_error("Unable to read sequence delta in acked packets.");
386 return false;
387 }
388 int32 time_delta_us;
389 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
390 set_detailed_error("Unable to read time delta in acked packets.");
378 return false; 391 return false;
jar (doing other things) 2012/11/30 16:50:33 nit: indent by two more spaces.
Ryan Hamilton 2012/12/04 18:04:51 Done.
379 } 392 }
jar (doing other things) 2012/11/30 16:50:33 nit: indent by two more spaces.
Ryan Hamilton 2012/12/04 18:04:51 Done.
380 frame->received_info.missing_packets.insert(sequence_number); 393 frame->received_info.RecordAck(
394 smallest_received + sequence_delta,
395 QuicTime::FromMicroseconds(time_received_us + time_delta_us));
396 }
381 } 397 }
382 398
383 if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) { 399 if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) {
384 set_detailed_error("Unable to read least unacked."); 400 set_detailed_error("Unable to read least unacked.");
385 return false; 401 return false;
386 } 402 }
387 403
388 uint8 num_non_retransmiting_packets;
389 if (!reader_->ReadBytes(&num_non_retransmiting_packets, 1)) {
390 set_detailed_error("Unable to read num non-retransmitting.");
391 return false;
392 }
393 for (uint8 i = 0; i < num_non_retransmiting_packets; ++i) {
394 QuicPacketSequenceNumber sequence_number;
395 if (!reader_->ReadUInt48(&sequence_number)) {
396 set_detailed_error(
397 "Unable to read sequence number in non-retransmitting.");
398 return false;
399 }
400 frame->sent_info.non_retransmiting.insert(sequence_number);
401 }
402
403 uint8 congestion_info_type; 404 uint8 congestion_info_type;
404 if (!reader_->ReadBytes(&congestion_info_type, 1)) { 405 if (!reader_->ReadBytes(&congestion_info_type, 1)) {
405 set_detailed_error("Unable to read congestion info type."); 406 set_detailed_error("Unable to read congestion info type.");
406 return false; 407 return false;
407 } 408 }
408 frame->congestion_info.type = 409 frame->congestion_info.type =
409 static_cast<CongestionFeedbackType>(congestion_info_type); 410 static_cast<CongestionFeedbackType>(congestion_info_type);
410 411
411 switch (frame->congestion_info.type) { 412 switch (frame->congestion_info.type) {
412 case kNone: 413 case kNone:
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 len += 1; // fin 576 len += 1; // fin
576 len += 8; // offset 577 len += 8; // offset
577 len += 2; // space for the 16 bit length 578 len += 2; // space for the 16 bit length
578 len += frame.stream_frame->data.size(); 579 len += frame.stream_frame->data.size();
579 break; 580 break;
580 case PDU_FRAME: 581 case PDU_FRAME:
581 DLOG(INFO) << "PDU_FRAME not yet supported"; 582 DLOG(INFO) << "PDU_FRAME not yet supported";
582 break; // Need to support this eventually :> 583 break; // Need to support this eventually :>
583 case ACK_FRAME: { 584 case ACK_FRAME: {
584 const QuicAckFrame& ack = *frame.ack_frame; 585 const QuicAckFrame& ack = *frame.ack_frame;
586 len += 1; // num acked packets
585 len += 6; // largest received packet sequence number 587 len += 6; // largest received packet sequence number
586 len += 8; // time delta 588 if (ack.received_info.received_packet_times.size() > 0) {
587 len += 1; // num missing packets 589 len += 8; // time
588 len += 6 * ack.received_info.missing_packets.size(); 590 len += 5 * (ack.received_info.received_packet_times.size() - 1);
jar (doing other things) 2012/11/30 16:50:33 nit: add comment about what is included in this pr
Ian Swett 2012/12/04 21:40:19 Done in cleanup CL.
591 }
589 len += 6; // least packet sequence number awaiting an ack 592 len += 6; // least packet sequence number awaiting an ack
590 len += 1; // num non retransmitting packets
591 len += 6 * ack.sent_info.non_retransmiting.size();
592 len += 1; // congestion control type 593 len += 1; // congestion control type
593 switch (ack.congestion_info.type) { 594 switch (ack.congestion_info.type) {
594 case kNone: 595 case kNone:
595 break; 596 break;
596 case kInterArrival: 597 case kInterArrival:
597 len += 6; 598 len += 6;
598 break; 599 break;
599 case kFixRate: 600 case kFixRate:
600 len += 4; 601 len += 4;
601 break; 602 break;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 if (!writer->WriteBytes(frame.data.data(), 650 if (!writer->WriteBytes(frame.data.data(),
650 frame.data.size())) { 651 frame.data.size())) {
651 return false; 652 return false;
652 } 653 }
653 return true; 654 return true;
654 } 655 }
655 656
656 bool QuicFramer::AppendAckFramePayload( 657 bool QuicFramer::AppendAckFramePayload(
657 const QuicAckFrame& frame, 658 const QuicAckFrame& frame,
658 QuicDataWriter* writer) { 659 QuicDataWriter* writer) {
659 if (!writer->WriteUInt48(frame.received_info.largest_received)) { 660 uint8 num_acked_packets = frame.received_info.received_packet_times.size();
661 if (!writer->WriteBytes(&num_acked_packets, 1)) {
662 return false;
663 }
664 if (num_acked_packets == 0) {
665 // Special case when no packets are acked, just transmit the largest.
jar (doing other things) 2012/11/30 16:50:33 I'm confused about why this is needed/used.
Ian Swett 2012/12/04 21:40:19 Agreed, fixed in HEAD.
666 if (!writer->WriteUInt48(frame.received_info.largest_received)) {
667 return false;
668 }
jar (doing other things) 2012/11/30 16:50:33 nit: indent last two lines.
Ryan Hamilton 2012/12/04 18:04:51 codereview seems to be confused. This is correctl
669 } else {
670 map<QuicPacketSequenceNumber, QuicTime>::const_iterator it =
671 frame.received_info.received_packet_times.begin();
672
673 QuicPacketSequenceNumber lowest_sequence = it->first;
674 if (!writer->WriteUInt48(lowest_sequence)) {
660 return false; 675 return false;
661 } 676 }
jar (doing other things) 2012/11/30 16:50:33 nit: indent last two lines. Is there any chance t
Ryan Hamilton 2012/12/04 18:04:51 This is also correct in the file. Not sure why co
662 677
663 if (!writer->WriteUInt64( 678 QuicTime lowest_time = it->second;
664 frame.received_info.time_received.ToMicroseconds())) { 679 // TODO(ianswett): Use time deltas from the connection's first received
680 // packet.
681 if (!writer->WriteUInt64(lowest_time.ToMicroseconds())) {
682 return false;
683 }
684
685 for (++it; it != frame.received_info.received_packet_times.end(); ++it) {
686 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
687 if (!writer->WriteBytes(&sequence_delta, 1)) {
665 return false; 688 return false;
666 } 689 }
jar (doing other things) 2012/11/30 16:50:33 nit: indent last 2 lines by 4 more spaces.
Ryan Hamilton 2012/12/04 18:04:51 ditto.
667 690
668 size_t num_unacked_packets = frame.received_info.missing_packets.size(); 691 int32 time_delta_us = it->second.Subtract(lowest_time).ToMicroseconds();
669 if (!writer->WriteBytes(&num_unacked_packets, 1)) { 692 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
670 return false; 693 return false;
671 } 694 }
jar (doing other things) 2012/11/30 16:50:33 nit: indent last two lines.
Ryan Hamilton 2012/12/04 18:04:51 ditto
672
673 SequenceSet::const_iterator it = frame.received_info.missing_packets.begin();
674 for (; it != frame.received_info.missing_packets.end(); ++it) {
675 if (!writer->WriteUInt48(*it)) {
676 return false;
677 } 695 }
678 } 696 }
679 697
680 if (!writer->WriteUInt48(frame.sent_info.least_unacked)) { 698 if (!writer->WriteUInt48(frame.sent_info.least_unacked)) {
681 return false;
682 }
683
684 size_t num_non_retransmiting_packets =
685 frame.sent_info.non_retransmiting.size();
686 if (!writer->WriteBytes(&num_non_retransmiting_packets, 1)) {
687 return false;
688 }
689
690 it = frame.sent_info.non_retransmiting.begin();
691 while (it != frame.sent_info.non_retransmiting.end()) {
692 if (!writer->WriteUInt48(*it)) {
693 return false; 699 return false;
694 } 700 }
695 ++it;
696 }
697 701
698 if (!writer->WriteBytes(&frame.congestion_info.type, 1)) { 702 if (!writer->WriteBytes(&frame.congestion_info.type, 1)) {
699 return false; 703 return false;
700 } 704 }
701 705
702 switch (frame.congestion_info.type) { 706 switch (frame.congestion_info.type) {
703 case kNone: 707 case kNone:
704 break; 708 break;
705 case kInterArrival: { 709 case kInterArrival: {
706 const CongestionFeedbackMessageInterArrival& inter_arrival = 710 const CongestionFeedbackMessageInterArrival& inter_arrival =
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 783
780 bool QuicFramer::RaiseError(QuicErrorCode error) { 784 bool QuicFramer::RaiseError(QuicErrorCode error) {
781 DLOG(INFO) << detailed_error_; 785 DLOG(INFO) << detailed_error_;
782 set_error(error); 786 set_error(error);
783 visitor_->OnError(this); 787 visitor_->OnError(this);
784 reader_.reset(NULL); 788 reader_.reset(NULL);
785 return false; 789 return false;
786 } 790 }
787 791
788 } // namespace net 792 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698