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 "net/third_party/quiche/src/quic/qbone/qbone_stream.h"
6
7 #include "absl/strings/string_view.h"
8 #include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
9 #include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
10 #include "net/third_party/quiche/src/quic/core/quic_types.h"
11 #include "net/third_party/quiche/src/quic/qbone/qbone_constants.h"
12 #include "net/third_party/quiche/src/quic/qbone/qbone_session_base.h"
13
14 ABSL_FLAG(int, qbone_stream_ttl_secs, 3, "The QBONE Stream TTL in seconds.");
15
16 namespace quic {
17
QboneWriteOnlyStream(QuicStreamId id,QuicSession * session)18 QboneWriteOnlyStream::QboneWriteOnlyStream(QuicStreamId id,
19 QuicSession* session)
20 : QuicStream(id, session, /*is_static=*/false, WRITE_UNIDIRECTIONAL) {
21 // QBONE uses a LIFO queue to try to always make progress. An individual
22 // packet may persist for upto to qbone_stream_ttl_secs seconds in memory.
23 MaybeSetTtl(
24 QuicTime::Delta::FromSeconds(GetQuicFlag(FLAGS_qbone_stream_ttl_secs)));
25 }
26
WritePacketToQuicStream(absl::string_view packet)27 void QboneWriteOnlyStream::WritePacketToQuicStream(absl::string_view packet) {
28 // Streams are one way and ephemeral. This function should only be
29 // called once.
30 WriteOrBufferData(packet, /* fin= */ true, nullptr);
31 }
32
QboneReadOnlyStream(QuicStreamId id,QboneSessionBase * session)33 QboneReadOnlyStream::QboneReadOnlyStream(QuicStreamId id,
34 QboneSessionBase* session)
35 : QuicStream(id,
36 session,
37 /*is_static=*/false,
38 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(
43 QuicTime::Delta::FromSeconds(GetQuicFlag(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