Packages
hackney
2.0.1
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/lsquic/src/liblsquic/lsquic_trechist.h
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
/*
* Tiny receive history. It is used in IETF mini connection, where we want
* to use as little memory as possible. This data structure is an array of
* packet ranges. Each packet range is six bytes. This is possible because
* initial packets must not be wider than four bytes.
*
* Another limitation of this history is that it never shrinks. (Although
* technically is is possible to implement.
*/
#ifndef LSQUIC_TRECHIST
#define LSQUIC_TRECHIST 1
struct lsquic_packno_range;
/* This value could be as large as 32, which is how many bits wide
* trechist_mask_t is. The other limit on the number of ranges is
* UCHAR_MAX, which is how many different values can fit into te_next.
*/
#define TRECHIST_MAX_RANGES 16
#define TRECHIST_MAX_RANGES_MASK ((1u << TRECHIST_MAX_RANGES) - 1)
struct trechist_elem
{
uint32_t te_low;
unsigned char te_count;
unsigned char te_next; /* 0 means no next element */
};
#define TE_HIGH(te_) ((te_)->te_low + (te_)->te_count - 1)
#define TRECHIST_SIZE (TRECHIST_MAX_RANGES * sizeof(struct trechist_elem))
/* There are two parts to this: the array of trechist_elem's and the bitmask
* that tracks which elements are used. The smallest range must always be at
* offset zero.
*/
typedef uint32_t trechist_mask_t;
int
lsquic_trechist_insert (trechist_mask_t *, struct trechist_elem *, uint32_t);
struct trechist_iter {
struct lsquic_packno_range range;
const struct trechist_elem *elems;
trechist_mask_t mask;
unsigned char next;
};
void
lsquic_trechist_iter (struct trechist_iter *iter, trechist_mask_t mask,
const struct trechist_elem *);
/* Don't modify history while iterating */
const struct lsquic_packno_range *
lsquic_trechist_first (void *iter);
const struct lsquic_packno_range *
lsquic_trechist_next (void *iter);
void
lsquic_trechist_copy_ranges (trechist_mask_t *mask /* This gets overwritten */,
struct trechist_elem *elems, void *src_rechist,
const struct lsquic_packno_range * (*first) (void *),
const struct lsquic_packno_range * (*next) (void *));
int
lsquic_trechist_contains (trechist_mask_t mask,
const struct trechist_elem *elems, uint32_t packno);
uint32_t
lsquic_trechist_max (trechist_mask_t mask, const struct trechist_elem *elems);
#endif