1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov#include <assert.h>
350aadb33SDmitri Tikhonov#include <stdio.h>
450aadb33SDmitri Tikhonov#include <stdlib.h>
550aadb33SDmitri Tikhonov#include <string.h>
650aadb33SDmitri Tikhonov#include <sys/queue.h>
7461e84d8SAmol Deshpande#ifndef WIN32
850aadb33SDmitri Tikhonov#include <sys/time.h>
9461e84d8SAmol Deshpande#endif
1050aadb33SDmitri Tikhonov
1150aadb33SDmitri Tikhonov#include "lsquic.h"
1250aadb33SDmitri Tikhonov#include "lsquic_types.h"
1350aadb33SDmitri Tikhonov#include "lsquic_packet_common.h"
1450aadb33SDmitri Tikhonov#include "lsquic_parse.h"
1550aadb33SDmitri Tikhonov
1650aadb33SDmitri Tikhonov
17f07b3eaeSTyler Young//static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_043); // will not work on MSVC
18f07b3eaeSTyler Young#define pf ((const struct parse_funcs *const)select_pf_by_ver(LSQVER_043))
19c7d81ce1SDmitri Tikhonov
20c7d81ce1SDmitri Tikhonov
2150aadb33SDmitri Tikhonovstruct packno_bits_test {
2250aadb33SDmitri Tikhonov    int             pbt_lineno;
2350aadb33SDmitri Tikhonov    /* Inputs: */
245392f7a3SLiteSpeed Tech    lsquic_packno_t pbt_packno,
2550aadb33SDmitri Tikhonov                    pbt_least_unacked;
2650aadb33SDmitri Tikhonov    uint64_t        pbt_n_in_flight;
2750aadb33SDmitri Tikhonov    /* Output: */
28c7d81ce1SDmitri Tikhonov    enum packno_bits pbt_packno_bits;
2950aadb33SDmitri Tikhonov};
3050aadb33SDmitri Tikhonov
3150aadb33SDmitri Tikhonov
3250aadb33SDmitri Tikhonovstatic const struct packno_bits_test pb_tests[] = {
3350aadb33SDmitri Tikhonov
3450aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
3550aadb33SDmitri Tikhonov        .pbt_packno         = 1,
3650aadb33SDmitri Tikhonov        .pbt_least_unacked  = 0,
3750aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
38c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_1,
3950aadb33SDmitri Tikhonov    },
4050aadb33SDmitri Tikhonov
4150aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
4250aadb33SDmitri Tikhonov        .pbt_packno         = 101,
4350aadb33SDmitri Tikhonov        .pbt_least_unacked  = 100,
4450aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
45c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_1,
4650aadb33SDmitri Tikhonov    },
4750aadb33SDmitri Tikhonov
4850aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
4950aadb33SDmitri Tikhonov        .pbt_packno         = 10001,
5050aadb33SDmitri Tikhonov        .pbt_least_unacked  = 10000,
5150aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 1 << 6,
52c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_1,
5350aadb33SDmitri Tikhonov    },
5450aadb33SDmitri Tikhonov
5550aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
5650aadb33SDmitri Tikhonov        .pbt_packno         = 10001,
5750aadb33SDmitri Tikhonov        .pbt_least_unacked  = 10000,
5850aadb33SDmitri Tikhonov        .pbt_n_in_flight    = (1 << 6) + 1,
59c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
6050aadb33SDmitri Tikhonov    },
6150aadb33SDmitri Tikhonov
6250aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
6350aadb33SDmitri Tikhonov        .pbt_packno         = (1 << 16) + 1,
6450aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1 << 16,
6550aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 1 << 14,
66c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
6750aadb33SDmitri Tikhonov    },
6850aadb33SDmitri Tikhonov
6950aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
7050aadb33SDmitri Tikhonov        .pbt_packno         = (1 << 16) + 1,
7150aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1 << 16,
7250aadb33SDmitri Tikhonov        .pbt_n_in_flight    = (1 << 14) + 1,
73c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_4,
7450aadb33SDmitri Tikhonov    },
7550aadb33SDmitri Tikhonov
7650aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
7750aadb33SDmitri Tikhonov        .pbt_packno         = (1ULL << 33) + 1,
7850aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1ULL << 33,
7950aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 1ULL << 30,
80c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_4,
8150aadb33SDmitri Tikhonov    },
8250aadb33SDmitri Tikhonov
8350aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
8450aadb33SDmitri Tikhonov        .pbt_packno         = (1ULL << 33) + 1,
8550aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1ULL << 33,
8650aadb33SDmitri Tikhonov        .pbt_n_in_flight    = (1ULL << 30) + 1,
87c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_6,
8850aadb33SDmitri Tikhonov    },
8950aadb33SDmitri Tikhonov
9050aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
9150aadb33SDmitri Tikhonov        .pbt_packno         = 100,
9250aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
9350aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 3,
94c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
9550aadb33SDmitri Tikhonov    },
9650aadb33SDmitri Tikhonov
9750aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
9850aadb33SDmitri Tikhonov        .pbt_packno         = 100,
9950aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
10050aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 99,
101c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
10250aadb33SDmitri Tikhonov    },
10350aadb33SDmitri Tikhonov
10450aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
10550aadb33SDmitri Tikhonov        .pbt_packno         = 1 + (1 << 6),
10650aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
10750aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
108c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_1,
10950aadb33SDmitri Tikhonov    },
11050aadb33SDmitri Tikhonov
11150aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
11250aadb33SDmitri Tikhonov        .pbt_packno         = 1 + (1 << 6) + 1,
11350aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
11450aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
115c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
11650aadb33SDmitri Tikhonov    },
11750aadb33SDmitri Tikhonov
11850aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
11950aadb33SDmitri Tikhonov        .pbt_packno         = (1 << 20) + (1 << 14),
12050aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1 << 20,
12150aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
122c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
12350aadb33SDmitri Tikhonov    },
12450aadb33SDmitri Tikhonov
12550aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
12650aadb33SDmitri Tikhonov        .pbt_packno         = (1 << 20) + (1 << 14) + 1,
12750aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1 << 20,
12850aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
129c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_4,
13050aadb33SDmitri Tikhonov    },
13150aadb33SDmitri Tikhonov
13250aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
13350aadb33SDmitri Tikhonov        .pbt_packno         = (1 << 20) + (1ULL << 30),
13450aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1 << 20,
13550aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
136c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_4,
13750aadb33SDmitri Tikhonov    },
13850aadb33SDmitri Tikhonov
13950aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
14050aadb33SDmitri Tikhonov        .pbt_packno         = (1 << 20) + (1ULL << 30) + 1,
14150aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1 << 20,
14250aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 0,
143c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_6,
14450aadb33SDmitri Tikhonov    },
14550aadb33SDmitri Tikhonov
14650aadb33SDmitri Tikhonov    /* Tests from Chrome: */
14750aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
14850aadb33SDmitri Tikhonov        .pbt_packno         = 65,
14950aadb33SDmitri Tikhonov        .pbt_least_unacked  = 2,
15050aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 7,
151c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_1,
15250aadb33SDmitri Tikhonov    },
15350aadb33SDmitri Tikhonov
15450aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
15550aadb33SDmitri Tikhonov        .pbt_packno         = 64 * 256 - 1,
15650aadb33SDmitri Tikhonov        .pbt_least_unacked  = 2,
15750aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 7,
158c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
15950aadb33SDmitri Tikhonov    },
16050aadb33SDmitri Tikhonov
16150aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
16250aadb33SDmitri Tikhonov        .pbt_packno         = 64 * 256 * 256 - 1,
16350aadb33SDmitri Tikhonov        .pbt_least_unacked  = 2,
16450aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 7,
165c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_4,
16650aadb33SDmitri Tikhonov    },
16750aadb33SDmitri Tikhonov
16850aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
16950aadb33SDmitri Tikhonov        .pbt_packno         = 64ULL * 256 * 256 * 256 * 256 - 1,
17050aadb33SDmitri Tikhonov        .pbt_least_unacked  = 2,
17150aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 7,
172c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_6,
17350aadb33SDmitri Tikhonov    },
17450aadb33SDmitri Tikhonov
17550aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
17650aadb33SDmitri Tikhonov        .pbt_packno         = 2,
17750aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
17850aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 7,
179c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_1,
18050aadb33SDmitri Tikhonov    },
18150aadb33SDmitri Tikhonov
18250aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
18350aadb33SDmitri Tikhonov        .pbt_packno         = 2,
18450aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
18550aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 1896,
186c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_2,
18750aadb33SDmitri Tikhonov    },
18850aadb33SDmitri Tikhonov
18950aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
19050aadb33SDmitri Tikhonov        .pbt_packno         = 2,
19150aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
19250aadb33SDmitri Tikhonov        .pbt_n_in_flight    = 48545,
193c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_4,
19450aadb33SDmitri Tikhonov    },
19550aadb33SDmitri Tikhonov
19650aadb33SDmitri Tikhonov    {   .pbt_lineno         = __LINE__,
19750aadb33SDmitri Tikhonov        .pbt_packno         = 2,
19850aadb33SDmitri Tikhonov        .pbt_least_unacked  = 1,
199e0197994SDmitri Tikhonov        .pbt_n_in_flight    = 3181457256ULL,
200c7d81ce1SDmitri Tikhonov        .pbt_packno_bits    = GQUIC_PACKNO_LEN_6,
20150aadb33SDmitri Tikhonov    },
20250aadb33SDmitri Tikhonov
20350aadb33SDmitri Tikhonov};
20450aadb33SDmitri Tikhonov
20550aadb33SDmitri Tikhonov
20650aadb33SDmitri Tikhonovstatic void
20750aadb33SDmitri Tikhonovrun_pbt (int i)
20850aadb33SDmitri Tikhonov{
20950aadb33SDmitri Tikhonov    const struct packno_bits_test *const pbt = &pb_tests[i];
210c7d81ce1SDmitri Tikhonov    enum packno_bits packno_bits = pf->pf_calc_packno_bits(pbt->pbt_packno,
21150aadb33SDmitri Tikhonov                                pbt->pbt_least_unacked, pbt->pbt_n_in_flight);
21250aadb33SDmitri Tikhonov    assert(packno_bits == pbt->pbt_packno_bits);
213c7d81ce1SDmitri Tikhonov    unsigned packet_len = pf->pf_packno_bits2len(packno_bits);
21450aadb33SDmitri Tikhonov    /* Now see if we can restore it back: */
21550aadb33SDmitri Tikhonov    lsquic_packno_t cur_packno = pbt->pbt_packno &
216c7d81ce1SDmitri Tikhonov                        ((1ULL << (packet_len << 3)) - 1);
217a5fa05f9SDmitri Tikhonov    lsquic_packno_t orig_packno = lsquic_restore_packno(cur_packno, packet_len,
21850aadb33SDmitri Tikhonov                                                    pbt->pbt_least_unacked);
21950aadb33SDmitri Tikhonov    assert(orig_packno == pbt->pbt_packno);
22050aadb33SDmitri Tikhonov}
22150aadb33SDmitri Tikhonov
22250aadb33SDmitri Tikhonov
223a5fa05f9SDmitri Tikhonovstruct lsquic_restore_packno_test {
22450aadb33SDmitri Tikhonov    int                         rpt_lineno;
22550aadb33SDmitri Tikhonov    /* Input */
226c7d81ce1SDmitri Tikhonov    enum packno_bits     rpt_packno_bits;
22750aadb33SDmitri Tikhonov    lsquic_packno_t             rpt_cur_packno;
22850aadb33SDmitri Tikhonov    lsquic_packno_t             rpt_max_packno;
22950aadb33SDmitri Tikhonov    /* Output */
23050aadb33SDmitri Tikhonov    lsquic_packno_t             rpt_orig_packno;
23150aadb33SDmitri Tikhonov};
23250aadb33SDmitri Tikhonov
233a5fa05f9SDmitri Tikhonovstatic const struct lsquic_restore_packno_test rp_tests[] =
23450aadb33SDmitri Tikhonov{
23550aadb33SDmitri Tikhonov
23650aadb33SDmitri Tikhonov    {   .rpt_lineno         = __LINE__,
23750aadb33SDmitri Tikhonov        .rpt_max_packno     = 0,
23850aadb33SDmitri Tikhonov        .rpt_cur_packno     = 1,
239c7d81ce1SDmitri Tikhonov        .rpt_packno_bits    = GQUIC_PACKNO_LEN_1,
24050aadb33SDmitri Tikhonov        .rpt_orig_packno    = 1,
24150aadb33SDmitri Tikhonov    },
24250aadb33SDmitri Tikhonov
24350aadb33SDmitri Tikhonov};
24450aadb33SDmitri Tikhonov
24550aadb33SDmitri Tikhonov
24650aadb33SDmitri Tikhonovstatic void
24750aadb33SDmitri Tikhonovrun_rpt (int i)
24850aadb33SDmitri Tikhonov{
249a5fa05f9SDmitri Tikhonov    const struct lsquic_restore_packno_test *const rpt = &rp_tests[i];
250c7d81ce1SDmitri Tikhonov    unsigned packet_len = pf->pf_packno_bits2len(rpt->rpt_packno_bits);
251a5fa05f9SDmitri Tikhonov    lsquic_packno_t orig_packno = lsquic_restore_packno(rpt->rpt_cur_packno,
252c7d81ce1SDmitri Tikhonov                            packet_len, rpt->rpt_max_packno);
25350aadb33SDmitri Tikhonov    assert(orig_packno == rpt->rpt_orig_packno);
25450aadb33SDmitri Tikhonov}
25550aadb33SDmitri Tikhonov
25650aadb33SDmitri Tikhonov
25750aadb33SDmitri Tikhonovstatic void
258c7d81ce1SDmitri Tikhonovtest_restore (enum packno_bits bits)
25950aadb33SDmitri Tikhonov{
26050aadb33SDmitri Tikhonov    unsigned len, n;
26150aadb33SDmitri Tikhonov    enum { OP_PLUS, OP_MINUS, N_OPS } op;
26250aadb33SDmitri Tikhonov    uint64_t epoch, epoch_delta;
263b93f59beSBob Perper    lsquic_packno_t orig_packno, cur_packno, restored_packno;
26450aadb33SDmitri Tikhonov
265b93f59beSBob Perper#ifdef WIN32
266b93f59beSBob Perper    orig_packno = 0;
267b93f59beSBob Perper#endif
268c7d81ce1SDmitri Tikhonov    len = pf->pf_packno_bits2len(bits);
26950aadb33SDmitri Tikhonov    epoch_delta = 1ULL << (len << 3);
27050aadb33SDmitri Tikhonov    epoch = epoch_delta * 11 /* Just some number */;
27150aadb33SDmitri Tikhonov
27250aadb33SDmitri Tikhonov    /* Test current epoch: */
27350aadb33SDmitri Tikhonov    for (op = 0; op < N_OPS; ++op)
27450aadb33SDmitri Tikhonov        for (n = 0; n < 5; ++n)
27550aadb33SDmitri Tikhonov        {
27650aadb33SDmitri Tikhonov            /* Test at the ends of the epoch */
27750aadb33SDmitri Tikhonov            if (op == OP_MINUS)
27850aadb33SDmitri Tikhonov                orig_packno = epoch - epoch_delta / 2 + n;
27950aadb33SDmitri Tikhonov            else if (op == OP_PLUS)
28050aadb33SDmitri Tikhonov                orig_packno = epoch + epoch_delta / 2 - n - 1;
28150aadb33SDmitri Tikhonov            else
28250aadb33SDmitri Tikhonov                assert(0);
28350aadb33SDmitri Tikhonov            cur_packno = orig_packno & (epoch_delta - 1);
284a5fa05f9SDmitri Tikhonov            restored_packno = lsquic_restore_packno(cur_packno, len, epoch);
28550aadb33SDmitri Tikhonov            assert(orig_packno == restored_packno);
28650aadb33SDmitri Tikhonov            /* Test in the middle of the epoch */
28750aadb33SDmitri Tikhonov            if (op == OP_MINUS)
28850aadb33SDmitri Tikhonov                orig_packno = epoch - n;
28950aadb33SDmitri Tikhonov            else
29050aadb33SDmitri Tikhonov                orig_packno = epoch + n;
29150aadb33SDmitri Tikhonov            cur_packno = orig_packno & (epoch_delta - 1);
292a5fa05f9SDmitri Tikhonov            restored_packno = lsquic_restore_packno(cur_packno, len, epoch);
29350aadb33SDmitri Tikhonov            assert(orig_packno == restored_packno);
29450aadb33SDmitri Tikhonov        }
29550aadb33SDmitri Tikhonov
29650aadb33SDmitri Tikhonov    /* Test previous epoch (max is to the left) */
29750aadb33SDmitri Tikhonov    for (n = 0; n < 5; ++n)
29850aadb33SDmitri Tikhonov    {
29950aadb33SDmitri Tikhonov        /* Test at the end of the epoch */
30050aadb33SDmitri Tikhonov        orig_packno = epoch + epoch_delta / 2 - n - 1;
30150aadb33SDmitri Tikhonov        cur_packno = orig_packno & (epoch_delta - 1);
302a5fa05f9SDmitri Tikhonov        restored_packno = lsquic_restore_packno(cur_packno, len, epoch - epoch_delta * 3 / 4);
30350aadb33SDmitri Tikhonov        assert(orig_packno == restored_packno + epoch_delta);
30450aadb33SDmitri Tikhonov        /* Test in the middle of the epoch */
30550aadb33SDmitri Tikhonov        orig_packno = epoch + 2 - n;
30650aadb33SDmitri Tikhonov        cur_packno = orig_packno & (epoch_delta - 1);
307a5fa05f9SDmitri Tikhonov        restored_packno = lsquic_restore_packno(cur_packno, len, epoch - epoch_delta * 3 / 4);
30850aadb33SDmitri Tikhonov        assert(orig_packno == restored_packno + epoch_delta);
30950aadb33SDmitri Tikhonov    }
31050aadb33SDmitri Tikhonov
31150aadb33SDmitri Tikhonov    /* Test previous epoch (max is to the right) */
31250aadb33SDmitri Tikhonov    for (n = 0; n < 5; ++n)
31350aadb33SDmitri Tikhonov    {
31450aadb33SDmitri Tikhonov        /* Test at the end of the epoch */
31550aadb33SDmitri Tikhonov        orig_packno = epoch - epoch_delta / 2 + n;
31650aadb33SDmitri Tikhonov        cur_packno = orig_packno & (epoch_delta - 1);
317a5fa05f9SDmitri Tikhonov        restored_packno = lsquic_restore_packno(cur_packno, len, epoch + epoch_delta * 3 / 4);
31850aadb33SDmitri Tikhonov        assert(orig_packno == restored_packno - epoch_delta);
31950aadb33SDmitri Tikhonov        /* Test in the middle of the epoch */
32050aadb33SDmitri Tikhonov        orig_packno = epoch + 2 - n;
32150aadb33SDmitri Tikhonov        cur_packno = orig_packno & (epoch_delta - 1);
322a5fa05f9SDmitri Tikhonov        restored_packno = lsquic_restore_packno(cur_packno, len, epoch + epoch_delta * 3 / 4);
32350aadb33SDmitri Tikhonov        assert(orig_packno == restored_packno - epoch_delta);
32450aadb33SDmitri Tikhonov    }
32550aadb33SDmitri Tikhonov
32650aadb33SDmitri Tikhonov}
32750aadb33SDmitri Tikhonov
32850aadb33SDmitri Tikhonov
32950aadb33SDmitri Tikhonovint
33050aadb33SDmitri Tikhonovmain (void)
33150aadb33SDmitri Tikhonov{
33250aadb33SDmitri Tikhonov    unsigned i;
33350aadb33SDmitri Tikhonov    for (i = 0; i < sizeof(pb_tests) / sizeof(pb_tests[0]); ++i)
33450aadb33SDmitri Tikhonov        run_pbt(i);
33550aadb33SDmitri Tikhonov    for (i = 0; i < sizeof(rp_tests) / sizeof(rp_tests[0]); ++i)
33650aadb33SDmitri Tikhonov        run_rpt(i);
337c7d81ce1SDmitri Tikhonov    test_restore(GQUIC_PACKNO_LEN_1);
338c7d81ce1SDmitri Tikhonov    test_restore(GQUIC_PACKNO_LEN_2);
339c7d81ce1SDmitri Tikhonov    test_restore(GQUIC_PACKNO_LEN_4);
340c7d81ce1SDmitri Tikhonov    test_restore(GQUIC_PACKNO_LEN_6);
34150aadb33SDmitri Tikhonov    return 0;
34250aadb33SDmitri Tikhonov}
343