1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_headers_stream.h -- HEADERS stream interface
450aadb33SDmitri Tikhonov */
550aadb33SDmitri Tikhonov
650aadb33SDmitri Tikhonov#ifndef LSQUIC_HEADERS_STREAM_H
750aadb33SDmitri Tikhonov#define LSQUIC_HEADERS_STREAM_H 1
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonov#include <stdint.h>
1050aadb33SDmitri Tikhonov
1150aadb33SDmitri Tikhonovstruct iovec;
1250aadb33SDmitri Tikhonovstruct lsquic_stream_if;
1350aadb33SDmitri Tikhonovstruct lsquic_stream;
1450aadb33SDmitri Tikhonovstruct lsquic_mm;
1550aadb33SDmitri Tikhonovstruct lsquic_http_headers;
1650aadb33SDmitri Tikhonovstruct lsquic_frame_reader;
1750aadb33SDmitri Tikhonovstruct lsquic_frame_writer;
1850aadb33SDmitri Tikhonovstruct uncompressed_headers;
193b55e6aeSDmitri Tikhonovstruct lsquic_engine_public;
2050aadb33SDmitri Tikhonovstruct lsquic_http2_setting;
2119f667fbSDmitri Tikhonov#if LSQUIC_CONN_STATS
2219f667fbSDmitri Tikhonovstruct conn_stats;
2319f667fbSDmitri Tikhonov#endif
2450aadb33SDmitri Tikhonov
2550aadb33SDmitri Tikhonov
2650aadb33SDmitri Tikhonov/* Incoming frames result in new objects or events.  Callbacks in this
2750aadb33SDmitri Tikhonov * struct are used to dispatch them.
2850aadb33SDmitri Tikhonov */
2950aadb33SDmitri Tikhonovstruct headers_stream_callbacks
3050aadb33SDmitri Tikhonov{
3150aadb33SDmitri Tikhonov    void (*hsc_on_headers)
3250aadb33SDmitri Tikhonov                    (void *frame_cb_ctx, struct uncompressed_headers *);
3350aadb33SDmitri Tikhonov    void (*hsc_on_enable_push)  (void *hs_cb_ctx, int enable_push);
3450aadb33SDmitri Tikhonov    void (*hsc_on_push_promise)
3550aadb33SDmitri Tikhonov                    (void *frame_cb_ctx, struct uncompressed_headers *);
365392f7a3SLiteSpeed Tech    void (*hsc_on_priority)     (void *hs_cb_ctx, lsquic_stream_id_t stream_id,
375392f7a3SLiteSpeed Tech            int exclusive, lsquic_stream_id_t dep_stream_id, unsigned weight);
385392f7a3SLiteSpeed Tech    void (*hsc_on_stream_error) (void *hs_cb_ctx, lsquic_stream_id_t stream_id);
3950aadb33SDmitri Tikhonov    void (*hsc_on_conn_error)   (void *hs_cb_ctx);
4050aadb33SDmitri Tikhonov};
4150aadb33SDmitri Tikhonov
4250aadb33SDmitri Tikhonov
4350aadb33SDmitri Tikhonovstruct headers_stream *
443b55e6aeSDmitri Tikhonovlsquic_headers_stream_new (int is_server, struct lsquic_engine_public *,
4550aadb33SDmitri Tikhonov                           const struct headers_stream_callbacks *,
4619f667fbSDmitri Tikhonov#if LSQUIC_CONN_STATS
4719f667fbSDmitri Tikhonov                           struct conn_stats *,
4819f667fbSDmitri Tikhonov#endif
4950aadb33SDmitri Tikhonov                           void *hs_cb_ctx);
5050aadb33SDmitri Tikhonov
5150aadb33SDmitri Tikhonovvoid
5250aadb33SDmitri Tikhonovlsquic_headers_stream_destroy (struct headers_stream *);
5350aadb33SDmitri Tikhonov
5450aadb33SDmitri Tikhonovint
5550aadb33SDmitri Tikhonovlsquic_headers_stream_send_headers (struct headers_stream *hs,
565392f7a3SLiteSpeed Tech                                lsquic_stream_id_t stream_id,
5750aadb33SDmitri Tikhonov                                const struct lsquic_http_headers *, int eos,
5850aadb33SDmitri Tikhonov                                unsigned weight);
5950aadb33SDmitri Tikhonov
6050aadb33SDmitri Tikhonovint
6150aadb33SDmitri Tikhonovlsquic_headers_stream_push_promise (struct headers_stream *hs,
625392f7a3SLiteSpeed Tech            lsquic_stream_id_t stream_id, lsquic_stream_id_t promised_stream_id,
6350aadb33SDmitri Tikhonov                        const struct lsquic_http_headers *);
6450aadb33SDmitri Tikhonov
6550aadb33SDmitri Tikhonovint
6650aadb33SDmitri Tikhonovlsquic_headers_stream_send_priority (struct headers_stream *hs,
675392f7a3SLiteSpeed Tech    lsquic_stream_id_t stream_id, int exclusive,
685392f7a3SLiteSpeed Tech    lsquic_stream_id_t dep_stream_id, unsigned weight);
6950aadb33SDmitri Tikhonov
7050aadb33SDmitri Tikhonovint
7150aadb33SDmitri Tikhonovlsquic_headers_stream_send_settings (struct headers_stream *hs,
7250aadb33SDmitri Tikhonov                        const struct lsquic_http2_setting *, unsigned count);
7350aadb33SDmitri Tikhonov
74c51ce338SDmitri Tikhonovstruct lsquic_stream *
75c51ce338SDmitri Tikhonovlsquic_headers_stream_get_stream (const struct headers_stream *);
76c51ce338SDmitri Tikhonov
77c51ce338SDmitri Tikhonovsize_t
78c51ce338SDmitri Tikhonovlsquic_headers_stream_mem_used (const struct headers_stream *);
79c51ce338SDmitri Tikhonov
8050aadb33SDmitri Tikhonovextern const struct lsquic_stream_if *const lsquic_headers_stream_if;
8150aadb33SDmitri Tikhonov
8250aadb33SDmitri Tikhonov#endif
83