|  | // 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_server_session.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quic/core/quic_connection_id.h" | 
|  | #include "quic/core/quic_types.h" | 
|  | #include "quic/core/quic_utils.h" | 
|  | #include "quic/qbone/qbone_constants.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | bool QboneCryptoServerStreamHelper::CanAcceptClientHello( | 
|  | const CryptoHandshakeMessage& chlo, | 
|  | const QuicSocketAddress& client_address, | 
|  | const QuicSocketAddress& peer_address, | 
|  | const QuicSocketAddress& self_address, | 
|  | std::string* error_details) const { | 
|  | absl::string_view alpn; | 
|  | chlo.GetStringPiece(quic::kALPN, &alpn); | 
|  | if (alpn != QboneConstants::kQboneAlpn) { | 
|  | *error_details = "ALPN-indicated protocol is not qbone"; | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | QboneServerSession::QboneServerSession( | 
|  | const quic::ParsedQuicVersionVector& supported_versions, | 
|  | QuicConnection* connection, | 
|  | Visitor* owner, | 
|  | const QuicConfig& config, | 
|  | const QuicCryptoServerConfig* quic_crypto_server_config, | 
|  | QuicCompressedCertsCache* compressed_certs_cache, | 
|  | QbonePacketWriter* writer, | 
|  | QuicIpAddress self_ip, | 
|  | QuicIpAddress client_ip, | 
|  | size_t client_ip_subnet_length, | 
|  | QboneServerControlStream::Handler* handler) | 
|  | : QboneSessionBase(connection, owner, config, supported_versions, writer), | 
|  | processor_(self_ip, client_ip, client_ip_subnet_length, this, this), | 
|  | quic_crypto_server_config_(quic_crypto_server_config), | 
|  | compressed_certs_cache_(compressed_certs_cache), | 
|  | handler_(handler) {} | 
|  |  | 
|  | QboneServerSession::~QboneServerSession() {} | 
|  |  | 
|  | std::unique_ptr<QuicCryptoStream> QboneServerSession::CreateCryptoStream() { | 
|  | return CreateCryptoServerStream(quic_crypto_server_config_, | 
|  | compressed_certs_cache_, this, | 
|  | &stream_helper_); | 
|  | } | 
|  |  | 
|  | void QboneServerSession::Initialize() { | 
|  | QboneSessionBase::Initialize(); | 
|  | // Register the reserved control stream. | 
|  | auto control_stream = | 
|  | std::make_unique<QboneServerControlStream>(this, handler_); | 
|  | control_stream_ = control_stream.get(); | 
|  | ActivateStream(std::move(control_stream)); | 
|  | } | 
|  |  | 
|  | bool QboneServerSession::SendClientRequest(const QboneClientRequest& request) { | 
|  | if (!control_stream_) { | 
|  | QUIC_BUG(quic_bug_11026_1) | 
|  | << "Cannot send client request before control stream is created."; | 
|  | return false; | 
|  | } | 
|  | return control_stream_->SendRequest(request); | 
|  | } | 
|  |  | 
|  | void QboneServerSession::ProcessPacketFromNetwork(absl::string_view packet) { | 
|  | std::string buffer = std::string(packet); | 
|  | processor_.ProcessPacket(&buffer, | 
|  | QbonePacketProcessor::Direction::FROM_NETWORK); | 
|  | } | 
|  |  | 
|  | void QboneServerSession::ProcessPacketFromPeer(absl::string_view packet) { | 
|  | std::string buffer = std::string(packet); | 
|  | processor_.ProcessPacket(&buffer, | 
|  | QbonePacketProcessor::Direction::FROM_OFF_NETWORK); | 
|  | } | 
|  |  | 
|  | void QboneServerSession::SendPacketToClient(absl::string_view packet) { | 
|  | SendPacketToPeer(packet); | 
|  | } | 
|  |  | 
|  | void QboneServerSession::SendPacketToNetwork(absl::string_view packet) { | 
|  | QUICHE_DCHECK(writer_ != nullptr); | 
|  | writer_->WritePacketToNetwork(packet.data(), packet.size()); | 
|  | } | 
|  |  | 
|  | }  // namespace quic |