1/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
2/*
3 * lsquic_qenc_hdl.h -- QPACK encoder streams handler
4 *
5 * The handler owns two unidirectional streams: a) locally-initiated QPACK
6 * encoder stream, to which it writes; and b) peer-initiated QPACK decoder
7 * stream, from which it reads.
8 */
9
10#ifndef LSQUIC_QENC_HDL_H
11#define LSQUIC_QENC_HDL_H 1
12
13struct lsquic_conn;
14struct lsquic_stream;
15struct lsquic_stream_if;
16struct qpack_exp_record;
17
18struct qpack_enc_hdl
19{
20    struct lsquic_conn      *qeh_conn;
21    enum {
22        QEH_INITIALIZED     = 1 << 0,
23        QEH_HAVE_SETTINGS   = 1 << 1,
24    }                        qeh_flags;
25    unsigned                 qeh_max_prefix_size;
26    struct lsqpack_enc       qeh_encoder;
27    struct lsquic_stream    *qeh_enc_sm_out;
28    struct frab_list         qeh_fral;
29    struct lsquic_stream    *qeh_dec_sm_in;
30    struct qpack_exp_record *qeh_exp_rec;
31    size_t                   qeh_tsu_sz;
32    unsigned char            qeh_tsu_buf[LSQPACK_LONGEST_SDTC];
33};
34
35void
36lsquic_qeh_init (struct qpack_enc_hdl *, struct lsquic_conn *);
37
38int
39lsquic_qeh_settings (struct qpack_enc_hdl *, unsigned max_table_size,
40            unsigned dyn_table_size, unsigned max_risked_streams, int server);
41
42void
43lsquic_qeh_cleanup (struct qpack_enc_hdl *);
44
45#define lsquic_qeh_has_dec_stream(qeh) ((qeh)->qeh_dec_sm_in != NULL)
46
47enum qwh_status {
48    QWH_FULL,   /* All bytes written to encoder stream.  This is also returned
49                 * if there were no bytes to write.
50                 */
51    QWH_PARTIAL,/* Not all bytes are written to the encoder stream.  In this
52                 * case, `completion_offset' is set to the value of the
53                 * encoder stream offset when the necessary bytes will have
54                 * been written.
55                 */
56    QWH_ENOBUF, /* Not enough room in `buf' to write the full header block */
57    QWH_ERR,    /* Some other error */
58};
59
60enum qwh_status
61lsquic_qeh_write_headers (struct qpack_enc_hdl *, lsquic_stream_id_t stream_id,
62    unsigned seqno, const struct lsquic_http_headers *, unsigned char *buf,
63    size_t *prefix_sz, size_t *headers_sz, uint64_t *completion_offset,
64    enum lsqpack_enc_header_flags *hflags);
65
66uint64_t
67lsquic_qeh_enc_off (struct qpack_enc_hdl *);
68
69size_t
70lsquic_qeh_write_avail (struct qpack_enc_hdl *);
71
72size_t
73lsquic_qeh_max_prefix_size (const struct qpack_enc_hdl *);
74
75extern const struct lsquic_stream_if *const lsquic_qeh_enc_sm_out_if;
76extern const struct lsquic_stream_if *const lsquic_qeh_dec_sm_in_if;
77
78#endif
79