// Copyright (c) 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "quic/qbone/qbone_client_session.h" #include #include "absl/strings/string_view.h" #include "quic/core/quic_types.h" #include "quic/qbone/qbone_constants.h" namespace quic { QboneClientSession::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) : QboneSessionBase(connection, owner, config, supported_versions, writer), server_id_(server_id), quic_crypto_client_config_(quic_crypto_client_config), handler_(handler) {} QboneClientSession::~QboneClientSession() {} std::unique_ptr QboneClientSession::CreateCryptoStream() { return std::make_unique( server_id_, this, nullptr, quic_crypto_client_config_, this, /*has_application_state = */ true); } void QboneClientSession::Initialize() { // Initialize must be called first, as that's what generates the crypto // stream. QboneSessionBase::Initialize(); static_cast(GetMutableCryptoStream()) ->CryptoConnect(); // Register the reserved control stream. QuicStreamId next_id = GetNextOutgoingBidirectionalStreamId(); QUICHE_DCHECK_EQ(next_id, QboneConstants::GetControlStreamId(transport_version())); auto control_stream = std::make_unique(this, handler_); control_stream_ = control_stream.get(); ActivateStream(std::move(control_stream)); } int QboneClientSession::GetNumSentClientHellos() const { return static_cast(GetCryptoStream()) ->num_sent_client_hellos(); } bool QboneClientSession::EarlyDataAccepted() const { return static_cast(GetCryptoStream()) ->EarlyDataAccepted(); } bool QboneClientSession::ReceivedInchoateReject() const { return static_cast(GetCryptoStream()) ->ReceivedInchoateReject(); } int QboneClientSession::GetNumReceivedServerConfigUpdates() const { return static_cast(GetCryptoStream()) ->num_scup_messages_received(); } bool QboneClientSession::SendServerRequest(const QboneServerRequest& request) { if (!control_stream_) { QUIC_BUG(quic_bug_11056_1) << "Cannot send server request before control stream is created."; return false; } return control_stream_->SendRequest(request); } void QboneClientSession::ProcessPacketFromNetwork(absl::string_view packet) { SendPacketToPeer(packet); } void QboneClientSession::ProcessPacketFromPeer(absl::string_view packet) { writer_->WritePacketToNetwork(packet.data(), packet.size()); } void QboneClientSession::OnProofValid( const QuicCryptoClientConfig::CachedState& cached) {} void QboneClientSession::OnProofVerifyDetailsAvailable( const ProofVerifyDetails& verify_details) {} bool QboneClientSession::HasActiveRequests() const { return GetNumActiveStreams() + num_draining_streams() > 0; } } // namespace quic