57 lines
2.0 KiB
C
57 lines
2.0 KiB
C
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
|
|
/*
|
|
* lsquic_sfcw.h -- Stream flow control window functions
|
|
*/
|
|
|
|
#ifndef LSQUIC_SFCW_H
|
|
#define LSQUIC_SFCW_H 1
|
|
|
|
struct lsquic_cfcw;
|
|
struct lsquic_conn_public;
|
|
|
|
typedef struct lsquic_sfcw {
|
|
struct lsquic_cfcw *sf_cfcw; /* Connection flow control window,
|
|
* NULL for streams 1 and 3.
|
|
*/
|
|
uint64_t sf_max_recv_off; /* Largest offset observed */
|
|
uint64_t sf_recv_off; /* Flow control receive offset */
|
|
uint64_t sf_read_off; /* Number of bytes consumed */
|
|
lsquic_time_t sf_last_updated; /* Last time window was updated */
|
|
struct lsquic_conn_public
|
|
*sf_conn_pub;
|
|
unsigned sf_max_recv_win; /* Maximum receive window */
|
|
lsquic_stream_id_t sf_stream_id; /* Used for logging */
|
|
} lsquic_sfcw_t;
|
|
|
|
|
|
void
|
|
lsquic_sfcw_init (lsquic_sfcw_t *, unsigned initial_max_recv_window,
|
|
struct lsquic_cfcw *cfcw, struct lsquic_conn_public *,
|
|
lsquic_stream_id_t stream_id);
|
|
|
|
/* If update is to be sent, updates max_recv_off and returns true. Note
|
|
* that if you call this function twice, the second call will return false.
|
|
*/
|
|
int
|
|
lsquic_sfcw_fc_offsets_changed (lsquic_sfcw_t *);
|
|
|
|
#define lsquic_sfcw_get_fc_recv_off(fc) ((fc)->sf_recv_off)
|
|
|
|
#define lsquic_sfcw_get_max_recv_off(fc) ((fc)->sf_max_recv_off)
|
|
|
|
/* Returns false if flow control violation is encountered */
|
|
int
|
|
lsquic_sfcw_set_max_recv_off (lsquic_sfcw_t *, uint64_t);
|
|
|
|
/* Void because we do not expect the caller to make a mistake.
|
|
*/
|
|
void
|
|
lsquic_sfcw_set_read_off (lsquic_sfcw_t *, uint64_t);
|
|
|
|
#define lsquic_sfcw_consume_rem(sfcw) do { \
|
|
lsquic_sfcw_set_read_off(sfcw, \
|
|
lsquic_sfcw_get_max_recv_off(sfcw)); \
|
|
} while (0)
|
|
|
|
#endif
|