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