mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-29 10:31:25 +02:00
This flag is set when the STREAM frame with FIN set has been received on a qcs instance. For now, this is only used as a BUG_ON guard to prevent against multiple frames with FIN set. It will also be useful when reorganize the RX path and move some of its code in the mux.
108 lines
3.1 KiB
C
108 lines
3.1 KiB
C
#ifndef _HAPROXY_MUX_QUIC_T_H
|
|
#define _HAPROXY_MUX_QUIC_T_H
|
|
|
|
#ifdef USE_QUIC
|
|
#ifndef USE_OPENSSL
|
|
#error "Must define USE_OPENSSL"
|
|
#endif
|
|
|
|
#include <import/ebtree-t.h>
|
|
|
|
#include <haproxy/buf-t.h>
|
|
#include <haproxy/connection-t.h>
|
|
|
|
/* Stream types */
|
|
enum qcs_type {
|
|
QCS_CLT_BIDI,
|
|
QCS_SRV_BIDI,
|
|
QCS_CLT_UNI,
|
|
QCS_SRV_UNI,
|
|
|
|
/* Must be the last one */
|
|
QCS_MAX_TYPES
|
|
};
|
|
|
|
#define QC_CF_CC_RECV 0x00000001
|
|
|
|
struct qcc {
|
|
struct connection *conn;
|
|
uint32_t flags; /* QC_CF_* */
|
|
|
|
struct {
|
|
uint64_t max_streams; /* maximum number of concurrent streams */
|
|
uint64_t largest_id; /* Largest ID of the open streams */
|
|
uint64_t nb_streams; /* Number of open streams */
|
|
struct {
|
|
uint64_t max_data; /* Maximum number of bytes which may be received */
|
|
uint64_t bytes; /* Number of bytes received */
|
|
} rx;
|
|
struct {
|
|
uint64_t max_data; /* Maximum number of bytes which may be sent */
|
|
uint64_t bytes; /* Number of bytes sent */
|
|
} tx;
|
|
} strms[QCS_MAX_TYPES];
|
|
|
|
struct {
|
|
uint64_t max_data; /* Maximum number of bytes which may be received */
|
|
} rx;
|
|
struct {
|
|
uint64_t max_data; /* Maximum number of bytes which may be sent */
|
|
} tx;
|
|
|
|
struct eb_root streams_by_id; /* all active streams by their ID */
|
|
|
|
struct wait_event wait_event; /* To be used if we're waiting for I/Os */
|
|
struct wait_event *subs;
|
|
|
|
/* haproxy timeout management */
|
|
struct task *task;
|
|
int timeout;
|
|
|
|
const struct qcc_app_ops *app_ops;
|
|
void *ctx; /* Application layer context */
|
|
};
|
|
|
|
#define QC_SF_NONE 0x00000000
|
|
#define QC_SF_FIN_RECV 0x00000001 // last frame received for this stream
|
|
#define QC_SF_FIN_STREAM 0x00000002 // FIN bit must be set for last frame of the stream
|
|
#define QC_SF_BLK_MROOM 0x00000004 // app layer is blocked waiting for room in the qcs.tx.buf
|
|
#define QC_SF_DETACH 0x00000008 // cs is detached but there is remaining data to send
|
|
|
|
struct qcs {
|
|
struct qcc *qcc;
|
|
struct conn_stream *cs;
|
|
uint32_t flags; /* QC_SF_* */
|
|
|
|
struct {
|
|
struct eb_root frms; /* received frames ordered by their offsets */
|
|
uint64_t offset; /* the current offset of received data */
|
|
struct buffer buf; /* receive buffer, always valid (buf_empty or real buffer) */
|
|
struct buffer app_buf; /* receive buffer used by conn_stream layer */
|
|
} rx;
|
|
struct {
|
|
uint64_t offset; /* the current offset of received data */
|
|
struct eb_root acked_frms; /* acked frames ordered by their offsets */
|
|
uint64_t ack_offset; /* last acked ordered byte offset */
|
|
struct buffer buf; /* transmit buffer before sending via xprt */
|
|
struct buffer xprt_buf; /* buffer for xprt sending, cleared on ACK. */
|
|
} tx;
|
|
|
|
struct eb64_node by_id; /* place in qcc's streams_by_id */
|
|
|
|
struct wait_event wait_event;
|
|
struct wait_event *subs;
|
|
};
|
|
|
|
/* QUIC application layer operations */
|
|
struct qcc_app_ops {
|
|
int (*init)(struct qcc *qcc);
|
|
int (*attach_ruqs)(struct qcs *qcs, void *ctx);
|
|
int (*decode_qcs)(struct qcs *qcs, int fin, void *ctx);
|
|
size_t (*snd_buf)(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
|
|
int (*finalize)(void *ctx);
|
|
};
|
|
|
|
#endif /* USE_QUIC */
|
|
|
|
#endif /* _HAPROXY_MUX_QUIC_T_H */
|