blob: 1f8ca0ab788a35caf0f34cf1eeb93d1b6574b4f6 [file] [log] [blame]
wubf975eac2019-08-19 19:41:01 -07001// 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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/qbone/qbone_client_session.h"
wubf975eac2019-08-19 19:41:01 -07006
bnc463f2352019-10-10 04:49:34 -07007#include <utility>
8
vasilvv1436e342020-10-09 12:31:16 -07009#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -050010#include "quic/core/quic_types.h"
11#include "quic/qbone/qbone_constants.h"
wubf975eac2019-08-19 19:41:01 -070012
13namespace quic {
14
15QboneClientSession::QboneClientSession(
16 QuicConnection* connection,
17 QuicCryptoClientConfig* quic_crypto_client_config,
18 QuicSession::Visitor* owner,
19 const QuicConfig& config,
20 const ParsedQuicVersionVector& supported_versions,
21 const QuicServerId& server_id,
22 QbonePacketWriter* writer,
23 QboneClientControlStream::Handler* handler)
24 : QboneSessionBase(connection, owner, config, supported_versions, writer),
25 server_id_(server_id),
26 quic_crypto_client_config_(quic_crypto_client_config),
27 handler_(handler) {}
28
29QboneClientSession::~QboneClientSession() {}
30
31std::unique_ptr<QuicCryptoStream> QboneClientSession::CreateCryptoStream() {
vasilvv0fc587f2019-09-06 13:33:08 -070032 return std::make_unique<QuicCryptoClientStream>(
renjietangbcc066a2020-04-21 18:05:57 -070033 server_id_, this, nullptr, quic_crypto_client_config_, this,
34 /*has_application_state = */ true);
wubf975eac2019-08-19 19:41:01 -070035}
36
37void QboneClientSession::Initialize() {
38 // Initialize must be called first, as that's what generates the crypto
39 // stream.
40 QboneSessionBase::Initialize();
41 static_cast<QuicCryptoClientStreamBase*>(GetMutableCryptoStream())
42 ->CryptoConnect();
43 // Register the reserved control stream.
44 QuicStreamId next_id = GetNextOutgoingBidirectionalStreamId();
vasilvvf8035162021-02-01 14:49:14 -080045 QUICHE_DCHECK_EQ(next_id,
46 QboneConstants::GetControlStreamId(transport_version()));
wubf975eac2019-08-19 19:41:01 -070047 auto control_stream =
vasilvv0fc587f2019-09-06 13:33:08 -070048 std::make_unique<QboneClientControlStream>(this, handler_);
wubf975eac2019-08-19 19:41:01 -070049 control_stream_ = control_stream.get();
renjietang5c729f02019-09-06 12:43:48 -070050 ActivateStream(std::move(control_stream));
wubf975eac2019-08-19 19:41:01 -070051}
52
53int QboneClientSession::GetNumSentClientHellos() const {
54 return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
55 ->num_sent_client_hellos();
56}
57
nharper4084fc92020-02-10 14:43:35 -080058bool QboneClientSession::EarlyDataAccepted() const {
59 return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
60 ->EarlyDataAccepted();
61}
62
63bool QboneClientSession::ReceivedInchoateReject() const {
64 return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
65 ->ReceivedInchoateReject();
66}
67
wubf975eac2019-08-19 19:41:01 -070068int QboneClientSession::GetNumReceivedServerConfigUpdates() const {
69 return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
70 ->num_scup_messages_received();
71}
72
73bool QboneClientSession::SendServerRequest(const QboneServerRequest& request) {
74 if (!control_stream_) {
QUICHE team7ec20c22021-03-16 14:45:53 -070075 QUIC_BUG(quic_bug_11056_1)
QUICHE team57b0aac2021-03-08 15:13:24 -080076 << "Cannot send server request before control stream is created.";
wubf975eac2019-08-19 19:41:01 -070077 return false;
78 }
79 return control_stream_->SendRequest(request);
80}
81
vasilvv1436e342020-10-09 12:31:16 -070082void QboneClientSession::ProcessPacketFromNetwork(absl::string_view packet) {
wubf975eac2019-08-19 19:41:01 -070083 SendPacketToPeer(packet);
84}
85
vasilvv1436e342020-10-09 12:31:16 -070086void QboneClientSession::ProcessPacketFromPeer(absl::string_view packet) {
wubf975eac2019-08-19 19:41:01 -070087 writer_->WritePacketToNetwork(packet.data(), packet.size());
88}
89
90void QboneClientSession::OnProofValid(
91 const QuicCryptoClientConfig::CachedState& cached) {}
92
93void QboneClientSession::OnProofVerifyDetailsAvailable(
94 const ProofVerifyDetails& verify_details) {}
95
96bool QboneClientSession::HasActiveRequests() const {
renjietang0bf2a6f2020-09-30 14:58:24 -070097 return GetNumActiveStreams() + num_draining_streams() > 0;
wubf975eac2019-08-19 19:41:01 -070098}
99
100} // namespace quic