wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 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 | |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 5 | #include "quic/qbone/qbone_client_session.h" |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 6 | |
bnc | 463f235 | 2019-10-10 04:49:34 -0700 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
vasilvv | 1436e34 | 2020-10-09 12:31:16 -0700 | [diff] [blame] | 9 | #include "absl/strings/string_view.h" |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 10 | #include "quic/core/quic_types.h" |
| 11 | #include "quic/qbone/qbone_constants.h" |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 12 | |
| 13 | namespace quic { |
| 14 | |
| 15 | QboneClientSession::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 | |
| 29 | QboneClientSession::~QboneClientSession() {} |
| 30 | |
| 31 | std::unique_ptr<QuicCryptoStream> QboneClientSession::CreateCryptoStream() { |
vasilvv | 0fc587f | 2019-09-06 13:33:08 -0700 | [diff] [blame] | 32 | return std::make_unique<QuicCryptoClientStream>( |
renjietang | bcc066a | 2020-04-21 18:05:57 -0700 | [diff] [blame] | 33 | server_id_, this, nullptr, quic_crypto_client_config_, this, |
| 34 | /*has_application_state = */ true); |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 35 | } |
| 36 | |
| 37 | void 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(); |
vasilvv | f803516 | 2021-02-01 14:49:14 -0800 | [diff] [blame] | 45 | QUICHE_DCHECK_EQ(next_id, |
| 46 | QboneConstants::GetControlStreamId(transport_version())); |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 47 | auto control_stream = |
vasilvv | 0fc587f | 2019-09-06 13:33:08 -0700 | [diff] [blame] | 48 | std::make_unique<QboneClientControlStream>(this, handler_); |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 49 | control_stream_ = control_stream.get(); |
renjietang | 5c729f0 | 2019-09-06 12:43:48 -0700 | [diff] [blame] | 50 | ActivateStream(std::move(control_stream)); |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 51 | } |
| 52 | |
| 53 | int QboneClientSession::GetNumSentClientHellos() const { |
| 54 | return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream()) |
| 55 | ->num_sent_client_hellos(); |
| 56 | } |
| 57 | |
nharper | 4084fc9 | 2020-02-10 14:43:35 -0800 | [diff] [blame] | 58 | bool QboneClientSession::EarlyDataAccepted() const { |
| 59 | return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream()) |
| 60 | ->EarlyDataAccepted(); |
| 61 | } |
| 62 | |
| 63 | bool QboneClientSession::ReceivedInchoateReject() const { |
| 64 | return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream()) |
| 65 | ->ReceivedInchoateReject(); |
| 66 | } |
| 67 | |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 68 | int QboneClientSession::GetNumReceivedServerConfigUpdates() const { |
| 69 | return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream()) |
| 70 | ->num_scup_messages_received(); |
| 71 | } |
| 72 | |
| 73 | bool QboneClientSession::SendServerRequest(const QboneServerRequest& request) { |
| 74 | if (!control_stream_) { |
QUICHE team | 7ec20c2 | 2021-03-16 14:45:53 -0700 | [diff] [blame] | 75 | QUIC_BUG(quic_bug_11056_1) |
QUICHE team | 57b0aac | 2021-03-08 15:13:24 -0800 | [diff] [blame] | 76 | << "Cannot send server request before control stream is created."; |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 77 | return false; |
| 78 | } |
| 79 | return control_stream_->SendRequest(request); |
| 80 | } |
| 81 | |
vasilvv | 1436e34 | 2020-10-09 12:31:16 -0700 | [diff] [blame] | 82 | void QboneClientSession::ProcessPacketFromNetwork(absl::string_view packet) { |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 83 | SendPacketToPeer(packet); |
| 84 | } |
| 85 | |
vasilvv | 1436e34 | 2020-10-09 12:31:16 -0700 | [diff] [blame] | 86 | void QboneClientSession::ProcessPacketFromPeer(absl::string_view packet) { |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 87 | writer_->WritePacketToNetwork(packet.data(), packet.size()); |
| 88 | } |
| 89 | |
| 90 | void QboneClientSession::OnProofValid( |
| 91 | const QuicCryptoClientConfig::CachedState& cached) {} |
| 92 | |
| 93 | void QboneClientSession::OnProofVerifyDetailsAvailable( |
| 94 | const ProofVerifyDetails& verify_details) {} |
| 95 | |
| 96 | bool QboneClientSession::HasActiveRequests() const { |
renjietang | 0bf2a6f | 2020-09-30 14:58:24 -0700 | [diff] [blame] | 97 | return GetNumActiveStreams() + num_draining_streams() > 0; |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 98 | } |
| 99 | |
| 100 | } // namespace quic |