The QuicWriteBlockedList needs to register outgoing QUIC streams so that when the QuicTransportChannel becomes unwritable and QUIC streams have buffered data, they can send data once the QuicTransportChannel becomes writable. Otherwise the QUIC streams will remain write blocked after the QuicTransportChannel is writable. BUG= Review-Url: https://codereview.webrtc.org/1888903002 Cr-Commit-Position: refs/heads/master@{#12573}
98 lines
3.6 KiB
C++
98 lines
3.6 KiB
C++
/*
|
|
* 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 <memory>
|
|
#include <string>
|
|
|
|
#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<net::QuicConnection> 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<net::QuicErrorCode, bool> 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<ReliableQuicStream*> 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<net::QuicCryptoStream> crypto_stream_;
|
|
net::QuicClock clock_; // For recording packet receipt time
|
|
|
|
RTC_DISALLOW_COPY_AND_ASSIGN(QuicSession);
|
|
};
|
|
|
|
} // namespace cricket
|
|
|
|
#endif // WEBRTC_P2P_QUIC_QUICSESSION_H_
|