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 =