|  | // Copyright (c) 2017 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 "net/third_party/quiche/src/quic/quartc/quartc_dispatcher.h" | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/core/quic_utils.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_versions.h" | 
|  | #include "net/third_party/quiche/src/quic/quartc/quartc_factory.h" | 
|  | #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | QuartcDispatcher::QuartcDispatcher( | 
|  | std::unique_ptr<QuicConfig> config, | 
|  | std::unique_ptr<QuicCryptoServerConfig> crypto_config, | 
|  | QuicVersionManager* version_manager, | 
|  | std::unique_ptr<QuicConnectionHelperInterface> helper, | 
|  | std::unique_ptr<QuicCryptoServerStream::Helper> session_helper, | 
|  | std::unique_ptr<QuicAlarmFactory> alarm_factory, | 
|  | std::unique_ptr<QuartcPacketWriter> packet_writer, | 
|  | Delegate* delegate) | 
|  | : QuicDispatcher( | 
|  | config.get(), | 
|  | crypto_config.get(), | 
|  | version_manager, | 
|  | std::move(helper), | 
|  | std::move(session_helper), | 
|  | std::move(alarm_factory), | 
|  | QuicUtils::CreateZeroConnectionId( | 
|  | version_manager->GetSupportedVersions()[0].transport_version) | 
|  | .length()), | 
|  | owned_quic_config_(std::move(config)), | 
|  | owned_crypto_config_(std::move(crypto_config)), | 
|  | delegate_(delegate), | 
|  | packet_writer_(packet_writer.get()) { | 
|  | // Allow incoming packets to set our expected connection ID length. | 
|  | SetShouldUpdateExpectedServerConnectionIdLength(true); | 
|  | // Allow incoming packets with connection ID lengths shorter than allowed. | 
|  | SetAllowShortInitialServerConnectionIds(true); | 
|  | // QuicDispatcher takes ownership of the writer. | 
|  | QuicDispatcher::InitializeWithWriter(packet_writer.release()); | 
|  | // NB: This must happen *after* InitializeWithWriter.  It can call us back | 
|  | // with OnTransportCanWrite() immediately, and the dispatcher needs to be | 
|  | // fully initialized to handle that. | 
|  | packet_writer_->SetPacketTransportDelegate(this); | 
|  | } | 
|  |  | 
|  | QuartcDispatcher::~QuartcDispatcher() { | 
|  | packet_writer_->SetPacketTransportDelegate(nullptr); | 
|  | } | 
|  |  | 
|  | std::unique_ptr<QuicSession> QuartcDispatcher::CreateQuicSession( | 
|  | QuicConnectionId connection_id, | 
|  | const QuicSocketAddress& client_address, | 
|  | quiche::QuicheStringPiece /*alpn*/, | 
|  | const ParsedQuicVersion& version) { | 
|  | // Make our expected connection ID non-mutable since we have a connection. | 
|  | SetShouldUpdateExpectedServerConnectionIdLength(false); | 
|  | std::unique_ptr<QuicConnection> connection = CreateQuicConnection( | 
|  | connection_id, client_address, helper(), alarm_factory(), writer(), | 
|  | Perspective::IS_SERVER, ParsedQuicVersionVector{version}); | 
|  | auto session = std::make_unique<QuartcServerSession>( | 
|  | std::move(connection), /*visitor=*/this, config(), GetSupportedVersions(), | 
|  | helper()->GetClock(), crypto_config(), compressed_certs_cache(), | 
|  | session_helper()); | 
|  | delegate_->OnSessionCreated(session.get()); | 
|  | return session; | 
|  | } | 
|  |  | 
|  | void QuartcDispatcher::OnTransportCanWrite() { | 
|  | OnCanWrite(); | 
|  | } | 
|  |  | 
|  | void QuartcDispatcher::OnTransportReceived(const char* data, size_t data_len) { | 
|  | // QuartcPacketTransport does not surface real peer addresses, so the | 
|  | // dispatcher uses a dummy address when processing incoming packets. Note that | 
|  | // the dispatcher refuses to process anything with port 0. | 
|  | static const QuicSocketAddress* dummy_address = | 
|  | new QuicSocketAddress(QuicIpAddress::Any4(), /*port=*/1); | 
|  |  | 
|  | QuicReceivedPacket packet(data, data_len, helper()->GetClock()->Now()); | 
|  | ProcessPacket(/*self_address=*/*dummy_address, | 
|  | /*peer_address=*/*dummy_address, packet); | 
|  | } | 
|  |  | 
|  | }  // namespace quic |