1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov#ifndef LSQUIC_PACER_H
350aadb33SDmitri Tikhonov#define LSQUIC_PACER_H 1
450aadb33SDmitri Tikhonov
55392f7a3SLiteSpeed Techstruct lsquic_conn;
65392f7a3SLiteSpeed Tech
750aadb33SDmitri Tikhonovstruct pacer
850aadb33SDmitri Tikhonov{
95392f7a3SLiteSpeed Tech    const struct lsquic_conn
105392f7a3SLiteSpeed Tech                   *pa_conn;             /* Used for logging */
1150aadb33SDmitri Tikhonov    lsquic_time_t   pa_next_sched;
1250aadb33SDmitri Tikhonov    lsquic_time_t   pa_last_delayed;
1350aadb33SDmitri Tikhonov    lsquic_time_t   pa_now;
1450aadb33SDmitri Tikhonov
1550aadb33SDmitri Tikhonov    /* All tick times are in microseconds */
1650aadb33SDmitri Tikhonov
176aba801dSDmitri Tikhonov    unsigned        pa_clock_granularity;
1850aadb33SDmitri Tikhonov
196aba801dSDmitri Tikhonov    unsigned        pa_burst_tokens;
205392f7a3SLiteSpeed Tech    unsigned        pa_n_scheduled;     /* Within single tick */
2150aadb33SDmitri Tikhonov    enum {
2250aadb33SDmitri Tikhonov        PA_LAST_SCHED_DELAYED   = (1 << 0),
235392f7a3SLiteSpeed Tech        PA_DELAYED_ON_TICK_IN   = (1 << 1),
246aba801dSDmitri Tikhonov    }               pa_flags;
25bfc7bfd8SDmitri Tikhonov#ifndef NDEBUG
26bfc7bfd8SDmitri Tikhonov    struct {
27bfc7bfd8SDmitri Tikhonov        unsigned        n_scheduled;
28bfc7bfd8SDmitri Tikhonov    }               pa_stats;
29bfc7bfd8SDmitri Tikhonov#endif
3050aadb33SDmitri Tikhonov};
3150aadb33SDmitri Tikhonov
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonovtypedef lsquic_time_t (*tx_time_f)(void *ctx);
3450aadb33SDmitri Tikhonov
3550aadb33SDmitri Tikhonovvoid
36a5fa05f9SDmitri Tikhonovlsquic_pacer_init (struct pacer *, const struct lsquic_conn *,
375392f7a3SLiteSpeed Tech                                            unsigned clock_granularity);
3850aadb33SDmitri Tikhonov
3950aadb33SDmitri Tikhonovvoid
40a5fa05f9SDmitri Tikhonovlsquic_pacer_cleanup (struct pacer *);
41bfc7bfd8SDmitri Tikhonov
42bfc7bfd8SDmitri Tikhonovvoid
43a5fa05f9SDmitri Tikhonovlsquic_pacer_tick_in (struct pacer *, lsquic_time_t);
445392f7a3SLiteSpeed Tech
455392f7a3SLiteSpeed Techvoid
46a5fa05f9SDmitri Tikhonovlsquic_pacer_tick_out (struct pacer *);
4750aadb33SDmitri Tikhonov
4850aadb33SDmitri Tikhonovint
49a5fa05f9SDmitri Tikhonovlsquic_pacer_can_schedule (struct pacer *, unsigned n_in_flight);
5050aadb33SDmitri Tikhonov
5150aadb33SDmitri Tikhonovvoid
52a5fa05f9SDmitri Tikhonovlsquic_pacer_packet_scheduled (struct pacer *pacer, unsigned n_in_flight,
5350aadb33SDmitri Tikhonov                        int in_recovery, tx_time_f tx_time, void *tx_ctx);
5450aadb33SDmitri Tikhonov
5550aadb33SDmitri Tikhonovvoid
56a5fa05f9SDmitri Tikhonovlsquic_pacer_loss_event (struct pacer *);
5750aadb33SDmitri Tikhonov
58a5fa05f9SDmitri Tikhonov#define lsquic_pacer_delayed(pacer) ((pacer)->pa_flags & PA_LAST_SCHED_DELAYED)
59e8bd737dSDmitri Tikhonov
60a5fa05f9SDmitri Tikhonov#define lsquic_pacer_next_sched(pacer) (+(pacer)->pa_next_sched)
6150aadb33SDmitri Tikhonov
62b8fa6195SDmitri Tikhonovint
63b8fa6195SDmitri Tikhonovlsquic_pacer_can_schedule_probe (const struct pacer *,
64b8fa6195SDmitri Tikhonov                                unsigned n_in_flight, lsquic_time_t tx_time);
65b8fa6195SDmitri Tikhonov
6650aadb33SDmitri Tikhonov#endif
67