|  | // Copyright 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 "net/third_party/quiche/src/quic/masque/masque_client_session.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | MasqueClientSession::MasqueClientSession( | 
|  | const QuicConfig& config, | 
|  | const ParsedQuicVersionVector& supported_versions, | 
|  | QuicConnection* connection, | 
|  | const QuicServerId& server_id, | 
|  | QuicCryptoClientConfig* crypto_config, | 
|  | QuicClientPushPromiseIndex* push_promise_index, | 
|  | Owner* owner) | 
|  | : QuicSpdyClientSession(config, | 
|  | supported_versions, | 
|  | connection, | 
|  | server_id, | 
|  | crypto_config, | 
|  | push_promise_index), | 
|  | owner_(owner), | 
|  | compression_engine_(this) {} | 
|  |  | 
|  | void MasqueClientSession::OnMessageReceived(quiche::QuicheStringPiece message) { | 
|  | QUIC_DVLOG(1) << "Received DATAGRAM frame of length " << message.length(); | 
|  |  | 
|  | QuicConnectionId client_connection_id, server_connection_id; | 
|  | QuicSocketAddress server_address; | 
|  | std::vector<char> packet; | 
|  | bool version_present; | 
|  | if (!compression_engine_.DecompressDatagram( | 
|  | message, &client_connection_id, &server_connection_id, | 
|  | &server_address, &packet, &version_present)) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | auto connection_id_registration = | 
|  | client_connection_id_registrations_.find(client_connection_id); | 
|  | if (connection_id_registration == client_connection_id_registrations_.end()) { | 
|  | QUIC_DLOG(ERROR) << "MasqueClientSession failed to dispatch " | 
|  | << client_connection_id; | 
|  | return; | 
|  | } | 
|  | EncapsulatedClientSession* encapsulated_client_session = | 
|  | connection_id_registration->second; | 
|  | encapsulated_client_session->ProcessPacket( | 
|  | quiche::QuicheStringPiece(packet.data(), packet.size()), server_address); | 
|  |  | 
|  | QUIC_DVLOG(1) << "Sent " << packet.size() << " bytes to connection for " | 
|  | << client_connection_id; | 
|  | } | 
|  |  | 
|  | void MasqueClientSession::OnMessageAcked(QuicMessageId message_id, | 
|  | QuicTime /*receive_timestamp*/) { | 
|  | QUIC_DVLOG(1) << "Received ack for DATAGRAM frame " << message_id; | 
|  | } | 
|  |  | 
|  | void MasqueClientSession::OnMessageLost(QuicMessageId message_id) { | 
|  | QUIC_DVLOG(1) << "We believe DATAGRAM frame " << message_id << " was lost"; | 
|  | } | 
|  |  | 
|  | void MasqueClientSession::SendPacket(QuicConnectionId client_connection_id, | 
|  | QuicConnectionId server_connection_id, | 
|  | quiche::QuicheStringPiece packet, | 
|  | const QuicSocketAddress& server_address) { | 
|  | compression_engine_.CompressAndSendPacket( | 
|  | packet, client_connection_id, server_connection_id, server_address); | 
|  | } | 
|  |  | 
|  | void MasqueClientSession::RegisterConnectionId( | 
|  | QuicConnectionId client_connection_id, | 
|  | EncapsulatedClientSession* encapsulated_client_session) { | 
|  | QUIC_DLOG(INFO) << "Registering " << client_connection_id | 
|  | << " to encapsulated client"; | 
|  | DCHECK(client_connection_id_registrations_.find(client_connection_id) == | 
|  | client_connection_id_registrations_.end() || | 
|  | client_connection_id_registrations_[client_connection_id] == | 
|  | encapsulated_client_session); | 
|  | client_connection_id_registrations_[client_connection_id] = | 
|  | encapsulated_client_session; | 
|  | } | 
|  |  | 
|  | void MasqueClientSession::UnregisterConnectionId( | 
|  | QuicConnectionId client_connection_id) { | 
|  | QUIC_DLOG(INFO) << "Unregistering " << client_connection_id; | 
|  | if (client_connection_id_registrations_.find(client_connection_id) != | 
|  | client_connection_id_registrations_.end()) { | 
|  | client_connection_id_registrations_.erase(client_connection_id); | 
|  | owner_->UnregisterClientConnectionId(client_connection_id); | 
|  | compression_engine_.UnregisterClientConnectionId(client_connection_id); | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace quic |