/* * Copyright 2016 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef WEBRTC_P2P_QUIC_QUICSESSION_H_ #define WEBRTC_P2P_QUIC_QUICSESSION_H_ #include #include #include "net/quic/quic_crypto_client_stream.h" #include "net/quic/quic_crypto_server_stream.h" #include "net/quic/quic_crypto_stream.h" #include "net/quic/quic_session.h" #include "webrtc/base/constructormagic.h" #include "webrtc/base/sigslot.h" #include "webrtc/base/sslidentity.h" #include "webrtc/p2p/quic/reliablequicstream.h" namespace cricket { // This class provides a QUIC session over peer-to-peer transport that // negotiates the crypto handshake (using QuicCryptoHandshake) and provides // reading/writing of data using QUIC packets. class QuicSession : public net::QuicSession, public sigslot::has_slots<> { public: QuicSession(std::unique_ptr connection, const net::QuicConfig& config); ~QuicSession() override; // Initiates client crypto handshake by sending client hello. void StartClientHandshake(net::QuicCryptoClientStream* crypto_stream); // Responds to a client who has inititated the crypto handshake. void StartServerHandshake(net::QuicCryptoServerStream* crypto_stream); // QuicSession overrides. net::QuicCryptoStream* GetCryptoStream() override { return crypto_stream_.get(); } ReliableQuicStream* CreateOutgoingDynamicStream( net::SpdyPriority priority) override; // QuicSession optional overrides. void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override; void CloseStream(net::QuicStreamId stream_id) override; // QuicConnectionVisitorInterface overrides. void OnConnectionClosed(net::QuicErrorCode error, const std::string& error_details, net::ConnectionCloseSource source) override; // Exports keying material for SRTP. bool ExportKeyingMaterial(base::StringPiece label, base::StringPiece context, size_t result_len, std::string* result); // Decrypts an incoming QUIC packet to a data stream. bool OnReadPacket(const char* data, size_t data_len); // Called when peers have established forward-secure encryption sigslot::signal0<> SignalHandshakeComplete; // Called when connection closes locally, or remotely by peer. sigslot::signal2 SignalConnectionClosed; // Called when an incoming QUIC stream is created so we can process data // from it by registering a listener to // ReliableQuicStream::SignalDataReceived. sigslot::signal1 SignalIncomingStream; protected: // Sets the QUIC crypto stream and takes ownership of it. void SetCryptoStream(net::QuicCryptoStream* crypto_stream); // QuicSession override. ReliableQuicStream* CreateIncomingDynamicStream( net::QuicStreamId id) override; virtual ReliableQuicStream* CreateDataStream(net::QuicStreamId id, net::SpdyPriority priority); private: std::unique_ptr crypto_stream_; net::QuicClock clock_; // For recording packet receipt time RTC_DISALLOW_COPY_AND_ASSIGN(QuicSession); }; } // namespace cricket #endif // WEBRTC_P2P_QUIC_QUICSESSION_H_