lsquic_pacer.h revision e8bd737d
1/* Copyright (c) 2017 - 2018 LiteSpeed Technologies Inc. See LICENSE. */ 2#ifndef LSQUIC_PACER_H 3#define LSQUIC_PACER_H 1 4 5struct pacer 6{ 7 lsquic_cid_t pa_cid; /* Used for logging */ 8 lsquic_time_t pa_next_sched; 9 lsquic_time_t pa_last_delayed; 10 lsquic_time_t pa_now; 11 12 /* All tick times are in microseconds */ 13 14 unsigned pa_max_intertick; /* Maximum intertick time */ 15 16 /* We keep an average of intertick times, which is our best estimate 17 * for the time when the connection ticks next. This estimate is used 18 * to see whether a packet can be scheduled or not. 19 */ 20 unsigned pa_intertick_avg; /* Smoothed average */ 21 unsigned pa_intertick_var; /* Variance */ 22 23 unsigned short pa_packet_size; 24 unsigned char pa_burst_tokens; 25 enum { 26 PA_LAST_SCHED_DELAYED = (1 << 0), 27#ifndef NDEBUG 28 PA_CONSTANT_INTERTICK = (1 << 1), /* Use fake intertick time for testing */ 29#endif 30 } pa_flags:8; 31#ifndef NDEBUG 32 struct { 33 unsigned n_scheduled; 34 } pa_stats; 35#endif 36}; 37 38 39typedef lsquic_time_t (*tx_time_f)(void *ctx); 40 41void 42pacer_init (struct pacer *, lsquic_cid_t, unsigned max_intertick); 43 44void 45pacer_cleanup (struct pacer *); 46 47void 48pacer_tick (struct pacer *, lsquic_time_t); 49 50int 51pacer_can_schedule (struct pacer *, unsigned n_in_flight); 52 53void 54pacer_packet_scheduled (struct pacer *pacer, unsigned n_in_flight, 55 int in_recovery, tx_time_f tx_time, void *tx_ctx); 56 57void 58pacer_loss_event (struct pacer *); 59 60#define pacer_delayed(pacer) ((pacer)->pa_flags & PA_LAST_SCHED_DELAYED) 61 62#define pacer_next_sched(pacer) (+(pacer)->pa_next_sched) 63 64#endif 65