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

Unified 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: Rebase Created 8 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/quic_connection_test.cc ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/quic_framer.cc
diff --git a/net/quic/quic_framer.cc b/net/quic/quic_framer.cc
index 708bd7576bedb9136749ed323aa351621e2337c5..8760a1c729d24a89ca775f91510e3ac46bdf728c 100644
--- a/net/quic/quic_framer.cc
+++ b/net/quic/quic_framer.cc
@@ -12,6 +12,7 @@
#include "net/quic/quic_utils.h"
using base::StringPiece;
+using std::map;
namespace net {
@@ -353,31 +354,46 @@ bool QuicFramer::ProcessPDUFrame() {
}
bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
- if (!reader_->ReadUInt48(&frame->received_info.largest_received)) {
- set_detailed_error("Unable to read largest received.");
+ uint8 num_acked_packets;
+ if (!reader_->ReadBytes(&num_acked_packets, 1)) {
+ set_detailed_error("Unable to read num acked packets.");
return false;
}
- uint64 time_received;
- if (!reader_->ReadUInt64(&time_received)) {
- set_detailed_error("Unable to read time received.");
- return false;
- }
- frame->received_info.time_received =
- QuicTime::FromMicroseconds(time_received);
- uint8 num_unacked_packets;
- if (!reader_->ReadBytes(&num_unacked_packets, 1)) {
- set_detailed_error("Unable to read num unacked packets.");
+ uint64 smallest_received;
+ if (!reader_->ReadUInt48(&smallest_received)) {
+ set_detailed_error("Unable to read smallest received.");
return false;
}
- for (int i = 0; i < num_unacked_packets; ++i) {
- QuicPacketSequenceNumber sequence_number;
- if (!reader_->ReadUInt48(&sequence_number)) {
- set_detailed_error("Unable to read sequence number in unacked packets.");
+ if (num_acked_packets == 0u) {
+ // Ensures largest_received is set when no actual acks are transmitted.
+ frame->received_info.largest_received = smallest_received;
+ } else {
+ uint64 time_received_us;
+ if (!reader_->ReadUInt64(&time_received_us)) {
+ set_detailed_error("Unable to read time received.");
return false;
}
- frame->received_info.missing_packets.insert(sequence_number);
+
+ frame->received_info.RecordAck(
+ smallest_received, QuicTime::FromMicroseconds(time_received_us));
+
+ for (int i = 0; i < num_acked_packets - 1; ++i) {
+ uint8 sequence_delta;
+ if (!reader_->ReadBytes(&sequence_delta, 1)) {
+ set_detailed_error("Unable to read sequence delta in acked packets.");
+ return false;
+ }
+ int32 time_delta_us;
+ if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
+ set_detailed_error("Unable to read time delta in acked packets.");
+ return false;
+ }
+ frame->received_info.RecordAck(
+ smallest_received + sequence_delta,
+ QuicTime::FromMicroseconds(time_received_us + time_delta_us));
+ }
}
if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) {
@@ -385,21 +401,6 @@ bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
return false;
}
- uint8 num_non_retransmiting_packets;
- if (!reader_->ReadBytes(&num_non_retransmiting_packets, 1)) {
- set_detailed_error("Unable to read num non-retransmitting.");
- return false;
- }
- for (uint8 i = 0; i < num_non_retransmiting_packets; ++i) {
- QuicPacketSequenceNumber sequence_number;
- if (!reader_->ReadUInt48(&sequence_number)) {
- set_detailed_error(
- "Unable to read sequence number in non-retransmitting.");
- return false;
- }
- frame->sent_info.non_retransmiting.insert(sequence_number);
- }
-
uint8 congestion_info_type;
if (!reader_->ReadBytes(&congestion_info_type, 1)) {
set_detailed_error("Unable to read congestion info type.");
@@ -582,13 +583,13 @@ size_t QuicFramer::ComputeFramePayloadLength(const QuicFrame& frame) {
break; // Need to support this eventually :>
case ACK_FRAME: {
const QuicAckFrame& ack = *frame.ack_frame;
+ len += 1; // num acked packets
len += 6; // largest received packet sequence number
- len += 8; // time delta
- len += 1; // num missing packets
- len += 6 * ack.received_info.missing_packets.size();
+ if (ack.received_info.received_packet_times.size() > 0) {
+ len += 8; // time
+ len += 5 * (ack.received_info.received_packet_times.size() - 1);
+ }
len += 6; // least packet sequence number awaiting an ack
- len += 1; // num non retransmitting packets
- len += 6 * ack.sent_info.non_retransmiting.size();
len += 1; // congestion control type
switch (ack.congestion_info.type) {
case kNone:
@@ -656,43 +657,46 @@ bool QuicFramer::AppendStreamFramePayload(
bool QuicFramer::AppendAckFramePayload(
const QuicAckFrame& frame,
QuicDataWriter* writer) {
- if (!writer->WriteUInt48(frame.received_info.largest_received)) {
- return false;
- }
-
- if (!writer->WriteUInt64(
- frame.received_info.time_received.ToMicroseconds())) {
+ uint8 num_acked_packets = frame.received_info.received_packet_times.size();
+ if (!writer->WriteBytes(&num_acked_packets, 1)) {
return false;
}
+ if (num_acked_packets == 0) {
+ // Special case when no packets are acked, just transmit the largest.
+ if (!writer->WriteUInt48(frame.received_info.largest_received)) {
+ return false;
+ }
+ } else {
+ map<QuicPacketSequenceNumber, QuicTime>::const_iterator it =
+ frame.received_info.received_packet_times.begin();
- size_t num_unacked_packets = frame.received_info.missing_packets.size();
- if (!writer->WriteBytes(&num_unacked_packets, 1)) {
- return false;
- }
+ QuicPacketSequenceNumber lowest_sequence = it->first;
+ if (!writer->WriteUInt48(lowest_sequence)) {
+ return false;
+ }
- SequenceSet::const_iterator it = frame.received_info.missing_packets.begin();
- for (; it != frame.received_info.missing_packets.end(); ++it) {
- if (!writer->WriteUInt48(*it)) {
+ QuicTime lowest_time = it->second;
+ // TODO(ianswett): Use time deltas from the connection's first received
+ // packet.
+ if (!writer->WriteUInt64(lowest_time.ToMicroseconds())) {
return false;
}
- }
- if (!writer->WriteUInt48(frame.sent_info.least_unacked)) {
- return false;
- }
+ for (++it; it != frame.received_info.received_packet_times.end(); ++it) {
+ QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
+ if (!writer->WriteBytes(&sequence_delta, 1)) {
+ return false;
+ }
- size_t num_non_retransmiting_packets =
- frame.sent_info.non_retransmiting.size();
- if (!writer->WriteBytes(&num_non_retransmiting_packets, 1)) {
- return false;
+ int32 time_delta_us = it->second.Subtract(lowest_time).ToMicroseconds();
+ if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
+ return false;
+ }
+ }
}
- it = frame.sent_info.non_retransmiting.begin();
- while (it != frame.sent_info.non_retransmiting.end()) {
- if (!writer->WriteUInt48(*it)) {
- return false;
- }
- ++it;
+ if (!writer->WriteUInt48(frame.sent_info.least_unacked)) {
+ return false;
}
if (!writer->WriteBytes(&frame.congestion_info.type, 1)) {
« no previous file with comments | « net/quic/quic_connection_test.cc ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698