1eb023232SDmitri Tikhonov[![Linux and MacOS build status](https://ci.appveyor.com/api/projects/status/x790ve5msewmva2b/branch/master?svg=true)](https://ci.appveyor.com/project/litespeedtech/lsquic-linux/branch/master)
2eb023232SDmitri Tikhonov[![Windows build status](https://ci.appveyor.com/api/projects/status/ij4n3vy343pkgm1j/branch/master?svg=true)](https://ci.appveyor.com/project/litespeedtech/lsquic-windows/branch/master)
3eb023232SDmitri Tikhonov[![FreeBSD build status](https://api.cirrus-ci.com/github/litespeedtech/lsquic.svg)](https://cirrus-ci.com/github/litespeedtech/lsquic)
44ffff819SLiteSpeed Tech[![Documentation Status](https://readthedocs.org/projects/lsquic/badge/?version=latest)](https://lsquic.readthedocs.io/en/latest/?badge=latest)
51fc8f998SDmitri Tikhonov
65392f7a3SLiteSpeed TechLiteSpeed QUIC (LSQUIC) Library README
750aadb33SDmitri Tikhonov=============================================
850aadb33SDmitri Tikhonov
950aadb33SDmitri TikhonovDescription
1050aadb33SDmitri Tikhonov-----------
1150aadb33SDmitri Tikhonov
125392f7a3SLiteSpeed TechLiteSpeed QUIC (LSQUIC) Library is an open-source implementation of QUIC
13f87fb49cSDmitri Tikhonovand HTTP/3 functionality for servers and clients.  Most of the code in this
14f87fb49cSDmitri Tikhonovdistribution is used in our own products: LiteSpeed Web Server, LiteSpeed ADC,
15758aff32SDmitri Tikhonovand OpenLiteSpeed.
1650aadb33SDmitri Tikhonov
17df5cc4b6SLiteSpeed TechCurrently supported QUIC versions are v1, Internet-Draft versions 29, and 27;
1826e8f082SDmitri Tikhonovand the older "Google" QUIC versions Q043, Q046, an Q050.
1950aadb33SDmitri Tikhonov
2050aadb33SDmitri TikhonovDocumentation
2150aadb33SDmitri Tikhonov-------------
2250aadb33SDmitri Tikhonov
23a5fa05f9SDmitri TikhonovDocumentation is available at https://lsquic.readthedocs.io/en/latest/.
24a5fa05f9SDmitri Tikhonov
25a5fa05f9SDmitri TikhonovIn addition, see example programs for API usage and EXAMPLES.txt for
26a5fa05f9SDmitri Tikhonovsome compilation and run-time options.
2750aadb33SDmitri Tikhonov
28e0197994SDmitri TikhonovRequirements
29e0197994SDmitri Tikhonov------------
3050aadb33SDmitri Tikhonov
31e0197994SDmitri TikhonovTo build LSQUIC, you need CMake, zlib, and BoringSSL.  The example program
32e0197994SDmitri Tikhonovuses libevent to provide the event loop.
3350aadb33SDmitri Tikhonov
34e0197994SDmitri TikhonovBuilding BoringSSL
35e0197994SDmitri Tikhonov------------------
36e0197994SDmitri Tikhonov
37e0197994SDmitri TikhonovBoringSSL is not packaged; you have to build it yourself.  The process is
38e0197994SDmitri Tikhonovstraightforward.  You will need `go` installed.
39e0197994SDmitri Tikhonov
40e0197994SDmitri Tikhonov1. Clone BoringSSL by issuing the following command:
41e0197994SDmitri Tikhonov
42e0197994SDmitri Tikhonov```
43e0197994SDmitri Tikhonovgit clone https://boringssl.googlesource.com/boringssl
44e0197994SDmitri Tikhonovcd boringssl
45e0197994SDmitri Tikhonov```
46e0197994SDmitri Tikhonov
475392f7a3SLiteSpeed TechYou may need to install pre-requisites like zlib and libevent.
48e0197994SDmitri Tikhonov
49c38e7df7SDmitri Tikhonov2. Use specific BoringSSL version
50c38e7df7SDmitri Tikhonov
51c38e7df7SDmitri Tikhonov```
52646652a6Swangfuyugit checkout a9670a8b476470e6f874fef3554e8059683e1413
53c38e7df7SDmitri Tikhonov```
54c38e7df7SDmitri Tikhonov
554947ba95SDmitri Tikhonov3. Compile the library
56e0197994SDmitri Tikhonov
57e0197994SDmitri Tikhonov```
58e0197994SDmitri Tikhonovcmake . &&  make
59e0197994SDmitri Tikhonov```
60e0197994SDmitri Tikhonov
61199c01abSLiteSpeed TechRemember where BoringSSL sources are:
62e0197994SDmitri Tikhonov```
63199c01abSLiteSpeed TechBORINGSSL=$PWD
64e0197994SDmitri Tikhonov```
65e0197994SDmitri Tikhonov
66199c01abSLiteSpeed TechIf you want to turn on optimizations, do
67e0197994SDmitri Tikhonov
68e0197994SDmitri Tikhonov```
69199c01abSLiteSpeed Techcmake -DCMAKE_BUILD_TYPE=Release . && make
70e0197994SDmitri Tikhonov```
71e0197994SDmitri Tikhonov
72038a9441SAaron FranceIf you want to build as a library, (necessary to build lsquic itself
73038a9441SAaron Franceas as shared library) do:
74038a9441SAaron France
75038a9441SAaron France```
76038a9441SAaron Francecmake -DBUILD_SHARED_LIBS=1 . && make
77038a9441SAaron France```
78038a9441SAaron France
795392f7a3SLiteSpeed TechBuilding LSQUIC Library
805392f7a3SLiteSpeed Tech-----------------------
81e0197994SDmitri Tikhonov
825392f7a3SLiteSpeed TechLSQUIC's `http_client`, `http_server`, and the tests link BoringSSL
835392f7a3SLiteSpeed Techlibraries statically.  Following previous section, you can build LSQUIC
845392f7a3SLiteSpeed Techas follows:
85e0197994SDmitri Tikhonov
8667b0dc15SDmitri Tikhonov1. Get the source code
8767b0dc15SDmitri Tikhonov
8867b0dc15SDmitri Tikhonov```
895392f7a3SLiteSpeed Techgit clone https://github.com/litespeedtech/lsquic.git
905392f7a3SLiteSpeed Techcd lsquic
915392f7a3SLiteSpeed Techgit submodule init
925392f7a3SLiteSpeed Techgit submodule update
9367b0dc15SDmitri Tikhonov```
9467b0dc15SDmitri Tikhonov
9567b0dc15SDmitri Tikhonov2. Compile the library
9667b0dc15SDmitri Tikhonov
97038a9441SAaron FranceStatically:
98038a9441SAaron France
9967b0dc15SDmitri Tikhonov
100e0197994SDmitri Tikhonov```
101199c01abSLiteSpeed Tech# $BORINGSSL is the top-level BoringSSL directory from the previous step
102199c01abSLiteSpeed Techcmake -DBORINGSSL_DIR=$BORINGSSL .
103e0197994SDmitri Tikhonovmake
104e0197994SDmitri Tikhonov```
105e0197994SDmitri Tikhonov
106038a9441SAaron FranceAs a dynamic library:
107038a9441SAaron France
108038a9441SAaron France```
1092e1429b4SDmitri Tikhonovcmake -DLSQUIC_SHARED_LIB=1 -DBORINGSSL_DIR=$BORINGSSL .
110038a9441SAaron Francemake
111038a9441SAaron France```
112038a9441SAaron France
113038a9441SAaron France
11467b0dc15SDmitri Tikhonov3. Run tests
115e0197994SDmitri Tikhonov
116e0197994SDmitri Tikhonov```
117e0197994SDmitri Tikhonovmake test
118e0197994SDmitri Tikhonov```
119e0197994SDmitri Tikhonov
120306ecefeSBrian ProdoehlBuilding with Docker
121306ecefeSBrian Prodoehl---------
12227187418SLiteSpeed TechThe library and the example client and server can be built with Docker.
12327187418SLiteSpeed Tech
12427187418SLiteSpeed TechInitialize Git submodules:
12527187418SLiteSpeed Tech```
12627187418SLiteSpeed Techcd lsquic
12727187418SLiteSpeed Techgit submodule init
12827187418SLiteSpeed Techgit submodule update
12927187418SLiteSpeed Tech```
13027187418SLiteSpeed Tech
13127187418SLiteSpeed TechBuild the Docker image:
132306ecefeSBrian Prodoehl```
1335392f7a3SLiteSpeed Techdocker build -t lsquic .
134306ecefeSBrian Prodoehl```
135306ecefeSBrian Prodoehl
13627187418SLiteSpeed TechThen you can use the examples from the command line.  For example:
137306ecefeSBrian Prodoehl```
13895648693SLiteSpeed Techsudo docker run -it --rm lsquic http_client -s www.google.com  -p / -o version=h3-29
13927187418SLiteSpeed Techsudo 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
140306ecefeSBrian Prodoehl```
141306ecefeSBrian Prodoehl
142e0197994SDmitri TikhonovPlatforms
143e0197994SDmitri Tikhonov---------
144e0197994SDmitri Tikhonov
1455392f7a3SLiteSpeed TechThe library has been tested on the following platforms:
146e0197994SDmitri Tikhonov- Linux
147aff2a1d8SDmitri Tikhonov  - i386
148e0197994SDmitri Tikhonov  - x86_64
149e0197994SDmitri Tikhonov  - ARM (Raspberry Pi 3)
150e0197994SDmitri Tikhonov- FreeBSD
151e0197994SDmitri Tikhonov  - i386
152e0197994SDmitri Tikhonov- MacOS
153e0197994SDmitri Tikhonov  - x86_64
15470e6fdd8Swangweiwei- iOS
15570e6fdd8Swangweiwei  - ARM
1569a690580SDmitri Tikhonov- Android
1579a690580SDmitri Tikhonov  - ARM
158fb3e20e0SDmitri Tikhonov- Windows
1595392f7a3SLiteSpeed Tech  - x86_64
16050aadb33SDmitri Tikhonov
161758aff32SDmitri TikhonovGet Involved
162758aff32SDmitri Tikhonov------------
163758aff32SDmitri Tikhonov
164758aff32SDmitri TikhonovDo not hesitate to report bugs back to us.  Even better, send us fixes
165758aff32SDmitri Tikhonovand improvements!
166758aff32SDmitri Tikhonov
16750aadb33SDmitri TikhonovHave fun,
16850aadb33SDmitri Tikhonov
16950aadb33SDmitri TikhonovLiteSpeed QUIC Team.
17050aadb33SDmitri Tikhonov
1711a0003e3SDmitri TikhonovCopyright (c) 2017 - 2021 LiteSpeed Technologies Inc
172