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