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