1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_spi.h - SPI: Stream Priority Iterator
450aadb33SDmitri Tikhonov *
5fbc6cc04SDmitri Tikhonov * Changing a stream's priority when the stream is in the iterator
6fbc6cc04SDmitri Tikhonov * does not change the stream's position in the iterator.
750aadb33SDmitri Tikhonov */
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonov#ifndef LSQUIC_SPI
1050aadb33SDmitri Tikhonov#define LSQUIC_SPI 1
1150aadb33SDmitri Tikhonov
1250aadb33SDmitri Tikhonov
1350aadb33SDmitri Tikhonovstruct stream_prio_iter
1450aadb33SDmitri Tikhonov{
155392f7a3SLiteSpeed Tech    const struct lsquic_conn       *spi_conn;           /* Used for logging */
1650aadb33SDmitri Tikhonov    const char                     *spi_name;           /* Used for logging */
1750aadb33SDmitri Tikhonov    uint64_t                        spi_set[4];         /* 256 bits */
18a0e1aeeeSDmitri Tikhonov    unsigned                        spi_n_added;
1950aadb33SDmitri Tikhonov    unsigned char                   spi_cur_prio;
20cd35ff02SDmitri Tikhonov    struct lsquic_stream           *spi_next_stream;
2150aadb33SDmitri Tikhonov    struct lsquic_streams_tailq     spi_streams[256];
2250aadb33SDmitri Tikhonov};
2350aadb33SDmitri Tikhonov
2450aadb33SDmitri Tikhonov
2550aadb33SDmitri Tikhonovvoid
26fbc6cc04SDmitri Tikhonovlsquic_spi_init (void *, struct lsquic_stream *first,
2750aadb33SDmitri Tikhonov         struct lsquic_stream *last, uintptr_t next_ptr_offset,
28fbc6cc04SDmitri Tikhonov         struct lsquic_conn_public *,
295392f7a3SLiteSpeed Tech         const char *name,
3019f667fbSDmitri Tikhonov         int (*filter)(void *filter_ctx, struct lsquic_stream *),
3119f667fbSDmitri Tikhonov         void *filter_ctx);
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonovstruct lsquic_stream *
34fbc6cc04SDmitri Tikhonovlsquic_spi_first (void *);
3550aadb33SDmitri Tikhonov
3650aadb33SDmitri Tikhonovstruct lsquic_stream *
37fbc6cc04SDmitri Tikhonovlsquic_spi_next (void *);
3850aadb33SDmitri Tikhonov
3950aadb33SDmitri Tikhonovvoid
40fbc6cc04SDmitri Tikhonovlsquic_spi_drop_non_high (void *);
4150aadb33SDmitri Tikhonov
42c51ce338SDmitri Tikhonovvoid
43fbc6cc04SDmitri Tikhonovlsquic_spi_drop_high (void *);
44c51ce338SDmitri Tikhonov
45c51ce338SDmitri Tikhonovvoid
46fbc6cc04SDmitri Tikhonovlsquic_spi_cleanup (void *);
47c51ce338SDmitri Tikhonov
4850aadb33SDmitri Tikhonov#endif
49