Commit 4b06ae7c authored by rtenneti's avatar rtenneti Committed by Commit bot

Change the wire format of the ack frame to include a compressed version

of the previous CongestionFeedback Timestamp frame.
Adds QUIC_VERSION_23. Deprecate CongestionFeedbackFrame

1 bytes - num_received_packets
First packet:
1 byte - distance from the largest observed in sequence number space.
4 bytes - mod of microseconds since the connection's creation when the
  packet arrived.  (1.1hrs in us)
Every other packet:
1 byte - distance from the largest observed in sequence number space.
2 bytes - mod of microseconds since the previous timestamp

Merge internal change: 73740829

The following are chromium specific changes:
+ Changed ACK frame not to send CongestionFeedback frame
+ Added received_packet_times to ACK frame.
+ The timestamp that is sent is relative to creation time, thus passed
  MockClock's now() as argument to AckFrame and it is used to pass
  QuicFramer's creation time and received_packet_times.

R=cyr@google.com, ianswett@google.com, rch@chromium.org

Review URL: https://codereview.chromium.org/478153003

Cr-Commit-Position: refs/heads/master@{#291830}
parent 139fb7ad
...@@ -14,9 +14,6 @@ ReceiveAlgorithmInterface* ReceiveAlgorithmInterface::Create( ...@@ -14,9 +14,6 @@ ReceiveAlgorithmInterface* ReceiveAlgorithmInterface::Create(
switch (type) { switch (type) {
case kTCP: case kTCP:
return new TcpReceiver(); return new TcpReceiver();
case kTimestamp:
LOG(DFATAL) << "Timestamp congestion feedback is not supported";
return NULL;
} }
return NULL; return NULL;
} }
......
...@@ -49,7 +49,6 @@ const QuicTag kSRBF = TAG('S', 'R', 'B', 'F'); // Socket receive buffer ...@@ -49,7 +49,6 @@ const QuicTag kSRBF = TAG('S', 'R', 'B', 'F'); // Socket receive buffer
// Congestion control feedback types // Congestion control feedback types
const QuicTag kQBIC = TAG('Q', 'B', 'I', 'C'); // TCP cubic const QuicTag kQBIC = TAG('Q', 'B', 'I', 'C'); // TCP cubic
const QuicTag kTSTP = TAG('T', 'S', 'T', 'P'); // Timestamp
// Connection options (COPT) values // Connection options (COPT) values
const QuicTag kTBBR = TAG('T', 'B', 'B', 'R'); // Reduced Buffer Bloat TCP const QuicTag kTBBR = TAG('T', 'B', 'B', 'R'); // Reduced Buffer Bloat TCP
......
...@@ -80,7 +80,6 @@ TEST_F(QuicConfigTest, ToHandshakeMessage) { ...@@ -80,7 +80,6 @@ TEST_F(QuicConfigTest, ToHandshakeMessage) {
TEST_F(QuicConfigTest, ProcessClientHello) { TEST_F(QuicConfigTest, ProcessClientHello) {
QuicConfig client_config; QuicConfig client_config;
QuicTagVector cgst; QuicTagVector cgst;
cgst.push_back(kTSTP);
cgst.push_back(kQBIC); cgst.push_back(kQBIC);
client_config.set_congestion_feedback(cgst, kQBIC); client_config.set_congestion_feedback(cgst, kQBIC);
client_config.set_idle_connection_state_lifetime( client_config.set_idle_connection_state_lifetime(
...@@ -256,7 +255,7 @@ TEST_F(QuicConfigTest, MultipleNegotiatedValuesInVectorTag) { ...@@ -256,7 +255,7 @@ TEST_F(QuicConfigTest, MultipleNegotiatedValuesInVectorTag) {
QuicConfig server_config; QuicConfig server_config;
QuicTagVector cgst; QuicTagVector cgst;
cgst.push_back(kQBIC); cgst.push_back(kQBIC);
cgst.push_back(kTSTP); cgst.push_back(kTBBR);
server_config.set_congestion_feedback(cgst, kQBIC); server_config.set_congestion_feedback(cgst, kQBIC);
CryptoHandshakeMessage msg; CryptoHandshakeMessage msg;
...@@ -271,8 +270,8 @@ TEST_F(QuicConfigTest, NoOverLapInCGST) { ...@@ -271,8 +270,8 @@ TEST_F(QuicConfigTest, NoOverLapInCGST) {
QuicConfig server_config; QuicConfig server_config;
server_config.SetDefaults(); server_config.SetDefaults();
QuicTagVector cgst; QuicTagVector cgst;
cgst.push_back(kTSTP); cgst.push_back(kTBBR);
server_config.set_congestion_feedback(cgst, kTSTP); server_config.set_congestion_feedback(cgst, kTBBR);
CryptoHandshakeMessage msg; CryptoHandshakeMessage msg;
string error_details; string error_details;
......
...@@ -211,7 +211,7 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id, ...@@ -211,7 +211,7 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id,
largest_seen_packet_with_ack_(0), largest_seen_packet_with_ack_(0),
largest_seen_packet_with_stop_waiting_(0), largest_seen_packet_with_stop_waiting_(0),
pending_version_negotiation_packet_(false), pending_version_negotiation_packet_(false),
received_packet_manager_(kTCP, &stats_), received_packet_manager_(&stats_),
ack_queued_(false), ack_queued_(false),
stop_waiting_count_(0), stop_waiting_count_(0),
ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), ack_alarm_(helper->CreateAlarm(new AckAlarm(this))),
...@@ -269,7 +269,6 @@ QuicConnection::~QuicConnection() { ...@@ -269,7 +269,6 @@ QuicConnection::~QuicConnection() {
void QuicConnection::SetFromConfig(const QuicConfig& config) { void QuicConnection::SetFromConfig(const QuicConfig& config) {
SetIdleNetworkTimeout(config.idle_connection_state_lifetime()); SetIdleNetworkTimeout(config.idle_connection_state_lifetime());
sent_packet_manager_.SetFromConfig(config); sent_packet_manager_.SetFromConfig(config);
// TODO(satyamshekhar): Set congestion control and ICSL also.
} }
bool QuicConnection::SelectMutualVersion( bool QuicConnection::SelectMutualVersion(
...@@ -1574,15 +1573,16 @@ void QuicConnection::SendPing() { ...@@ -1574,15 +1573,16 @@ void QuicConnection::SendPing() {
void QuicConnection::SendAck() { void QuicConnection::SendAck() {
ack_alarm_->Cancel(); ack_alarm_->Cancel();
stop_waiting_count_ = 0; stop_waiting_count_ = 0;
// TODO(rch): delay this until the CreateFeedbackFrame
// method is invoked. This requires changes SetShouldSendAck
// to be a no-arg method, and re-jiggering its implementation.
bool send_feedback = false; bool send_feedback = false;
if (received_packet_manager_.GenerateCongestionFeedback(
&outgoing_congestion_feedback_)) { // Deprecating the Congestion Feedback Frame after QUIC_VERSION_22.
DVLOG(1) << ENDPOINT << "Sending feedback: " if (version() <= QUIC_VERSION_22) {
<< outgoing_congestion_feedback_; if (received_packet_manager_.GenerateCongestionFeedback(
send_feedback = true; &outgoing_congestion_feedback_)) {
DVLOG(1) << ENDPOINT << "Sending feedback: "
<< outgoing_congestion_feedback_;
send_feedback = true;
}
} }
packet_generator_.SetShouldSendAck(send_feedback, true); packet_generator_.SetShouldSendAck(send_feedback, true);
......
...@@ -122,19 +122,6 @@ base::Value* NetLogQuicCongestionFeedbackFrameCallback( ...@@ -122,19 +122,6 @@ base::Value* NetLogQuicCongestionFeedbackFrameCallback(
NetLog::LogLevel /* log_level */) { NetLog::LogLevel /* log_level */) {
base::DictionaryValue* dict = new base::DictionaryValue(); base::DictionaryValue* dict = new base::DictionaryValue();
switch (frame->type) { switch (frame->type) {
case kTimestamp: {
dict->SetString("type", "Timestamp");
base::ListValue* received = new base::ListValue();
dict->Set("received_packets", received);
for (TimeMap::const_iterator it =
frame->timestamp.received_packet_times.begin();
it != frame->timestamp.received_packet_times.end(); ++it) {
string value = base::Uint64ToString(it->first) + "@" +
base::Uint64ToString(it->second.ToDebuggingValue());
received->AppendString(value);
}
break;
}
case kTCP: case kTCP:
dict->SetString("type", "TCP"); dict->SetString("type", "TCP");
dict->SetInteger("receive_window", frame->tcp.receive_window); dict->SetInteger("receive_window", frame->tcp.receive_window);
......
...@@ -2568,11 +2568,20 @@ TEST_P(QuicConnectionTest, WithQuicCongestionFeedbackFrame) { ...@@ -2568,11 +2568,20 @@ TEST_P(QuicConnectionTest, WithQuicCongestionFeedbackFrame) {
QuicCongestionFeedbackFrame info; QuicCongestionFeedbackFrame info;
info.type = kTCP; info.type = kTCP;
info.tcp.receive_window = 0x4030; info.tcp.receive_window = 0x4030;
SetFeedback(&info);
SendAckPacketToPeer(); // After QUIC_VERSION_22, do not send TCP Congestion Feedback Frames anymore.
ASSERT_FALSE(writer_->feedback_frames().empty()); if (version() > QUIC_VERSION_22) {
ASSERT_EQ(kTCP, writer_->feedback_frames()[0].type); SendAckPacketToPeer();
ASSERT_TRUE(writer_->feedback_frames().empty());
} else {
// Only SetFeedback in this case because SetFeedback will create a receive
// algorithm which is how the received_packet_manager checks if it should be
// creating TCP Congestion Feedback Frames.
SetFeedback(&info);
SendAckPacketToPeer();
ASSERT_FALSE(writer_->feedback_frames().empty());
ASSERT_EQ(kTCP, writer_->feedback_frames()[0].type);
}
} }
TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) { TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) {
......
This diff is collapsed.
...@@ -45,6 +45,8 @@ const size_t kQuicEntropyHashSize = 1; ...@@ -45,6 +45,8 @@ const size_t kQuicEntropyHashSize = 1;
// Size in bytes reserved for the delta time of the largest observed // Size in bytes reserved for the delta time of the largest observed
// sequence number in ack frames. // sequence number in ack frames.
const size_t kQuicDeltaTimeLargestObservedSize = 2; const size_t kQuicDeltaTimeLargestObservedSize = 2;
// Size in bytes reserved for the number of received packets with timestamps.
const size_t kQuicNumTimestampsSize = 1;
// Size in bytes reserved for the number of missing packets in ack frames. // Size in bytes reserved for the number of missing packets in ack frames.
const size_t kNumberOfNackRangesSize = 1; const size_t kNumberOfNackRangesSize = 1;
// Maximum number of missing packet ranges that can fit within an ack frame. // Maximum number of missing packet ranges that can fit within an ack frame.
...@@ -409,9 +411,10 @@ class NET_EXPORT_PRIVATE QuicFramer { ...@@ -409,9 +411,10 @@ class NET_EXPORT_PRIVATE QuicFramer {
bool ProcessFrameData(const QuicPacketHeader& header); bool ProcessFrameData(const QuicPacketHeader& header);
bool ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame); bool ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame);
bool ProcessAckFrame(uint8 frame_type, QuicAckFrame* frame); bool ProcessAckFrame(uint8 frame_type, QuicAckFrame* frame);
bool ProcessTimestampsInAckFrame(QuicAckFrame* frame);
bool ProcessStopWaitingFrame(const QuicPacketHeader& public_header, bool ProcessStopWaitingFrame(const QuicPacketHeader& public_header,
QuicStopWaitingFrame* stop_waiting); QuicStopWaitingFrame* stop_waiting);
bool ProcessQuicCongestionFeedbackFrame( bool ProcessCongestionFeedbackFrame(
QuicCongestionFeedbackFrame* congestion_feedback); QuicCongestionFeedbackFrame* congestion_feedback);
bool ProcessRstStreamFrame(QuicRstStreamFrame* frame); bool ProcessRstStreamFrame(QuicRstStreamFrame* frame);
bool ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame); bool ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame);
...@@ -428,6 +431,10 @@ class NET_EXPORT_PRIVATE QuicFramer { ...@@ -428,6 +431,10 @@ class NET_EXPORT_PRIVATE QuicFramer {
QuicSequenceNumberLength sequence_number_length, QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number) const; QuicPacketSequenceNumber packet_sequence_number) const;
// Returns the QuicTime::Delta corresponding to the time from when the framer
// was created.
const QuicTime::Delta CalculateTimestampFromWire(uint32 time_delta_us);
// Computes the wire size in bytes of the |ack| frame, assuming no truncation. // Computes the wire size in bytes of the |ack| frame, assuming no truncation.
size_t GetAckFrameSize(const QuicAckFrame& ack, size_t GetAckFrameSize(const QuicAckFrame& ack,
QuicSequenceNumberLength sequence_number_length); QuicSequenceNumberLength sequence_number_length);
...@@ -463,6 +470,8 @@ class NET_EXPORT_PRIVATE QuicFramer { ...@@ -463,6 +470,8 @@ class NET_EXPORT_PRIVATE QuicFramer {
QuicDataWriter* builder); QuicDataWriter* builder);
bool AppendCongestionFeedbackFrame(const QuicCongestionFeedbackFrame& frame, bool AppendCongestionFeedbackFrame(const QuicCongestionFeedbackFrame& frame,
QuicDataWriter* builder); QuicDataWriter* builder);
bool AppendTimestampToAckFrame(const QuicAckFrame& frame,
QuicDataWriter* builder);
bool AppendStopWaitingFrame(const QuicPacketHeader& header, bool AppendStopWaitingFrame(const QuicPacketHeader& header,
const QuicStopWaitingFrame& frame, const QuicStopWaitingFrame& frame,
QuicDataWriter* builder); QuicDataWriter* builder);
...@@ -527,6 +536,9 @@ class NET_EXPORT_PRIVATE QuicFramer { ...@@ -527,6 +536,9 @@ class NET_EXPORT_PRIVATE QuicFramer {
// The time this framer was created. Time written to the wire will be // The time this framer was created. Time written to the wire will be
// written as a delta from this value. // written as a delta from this value.
QuicTime creation_time_; QuicTime creation_time_;
// The time delta computed for the last timestamp frame. This is relative to
// the creation_time.
QuicTime::Delta last_timestamp_;
DISALLOW_COPY_AND_ASSIGN(QuicFramer); DISALLOW_COPY_AND_ASSIGN(QuicFramer);
}; };
......
This diff is collapsed.
...@@ -150,12 +150,13 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> { ...@@ -150,12 +150,13 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> {
read_buffer_(new IOBufferWithSize(4096)), read_buffer_(new IOBufferWithSize(4096)),
connection_id_(2), connection_id_(2),
stream_id_(kClientDataStreamId1), stream_id_(kClientDataStreamId1),
maker_(GetParam(), connection_id_), maker_(GetParam(), connection_id_, &clock_),
random_generator_(0) { random_generator_(0) {
IPAddressNumber ip; IPAddressNumber ip;
CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
peer_addr_ = IPEndPoint(ip, 443); peer_addr_ = IPEndPoint(ip, 443);
self_addr_ = IPEndPoint(ip, 8435); self_addr_ = IPEndPoint(ip, 8435);
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
} }
~QuicHttpStreamTest() { ~QuicHttpStreamTest() {
...@@ -243,7 +244,6 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> { ...@@ -243,7 +244,6 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> {
stream_.reset(use_closing_stream_ ? stream_.reset(use_closing_stream_ ?
new AutoClosingStream(session_->GetWeakPtr()) : new AutoClosingStream(session_->GetWeakPtr()) :
new QuicHttpStream(session_->GetWeakPtr())); new QuicHttpStream(session_->GetWeakPtr()));
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
} }
void SetRequest(const std::string& method, void SetRequest(const std::string& method,
......
...@@ -107,8 +107,8 @@ class QuicNetworkTransactionTest ...@@ -107,8 +107,8 @@ class QuicNetworkTransactionTest
public ::testing::WithParamInterface<QuicVersion> { public ::testing::WithParamInterface<QuicVersion> {
protected: protected:
QuicNetworkTransactionTest() QuicNetworkTransactionTest()
: maker_(GetParam(), 0), : clock_(new MockClock),
clock_(new MockClock), maker_(GetParam(), 0, clock_),
ssl_config_service_(new SSLConfigServiceDefaults), ssl_config_service_(new SSLConfigServiceDefaults),
proxy_service_(ProxyService::CreateDirect()), proxy_service_(ProxyService::CreateDirect()),
auth_handler_factory_( auth_handler_factory_(
...@@ -304,11 +304,11 @@ class QuicNetworkTransactionTest ...@@ -304,11 +304,11 @@ class QuicNetworkTransactionTest
socket_factory_.AddSocketDataProvider(&hanging_data_); socket_factory_.AddSocketDataProvider(&hanging_data_);
} }
MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
QuicTestPacketMaker maker_; QuicTestPacketMaker maker_;
scoped_refptr<HttpNetworkSession> session_; scoped_refptr<HttpNetworkSession> session_;
MockClientSocketFactory socket_factory_; MockClientSocketFactory socket_factory_;
MockCryptoClientStreamFactory crypto_client_stream_factory_; MockCryptoClientStreamFactory crypto_client_stream_factory_;
MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
MockHostResolver host_resolver_; MockHostResolver host_resolver_;
MockCertVerifier cert_verifier_; MockCertVerifier cert_verifier_;
TransportSecurityState transport_security_state_; TransportSecurityState transport_security_state_;
......
...@@ -379,19 +379,20 @@ SerializedPacket QuicPacketCreator::SerializePacket() { ...@@ -379,19 +379,20 @@ SerializedPacket QuicPacketCreator::SerializePacket() {
size_t max_plaintext_size = size_t max_plaintext_size =
framer_->GetMaxPlaintextSize(max_packet_length_); framer_->GetMaxPlaintextSize(max_packet_length_);
DCHECK_GE(max_plaintext_size, packet_size_); DCHECK_GE(max_plaintext_size, packet_size_);
// ACK Frames will be truncated only if they're the only frame in the packet, // ACK Frames will be truncated due to length only if they're the only frame
// and if packet_size_ was set to max_plaintext_size. If truncation occurred, // in the packet, and if packet_size_ was set to max_plaintext_size. If
// then GetSerializedFrameLength will have returned all bytes free. // truncation due to length occurred, then GetSerializedFrameLength will have
bool possibly_truncated = packet_size_ == max_plaintext_size && // returned all bytes free.
queued_frames_.size() == 1 && bool possibly_truncated_by_length = packet_size_ == max_plaintext_size &&
queued_frames_.back().type == ACK_FRAME; queued_frames_.size() == 1 &&
queued_frames_.back().type == ACK_FRAME;
SerializedPacket serialized = SerializedPacket serialized =
framer_->BuildDataPacket(header, queued_frames_, packet_size_); framer_->BuildDataPacket(header, queued_frames_, packet_size_);
LOG_IF(DFATAL, !serialized.packet) LOG_IF(DFATAL, !serialized.packet)
<< "Failed to serialize " << queued_frames_.size() << " frames."; << "Failed to serialize " << queued_frames_.size() << " frames.";
// Because of possible truncation, we can't be confident that our // Because of possible truncation, we can't be confident that our
// packet size calculation worked correctly. // packet size calculation worked correctly.
if (!possibly_truncated) { if (!possibly_truncated_by_length) {
DCHECK_EQ(packet_size_, serialized.packet->length()); DCHECK_EQ(packet_size_, serialized.packet->length());
} }
packet_size_ = 0; packet_size_ = 0;
......
...@@ -171,6 +171,8 @@ QuicTag QuicVersionToQuicTag(const QuicVersion version) { ...@@ -171,6 +171,8 @@ QuicTag QuicVersionToQuicTag(const QuicVersion version) {
return MakeQuicTag('Q', '0', '2', '1'); return MakeQuicTag('Q', '0', '2', '1');
case QUIC_VERSION_22: case QUIC_VERSION_22:
return MakeQuicTag('Q', '0', '2', '2'); return MakeQuicTag('Q', '0', '2', '2');
case QUIC_VERSION_23:
return MakeQuicTag('Q', '0', '2', '3');
default: default:
// This shold be an ERROR because we should never attempt to convert an // This shold be an ERROR because we should never attempt to convert an
// invalid QuicVersion to be written to the wire. // invalid QuicVersion to be written to the wire.
...@@ -203,6 +205,7 @@ string QuicVersionToString(const QuicVersion version) { ...@@ -203,6 +205,7 @@ string QuicVersionToString(const QuicVersion version) {
RETURN_STRING_LITERAL(QUIC_VERSION_20); RETURN_STRING_LITERAL(QUIC_VERSION_20);
RETURN_STRING_LITERAL(QUIC_VERSION_21); RETURN_STRING_LITERAL(QUIC_VERSION_21);
RETURN_STRING_LITERAL(QUIC_VERSION_22); RETURN_STRING_LITERAL(QUIC_VERSION_22);
RETURN_STRING_LITERAL(QUIC_VERSION_23);
default: default:
return "QUIC_VERSION_UNSUPPORTED"; return "QUIC_VERSION_UNSUPPORTED";
} }
...@@ -274,11 +277,6 @@ CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP() ...@@ -274,11 +277,6 @@ CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP()
: receive_window(0) { : receive_window(0) {
} }
CongestionFeedbackMessageTimestamp::CongestionFeedbackMessageTimestamp() {
}
CongestionFeedbackMessageTimestamp::~CongestionFeedbackMessageTimestamp() {}
QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {} QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {}
QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {} QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {}
...@@ -383,7 +381,6 @@ ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { ...@@ -383,7 +381,6 @@ ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) {
ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash)
<< " is_truncated: " << ack_frame.is_truncated
<< " largest_observed: " << ack_frame.largest_observed << " largest_observed: " << ack_frame.largest_observed
<< " delta_time_largest_observed: " << " delta_time_largest_observed: "
<< ack_frame.delta_time_largest_observed.ToMicroseconds() << ack_frame.delta_time_largest_observed.ToMicroseconds()
...@@ -392,11 +389,18 @@ ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { ...@@ -392,11 +389,18 @@ ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
it != ack_frame.missing_packets.end(); ++it) { it != ack_frame.missing_packets.end(); ++it) {
os << *it << " "; os << *it << " ";
} }
os << " ] revived_packets: [ "; os << " ] is_truncated: " << ack_frame.is_truncated;
os << " revived_packets: [ ";
for (SequenceNumberSet::const_iterator it = ack_frame.revived_packets.begin(); for (SequenceNumberSet::const_iterator it = ack_frame.revived_packets.begin();
it != ack_frame.revived_packets.end(); ++it) { it != ack_frame.revived_packets.end(); ++it) {
os << *it << " "; os << *it << " ";
} }
os << " ] received_packets: [ ";
for (PacketTimeList::const_iterator it =
ack_frame.received_packet_times.begin();
it != ack_frame.received_packet_times.end(); ++it) {
os << it->first << " at " << it->second.ToDebuggingValue() << " ";
}
os << " ]"; os << " ]";
return os; return os;
} }
...@@ -504,17 +508,6 @@ ostream& operator<<(ostream& os, ...@@ -504,17 +508,6 @@ ostream& operator<<(ostream& os,
const QuicCongestionFeedbackFrame& congestion_frame) { const QuicCongestionFeedbackFrame& congestion_frame) {
os << "type: " << congestion_frame.type; os << "type: " << congestion_frame.type;
switch (congestion_frame.type) { switch (congestion_frame.type) {
case kTimestamp: {
const CongestionFeedbackMessageTimestamp& timestamp =
congestion_frame.timestamp;
os << " received packets: [ ";
for (TimeMap::const_iterator it = timestamp.received_packet_times.begin();
it != timestamp.received_packet_times.end(); ++it) {
os << it->first << "@" << it->second.ToDebuggingValue() << " ";
}
os << "]";
break;
}
case kTCP: { case kTCP: {
const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp; const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
os << " receive_window: " << tcp.receive_window; os << " receive_window: " << tcp.receive_window;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stddef.h> #include <stddef.h>
#include <limits> #include <limits>
#include <list>
#include <map> #include <map>
#include <ostream> #include <ostream>
#include <set> #include <set>
...@@ -291,6 +292,7 @@ enum QuicVersion { ...@@ -291,6 +292,7 @@ enum QuicVersion {
QUIC_VERSION_20 = 20, // Independent stream/connection flow control windows. QUIC_VERSION_20 = 20, // Independent stream/connection flow control windows.
QUIC_VERSION_21 = 21, // Headers/crypto streams are flow controlled. QUIC_VERSION_21 = 21, // Headers/crypto streams are flow controlled.
QUIC_VERSION_22 = 22, // Send Server Config Update messages on crypto stream. QUIC_VERSION_22 = 22, // Send Server Config Update messages on crypto stream.
QUIC_VERSION_23 = 23, // Timestamp in the ack frame.
}; };
// This vector contains QUIC versions which we currently support. // This vector contains QUIC versions which we currently support.
...@@ -300,7 +302,8 @@ enum QuicVersion { ...@@ -300,7 +302,8 @@ enum QuicVersion {
// //
// IMPORTANT: if you are adding to this list, follow the instructions at // IMPORTANT: if you are adding to this list, follow the instructions at
// http://sites/quic/adding-and-removing-versions // http://sites/quic/adding-and-removing-versions
static const QuicVersion kSupportedQuicVersions[] = {QUIC_VERSION_22, static const QuicVersion kSupportedQuicVersions[] = {QUIC_VERSION_23,
QUIC_VERSION_22,
QUIC_VERSION_21, QUIC_VERSION_21,
QUIC_VERSION_20, QUIC_VERSION_20,
QUIC_VERSION_19, QUIC_VERSION_19,
...@@ -644,8 +647,8 @@ struct NET_EXPORT_PRIVATE QuicStreamFrame { ...@@ -644,8 +647,8 @@ struct NET_EXPORT_PRIVATE QuicStreamFrame {
// TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing // TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
// is finalized. // is finalized.
typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet; typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
// TODO(pwestin): Add a way to enforce the max size of this map.
typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap; typedef std::list<std::pair<QuicPacketSequenceNumber, QuicTime>> PacketTimeList;
struct NET_EXPORT_PRIVATE QuicStopWaitingFrame { struct NET_EXPORT_PRIVATE QuicStopWaitingFrame {
QuicStopWaitingFrame(); QuicStopWaitingFrame();
...@@ -696,6 +699,9 @@ struct NET_EXPORT_PRIVATE QuicAckFrame { ...@@ -696,6 +699,9 @@ struct NET_EXPORT_PRIVATE QuicAckFrame {
// Packets which have been revived via FEC. // Packets which have been revived via FEC.
// All of these must also be in missing_packets. // All of these must also be in missing_packets.
SequenceNumberSet revived_packets; SequenceNumberSet revived_packets;
// List of <sequence_number, time> for when packets arrived.
PacketTimeList received_packet_times;
}; };
// True if the sequence number is greater than largest_observed or is listed // True if the sequence number is greater than largest_observed or is listed
...@@ -714,9 +720,9 @@ void NET_EXPORT_PRIVATE InsertMissingPacketsBetween( ...@@ -714,9 +720,9 @@ void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
// Defines for all types of congestion feedback that will be negotiated in QUIC, // Defines for all types of congestion feedback that will be negotiated in QUIC,
// kTCP MUST be supported by all QUIC implementations to guarantee 100% // kTCP MUST be supported by all QUIC implementations to guarantee 100%
// compatibility. // compatibility.
// TODO(cyr): Remove this when removing QUIC_VERSION_22.
enum CongestionFeedbackType { enum CongestionFeedbackType {
kTCP, // Used to mimic TCP. kTCP, // Used to mimic TCP.
kTimestamp, // Use additional inter arrival timestamp information.
}; };
// Defines for all types of congestion control algorithms that can be used in // Defines for all types of congestion control algorithms that can be used in
...@@ -734,21 +740,14 @@ enum LossDetectionType { ...@@ -734,21 +740,14 @@ enum LossDetectionType {
kTime, // Time based loss detection. kTime, // Time based loss detection.
}; };
// TODO(cyr): Remove this when removing QUIC_VERSION_22.
struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP { struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
CongestionFeedbackMessageTCP(); CongestionFeedbackMessageTCP();
QuicByteCount receive_window; QuicByteCount receive_window;
}; };
struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTimestamp { // TODO(cyr): Remove this when removing QUIC_VERSION_22.
CongestionFeedbackMessageTimestamp();
~CongestionFeedbackMessageTimestamp();
// The set of received packets since the last feedback was sent, along with
// their arrival times.
TimeMap received_packet_times;
};
struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame { struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
QuicCongestionFeedbackFrame(); QuicCongestionFeedbackFrame();
~QuicCongestionFeedbackFrame(); ~QuicCongestionFeedbackFrame();
...@@ -760,7 +759,6 @@ struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame { ...@@ -760,7 +759,6 @@ struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
// This should really be a union, but since the timestamp struct // This should really be a union, but since the timestamp struct
// is non-trivial, C++ prohibits it. // is non-trivial, C++ prohibits it.
CongestionFeedbackMessageTCP tcp; CongestionFeedbackMessageTCP tcp;
CongestionFeedbackMessageTimestamp timestamp;
}; };
struct NET_EXPORT_PRIVATE QuicRstStreamFrame { struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
...@@ -861,7 +859,10 @@ struct NET_EXPORT_PRIVATE QuicFrame { ...@@ -861,7 +859,10 @@ struct NET_EXPORT_PRIVATE QuicFrame {
explicit QuicFrame(QuicPaddingFrame* padding_frame); explicit QuicFrame(QuicPaddingFrame* padding_frame);
explicit QuicFrame(QuicStreamFrame* stream_frame); explicit QuicFrame(QuicStreamFrame* stream_frame);
explicit QuicFrame(QuicAckFrame* frame); explicit QuicFrame(QuicAckFrame* frame);
// TODO(cyr): Remove this when removing QUIC_VERSION_22.
explicit QuicFrame(QuicCongestionFeedbackFrame* frame); explicit QuicFrame(QuicCongestionFeedbackFrame* frame);
explicit QuicFrame(QuicRstStreamFrame* frame); explicit QuicFrame(QuicRstStreamFrame* frame);
explicit QuicFrame(QuicConnectionCloseFrame* frame); explicit QuicFrame(QuicConnectionCloseFrame* frame);
explicit QuicFrame(QuicStopWaitingFrame* frame); explicit QuicFrame(QuicStopWaitingFrame* frame);
...@@ -878,8 +879,11 @@ struct NET_EXPORT_PRIVATE QuicFrame { ...@@ -878,8 +879,11 @@ struct NET_EXPORT_PRIVATE QuicFrame {
QuicPaddingFrame* padding_frame; QuicPaddingFrame* padding_frame;
QuicStreamFrame* stream_frame; QuicStreamFrame* stream_frame;
QuicAckFrame* ack_frame; QuicAckFrame* ack_frame;
// TODO(cyr): Remove this when removing QUIC_VERSION_22.
QuicCongestionFeedbackFrame* congestion_feedback_frame; QuicCongestionFeedbackFrame* congestion_feedback_frame;
QuicStopWaitingFrame* stop_waiting_frame; QuicStopWaitingFrame* stop_waiting_frame;
QuicPingFrame* ping_frame; QuicPingFrame* ping_frame;
QuicRstStreamFrame* rst_stream_frame; QuicRstStreamFrame* rst_stream_frame;
QuicConnectionCloseFrame* connection_close_frame; QuicConnectionCloseFrame* connection_close_frame;
......
...@@ -7,11 +7,13 @@ ...@@ -7,11 +7,13 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "net/base/linked_hash_map.h" #include "net/base/linked_hash_map.h"
#include "net/quic/crypto/crypto_protocol.h"
#include "net/quic/quic_connection_stats.h" #include "net/quic/quic_connection_stats.h"
using std::make_pair; using std::make_pair;
using std::max; using std::max;
using std::min; using std::min;
using std::numeric_limits;
namespace net { namespace net {
...@@ -128,11 +130,10 @@ AdvanceFirstGapAndGarbageCollectEntropyMap() { ...@@ -128,11 +130,10 @@ AdvanceFirstGapAndGarbageCollectEntropyMap() {
} }
QuicReceivedPacketManager::QuicReceivedPacketManager( QuicReceivedPacketManager::QuicReceivedPacketManager(
CongestionFeedbackType congestion_type,
QuicConnectionStats* stats) QuicConnectionStats* stats)
: peer_least_packet_awaiting_ack_(0), : peer_least_packet_awaiting_ack_(0),
time_largest_observed_(QuicTime::Zero()), time_largest_observed_(QuicTime::Zero()),
receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), receive_algorithm_(ReceiveAlgorithmInterface::Create(kTCP)),
stats_(stats) { stats_(stats) {
ack_frame_.largest_observed = 0; ack_frame_.largest_observed = 0;
ack_frame_.entropy_hash = 0; ack_frame_.entropy_hash = 0;
...@@ -178,6 +179,9 @@ void QuicReceivedPacketManager::RecordPacketReceived( ...@@ -178,6 +179,9 @@ void QuicReceivedPacketManager::RecordPacketReceived(
receive_algorithm_->RecordIncomingPacket( receive_algorithm_->RecordIncomingPacket(
bytes, sequence_number, receipt_time); bytes, sequence_number, receipt_time);
received_packet_times_.push_back(
std::make_pair(sequence_number, receipt_time));
ack_frame_.revived_packets.erase(sequence_number); ack_frame_.revived_packets.erase(sequence_number);
} }
...@@ -216,6 +220,15 @@ void QuicReceivedPacketManager::UpdateReceivedPacketInfo( ...@@ -216,6 +220,15 @@ void QuicReceivedPacketManager::UpdateReceivedPacketInfo(
ack_frame->delta_time_largest_observed = ack_frame->delta_time_largest_observed =
approximate_now.Subtract(time_largest_observed_); approximate_now.Subtract(time_largest_observed_);
// Remove all packets that are too far from largest_observed to express.
received_packet_times_.remove_if(
[this] (std::pair<QuicPacketSequenceNumber, QuicTime> p)
{ return ack_frame_.largest_observed - p.first >=
numeric_limits<uint8>::max();});
ack_frame->received_packet_times = received_packet_times_;
received_packet_times_.clear();
} }
bool QuicReceivedPacketManager::GenerateCongestionFeedback( bool QuicReceivedPacketManager::GenerateCongestionFeedback(
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <deque> #include <deque>
#include "net/quic/congestion_control/receive_algorithm_interface.h" #include "net/quic/congestion_control/receive_algorithm_interface.h"
#include "net/quic/quic_config.h"
#include "net/quic/quic_framer.h" #include "net/quic/quic_framer.h"
#include "net/quic/quic_protocol.h" #include "net/quic/quic_protocol.h"
...@@ -94,8 +95,7 @@ class NET_EXPORT_PRIVATE QuicReceivedPacketManager : ...@@ -94,8 +95,7 @@ class NET_EXPORT_PRIVATE QuicReceivedPacketManager :
DISALLOW_COPY_AND_ASSIGN(EntropyTracker); DISALLOW_COPY_AND_ASSIGN(EntropyTracker);
}; };
explicit QuicReceivedPacketManager(CongestionFeedbackType congestion_type, explicit QuicReceivedPacketManager(QuicConnectionStats* stats);
QuicConnectionStats* stats);
virtual ~QuicReceivedPacketManager(); virtual ~QuicReceivedPacketManager();
// Updates the internal state concerning which packets have been received. // Updates the internal state concerning which packets have been received.
...@@ -172,6 +172,8 @@ class NET_EXPORT_PRIVATE QuicReceivedPacketManager : ...@@ -172,6 +172,8 @@ class NET_EXPORT_PRIVATE QuicReceivedPacketManager :
QuicConnectionStats* stats_; QuicConnectionStats* stats_;
PacketTimeList received_packet_times_;
DISALLOW_COPY_AND_ASSIGN(QuicReceivedPacketManager); DISALLOW_COPY_AND_ASSIGN(QuicReceivedPacketManager);
}; };
......
...@@ -188,7 +188,7 @@ TEST(EntropyTrackerTest, SetCumulativeEntropyUpTo) { ...@@ -188,7 +188,7 @@ TEST(EntropyTrackerTest, SetCumulativeEntropyUpTo) {
class QuicReceivedPacketManagerTest : public ::testing::Test { class QuicReceivedPacketManagerTest : public ::testing::Test {
protected: protected:
QuicReceivedPacketManagerTest() : received_manager_(kTCP, &stats_) {} QuicReceivedPacketManagerTest() : received_manager_(&stats_) {}
void RecordPacketReceipt(QuicPacketSequenceNumber sequence_number, void RecordPacketReceipt(QuicPacketSequenceNumber sequence_number,
QuicPacketEntropyHash entropy_hash) { QuicPacketEntropyHash entropy_hash) {
......
...@@ -90,8 +90,8 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { ...@@ -90,8 +90,8 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
protected: protected:
QuicStreamFactoryTest() QuicStreamFactoryTest()
: random_generator_(0), : random_generator_(0),
maker_(GetParam(), 0),
clock_(new MockClock()), clock_(new MockClock()),
maker_(GetParam(), 0, clock_),
cert_verifier_(CertVerifier::CreateDefault()), cert_verifier_(CertVerifier::CreateDefault()),
channel_id_service_(new ChannelIDService( channel_id_service_(new ChannelIDService(
new DefaultChannelIDStore(NULL), new DefaultChannelIDStore(NULL),
...@@ -187,8 +187,8 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { ...@@ -187,8 +187,8 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
DeterministicMockClientSocketFactory socket_factory_; DeterministicMockClientSocketFactory socket_factory_;
MockCryptoClientStreamFactory crypto_client_stream_factory_; MockCryptoClientStreamFactory crypto_client_stream_factory_;
MockRandom random_generator_; MockRandom random_generator_;
QuicTestPacketMaker maker_;
MockClock* clock_; // Owned by factory_. MockClock* clock_; // Owned by factory_.
QuicTestPacketMaker maker_;
scoped_ptr<CertVerifier> cert_verifier_; scoped_ptr<CertVerifier> cert_verifier_;
scoped_ptr<ChannelIDService> channel_id_service_; scoped_ptr<ChannelIDService> channel_id_service_;
TransportSecurityState transport_security_state_; TransportSecurityState transport_security_state_;
......
...@@ -81,7 +81,10 @@ void MockCryptoClientStream::SendOnCryptoHandshakeEvent( ...@@ -81,7 +81,10 @@ void MockCryptoClientStream::SendOnCryptoHandshakeEvent(
void MockCryptoClientStream::SetConfigNegotiated() { void MockCryptoClientStream::SetConfigNegotiated() {
ASSERT_FALSE(session()->config()->negotiated()); ASSERT_FALSE(session()->config()->negotiated());
QuicTagVector cgst; QuicTagVector cgst;
cgst.push_back(kTSTP); // TODO(rtenneti): Enable the following code after BBR code is checked in.
#if 0
cgst.push_back(kTBBR);
#endif
cgst.push_back(kQBIC); cgst.push_back(kQBIC);
session()->config()->set_congestion_feedback(cgst, kQBIC); session()->config()->set_congestion_feedback(cgst, kQBIC);
session()->config()->set_idle_connection_state_lifetime( session()->config()->set_idle_connection_state_lifetime(
......
...@@ -4,18 +4,24 @@ ...@@ -4,18 +4,24 @@
#include "net/quic/test_tools/quic_test_packet_maker.h" #include "net/quic/test_tools/quic_test_packet_maker.h"
#include <list>
#include "net/quic/quic_framer.h" #include "net/quic/quic_framer.h"
#include "net/quic/quic_http_utils.h" #include "net/quic/quic_http_utils.h"
#include "net/quic/quic_utils.h" #include "net/quic/quic_utils.h"
#include "net/quic/test_tools/quic_test_utils.h" #include "net/quic/test_tools/quic_test_utils.h"
using std::make_pair;
namespace net { namespace net {
namespace test { namespace test {
QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version,
QuicConnectionId connection_id) QuicConnectionId connection_id,
MockClock* clock)
: version_(version), : version_(version),
connection_id_(connection_id), connection_id_(connection_id),
clock_(clock),
spdy_request_framer_(SPDY3), spdy_request_framer_(SPDY3),
spdy_response_framer_(SPDY3) { spdy_response_framer_(SPDY3) {
} }
...@@ -63,10 +69,16 @@ scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket( ...@@ -63,10 +69,16 @@ scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket(
QuicAckFrame ack(MakeAckFrame(largest_received)); QuicAckFrame ack(MakeAckFrame(largest_received));
ack.delta_time_largest_observed = QuicTime::Delta::Zero(); ack.delta_time_largest_observed = QuicTime::Delta::Zero();
if (version_ > QUIC_VERSION_22) {
for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received;
++i) {
ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
}
}
QuicFrames frames; QuicFrames frames;
frames.push_back(QuicFrame(&ack)); frames.push_back(QuicFrame(&ack));
QuicCongestionFeedbackFrame feedback; QuicCongestionFeedbackFrame feedback;
if (send_feedback) { if (send_feedback && version_ <= QUIC_VERSION_22) {
feedback.type = kTCP; feedback.type = kTCP;
feedback.tcp.receive_window = 256000; feedback.tcp.receive_window = 256000;
...@@ -80,7 +92,7 @@ scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket( ...@@ -80,7 +92,7 @@ scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket(
QuicRstStreamFrame rst(stream_id, error_code, 0); QuicRstStreamFrame rst(stream_id, error_code, 0);
frames.push_back(QuicFrame(&rst)); frames.push_back(QuicFrame(&rst));
QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); QuicFramer framer(SupportedVersions(version_), clock_->Now(), false);
scoped_ptr<QuicPacket> packet( scoped_ptr<QuicPacket> packet(
BuildUnsizedDataPacket(&framer, header, frames).packet); BuildUnsizedDataPacket(&framer, header, frames).packet);
return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
...@@ -122,15 +134,20 @@ scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket( ...@@ -122,15 +134,20 @@ scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket(
QuicAckFrame ack(MakeAckFrame(largest_received)); QuicAckFrame ack(MakeAckFrame(largest_received));
ack.delta_time_largest_observed = QuicTime::Delta::Zero(); ack.delta_time_largest_observed = QuicTime::Delta::Zero();
if (version_ > QUIC_VERSION_22) {
for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received;
++i) {
ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
}
}
QuicCongestionFeedbackFrame feedback; QuicFramer framer(SupportedVersions(version_), clock_->Now(), false);
feedback.type = kTCP;
feedback.tcp.receive_window = 256000;
QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
QuicFrames frames; QuicFrames frames;
frames.push_back(QuicFrame(&ack)); frames.push_back(QuicFrame(&ack));
if (send_feedback) { QuicCongestionFeedbackFrame feedback;
if (send_feedback && version_ <= QUIC_VERSION_22) {
feedback.type = kTCP;
feedback.tcp.receive_window = 256000;
frames.push_back(QuicFrame(&feedback)); frames.push_back(QuicFrame(&feedback));
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "net/base/request_priority.h" #include "net/base/request_priority.h"
#include "net/quic/quic_protocol.h" #include "net/quic/quic_protocol.h"
#include "net/quic/test_tools/mock_clock.h"
#include "net/quic/test_tools/mock_random.h" #include "net/quic/test_tools/mock_random.h"
#include "net/spdy/spdy_framer.h" #include "net/spdy/spdy_framer.h"
#include "net/spdy/spdy_protocol.h" #include "net/spdy/spdy_protocol.h"
...@@ -19,7 +20,9 @@ namespace test { ...@@ -19,7 +20,9 @@ namespace test {
class QuicTestPacketMaker { class QuicTestPacketMaker {
public: public:
QuicTestPacketMaker(QuicVersion version, QuicConnectionId connection_id); QuicTestPacketMaker(QuicVersion version,
QuicConnectionId connection_id,
MockClock* clock);
~QuicTestPacketMaker(); ~QuicTestPacketMaker();
scoped_ptr<QuicEncryptedPacket> MakeRstPacket( scoped_ptr<QuicEncryptedPacket> MakeRstPacket(
...@@ -77,6 +80,7 @@ class QuicTestPacketMaker { ...@@ -77,6 +80,7 @@ class QuicTestPacketMaker {
QuicVersion version_; QuicVersion version_;
QuicConnectionId connection_id_; QuicConnectionId connection_id_;
MockClock* clock_; // Owned by QuicStreamFactory.
SpdyFramer spdy_request_framer_; SpdyFramer spdy_request_framer_;
SpdyFramer spdy_response_framer_; SpdyFramer spdy_response_framer_;
MockRandom random_generator_; MockRandom random_generator_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment