Landing Recent QUIC changes until Thu Dec 21 15:21:19 2017 +0000
Sync flags.
https://chromium-review.googlesource.com/c/chromium/src/+/843166
Fix typo in comment
Merge internal change: 179811481
https://chromium-review.googlesource.com/c/chromium/src/+/843165
In QUIC, allow receiving overlapping stream data. Protected by FLAGS_quic_reloadable_flag_quic_allow_receiving_overlapping_data.
Merge internal change: 179808379
https://chromium-review.googlesource.com/c/chromium/src/+/842710
In QUIC, change OnStreamFrameAcked, OnStreamFrameLost to OnFrameAcked and OnFrameLost, respectively. No functional change expected.
Also rename StreamNotifierInterface to SessionNotifierInterface. Wrap QuicConnection's Neuter NeuterUnencryptedPackets into QuicSession::NeuterUnencryptedData.
Merge internal change: 179806882
https://chromium-review.googlesource.com/c/chromium/src/+/842708
Merge TcpCubicSenderBytes with its parent class, TcpCubicSenderBase.
Merge internal change: 179756874
https://chromium-review.googlesource.com/c/chromium/src/+/843087
Choose QUIC handshake protocol based on QUIC version. Protected by FLAGS_quic_supports_tls_handshake.
Merge internal change: 179743631
https://chromium-review.googlesource.com/c/chromium/src/+/843086
Add a QUIC connection option, 1TLP, to configure QUIC to send 1 TLP instead of 2. Also fixes QUIC's BBRSender to support changing the min CWND to 1 with the MIN1 connection option. Protected by FLAGS_quic_reloadable_flag_quic_one_tlp.
Merge internal change: 179722291
https://chromium-review.googlesource.com/c/chromium/src/+/843083
Deprecate flag FLAGS_quic_reloadable_flag_quic_deprecate_largest_observed in the false position. QuicAckFrame.largest_acked is kept for performance reasons.
Merge internal change: 179691236
https://chromium-review.googlesource.com/c/chromium/src/+/842704
Deprecate FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_window.
Merge internal change: 179582366
https://chromium-review.googlesource.com/c/chromium/src/+/841267
Deprecate FLAGS_quic_reloadable_flag_quic_bbr_conservation_in_startup.
Merge internal change: 179492415
https://chromium-review.googlesource.com/c/chromium/src/+/840828
Add an end_to_end_test making sure packet write error does not cause crash.
Merge internal change: 179460919
https://chromium-review.googlesource.com/c/chromium/src/+/840827
Deprecate FLAGS_quic_reloadable_flag_quic_remove_on_stream_frame_discarded.
Merge internal change: 179460654
https://chromium-review.googlesource.com/c/chromium/src/+/840648
Move state tracking whether QuartcPacketWriter is blocked into the class.
Derive whether QuartcPacketWriter is blocked from whether the last write
succeeded or failed. When a write fails, transition to a not-writable state.
When OnTransportCanWrite() fires, set the packet writer to writable.
Merge internal change: 179434425
https://chromium-review.googlesource.com/c/chromium/src/+/840823
Move and update a DCHECK for ack sending.
Merge internal change: 179189976
https://chromium-review.googlesource.com/c/chromium/src/+/840663
[email protected]
Bug:
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_dbg_ng
Change-Id: I0bf7b12db581a0638ec927bcac85384d56a80f9f
Reviewed-on: https://chromium-review.googlesource.com/843128
Commit-Queue: Michael Warres <[email protected]>
Reviewed-by: Ryan Hamilton <[email protected]>
Cr-Commit-Position: refs/heads/master@{#526101}
diff --git a/net/quic/test_tools/crypto_test_utils.cc b/net/quic/test_tools/crypto_test_utils.cc
index 2115559a..7f43881c 100644
--- a/net/quic/test_tools/crypto_test_utils.cc
+++ b/net/quic/test_tools/crypto_test_utils.cc
@@ -20,6 +20,8 @@
#include "net/quic/core/quic_crypto_stream.h"
#include "net/quic/core/quic_server_id.h"
#include "net/quic/core/quic_utils.h"
+#include "net/quic/core/tls_client_handshaker.h"
+#include "net/quic/core/tls_server_handshaker.h"
#include "net/quic/platform/api/quic_bug_tracker.h"
#include "net/quic/platform/api/quic_clock.h"
#include "net/quic/platform/api/quic_logging.h"
@@ -390,9 +392,9 @@
new PacketSavingConnection(helper, alarm_factory, Perspective::IS_SERVER,
client_conn->supported_versions());
- QuicCryptoServerConfig crypto_config(QuicCryptoServerConfig::TESTING,
- QuicRandom::GetInstance(),
- ProofSourceForTesting());
+ QuicCryptoServerConfig crypto_config(
+ QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(),
+ ProofSourceForTesting(), TlsServerHandshaker::CreateSslCtx());
QuicCompressedCertsCache compressed_certs_cache(
QuicCompressedCertsCache::kQuicCompressedCertsCacheSize);
SetupCryptoServerConfigForTest(server_conn->clock(),
@@ -427,12 +429,22 @@
QuicCryptoServerStream* server,
const QuicServerId& server_id,
const FakeClientOptions& options) {
- PacketSavingConnection* client_conn =
- new PacketSavingConnection(helper, alarm_factory, Perspective::IS_CLIENT);
+ ParsedQuicVersionVector supported_versions = AllSupportedVersions();
+ if (options.only_tls_versions) {
+ supported_versions.clear();
+ for (QuicTransportVersion transport_version :
+ AllSupportedTransportVersions()) {
+ supported_versions.push_back(
+ ParsedQuicVersion(PROTOCOL_TLS1_3, transport_version));
+ }
+ }
+ PacketSavingConnection* client_conn = new PacketSavingConnection(
+ helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);
// Advance the time, because timers do not like uninitialized times.
client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(1));
- QuicCryptoClientConfig crypto_config(ProofVerifierForTesting());
+ QuicCryptoClientConfig crypto_config(ProofVerifierForTesting(),
+ TlsClientHandshaker::CreateSslCtx());
AsyncTestChannelIDSource* async_channel_id_source = nullptr;
if (options.channel_id_enabled) {
ChannelIDSource* source = ChannelIDSourceForTesting();
@@ -515,7 +527,7 @@
QuicCryptoStream* server,
CallbackSource* callback_source) {
size_t client_i = 0, server_i = 0;
- while (!client->handshake_confirmed()) {
+ while (!client->handshake_confirmed() || !server->handshake_confirmed()) {
ASSERT_GT(client_conn->encrypted_packets_.size(), client_i);
QUIC_LOG(INFO) << "Processing "
<< client_conn->encrypted_packets_.size() - client_i
@@ -897,11 +909,37 @@
return new TestChannelIDSource();
}
+void MovePacketsForTlsHandshake(PacketSavingConnection* source_conn,
+ size_t* inout_packet_index,
+ QuicCryptoStream* dest_stream,
+ PacketSavingConnection* dest_conn,
+ Perspective dest_perspective) {
+ SimpleQuicFramer framer(source_conn->supported_versions(), dest_perspective);
+ size_t index = *inout_packet_index;
+ for (; index < source_conn->encrypted_packets_.size(); index++) {
+ if (!framer.ProcessPacket(*source_conn->encrypted_packets_[index])) {
+ // The framer will be unable to decrypt forward-secure packets sent after
+ // the handshake is complete. Don't treat them as handshake packets.
+ break;
+ }
+
+ for (const auto& stream_frame : framer.stream_frames()) {
+ dest_conn->OnStreamFrame(*stream_frame);
+ }
+ }
+ *inout_packet_index = index;
+}
+
void MovePackets(PacketSavingConnection* source_conn,
size_t* inout_packet_index,
QuicCryptoStream* dest_stream,
PacketSavingConnection* dest_conn,
Perspective dest_perspective) {
+ if (dest_stream->handshake_protocol() == PROTOCOL_TLS1_3) {
+ MovePacketsForTlsHandshake(source_conn, inout_packet_index, dest_stream,
+ dest_conn, dest_perspective);
+ return;
+ }
SimpleQuicFramer framer(source_conn->supported_versions(), dest_perspective);
CryptoFramer crypto_framer;
CryptoFramerVisitor crypto_visitor;
diff --git a/net/quic/test_tools/crypto_test_utils.h b/net/quic/test_tools/crypto_test_utils.h
index 38dc33e..b3baa5c 100644
--- a/net/quic/test_tools/crypto_test_utils.h
+++ b/net/quic/test_tools/crypto_test_utils.h
@@ -112,6 +112,10 @@
// The Token Binding params that the client supports and will negotiate.
QuicTagVector token_binding_params;
+
+ // If only_tls_versions is set, then the client will only use TLS for the
+ // crypto handshake.
+ bool only_tls_versions = false;
};
// returns: the number of client hellos that the client sent.
diff --git a/net/quic/test_tools/crypto_test_utils_test.cc b/net/quic/test_tools/crypto_test_utils_test.cc
index b3fcf55..053c468 100644
--- a/net/quic/test_tools/crypto_test_utils_test.cc
+++ b/net/quic/test_tools/crypto_test_utils_test.cc
@@ -6,6 +6,7 @@
#include "net/quic/core/crypto/crypto_server_config_protobuf.h"
#include "net/quic/core/quic_utils.h"
+#include "net/quic/core/tls_server_handshaker.h"
#include "net/quic/platform/api/quic_test.h"
#include "net/quic/platform/api/quic_text_utils.h"
#include "net/quic/test_tools/mock_clock.h"
@@ -115,7 +116,8 @@
MockClock clock;
QuicCryptoServerConfig crypto_config(
QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(),
- crypto_test_utils::ProofSourceForTesting());
+ crypto_test_utils::ProofSourceForTesting(),
+ TlsServerHandshaker::CreateSslCtx());
QuicSocketAddress server_addr;
QuicSocketAddress client_addr(QuicIpAddress::Loopback4(), 1);
QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config(
diff --git a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc
index da5754a6..c7aa8e9 100644
--- a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc
+++ b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc
@@ -64,16 +64,16 @@
bool QuicStreamSequencerBufferPeer::CheckBufferInvariants() {
QuicStreamOffset data_span =
- buffer_->gaps_.back().begin_offset - buffer_->total_bytes_read_;
+ buffer_->NextExpectedByte() - buffer_->total_bytes_read_;
bool capacity_sane = data_span <= buffer_->max_buffer_capacity_bytes_ &&
data_span >= buffer_->num_bytes_buffered_;
if (!capacity_sane) {
QUIC_LOG(ERROR) << "data span is larger than capacity.";
QUIC_LOG(ERROR) << "total read: " << buffer_->total_bytes_read_
- << " last byte: " << buffer_->gaps_.back().begin_offset;
+ << " last byte: " << buffer_->NextExpectedByte();
}
bool total_read_sane =
- buffer_->gaps_.front().begin_offset >= buffer_->total_bytes_read_;
+ buffer_->FirstMissingByte() >= buffer_->total_bytes_read_;
if (!total_read_sane) {
QUIC_LOG(ERROR) << "read across 1st gap.";
}
@@ -106,7 +106,24 @@
}
int QuicStreamSequencerBufferPeer::GapSize() {
- return buffer_->gaps_.size();
+ if (!buffer_->allow_overlapping_data_) {
+ return buffer_->gaps_.size();
+ }
+ if (buffer_->bytes_received_.Empty()) {
+ return 1;
+ }
+ int gap_size = buffer_->bytes_received_.Size() + 1;
+ if (buffer_->bytes_received_.Empty()) {
+ return gap_size;
+ }
+ if (buffer_->bytes_received_.begin()->min() == 0) {
+ --gap_size;
+ }
+ if (buffer_->bytes_received_.rbegin()->max() ==
+ std::numeric_limits<uint64_t>::max()) {
+ --gap_size;
+ }
+ return gap_size;
}
std::list<Gap> QuicStreamSequencerBufferPeer::GetGaps() {
@@ -135,6 +152,11 @@
buffer_->gaps_ = gaps;
}
+void QuicStreamSequencerBufferPeer::AddBytesReceived(QuicStreamOffset offset,
+ QuicByteCount length) {
+ buffer_->bytes_received_.Add(offset, offset + length);
+}
+
bool QuicStreamSequencerBufferPeer::IsBufferAllocated() {
return buffer_->blocks_ != nullptr;
}
@@ -142,5 +164,15 @@
size_t QuicStreamSequencerBufferPeer::block_count() {
return buffer_->blocks_count_;
}
+
+const QuicIntervalSet<QuicStreamOffset>&
+QuicStreamSequencerBufferPeer::bytes_received() {
+ return buffer_->bytes_received_;
+}
+
+bool QuicStreamSequencerBufferPeer::allow_overlapping_data() {
+ return buffer_->allow_overlapping_data_;
+}
+
} // namespace test
} // namespace net
diff --git a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h
index 1255d3a7..655e78b 100644
--- a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h
+++ b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h
@@ -34,6 +34,8 @@
QuicStreamSequencerBuffer::BufferBlock* GetBlock(size_t index);
+ // TODO(fayang): Rename this to IntervalSize when deprecating
+ // quic_reloadable_flag_quic_allow_receiving_overlapping_data.
int GapSize();
std::list<QuicStreamSequencerBuffer::Gap> GetGaps();
@@ -49,10 +51,16 @@
void set_gaps(const std::list<QuicStreamSequencerBuffer::Gap>& gaps);
+ void AddBytesReceived(QuicStreamOffset offset, QuicByteCount length);
+
bool IsBufferAllocated();
size_t block_count();
+ const QuicIntervalSet<QuicStreamOffset>& bytes_received();
+
+ bool allow_overlapping_data();
+
private:
QuicStreamSequencerBuffer* buffer_;
DISALLOW_COPY_AND_ASSIGN(QuicStreamSequencerBufferPeer);
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc
index 1859654..b207756 100644
--- a/net/quic/test_tools/quic_test_utils.cc
+++ b/net/quic/test_tools/quic_test_utils.cc
@@ -46,7 +46,7 @@
end_of_previous_block = block.limit;
}
- ack.deprecated_largest_observed = ack.packets.Max();
+ ack.largest_acked = ack.packets.Max();
return ack;
}
@@ -58,7 +58,7 @@
QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks,
QuicPacketNumber least_unacked) {
QuicAckFrame ack;
- ack.deprecated_largest_observed = 2 * num_ack_blocks + least_unacked;
+ ack.largest_acked = 2 * num_ack_blocks + least_unacked;
// Add enough received packets to get num_ack_blocks ack blocks.
for (QuicPacketNumber i = 2; i < 2 * num_ack_blocks + 1; i += 2) {
ack.packets.Add(least_unacked + i);
@@ -845,6 +845,9 @@
MockPacketCreatorDelegate::MockPacketCreatorDelegate() {}
MockPacketCreatorDelegate::~MockPacketCreatorDelegate() {}
+MockSessionNotifier::MockSessionNotifier() {}
+MockSessionNotifier::~MockSessionNotifier() {}
+
void CreateClientSessionForTest(
QuicServerId server_id,
bool supports_stateless_rejects,
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h
index aadb9d3..2095527 100644
--- a/net/quic/test_tools/quic_test_utils.h
+++ b/net/quic/test_tools/quic_test_utils.h
@@ -936,6 +936,16 @@
DISALLOW_COPY_AND_ASSIGN(MockPacketCreatorDelegate);
};
+class MockSessionNotifier : public SessionNotifierInterface {
+ public:
+ MockSessionNotifier();
+ ~MockSessionNotifier() override;
+
+ MOCK_METHOD2(OnFrameAcked, void(const QuicFrame&, QuicTime::Delta));
+ MOCK_METHOD1(OnStreamFrameRetransmitted, void(const QuicStreamFrame&));
+ MOCK_METHOD1(OnFrameLost, void(const QuicFrame&));
+};
+
// Creates a client session for testing.
//
// server_id: The server id associated with this stream.
diff --git a/net/quic/test_tools/simple_data_producer.cc b/net/quic/test_tools/simple_data_producer.cc
index 5b1d024..c5988a7 100644
--- a/net/quic/test_tools/simple_data_producer.cc
+++ b/net/quic/test_tools/simple_data_producer.cc
@@ -38,19 +38,16 @@
return send_buffer_map_[id]->WriteStreamData(offset, data_length, writer);
}
-void SimpleDataProducer::OnStreamFrameAcked(
- const QuicStreamFrame& frame,
- QuicTime::Delta /*ack_delay_time*/) {
- OnStreamFrameDiscarded(frame);
-}
-
-void SimpleDataProducer::OnStreamFrameDiscarded(const QuicStreamFrame& frame) {
- if (!QuicContainsKey(send_buffer_map_, frame.stream_id)) {
+void SimpleDataProducer::OnFrameAcked(const QuicFrame& frame,
+ QuicTime::Delta /*ack_delay_time*/) {
+ if (frame.type != STREAM_FRAME ||
+ !QuicContainsKey(send_buffer_map_, frame.stream_frame->stream_id)) {
return;
}
QuicByteCount newly_acked_length = 0;
- send_buffer_map_[frame.stream_id]->OnStreamDataAcked(
- frame.offset, frame.data_length, &newly_acked_length);
+ send_buffer_map_[frame.stream_frame->stream_id]->OnStreamDataAcked(
+ frame.stream_frame->offset, frame.stream_frame->data_length,
+ &newly_acked_length);
}
} // namespace test
diff --git a/net/quic/test_tools/simple_data_producer.h b/net/quic/test_tools/simple_data_producer.h
index 22b6d0b5..6300d28 100644
--- a/net/quic/test_tools/simple_data_producer.h
+++ b/net/quic/test_tools/simple_data_producer.h
@@ -8,7 +8,7 @@
#include "net/quic/core/quic_simple_buffer_allocator.h"
#include "net/quic/core/quic_stream_frame_data_producer.h"
#include "net/quic/core/quic_stream_send_buffer.h"
-#include "net/quic/core/stream_notifier_interface.h"
+#include "net/quic/core/session_notifier_interface.h"
#include "net/quic/platform/api/quic_containers.h"
namespace net {
@@ -18,7 +18,7 @@
// A simple data producer which copies stream data into a map from stream
// id to send buffer.
class SimpleDataProducer : public QuicStreamFrameDataProducer,
- public StreamNotifierInterface {
+ public SessionNotifierInterface {
public:
SimpleDataProducer();
~SimpleDataProducer() override;
@@ -36,11 +36,11 @@
QuicByteCount data_length,
QuicDataWriter* writer) override;
- // StreamNotifierInterface methods:
- void OnStreamFrameAcked(const QuicStreamFrame& frame,
- QuicTime::Delta ack_delay_time) override;
+ // SessionNotifierInterface methods:
+ void OnFrameAcked(const QuicFrame& frame,
+ QuicTime::Delta ack_delay_time) override;
void OnStreamFrameRetransmitted(const QuicStreamFrame& frame) override {}
- void OnStreamFrameDiscarded(const QuicStreamFrame& frame) override;
+ void OnFrameLost(const QuicFrame& frame) override {}
private:
using SendBufferMap =