Packages
hackney
2.0.0-beta.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_varint.h
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
#ifndef LSQUIC_VARINT_H
#define LSQUIC_VARINT_H 1
#define VINT_MASK ((1 << 6) - 1)
/* See [draft-ietf-quic-transport-11], section-7.1 */
#define vint_val2bits(val) ( \
((val) >= (1 << 6)) + ((val) >= (1 << 14)) + ((val) >= (1 << 30)))
#define vint_size(val) (1u << vint_val2bits(val))
#define VINT_MAX_VALUE ((1ull << 62) - 1)
/* Map
* 0 -> 6
* 1 -> 14
* 2 -> 30
* 3 -> 62
*/
#define vint_bits2shift(bits) ((1 << (3 + (bits))) - 2)
#define VINT_MAX_B(bits_) ((1ull << (vint_bits2shift(bits_))) - 1)
/* Maximum value that can be encoded as one byte: */
#define VINT_MAX_ONE_BYTE VINT_MAX_B(0)
int
lsquic_varint_read (const unsigned char *p, const unsigned char *end,
uint64_t *valp);
#define vint_read lsquic_varint_read
struct varint_read_state
{
uint64_t val;
int pos;
};
int
lsquic_varint_read_nb (const unsigned char **p, const unsigned char *end,
struct varint_read_state *);
struct varint_read2_state
{
uint64_t vr2s_one;
struct varint_read_state vr2s_varint_state;
#define vr2s_two vr2s_varint_state.val
enum {
VR2S_READ_ONE_BEGIN = 0,
VR2S_READ_ONE_CONTINUE,
VR2S_READ_TWO_BEGIN,
VR2S_READ_TWO_CONTINUE,
} vr2s_state;
};
/* When first called, vr2s_state must be set to 0.
*
* Returns 0 when both varint values have been read. They are available
* in vr2s_one and vr2s_two.
*
* Returns -1 when more input is needed.
*/
int
lsquic_varint_read_two (const unsigned char **p, const unsigned char *end,
struct varint_read2_state *);
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define vint_write(dst, val, bits, len) do { \
uint64_t buf_ = (val) \
| (uint64_t) (bits) << vint_bits2shift(bits); \
buf_ = bswap_64(buf_); \
memcpy(dst, (unsigned char *) &buf_ + 8 - (len), (len)); \
} while (0)
#else
#define vint_write(dst, val, bits, len) do { \
uint64_t buf_ = (val) \
| (uint64_t) (bits) << vint_bits2shift(bits); \
memcpy(dst, (unsigned char *) &buf_ + 8 - (len), (len)); \
} while (0)
#endif
#endif