mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-27 09:31:26 +02:00
Implement the stream rcv_buf operation on QUIC mux. A new buffer is stored in qcs structure named app_buf. This new buffer will contains HTX and will be filled for example on H3 DATA frame parsing. The rcv_buf operation transfer as much as possible data from the HTX from app_buf to the conn-stream buffer. This is mainly identical to mux-h2. This is required to support HTTP POST data.
107 lines
3.0 KiB
C
107 lines
3.0 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_STREAM 0x00000001 // FIN bit must be set for last frame of the stream
|
|
#define QC_SF_BLK_MROOM 0x00000002 // app layer is blocked waiting for room in the qcs.tx.buf
|
|
#define QC_SF_DETACH 0x00000004 // 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 */
|