| // Copyright (c) 2019 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "quic/qbone/qbone_stream.h" | 
 |  | 
 | #include "absl/strings/string_view.h" | 
 | #include "quic/core/quic_data_reader.h" | 
 | #include "quic/core/quic_data_writer.h" | 
 | #include "quic/core/quic_types.h" | 
 | #include "quic/qbone/qbone_constants.h" | 
 | #include "quic/qbone/qbone_session_base.h" | 
 |  | 
 | DEFINE_QUIC_COMMAND_LINE_FLAG(int, | 
 |                               qbone_stream_ttl_secs, | 
 |                               3, | 
 |                               "The QBONE Stream TTL in seconds."); | 
 |  | 
 | namespace quic { | 
 |  | 
 | QboneWriteOnlyStream::QboneWriteOnlyStream(QuicStreamId id, | 
 |                                            QuicSession* session) | 
 |     : QuicStream(id, session, /*is_static=*/false, WRITE_UNIDIRECTIONAL) { | 
 |   // QBONE uses a LIFO queue to try to always make progress. An individual | 
 |   // packet may persist for upto to qbone_stream_ttl_secs seconds in memory. | 
 |   MaybeSetTtl( | 
 |       QuicTime::Delta::FromSeconds(GetQuicFlag(FLAGS_qbone_stream_ttl_secs))); | 
 | } | 
 |  | 
 | void QboneWriteOnlyStream::WritePacketToQuicStream(absl::string_view packet) { | 
 |   // Streams are one way and ephemeral. This function should only be | 
 |   // called once. | 
 |   WriteOrBufferData(packet, /* fin= */ true, nullptr); | 
 | } | 
 |  | 
 | QboneReadOnlyStream::QboneReadOnlyStream(QuicStreamId id, | 
 |                                          QboneSessionBase* session) | 
 |     : QuicStream(id, | 
 |                  session, | 
 |                  /*is_static=*/false, | 
 |                  READ_UNIDIRECTIONAL), | 
 |       session_(session) { | 
 |   // QBONE uses a LIFO queue to try to always make progress. An individual | 
 |   // packet may persist for upto to qbone_stream_ttl_secs seconds in memory. | 
 |   MaybeSetTtl( | 
 |       QuicTime::Delta::FromSeconds(GetQuicFlag(FLAGS_qbone_stream_ttl_secs))); | 
 | } | 
 |  | 
 | void QboneReadOnlyStream::OnDataAvailable() { | 
 |   // Read in data and buffer it, attempt to frame to see if there's a packet. | 
 |   sequencer()->Read(&buffer_); | 
 |   if (sequencer()->IsClosed()) { | 
 |     session_->ProcessPacketFromPeer(buffer_); | 
 |     OnFinRead(); | 
 |     return; | 
 |   } | 
 |   if (buffer_.size() > QboneConstants::kMaxQbonePacketBytes) { | 
 |     if (!rst_sent()) { | 
 |       Reset(QUIC_BAD_APPLICATION_PAYLOAD); | 
 |     } | 
 |     StopReading(); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace quic |