75 lines
2.6 KiB
C
75 lines
2.6 KiB
C
/* Copyright (c) 2017 LiteSpeed Technologies Inc. See LICENSE. */
|
|
/*
|
|
* lsquic_conn_flow.h -- Connection flow control-related functions
|
|
*/
|
|
|
|
#ifndef LSQUIC_CONN_FLOW_H
|
|
#define LSQUIC_CONN_FLOW_H 1
|
|
|
|
struct lsquic_conn_public;
|
|
|
|
typedef struct lsquic_cfcw {
|
|
struct lsquic_conn_public
|
|
*cf_conn_pub;
|
|
uint64_t cf_max_recv_off; /* Largest offset observed (cumulative) */
|
|
uint64_t cf_recv_off; /* Flow control receive offset */
|
|
uint64_t cf_read_off; /* Number of bytes consumed (cumulative) */
|
|
lsquic_time_t cf_last_updated;
|
|
unsigned cf_max_recv_win; /* Maximum receive window */
|
|
} lsquic_cfcw_t;
|
|
|
|
struct lsquic_conn_cap {
|
|
uint64_t cc_sent; /* Number of bytes sent on connection */
|
|
uint64_t cc_max; /* Maximum cumulative number of bytes allowed
|
|
* to be sent on this connection.
|
|
*/
|
|
uint64_t cc_tosend; /* Number of bytes scheduled to be sent
|
|
* accross all streams.
|
|
*/
|
|
uint64_t cc_blocked; /* Last blocked offset used */
|
|
};
|
|
|
|
|
|
#define lsquic_conn_cap_init(cc, max) do { \
|
|
(cc)->cc_sent = 0; \
|
|
(cc)->cc_tosend = 0; \
|
|
(cc)->cc_max = max; \
|
|
} while (0)
|
|
|
|
|
|
#define lsquic_conn_cap_avail(cap) ( \
|
|
((cap)->cc_sent + (cap)->cc_tosend <= (cap)->cc_max) \
|
|
? \
|
|
((cap)->cc_max - (cap)->cc_sent - (cap)->cc_tosend) \
|
|
: \
|
|
0 \
|
|
)
|
|
|
|
|
|
void
|
|
lsquic_cfcw_init (lsquic_cfcw_t *, struct lsquic_conn_public *,
|
|
unsigned initial_max_recv_window);
|
|
|
|
/* 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_cfcw_fc_offsets_changed (lsquic_cfcw_t *);
|
|
|
|
#define lsquic_cfcw_get_fc_recv_off(fc) (+(fc)->cf_recv_off)
|
|
|
|
#define lsquic_cfcw_get_max_recv_off(fc) (+(fc)->cf_max_recv_off)
|
|
|
|
#define lsquic_cfcw_get_max_recv_window(fc) (+(fc)->cf_max_recv_win)
|
|
|
|
/* Returns false if flow control violation is encountered */
|
|
int
|
|
lsquic_cfcw_incr_max_recv_off (lsquic_cfcw_t *, uint64_t);
|
|
|
|
/* Void because we do not expect the caller to make a mistake.
|
|
*/
|
|
void
|
|
lsquic_cfcw_incr_read_off (lsquic_cfcw_t *, uint64_t);
|
|
|
|
#endif
|