xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/qbone/qbone_stream.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/quic/qbone/qbone_stream.h"
6 
7 #include "absl/strings/string_view.h"
8 #include "quiche/quic/core/quic_data_reader.h"
9 #include "quiche/quic/core/quic_data_writer.h"
10 #include "quiche/quic/core/quic_types.h"
11 #include "quiche/quic/qbone/qbone_constants.h"
12 #include "quiche/quic/qbone/qbone_session_base.h"
13 #include "quiche/common/platform/api/quiche_command_line_flags.h"
14 
15 DEFINE_QUICHE_COMMAND_LINE_FLAG(int, qbone_stream_ttl_secs, 3,
16                                 "The QBONE Stream TTL in seconds.");
17 
18 namespace quic {
19 
QboneWriteOnlyStream(QuicStreamId id,QuicSession * session)20 QboneWriteOnlyStream::QboneWriteOnlyStream(QuicStreamId id,
21                                            QuicSession* session)
22     : QuicStream(id, session, /*is_static=*/false, WRITE_UNIDIRECTIONAL) {
23   // QBONE uses a LIFO queue to try to always make progress. An individual
24   // packet may persist for upto to qbone_stream_ttl_secs seconds in memory.
25   MaybeSetTtl(QuicTime::Delta::FromSeconds(
26       quiche::GetQuicheCommandLineFlag(FLAGS_qbone_stream_ttl_secs)));
27 }
28 
WritePacketToQuicStream(absl::string_view packet)29 void QboneWriteOnlyStream::WritePacketToQuicStream(absl::string_view packet) {
30   // Streams are one way and ephemeral. This function should only be
31   // called once.
32   WriteOrBufferData(packet, /* fin= */ true, nullptr);
33 }
34 
QboneReadOnlyStream(QuicStreamId id,QboneSessionBase * session)35 QboneReadOnlyStream::QboneReadOnlyStream(QuicStreamId id,
36                                          QboneSessionBase* session)
37     : QuicStream(id, session,
38                  /*is_static=*/false, READ_UNIDIRECTIONAL),
39       session_(session) {
40   // QBONE uses a LIFO queue to try to always make progress. An individual
41   // packet may persist for upto to qbone_stream_ttl_secs seconds in memory.
42   MaybeSetTtl(QuicTime::Delta::FromSeconds(
43       quiche::GetQuicheCommandLineFlag(FLAGS_qbone_stream_ttl_secs)));
44 }
45 
OnDataAvailable()46 void QboneReadOnlyStream::OnDataAvailable() {
47   // Read in data and buffer it, attempt to frame to see if there's a packet.
48   sequencer()->Read(&buffer_);
49   if (sequencer()->IsClosed()) {
50     session_->ProcessPacketFromPeer(buffer_);
51     OnFinRead();
52     return;
53   }
54   if (buffer_.size() > QboneConstants::kMaxQbonePacketBytes) {
55     if (!rst_sent()) {
56       Reset(QUIC_BAD_APPLICATION_PAYLOAD);
57     }
58     StopReading();
59   }
60 }
61 
62 }  // namespace quic
63