188c055a9c
* Test case and debug for lsquic rechist list problem Add: - test case - debug rechist print function (not called) Modify: - rechist_test_sanity to be more robust Test case: Added test case which produces a corrupt rechist. The rechist grows and then is emptied, then a rechist is produced that is nominally empty (rh_n_used == 0) but has a circular list in rh_elems. E.g. (using debug print at the problem site): lsquic_rechist_received: insert before done 0x7ffe65ce75a0: cutoff 9 l. acked 12087061905995 masks 1 alloced 4 used 1 max ranges 0 head 0 (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] test_rechist: /tmp/lsquic/src/liblsquic/lsquic_rechist.c:272: rechist_test_sanity: Assertion `rechist->rh_n_used == n_elems' failed. Debug print: Added 'rechist_dump' for ease of debugging, marked as unused. Useful for calling from gdb or adding to code temporarily. rechist_test_sanity: Make it more robust to bad rechists by limiting how many list items it will follow, to prevent infinite loops or walking off the end of the list. * rechist: Fix bug in lsquic_rechist_received causing circular list to be created Fix bug in lsquic_rechist_received demonstrated by the test6 test-case. When the list is empty, i.e. rh_n_used == 0, the 'first_elem' path should be used. However, the test for this was using rh_n_alloced, which would cause the code to continue on incorrectly. One possibility is that it goes to insert_before and creates a circular list in the rechist with the head at index 0 having a next of 0. This causes history to be lost I think. The list at this point is still 'empty', however a following call could go to the insert_before path and then insert an elem pointing to the circular list, and bump up rh_n_used. Now you have a circular list. Weird things can happen now. Notably, ACK generation will exhaust the packet buffer and generate an error, and so cause connections to be prematurely aborted. Fix lsquic_rechist_received to use rh_n_used. Also modify rechist_alloc_elem to NULL the next pointer for robustness. It would be nice for rechist_free_elem to also invalidate the elem, but it is meant for relinking elems in the list and should preserve the next pointer. |
||
---|---|---|
bin | ||
docs | ||
include | ||
src | ||
tests | ||
tools | ||
wincompat | ||
.cirrus.yml | ||
.gitmodules | ||
.nojekyll | ||
.travis.yml | ||
APIs.txt | ||
appveyor-linux.yml | ||
appveyor-windows.cmd | ||
appveyor-windows.yml | ||
BUILD-WINDOWS.md | ||
CHANGELOG | ||
CMakeLists.txt | ||
CONTRIBUTORS.txt | ||
Dockerfile | ||
EXAMPLES.txt | ||
LICENSE | ||
LICENSE.chrome | ||
README.md |
LiteSpeed QUIC (LSQUIC) Library README
Description
LiteSpeed QUIC (LSQUIC) Library is an open-source implementation of QUIC and HTTP/3 functionality for servers and clients. Most of the code in this distribution is used in our own products: LiteSpeed Web Server, LiteSpeed ADC, and OpenLiteSpeed.
Currently supported QUIC versions are v1, Internet-Draft versions 29, and 27; and the older "Google" QUIC versions Q043, Q046, an Q050.
Documentation
Documentation is available at https://lsquic.readthedocs.io/en/latest/.
In addition, see example programs for API usage and EXAMPLES.txt for some compilation and run-time options.
Requirements
To build LSQUIC, you need CMake, zlib, and BoringSSL. The example program uses libevent to provide the event loop.
Building BoringSSL
BoringSSL is not packaged; you have to build it yourself. The process is
straightforward. You will need go
installed.
- Clone BoringSSL by issuing the following command:
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
You may need to install pre-requisites like zlib and libevent.
- Use specific BoringSSL version
git checkout a9670a8b476470e6f874fef3554e8059683e1413
- Compile the library
cmake . && make
Remember where BoringSSL sources are:
BORINGSSL=$PWD
If you want to turn on optimizations, do
cmake -DCMAKE_BUILD_TYPE=Release . && make
If you want to build as a library, (necessary to build lsquic itself as as shared library) do:
cmake -DBUILD_SHARED_LIBS=1 . && make
Building LSQUIC Library
LSQUIC's http_client
, http_server
, and the tests link BoringSSL
libraries statically. Following previous section, you can build LSQUIC
as follows:
- Get the source code
git clone https://github.com/litespeedtech/lsquic.git
cd lsquic
git submodule init
git submodule update
- Compile the library
Statically:
# $BORINGSSL is the top-level BoringSSL directory from the previous step
cmake -DBORINGSSL_DIR=$BORINGSSL .
make
As a dynamic library:
cmake -DLSQUIC_SHARED_LIB=1 -DBORINGSSL_DIR=$BORINGSSL .
make
- Run tests
make test
Building with Docker
The library and the example client and server can be built with Docker.
Initialize Git submodules:
cd lsquic
git submodule init
git submodule update
Build the Docker image:
docker build -t lsquic .
Then you can use the examples from the command line. For example:
sudo docker run -it --rm lsquic http_client -s www.google.com -p / -o version=h3-29
sudo docker run -p 12345:12345/udp -v /path/to/certs:/mnt/certs -it --rm lsquic http_server -c www.example.com,/mnt/certs/chain,/mnt/certs/key
Platforms
The library has been tested on the following platforms:
- Linux
- i386
- x86_64
- ARM (Raspberry Pi 3)
- FreeBSD
- i386
- MacOS
- x86_64
- iOS
- ARM
- Android
- ARM
- Windows
- x86_64
Get Involved
Do not hesitate to report bugs back to us. Even better, send us fixes and improvements!
Have fun,
LiteSpeed QUIC Team.
Copyright (c) 2017 - 2021 LiteSpeed Technologies Inc