55 lines
1.5 KiB
C
55 lines
1.5 KiB
C
/* Copyright (c) 2017 LiteSpeed Technologies Inc. See LICENSE. */
|
|
#ifndef LSQUIC_PACER_H
|
|
#define LSQUIC_PACER_H 1
|
|
|
|
struct pacer
|
|
{
|
|
lsquic_cid_t pa_cid; /* Used for logging */
|
|
lsquic_time_t pa_next_sched;
|
|
lsquic_time_t pa_last_delayed;
|
|
lsquic_time_t pa_now;
|
|
|
|
/* All tick times are in microseconds */
|
|
|
|
unsigned pa_max_intertick; /* Maximum intertick time */
|
|
|
|
/* We keep an average of intertick times, which is our best estimate
|
|
* for the time when the connection ticks next. This estimate is used
|
|
* to see whether a packet can be scheduled or not.
|
|
*/
|
|
unsigned pa_intertick_avg; /* Smoothed average */
|
|
unsigned pa_intertick_var; /* Variance */
|
|
|
|
unsigned short pa_packet_size;
|
|
unsigned char pa_burst_tokens;
|
|
enum {
|
|
PA_LAST_SCHED_DELAYED = (1 << 0),
|
|
#ifndef NDEBUG
|
|
PA_CONSTANT_INTERTICK = (1 << 1), /* Use fake intertick time for testing */
|
|
#endif
|
|
} pa_flags:8;
|
|
};
|
|
|
|
|
|
typedef lsquic_time_t (*tx_time_f)(void *ctx);
|
|
|
|
void
|
|
pacer_init (struct pacer *, lsquic_cid_t, unsigned max_intertick);
|
|
|
|
void
|
|
pacer_tick (struct pacer *, lsquic_time_t);
|
|
|
|
int
|
|
pacer_can_schedule (struct pacer *, unsigned n_in_flight);
|
|
|
|
void
|
|
pacer_packet_scheduled (struct pacer *pacer, unsigned n_in_flight,
|
|
int in_recovery, tx_time_f tx_time, void *tx_ctx);
|
|
|
|
void
|
|
pacer_loss_event (struct pacer *);
|
|
|
|
#define pacer_next_sched(pacer) (+(pacer)->pa_next_sched)
|
|
|
|
#endif
|