lsquic_rechist.h revision b1a7c3f9
1/* Copyright (c) 2017 - 2020 LiteSpeed Technologies Inc.  See LICENSE. */
2/*
3 * lsquic_rechist.h -- History of received packets.
4 *
5 * The purpose of received packet history is to generate ACK frames.
6 */
7
8#ifndef LSQUIC_RECHIST_H
9#define LSQUIC_RECHIST_H 1
10
11struct lsquic_conn;
12
13#include "lsquic_packints.h"
14
15struct lsquic_rechist {
16    struct packints                 rh_pints;
17    lsquic_packno_t                 rh_cutoff;
18    lsquic_time_t                   rh_largest_acked_received;
19    const struct lsquic_conn       *rh_conn;        /* Used for logging */
20    /* Chromium limits the number of tracked packets (see
21     * kMaxTrackedPackets).  We could do this, too.
22     */
23    unsigned                        rh_n_packets;
24    enum {
25        RH_CUTOFF_SET   = (1 << 0),
26#if LSQUIC_ACK_ATTACK
27        RH_ACK_ATTACK   = (1 << 1),
28#endif
29    }                               rh_flags;
30#if LSQUIC_ACK_ATTACK
31    struct lsquic_packno_range      rh_first;
32#endif
33};
34
35typedef struct lsquic_rechist lsquic_rechist_t;
36
37void
38lsquic_rechist_init (struct lsquic_rechist *, const struct lsquic_conn *, int);
39
40void
41lsquic_rechist_cleanup (struct lsquic_rechist *);
42
43enum received_st {
44    REC_ST_OK,
45    REC_ST_DUP,
46    REC_ST_ERR,
47};
48
49enum received_st
50lsquic_rechist_received (lsquic_rechist_t *, lsquic_packno_t,
51                         lsquic_time_t now);
52
53void
54lsquic_rechist_stop_wait (lsquic_rechist_t *, lsquic_packno_t);
55
56/* Returns number of bytes written on success, -1 on failure */
57int
58lsquic_rechist_make_ackframe (lsquic_rechist_t *,
59                          void *outbuf, size_t outbuf_sz, int *has_missing,
60                          lsquic_time_t now);
61
62const struct lsquic_packno_range *
63lsquic_rechist_first (lsquic_rechist_t *);
64
65const struct lsquic_packno_range *
66lsquic_rechist_next (lsquic_rechist_t *);
67
68lsquic_packno_t
69lsquic_rechist_largest_packno (const lsquic_rechist_t *);
70
71lsquic_packno_t
72lsquic_rechist_cutoff (const lsquic_rechist_t *);
73
74lsquic_time_t
75lsquic_rechist_largest_recv (const lsquic_rechist_t *);
76
77size_t
78lsquic_rechist_mem_used (const struct lsquic_rechist *);
79
80const struct lsquic_packno_range *
81lsquic_rechist_peek (const struct lsquic_rechist *);
82
83#define lsquic_rechist_n_packets(rechist_) (+(rechist_)->rh_n_packets)
84
85#endif
86