blob: e59596df88c050bc02f8e91880ad597ce4b0c817 [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
5#include "net/third_party/quiche/src/quic/qbone/qbone_client_session.h"
6
bnc463f2352019-10-10 04:49:34 -07007#include <utility>
8
wubf975eac2019-08-19 19:41:01 -07009#include "net/third_party/quiche/src/quic/core/quic_types.h"
wubf975eac2019-08-19 19:41:01 -070010#include "net/third_party/quiche/src/quic/qbone/qbone_constants.h"
11
12namespace quic {
13
14QboneClientSession::QboneClientSession(
15 QuicConnection* connection,
16 QuicCryptoClientConfig* quic_crypto_client_config,
17 QuicSession::Visitor* owner,
18 const QuicConfig& config,
19 const ParsedQuicVersionVector& supported_versions,
20 const QuicServerId& server_id,
21 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
28QboneClientSession::~QboneClientSession() {}
29
30std::unique_ptr<QuicCryptoStream> QboneClientSession::CreateCryptoStream() {
vasilvv0fc587f2019-09-06 13:33:08 -070031 return std::make_unique<QuicCryptoClientStream>(
wubf975eac2019-08-19 19:41:01 -070032 server_id_, this, nullptr, quic_crypto_client_config_, this);
33}
34
35void QboneClientSession::Initialize() {
36 // Initialize must be called first, as that's what generates the crypto
37 // stream.
38 QboneSessionBase::Initialize();
39 static_cast<QuicCryptoClientStreamBase*>(GetMutableCryptoStream())
40 ->CryptoConnect();
41 // Register the reserved control stream.
42 QuicStreamId next_id = GetNextOutgoingBidirectionalStreamId();
renjietangd1d00852019-09-06 10:43:12 -070043 DCHECK_EQ(next_id, QboneConstants::GetControlStreamId(transport_version()));
wubf975eac2019-08-19 19:41:01 -070044 auto control_stream =
vasilvv0fc587f2019-09-06 13:33:08 -070045 std::make_unique<QboneClientControlStream>(this, handler_);
wubf975eac2019-08-19 19:41:01 -070046 control_stream_ = control_stream.get();
renjietang5c729f02019-09-06 12:43:48 -070047 ActivateStream(std::move(control_stream));
wubf975eac2019-08-19 19:41:01 -070048}
49
50int QboneClientSession::GetNumSentClientHellos() const {
51 return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
52 ->num_sent_client_hellos();
53}
54
55int QboneClientSession::GetNumReceivedServerConfigUpdates() const {
56 return static_cast<const QuicCryptoClientStreamBase*>(GetCryptoStream())
57 ->num_scup_messages_received();
58}
59
60bool QboneClientSession::SendServerRequest(const QboneServerRequest& request) {
61 if (!control_stream_) {
62 QUIC_BUG << "Cannot send server request before control stream is created.";
63 return false;
64 }
65 return control_stream_->SendRequest(request);
66}
67
68void QboneClientSession::ProcessPacketFromNetwork(QuicStringPiece packet) {
69 SendPacketToPeer(packet);
70}
71
72void QboneClientSession::ProcessPacketFromPeer(QuicStringPiece packet) {
73 writer_->WritePacketToNetwork(packet.data(), packet.size());
74}
75
76void QboneClientSession::OnProofValid(
77 const QuicCryptoClientConfig::CachedState& cached) {}
78
79void QboneClientSession::OnProofVerifyDetailsAvailable(
80 const ProofVerifyDetails& verify_details) {}
81
82bool QboneClientSession::HasActiveRequests() const {
83 return (stream_map().size() - num_incoming_static_streams() -
84 num_outgoing_static_streams()) > 0;
85}
86
87} // namespace quic