blob: d6cdf06ab0711100b6335edcc3f71d1f8dbc14fe [file] [log] [blame]
/** @file
*
* A brief file description
*
* @section license License
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "tscore/List.h"
#include "P_VConnection.h"
#include "I_Event.h"
#include "QUICFrame.h"
#include "QUICStreamState.h"
#include "QUICFlowController.h"
#include "QUICIncomingFrameBuffer.h"
#include "QUICFrameGenerator.h"
#include "QUICConnection.h"
#include "QUICFrameRetransmitter.h"
#include "QUICDebugNames.h"
class QUICStreamAdapter;
class QUICStreamStateListener;
/**
* @brief QUIC Stream
* TODO: This is similar to Http2Stream. Need to think some integration.
*/
class QUICStream : public QUICFrameGenerator, public QUICFrameRetransmitter
{
public:
QUICStream() {}
QUICStream(QUICConnectionInfoProvider *cinfo, QUICStreamId sid);
virtual ~QUICStream();
QUICStreamId id() const;
QUICStreamDirection direction() const;
const QUICConnectionInfoProvider *connection_info() const;
bool is_bidirectional() const;
QUICOffset final_offset() const;
/**
* Set an adapter to read/write data from/to this stream
*
* This is an interface for QUICApplication. An application can set an adapter
* to access data in the way the applications wants.
*/
void set_io_adapter(QUICStreamAdapter *adapter);
/*
* QUICApplication need to call one of these functions when it process VC_EVENT_*
*/
virtual void on_read();
virtual void on_eos();
virtual QUICConnectionErrorUPtr recv(const QUICStreamFrame &frame);
virtual QUICConnectionErrorUPtr recv(const QUICMaxStreamDataFrame &frame);
virtual QUICConnectionErrorUPtr recv(const QUICStreamDataBlockedFrame &frame);
virtual QUICConnectionErrorUPtr recv(const QUICStopSendingFrame &frame);
virtual QUICConnectionErrorUPtr recv(const QUICRstStreamFrame &frame);
virtual QUICConnectionErrorUPtr recv(const QUICCryptoFrame &frame);
QUICOffset reordered_bytes() const;
virtual QUICOffset largest_offset_received() const;
virtual QUICOffset largest_offset_sent() const;
virtual void stop_sending(QUICStreamErrorUPtr error);
virtual void reset(QUICStreamErrorUPtr error);
void set_state_listener(QUICStreamStateListener *listener);
LINK(QUICStream, link);
protected:
QUICConnectionInfoProvider *_connection_info = nullptr;
QUICStreamId _id = 0;
QUICOffset _send_offset = 0;
QUICOffset _reordered_bytes = 0;
QUICStreamAdapter *_adapter = nullptr;
QUICStreamStateListener *_state_listener = nullptr;
virtual void _on_adapter_updated(){};
void _notify_state_change();
void _records_rst_stream_frame(QUICEncryptionLevel level, const QUICRstStreamFrame &frame);
void _records_stream_frame(QUICEncryptionLevel level, const QUICStreamFrame &frame);
void _records_stop_sending_frame(QUICEncryptionLevel level, const QUICStopSendingFrame &frame);
void _records_crypto_frame(QUICEncryptionLevel level, const QUICCryptoFrame &frame);
};
class QUICStreamStateListener
{
public:
virtual void on_stream_state_close(const QUICStream *stream) = 0;
};
#define QUICStreamDebug(fmt, ...) \
Debug("quic_stream", "[%s] [%" PRIu64 "] [%s] " fmt, this->_connection_info->cids().data(), this->_id, \
QUICDebugNames::stream_state(this->_state.get()), ##__VA_ARGS__)
#define QUICVStreamDebug(fmt, ...) \
Debug("v_quic_stream", "[%s] [%" PRIu64 "] [%s] " fmt, this->_connection_info->cids().data(), this->_id, \
QUICDebugNames::stream_state(this->_state.get()), ##__VA_ARGS__)
#define QUICStreamFCDebug(fmt, ...) \
Debug("quic_flow_ctrl", "[%s] [%" PRIu64 "] [%s] " fmt, this->_connection_info->cids().data(), this->_id, \
QUICDebugNames::stream_state(this->_state.get()), ##__VA_ARGS__)
#define QUICVStreamFCDebug(fmt, ...) \
Debug("v_quic_flow_ctrl", "[%s] [%" PRIu64 "] [%s] " fmt, this->_connection_info->cids().data(), this->_id, \
QUICDebugNames::stream_state(this->_state.get()), ##__VA_ARGS__)
extern const uint32_t MAX_STREAM_FRAME_OVERHEAD;