xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/qbone/qbone_client_session.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_client_session.h"
6 
7 #include <utility>
8 
9 #include "absl/strings/string_view.h"
10 #include "quiche/quic/core/quic_types.h"
11 #include "quiche/quic/qbone/qbone_constants.h"
12 #include "quiche/common/platform/api/quiche_command_line_flags.h"
13 
14 namespace quic {
15 
QboneClientSession(QuicConnection * connection,QuicCryptoClientConfig * quic_crypto_client_config,QuicSession::Visitor * owner,const QuicConfig & config,const ParsedQuicVersionVector & supported_versions,const QuicServerId & server_id,QbonePacketWriter * writer,QboneClientControlStream::Handler * handler)16 QboneClientSession::QboneClientSession(
17     QuicConnection* connection,
18     QuicCryptoClientConfig* quic_crypto_client_config,
19     QuicSession::Visitor* owner, const QuicConfig& config,
20     const ParsedQuicVersionVector& supported_versions,
21     const QuicServerId& server_id, QbonePacketWriter* writer,
22     QboneClientControlStream::Handler* handler)
23     : QboneSessionBase(connection, owner, config, supported_versions, writer),
24       server_id_(server_id),
25       quic_crypto_client_config_(quic_crypto_client_config),
26       handler_(handler) {}
27 
~QboneClientSession()28 QboneClientSession::~QboneClientSession() {}
29 
CreateCryptoStream()30 std::unique_ptr<QuicCryptoStream> QboneClientSession::CreateCryptoStream() {
31   return std::make_unique<QuicCryptoClientStream>(
32       server_id_, this, nullptr, quic_crypto_client_config_, this,
33       /*has_application_state = */ true);
34 }
35 
CreateControlStream()36 void QboneClientSession::CreateControlStream() {
37   if (control_stream_ != nullptr) {
38     return;
39   }
40   // Register the reserved control stream.
41   QuicStreamId next_id = GetNextOutgoingBidirectionalStreamId();
42   QUICHE_DCHECK_EQ(next_id,
43                    QboneConstants::GetControlStreamId(transport_version()));
44   auto control_stream =
45       std::make_unique<QboneClientControlStream>(this, handler_);
46   control_stream_ = control_stream.get();
47   ActivateStream(std::move(control_stream));
48 }
49 
Initialize()50 void QboneClientSession::Initialize() {
51   // Initialize must be called first, as that's what generates the crypto
52   // stream.
53   QboneSessionBase::Initialize();
54   static_cast<QuicCryptoClientStreamBase*>(GetMutableCryptoStream())
55       ->CryptoConnect();
56 }
57 
SetDefaultEncryptionLevel(quic::EncryptionLevel level)58 void QboneClientSession::SetDefaultEncryptionLevel(
59     quic::EncryptionLevel level) {
60   QboneSessionBase::SetDefaultEncryptionLevel(level);
61   if (level == quic::ENCRYPTION_FORWARD_SECURE) {
62     CreateControlStream();
63   }
64 }
65 
GetNumSentClientHellos() const66 int QboneClientSession::GetNumSentClientHellos() const {
67   return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
68       ->num_sent_client_hellos();
69 }
70 
EarlyDataAccepted() const71 bool QboneClientSession::EarlyDataAccepted() const {
72   return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
73       ->EarlyDataAccepted();
74 }
75 
ReceivedInchoateReject() const76 bool QboneClientSession::ReceivedInchoateReject() const {
77   return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
78       ->ReceivedInchoateReject();
79 }
80 
GetNumReceivedServerConfigUpdates() const81 int QboneClientSession::GetNumReceivedServerConfigUpdates() const {
82   return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
83       ->num_scup_messages_received();
84 }
85 
SendServerRequest(const QboneServerRequest & request)86 bool QboneClientSession::SendServerRequest(const QboneServerRequest& request) {
87   if (!control_stream_) {
88     QUIC_BUG(quic_bug_11056_1)
89         << "Cannot send server request before control stream is created.";
90     return false;
91   }
92   return control_stream_->SendRequest(request);
93 }
94 
ProcessPacketFromNetwork(absl::string_view packet)95 void QboneClientSession::ProcessPacketFromNetwork(absl::string_view packet) {
96   SendPacketToPeer(packet);
97 }
98 
ProcessPacketFromPeer(absl::string_view packet)99 void QboneClientSession::ProcessPacketFromPeer(absl::string_view packet) {
100   writer_->WritePacketToNetwork(packet.data(), packet.size());
101 }
102 
OnProofValid(const QuicCryptoClientConfig::CachedState & cached)103 void QboneClientSession::OnProofValid(
104     const QuicCryptoClientConfig::CachedState& cached) {}
105 
OnProofVerifyDetailsAvailable(const ProofVerifyDetails & verify_details)106 void QboneClientSession::OnProofVerifyDetailsAvailable(
107     const ProofVerifyDetails& verify_details) {}
108 
HasActiveRequests() const109 bool QboneClientSession::HasActiveRequests() const {
110   return GetNumActiveStreams() + num_draining_streams() > 0;
111 }
112 
113 }  // namespace quic
114