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