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 "net/third_party/quiche/src/quic/qbone/qbone_client.h"
6
7 #include <utility>
8
9 #include "net/third_party/quiche/src/quic/core/quic_epoll_alarm_factory.h"
10 #include "net/third_party/quiche/src/quic/core/quic_epoll_connection_helper.h"
11 #include "net/third_party/quiche/src/quic/platform/api/quic_epoll.h"
12 #include "net/third_party/quiche/src/quic/platform/api/quic_exported_stats.h"
13 #include "net/third_party/quiche/src/quic/qbone/qbone_stream.h"
14 #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
15
16 namespace quic {
17 namespace {
CreateNetworkHelper(QuicEpollServer * epoll_server,QboneClient * client)18 std::unique_ptr<QuicClientBase::NetworkHelper> CreateNetworkHelper(
19 QuicEpollServer* epoll_server,
20 QboneClient* client) {
21 std::unique_ptr<QuicClientBase::NetworkHelper> helper =
22 std::make_unique<QuicClientEpollNetworkHelper>(epoll_server, client);
23 testing::testvalue::Adjust("QboneClient/network_helper", &helper);
24 return helper;
25 }
26 } // namespace
27
QboneClient(QuicSocketAddress server_address,const QuicServerId & server_id,const ParsedQuicVersionVector & supported_versions,QuicSession::Visitor * session_owner,const QuicConfig & config,QuicEpollServer * epoll_server,std::unique_ptr<ProofVerifier> proof_verifier,QbonePacketWriter * qbone_writer,QboneClientControlStream::Handler * qbone_handler)28 QboneClient::QboneClient(QuicSocketAddress server_address,
29 const QuicServerId& server_id,
30 const ParsedQuicVersionVector& supported_versions,
31 QuicSession::Visitor* session_owner,
32 const QuicConfig& config,
33 QuicEpollServer* epoll_server,
34 std::unique_ptr<ProofVerifier> proof_verifier,
35 QbonePacketWriter* qbone_writer,
36 QboneClientControlStream::Handler* qbone_handler)
37 : QuicClientBase(
38 server_id,
39 supported_versions,
40 config,
41 new QuicEpollConnectionHelper(epoll_server, QuicAllocator::SIMPLE),
42 new QuicEpollAlarmFactory(epoll_server),
43 CreateNetworkHelper(epoll_server, this),
44 std::move(proof_verifier),
45 nullptr),
46 qbone_writer_(qbone_writer),
47 qbone_handler_(qbone_handler),
48 session_owner_(session_owner) {
49 set_server_address(server_address);
50 crypto_config()->set_alpn("qbone");
51 }
52
~QboneClient()53 QboneClient::~QboneClient() {
54 ResetSession();
55 }
56
qbone_session()57 QboneClientSession* QboneClient::qbone_session() {
58 return static_cast<QboneClientSession*>(QuicClientBase::session());
59 }
60
ProcessPacketFromNetwork(quiche::QuicheStringPiece packet)61 void QboneClient::ProcessPacketFromNetwork(quiche::QuicheStringPiece packet) {
62 qbone_session()->ProcessPacketFromNetwork(packet);
63 }
64
EarlyDataAccepted()65 bool QboneClient::EarlyDataAccepted() {
66 return qbone_session()->EarlyDataAccepted();
67 }
68
ReceivedInchoateReject()69 bool QboneClient::ReceivedInchoateReject() {
70 return qbone_session()->ReceivedInchoateReject();
71 }
72
GetNumSentClientHellosFromSession()73 int QboneClient::GetNumSentClientHellosFromSession() {
74 return qbone_session()->GetNumSentClientHellos();
75 }
76
GetNumReceivedServerConfigUpdatesFromSession()77 int QboneClient::GetNumReceivedServerConfigUpdatesFromSession() {
78 return qbone_session()->GetNumReceivedServerConfigUpdates();
79 }
80
ResendSavedData()81 void QboneClient::ResendSavedData() {
82 // no op.
83 }
84
ClearDataToResend()85 void QboneClient::ClearDataToResend() {
86 // no op.
87 }
88
HasActiveRequests()89 bool QboneClient::HasActiveRequests() {
90 return qbone_session()->HasActiveRequests();
91 }
92
93 class QboneClientSessionWithConnection : public QboneClientSession {
94 public:
95 using QboneClientSession::QboneClientSession;
96
~QboneClientSessionWithConnection()97 ~QboneClientSessionWithConnection() override { DeleteConnection(); }
98 };
99
100 // Takes ownership of |connection|.
CreateQuicClientSession(const ParsedQuicVersionVector & supported_versions,QuicConnection * connection)101 std::unique_ptr<QuicSession> QboneClient::CreateQuicClientSession(
102 const ParsedQuicVersionVector& supported_versions,
103 QuicConnection* connection) {
104 return std::make_unique<QboneClientSessionWithConnection>(
105 connection, crypto_config(), session_owner(), *config(),
106 supported_versions, server_id(), qbone_writer_, qbone_handler_);
107 }
108
109 } // namespace quic
110