protocol-quic 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/ext/ngtcp2/AUTHORS +44 -0
- data/ext/ngtcp2/CMakeLists.txt +431 -0
- data/ext/ngtcp2/CMakeOptions.txt +17 -0
- data/ext/ngtcp2/COPYING +22 -0
- data/ext/ngtcp2/ChangeLog +0 -0
- data/ext/ngtcp2/Makefile.am +60 -0
- data/ext/ngtcp2/NEWS +0 -0
- data/ext/ngtcp2/README +1 -0
- data/ext/ngtcp2/README.rst +258 -0
- data/ext/ngtcp2/ci/build_boringssl.sh +10 -0
- data/ext/ngtcp2/ci/build_nghttp3.sh +9 -0
- data/ext/ngtcp2/ci/build_openssl1.sh +8 -0
- data/ext/ngtcp2/ci/build_openssl1_cross.sh +9 -0
- data/ext/ngtcp2/ci/build_openssl3.sh +8 -0
- data/ext/ngtcp2/ci/build_picotls.sh +26 -0
- data/ext/ngtcp2/ci/build_wolfssl.sh +9 -0
- data/ext/ngtcp2/ci/gen-certificate.sh +8 -0
- data/ext/ngtcp2/cmake/ExtractValidFlags.cmake +31 -0
- data/ext/ngtcp2/cmake/FindCUnit.cmake +40 -0
- data/ext/ngtcp2/cmake/FindJemalloc.cmake +40 -0
- data/ext/ngtcp2/cmake/FindLibev.cmake +38 -0
- data/ext/ngtcp2/cmake/FindLibnghttp3.cmake +41 -0
- data/ext/ngtcp2/cmake/Findwolfssl.cmake +41 -0
- data/ext/ngtcp2/cmake/Version.cmake +11 -0
- data/ext/ngtcp2/cmakeconfig.h.in +36 -0
- data/ext/ngtcp2/configure.ac +755 -0
- data/ext/ngtcp2/crypto/CMakeLists.txt +56 -0
- data/ext/ngtcp2/crypto/Makefile.am +49 -0
- data/ext/ngtcp2/crypto/boringssl/CMakeLists.txt +64 -0
- data/ext/ngtcp2/crypto/boringssl/Makefile.am +39 -0
- data/ext/ngtcp2/crypto/boringssl/boringssl.c +630 -0
- data/ext/ngtcp2/crypto/boringssl/libngtcp2_crypto_boringssl.pc.in +33 -0
- data/ext/ngtcp2/crypto/gnutls/CMakeLists.txt +86 -0
- data/ext/ngtcp2/crypto/gnutls/Makefile.am +43 -0
- data/ext/ngtcp2/crypto/gnutls/gnutls.c +644 -0
- data/ext/ngtcp2/crypto/gnutls/libngtcp2_crypto_gnutls.pc.in +33 -0
- data/ext/ngtcp2/crypto/includes/CMakeLists.txt +56 -0
- data/ext/ngtcp2/crypto/includes/Makefile.am +45 -0
- data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +893 -0
- data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h +104 -0
- data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_gnutls.h +107 -0
- data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_openssl.h +132 -0
- data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h +246 -0
- data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
- data/ext/ngtcp2/crypto/openssl/CMakeLists.txt +86 -0
- data/ext/ngtcp2/crypto/openssl/Makefile.am +43 -0
- data/ext/ngtcp2/crypto/openssl/libngtcp2_crypto_openssl.pc.in +33 -0
- data/ext/ngtcp2/crypto/openssl/openssl.c +807 -0
- data/ext/ngtcp2/crypto/picotls/CMakeLists.txt +65 -0
- data/ext/ngtcp2/crypto/picotls/Makefile.am +39 -0
- data/ext/ngtcp2/crypto/picotls/libngtcp2_crypto_picotls.pc.in +33 -0
- data/ext/ngtcp2/crypto/picotls/picotls.c +707 -0
- data/ext/ngtcp2/crypto/shared.c +1431 -0
- data/ext/ngtcp2/crypto/shared.h +350 -0
- data/ext/ngtcp2/crypto/wolfssl/CMakeLists.txt +84 -0
- data/ext/ngtcp2/crypto/wolfssl/Makefile.am +43 -0
- data/ext/ngtcp2/crypto/wolfssl/libngtcp2_crypto_wolfssl.pc.in +33 -0
- data/ext/ngtcp2/crypto/wolfssl/wolfssl.c +534 -0
- data/ext/ngtcp2/doc/Makefile.am +65 -0
- data/ext/ngtcp2/doc/make.bat +35 -0
- data/ext/ngtcp2/doc/mkapiref.py +356 -0
- data/ext/ngtcp2/doc/source/conf.py.in +94 -0
- data/ext/ngtcp2/doc/source/index.rst +22 -0
- data/ext/ngtcp2/doc/source/programmers-guide.rst +476 -0
- data/ext/ngtcp2/docker/Dockerfile +39 -0
- data/ext/ngtcp2/examples/CMakeLists.txt +361 -0
- data/ext/ngtcp2/examples/Makefile.am +228 -0
- data/ext/ngtcp2/examples/client.cc +3049 -0
- data/ext/ngtcp2/examples/client.h +192 -0
- data/ext/ngtcp2/examples/client_base.cc +202 -0
- data/ext/ngtcp2/examples/client_base.h +213 -0
- data/ext/ngtcp2/examples/debug.cc +298 -0
- data/ext/ngtcp2/examples/debug.h +124 -0
- data/ext/ngtcp2/examples/examplestest.cc +84 -0
- data/ext/ngtcp2/examples/gtlssimpleclient.c +720 -0
- data/ext/ngtcp2/examples/h09client.cc +2601 -0
- data/ext/ngtcp2/examples/h09client.h +196 -0
- data/ext/ngtcp2/examples/h09server.cc +3024 -0
- data/ext/ngtcp2/examples/h09server.h +237 -0
- data/ext/ngtcp2/examples/http.cc +138 -0
- data/ext/ngtcp2/examples/http.h +44 -0
- data/ext/ngtcp2/examples/network.h +80 -0
- data/ext/ngtcp2/examples/server.cc +3731 -0
- data/ext/ngtcp2/examples/server.h +256 -0
- data/ext/ngtcp2/examples/server_base.cc +58 -0
- data/ext/ngtcp2/examples/server_base.h +195 -0
- data/ext/ngtcp2/examples/shared.cc +385 -0
- data/ext/ngtcp2/examples/shared.h +96 -0
- data/ext/ngtcp2/examples/simpleclient.c +683 -0
- data/ext/ngtcp2/examples/template.h +71 -0
- data/ext/ngtcp2/examples/tests/README.rst +60 -0
- data/ext/ngtcp2/examples/tests/__init__.py +0 -0
- data/ext/ngtcp2/examples/tests/config.ini.in +32 -0
- data/ext/ngtcp2/examples/tests/conftest.py +28 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/__init__.py +6 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/certs.py +476 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/client.py +187 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/env.py +191 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/log.py +101 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/server.py +137 -0
- data/ext/ngtcp2/examples/tests/ngtcp2test/tls.py +983 -0
- data/ext/ngtcp2/examples/tests/test_01_handshake.py +30 -0
- data/ext/ngtcp2/examples/tests/test_02_resume.py +46 -0
- data/ext/ngtcp2/examples/tests/test_03_earlydata.py +56 -0
- data/ext/ngtcp2/examples/tests/test_04_clientcert.py +57 -0
- data/ext/ngtcp2/examples/tests/test_05_ciphers.py +46 -0
- data/ext/ngtcp2/examples/tls_client_context.h +52 -0
- data/ext/ngtcp2/examples/tls_client_context_boringssl.cc +126 -0
- data/ext/ngtcp2/examples/tls_client_context_boringssl.h +49 -0
- data/ext/ngtcp2/examples/tls_client_context_gnutls.cc +74 -0
- data/ext/ngtcp2/examples/tls_client_context_gnutls.h +50 -0
- data/ext/ngtcp2/examples/tls_client_context_openssl.cc +137 -0
- data/ext/ngtcp2/examples/tls_client_context_openssl.h +49 -0
- data/ext/ngtcp2/examples/tls_client_context_picotls.cc +158 -0
- data/ext/ngtcp2/examples/tls_client_context_picotls.h +53 -0
- data/ext/ngtcp2/examples/tls_client_context_wolfssl.cc +177 -0
- data/ext/ngtcp2/examples/tls_client_context_wolfssl.h +51 -0
- data/ext/ngtcp2/examples/tls_client_session.h +52 -0
- data/ext/ngtcp2/examples/tls_client_session_boringssl.cc +110 -0
- data/ext/ngtcp2/examples/tls_client_session_boringssl.h +52 -0
- data/ext/ngtcp2/examples/tls_client_session_gnutls.cc +190 -0
- data/ext/ngtcp2/examples/tls_client_session_gnutls.h +52 -0
- data/ext/ngtcp2/examples/tls_client_session_openssl.cc +113 -0
- data/ext/ngtcp2/examples/tls_client_session_openssl.h +52 -0
- data/ext/ngtcp2/examples/tls_client_session_picotls.cc +147 -0
- data/ext/ngtcp2/examples/tls_client_session_picotls.h +52 -0
- data/ext/ngtcp2/examples/tls_client_session_wolfssl.cc +160 -0
- data/ext/ngtcp2/examples/tls_client_session_wolfssl.h +52 -0
- data/ext/ngtcp2/examples/tls_server_context.h +52 -0
- data/ext/ngtcp2/examples/tls_server_context_boringssl.cc +257 -0
- data/ext/ngtcp2/examples/tls_server_context_boringssl.h +54 -0
- data/ext/ngtcp2/examples/tls_server_context_gnutls.cc +99 -0
- data/ext/ngtcp2/examples/tls_server_context_gnutls.h +59 -0
- data/ext/ngtcp2/examples/tls_server_context_openssl.cc +338 -0
- data/ext/ngtcp2/examples/tls_server_context_openssl.h +54 -0
- data/ext/ngtcp2/examples/tls_server_context_picotls.cc +321 -0
- data/ext/ngtcp2/examples/tls_server_context_picotls.h +58 -0
- data/ext/ngtcp2/examples/tls_server_context_wolfssl.cc +284 -0
- data/ext/ngtcp2/examples/tls_server_context_wolfssl.h +55 -0
- data/ext/ngtcp2/examples/tls_server_session.h +52 -0
- data/ext/ngtcp2/examples/tls_server_session_boringssl.cc +84 -0
- data/ext/ngtcp2/examples/tls_server_session_boringssl.h +47 -0
- data/ext/ngtcp2/examples/tls_server_session_gnutls.cc +155 -0
- data/ext/ngtcp2/examples/tls_server_session_gnutls.h +46 -0
- data/ext/ngtcp2/examples/tls_server_session_openssl.cc +54 -0
- data/ext/ngtcp2/examples/tls_server_session_openssl.h +47 -0
- data/ext/ngtcp2/examples/tls_server_session_picotls.cc +70 -0
- data/ext/ngtcp2/examples/tls_server_session_picotls.h +47 -0
- data/ext/ngtcp2/examples/tls_server_session_wolfssl.cc +55 -0
- data/ext/ngtcp2/examples/tls_server_session_wolfssl.h +47 -0
- data/ext/ngtcp2/examples/tls_session_base_gnutls.cc +87 -0
- data/ext/ngtcp2/examples/tls_session_base_gnutls.h +51 -0
- data/ext/ngtcp2/examples/tls_session_base_openssl.cc +54 -0
- data/ext/ngtcp2/examples/tls_session_base_openssl.h +52 -0
- data/ext/ngtcp2/examples/tls_session_base_picotls.cc +56 -0
- data/ext/ngtcp2/examples/tls_session_base_picotls.h +54 -0
- data/ext/ngtcp2/examples/tls_session_base_wolfssl.cc +54 -0
- data/ext/ngtcp2/examples/tls_session_base_wolfssl.h +54 -0
- data/ext/ngtcp2/examples/tls_shared_picotls.cc +59 -0
- data/ext/ngtcp2/examples/tls_shared_picotls.h +36 -0
- data/ext/ngtcp2/examples/util.cc +646 -0
- data/ext/ngtcp2/examples/util.h +361 -0
- data/ext/ngtcp2/examples/util_gnutls.cc +136 -0
- data/ext/ngtcp2/examples/util_openssl.cc +131 -0
- data/ext/ngtcp2/examples/util_test.cc +237 -0
- data/ext/ngtcp2/examples/util_test.h +45 -0
- data/ext/ngtcp2/examples/util_wolfssl.cc +130 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/ack +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/ack_ecn +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/connection_close +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/crypto +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/data_blocked +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram_len +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/max_data +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/max_stream_data +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/max_streams +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/new_connection_id +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/new_token +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/path_challenge +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/path_response +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/reset_stream +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/retire_connection_id +1 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/stop_sending +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/stream +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_data_blocked +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_len +0 -0
- data/ext/ngtcp2/fuzz/corpus/decode_frame/streams_blocked +0 -0
- data/ext/ngtcp2/fuzz/corpus/ksl/random +0 -0
- data/ext/ngtcp2/fuzz/decode_frame.cc +25 -0
- data/ext/ngtcp2/fuzz/ksl.cc +77 -0
- data/ext/ngtcp2/interop/Dockerfile +39 -0
- data/ext/ngtcp2/interop/run_endpoint.sh +93 -0
- data/ext/ngtcp2/lib/CMakeLists.txt +110 -0
- data/ext/ngtcp2/lib/Makefile.am +122 -0
- data/ext/ngtcp2/lib/includes/CMakeLists.txt +4 -0
- data/ext/ngtcp2/lib/includes/Makefile.am +25 -0
- data/ext/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +5843 -0
- data/ext/ngtcp2/lib/includes/ngtcp2/version.h.in +51 -0
- data/ext/ngtcp2/lib/libngtcp2.pc.in +33 -0
- data/ext/ngtcp2/lib/ngtcp2_acktr.c +335 -0
- data/ext/ngtcp2/lib/ngtcp2_acktr.h +221 -0
- data/ext/ngtcp2/lib/ngtcp2_addr.c +117 -0
- data/ext/ngtcp2/lib/ngtcp2_addr.h +69 -0
- data/ext/ngtcp2/lib/ngtcp2_balloc.c +90 -0
- data/ext/ngtcp2/lib/ngtcp2_balloc.h +91 -0
- data/ext/ngtcp2/lib/ngtcp2_bbr.c +693 -0
- data/ext/ngtcp2/lib/ngtcp2_bbr.h +157 -0
- data/ext/ngtcp2/lib/ngtcp2_bbr2.c +1490 -0
- data/ext/ngtcp2/lib/ngtcp2_bbr2.h +149 -0
- data/ext/ngtcp2/lib/ngtcp2_buf.c +56 -0
- data/ext/ngtcp2/lib/ngtcp2_buf.h +108 -0
- data/ext/ngtcp2/lib/ngtcp2_cc.c +616 -0
- data/ext/ngtcp2/lib/ngtcp2_cc.h +422 -0
- data/ext/ngtcp2/lib/ngtcp2_cid.c +147 -0
- data/ext/ngtcp2/lib/ngtcp2_cid.h +175 -0
- data/ext/ngtcp2/lib/ngtcp2_conn.c +13731 -0
- data/ext/ngtcp2/lib/ngtcp2_conn.h +1119 -0
- data/ext/ngtcp2/lib/ngtcp2_conn_stat.h +131 -0
- data/ext/ngtcp2/lib/ngtcp2_conv.c +291 -0
- data/ext/ngtcp2/lib/ngtcp2_conv.h +208 -0
- data/ext/ngtcp2/lib/ngtcp2_crypto.c +895 -0
- data/ext/ngtcp2/lib/ngtcp2_crypto.h +148 -0
- data/ext/ngtcp2/lib/ngtcp2_err.c +154 -0
- data/ext/ngtcp2/lib/ngtcp2_err.h +34 -0
- data/ext/ngtcp2/lib/ngtcp2_gaptr.c +167 -0
- data/ext/ngtcp2/lib/ngtcp2_gaptr.h +98 -0
- data/ext/ngtcp2/lib/ngtcp2_idtr.c +79 -0
- data/ext/ngtcp2/lib/ngtcp2_idtr.h +89 -0
- data/ext/ngtcp2/lib/ngtcp2_ksl.c +819 -0
- data/ext/ngtcp2/lib/ngtcp2_ksl.h +345 -0
- data/ext/ngtcp2/lib/ngtcp2_log.c +822 -0
- data/ext/ngtcp2/lib/ngtcp2_log.h +123 -0
- data/ext/ngtcp2/lib/ngtcp2_macro.h +58 -0
- data/ext/ngtcp2/lib/ngtcp2_map.c +336 -0
- data/ext/ngtcp2/lib/ngtcp2_map.h +136 -0
- data/ext/ngtcp2/lib/ngtcp2_mem.c +113 -0
- data/ext/ngtcp2/lib/ngtcp2_mem.h +72 -0
- data/ext/ngtcp2/lib/ngtcp2_net.h +136 -0
- data/ext/ngtcp2/lib/ngtcp2_objalloc.c +40 -0
- data/ext/ngtcp2/lib/ngtcp2_objalloc.h +140 -0
- data/ext/ngtcp2/lib/ngtcp2_opl.c +46 -0
- data/ext/ngtcp2/lib/ngtcp2_opl.h +65 -0
- data/ext/ngtcp2/lib/ngtcp2_path.c +77 -0
- data/ext/ngtcp2/lib/ngtcp2_path.h +49 -0
- data/ext/ngtcp2/lib/ngtcp2_pkt.c +2527 -0
- data/ext/ngtcp2/lib/ngtcp2_pkt.h +1235 -0
- data/ext/ngtcp2/lib/ngtcp2_pmtud.c +160 -0
- data/ext/ngtcp2/lib/ngtcp2_pmtud.h +123 -0
- data/ext/ngtcp2/lib/ngtcp2_ppe.c +230 -0
- data/ext/ngtcp2/lib/ngtcp2_ppe.h +153 -0
- data/ext/ngtcp2/lib/ngtcp2_pq.c +164 -0
- data/ext/ngtcp2/lib/ngtcp2_pq.h +126 -0
- data/ext/ngtcp2/lib/ngtcp2_pv.c +172 -0
- data/ext/ngtcp2/lib/ngtcp2_pv.h +194 -0
- data/ext/ngtcp2/lib/ngtcp2_qlog.c +1219 -0
- data/ext/ngtcp2/lib/ngtcp2_qlog.h +161 -0
- data/ext/ngtcp2/lib/ngtcp2_range.c +61 -0
- data/ext/ngtcp2/lib/ngtcp2_range.h +80 -0
- data/ext/ngtcp2/lib/ngtcp2_rcvry.h +40 -0
- data/ext/ngtcp2/lib/ngtcp2_ringbuf.c +121 -0
- data/ext/ngtcp2/lib/ngtcp2_ringbuf.h +132 -0
- data/ext/ngtcp2/lib/ngtcp2_rob.c +319 -0
- data/ext/ngtcp2/lib/ngtcp2_rob.h +197 -0
- data/ext/ngtcp2/lib/ngtcp2_rst.c +138 -0
- data/ext/ngtcp2/lib/ngtcp2_rst.h +86 -0
- data/ext/ngtcp2/lib/ngtcp2_rtb.c +1676 -0
- data/ext/ngtcp2/lib/ngtcp2_rtb.h +468 -0
- data/ext/ngtcp2/lib/ngtcp2_str.c +233 -0
- data/ext/ngtcp2/lib/ngtcp2_str.h +94 -0
- data/ext/ngtcp2/lib/ngtcp2_strm.c +698 -0
- data/ext/ngtcp2/lib/ngtcp2_strm.h +310 -0
- data/ext/ngtcp2/lib/ngtcp2_unreachable.c +71 -0
- data/ext/ngtcp2/lib/ngtcp2_unreachable.h +46 -0
- data/ext/ngtcp2/lib/ngtcp2_vec.c +243 -0
- data/ext/ngtcp2/lib/ngtcp2_vec.h +120 -0
- data/ext/ngtcp2/lib/ngtcp2_version.c +39 -0
- data/ext/ngtcp2/lib/ngtcp2_window_filter.c +99 -0
- data/ext/ngtcp2/lib/ngtcp2_window_filter.h +65 -0
- data/ext/ngtcp2/m4/ax_check_compile_flag.m4 +74 -0
- data/ext/ngtcp2/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
- data/ext/ngtcp2/tests/CMakeLists.txt +68 -0
- data/ext/ngtcp2/tests/Makefile.am +94 -0
- data/ext/ngtcp2/tests/main.c +358 -0
- data/ext/ngtcp2/tests/ngtcp2_acktr_test.c +367 -0
- data/ext/ngtcp2/tests/ngtcp2_acktr_test.h +37 -0
- data/ext/ngtcp2/tests/ngtcp2_conn_test.c +9821 -0
- data/ext/ngtcp2/tests/ngtcp2_conn_test.h +104 -0
- data/ext/ngtcp2/tests/ngtcp2_conv_test.c +430 -0
- data/ext/ngtcp2/tests/ngtcp2_conv_test.h +46 -0
- data/ext/ngtcp2/tests/ngtcp2_crypto_test.c +667 -0
- data/ext/ngtcp2/tests/ngtcp2_crypto_test.h +35 -0
- data/ext/ngtcp2/tests/ngtcp2_gaptr_test.c +127 -0
- data/ext/ngtcp2/tests/ngtcp2_gaptr_test.h +36 -0
- data/ext/ngtcp2/tests/ngtcp2_idtr_test.c +79 -0
- data/ext/ngtcp2/tests/ngtcp2_idtr_test.h +34 -0
- data/ext/ngtcp2/tests/ngtcp2_ksl_test.c +502 -0
- data/ext/ngtcp2/tests/ngtcp2_ksl_test.h +39 -0
- data/ext/ngtcp2/tests/ngtcp2_map_test.c +206 -0
- data/ext/ngtcp2/tests/ngtcp2_map_test.h +38 -0
- data/ext/ngtcp2/tests/ngtcp2_pkt_test.c +1645 -0
- data/ext/ngtcp2/tests/ngtcp2_pkt_test.h +68 -0
- data/ext/ngtcp2/tests/ngtcp2_pmtud_test.c +153 -0
- data/ext/ngtcp2/tests/ngtcp2_pmtud_test.h +34 -0
- data/ext/ngtcp2/tests/ngtcp2_pv_test.c +129 -0
- data/ext/ngtcp2/tests/ngtcp2_pv_test.h +35 -0
- data/ext/ngtcp2/tests/ngtcp2_range_test.c +105 -0
- data/ext/ngtcp2/tests/ngtcp2_range_test.h +36 -0
- data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.c +91 -0
- data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.h +35 -0
- data/ext/ngtcp2/tests/ngtcp2_rob_test.c +552 -0
- data/ext/ngtcp2/tests/ngtcp2_rob_test.h +37 -0
- data/ext/ngtcp2/tests/ngtcp2_rtb_test.c +470 -0
- data/ext/ngtcp2/tests/ngtcp2_rtb_test.h +38 -0
- data/ext/ngtcp2/tests/ngtcp2_str_test.c +96 -0
- data/ext/ngtcp2/tests/ngtcp2_str_test.h +36 -0
- data/ext/ngtcp2/tests/ngtcp2_strm_test.c +575 -0
- data/ext/ngtcp2/tests/ngtcp2_strm_test.h +36 -0
- data/ext/ngtcp2/tests/ngtcp2_test_helper.c +404 -0
- data/ext/ngtcp2/tests/ngtcp2_test_helper.h +191 -0
- data/ext/ngtcp2/tests/ngtcp2_vec_test.c +426 -0
- data/ext/ngtcp2/tests/ngtcp2_vec_test.h +36 -0
- data/ext/ngtcp2/third-party/CMakeLists.txt +34 -0
- data/ext/ngtcp2/third-party/Makefile.am +31 -0
- data/ext/ngtcp2/third-party/http-parser/AUTHORS +68 -0
- data/ext/ngtcp2/third-party/http-parser/LICENSE-MIT +23 -0
- data/ext/ngtcp2/third-party/http-parser/Makefile +157 -0
- data/ext/ngtcp2/third-party/http-parser/README.md +246 -0
- data/ext/ngtcp2/third-party/http-parser/bench.c +111 -0
- data/ext/ngtcp2/third-party/http-parser/contrib/parsertrace.c +160 -0
- data/ext/ngtcp2/third-party/http-parser/contrib/url_parser.c +47 -0
- data/ext/ngtcp2/third-party/http-parser/http_parser.c +2419 -0
- data/ext/ngtcp2/third-party/http-parser/http_parser.gyp +111 -0
- data/ext/ngtcp2/third-party/http-parser/http_parser.h +431 -0
- data/ext/ngtcp2/third-party/http-parser/test.c +4411 -0
- data/lib/protocol/quic/version.rb +10 -0
- data/lib/protocol/quic.rb +9 -0
- data/license.md +21 -0
- data.tar.gz.sig +1 -0
- metadata +424 -0
- metadata.gz.sig +1 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ngtcp2
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2016 ngtcp2 contributors
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
7
|
+
* a copy of this software and associated documentation files (the
|
|
8
|
+
* "Software"), to deal in the Software without restriction, including
|
|
9
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
10
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
11
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
12
|
+
* the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be
|
|
15
|
+
* included in all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
21
|
+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
|
+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
|
+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
#ifndef VERSION_H
|
|
26
|
+
#define VERSION_H
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @macrosection
|
|
30
|
+
*
|
|
31
|
+
* Library version macros
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @macro
|
|
36
|
+
*
|
|
37
|
+
* Version number of the ngtcp2 library release.
|
|
38
|
+
*/
|
|
39
|
+
#define NGTCP2_VERSION "@PACKAGE_VERSION@"
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @macro
|
|
43
|
+
*
|
|
44
|
+
* Numerical representation of the version number of the ngtcp2
|
|
45
|
+
* library release. This is a 24 bit number with 8 bits for major
|
|
46
|
+
* number, 8 bits for minor and 8 bits for patch. Version 1.2.3
|
|
47
|
+
* becomes 0x010203.
|
|
48
|
+
*/
|
|
49
|
+
#define NGTCP2_VERSION_NUM @PACKAGE_VERSION_NUM@
|
|
50
|
+
|
|
51
|
+
#endif /* VERSION_H */
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# ngtcp2
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2016 ngtcp2 contributors
|
|
4
|
+
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
# a copy of this software and associated documentation files (the
|
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
# the following conditions:
|
|
12
|
+
|
|
13
|
+
# The above copyright notice and this permission notice shall be
|
|
14
|
+
# included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
+
prefix=@prefix@
|
|
24
|
+
exec_prefix=@exec_prefix@
|
|
25
|
+
libdir=@libdir@
|
|
26
|
+
includedir=@includedir@
|
|
27
|
+
|
|
28
|
+
Name: libngtcp2
|
|
29
|
+
Description: ngtcp2 library
|
|
30
|
+
URL: https://github.com/ngtcp2/ngtcp2
|
|
31
|
+
Version: @VERSION@
|
|
32
|
+
Libs: -L${libdir} -lngtcp2
|
|
33
|
+
Cflags: -I${includedir}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ngtcp2
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2017 ngtcp2 contributors
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
7
|
+
* a copy of this software and associated documentation files (the
|
|
8
|
+
* "Software"), to deal in the Software without restriction, including
|
|
9
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
10
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
11
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
12
|
+
* the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be
|
|
15
|
+
* included in all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
21
|
+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
|
+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
|
+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
#include "ngtcp2_acktr.h"
|
|
26
|
+
|
|
27
|
+
#include <assert.h>
|
|
28
|
+
|
|
29
|
+
#include "ngtcp2_macro.h"
|
|
30
|
+
|
|
31
|
+
static void acktr_entry_init(ngtcp2_acktr_entry *ent, int64_t pkt_num,
|
|
32
|
+
ngtcp2_tstamp tstamp) {
|
|
33
|
+
ent->pkt_num = pkt_num;
|
|
34
|
+
ent->len = 1;
|
|
35
|
+
ent->tstamp = tstamp;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
int ngtcp2_acktr_entry_objalloc_new(ngtcp2_acktr_entry **ent, int64_t pkt_num,
|
|
39
|
+
ngtcp2_tstamp tstamp,
|
|
40
|
+
ngtcp2_objalloc *objalloc) {
|
|
41
|
+
*ent = ngtcp2_objalloc_acktr_entry_get(objalloc);
|
|
42
|
+
if (*ent == NULL) {
|
|
43
|
+
return NGTCP2_ERR_NOMEM;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
acktr_entry_init(*ent, pkt_num, tstamp);
|
|
47
|
+
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void ngtcp2_acktr_entry_objalloc_del(ngtcp2_acktr_entry *ent,
|
|
52
|
+
ngtcp2_objalloc *objalloc) {
|
|
53
|
+
ngtcp2_objalloc_acktr_entry_release(objalloc, ent);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static int greater(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) {
|
|
57
|
+
return *(int64_t *)lhs > *(int64_t *)rhs;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
int ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log,
|
|
61
|
+
const ngtcp2_mem *mem) {
|
|
62
|
+
int rv;
|
|
63
|
+
|
|
64
|
+
ngtcp2_objalloc_acktr_entry_init(&acktr->objalloc, 32, mem);
|
|
65
|
+
|
|
66
|
+
rv = ngtcp2_ringbuf_init(&acktr->acks, 32, sizeof(ngtcp2_acktr_ack_entry),
|
|
67
|
+
mem);
|
|
68
|
+
if (rv != 0) {
|
|
69
|
+
return rv;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
ngtcp2_ksl_init(&acktr->ents, greater, sizeof(int64_t), mem);
|
|
73
|
+
|
|
74
|
+
acktr->log = log;
|
|
75
|
+
acktr->mem = mem;
|
|
76
|
+
acktr->flags = NGTCP2_ACKTR_FLAG_NONE;
|
|
77
|
+
acktr->first_unacked_ts = UINT64_MAX;
|
|
78
|
+
acktr->rx_npkt = 0;
|
|
79
|
+
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void ngtcp2_acktr_free(ngtcp2_acktr *acktr) {
|
|
84
|
+
#ifdef NOMEMPOOL
|
|
85
|
+
ngtcp2_ksl_it it;
|
|
86
|
+
#endif /* NOMEMPOOL */
|
|
87
|
+
|
|
88
|
+
if (acktr == NULL) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#ifdef NOMEMPOOL
|
|
93
|
+
for (it = ngtcp2_ksl_begin(&acktr->ents); !ngtcp2_ksl_it_end(&it);
|
|
94
|
+
ngtcp2_ksl_it_next(&it)) {
|
|
95
|
+
ngtcp2_acktr_entry_objalloc_del(ngtcp2_ksl_it_get(&it), &acktr->objalloc);
|
|
96
|
+
}
|
|
97
|
+
#endif /* NOMEMPOOL */
|
|
98
|
+
|
|
99
|
+
ngtcp2_ksl_free(&acktr->ents);
|
|
100
|
+
|
|
101
|
+
ngtcp2_ringbuf_free(&acktr->acks);
|
|
102
|
+
|
|
103
|
+
ngtcp2_objalloc_free(&acktr->objalloc);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack,
|
|
107
|
+
ngtcp2_tstamp ts) {
|
|
108
|
+
ngtcp2_ksl_it it, prev_it;
|
|
109
|
+
ngtcp2_acktr_entry *ent, *prev_ent, *delent;
|
|
110
|
+
int rv;
|
|
111
|
+
int added = 0;
|
|
112
|
+
|
|
113
|
+
if (ngtcp2_ksl_len(&acktr->ents)) {
|
|
114
|
+
it = ngtcp2_ksl_lower_bound(&acktr->ents, &pkt_num);
|
|
115
|
+
if (ngtcp2_ksl_it_end(&it)) {
|
|
116
|
+
ngtcp2_ksl_it_prev(&it);
|
|
117
|
+
ent = ngtcp2_ksl_it_get(&it);
|
|
118
|
+
|
|
119
|
+
assert(ent->pkt_num >= pkt_num + (int64_t)ent->len);
|
|
120
|
+
|
|
121
|
+
if (ent->pkt_num == pkt_num + (int64_t)ent->len) {
|
|
122
|
+
++ent->len;
|
|
123
|
+
added = 1;
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
ent = ngtcp2_ksl_it_get(&it);
|
|
127
|
+
|
|
128
|
+
assert(ent->pkt_num != pkt_num);
|
|
129
|
+
|
|
130
|
+
if (ngtcp2_ksl_it_begin(&it)) {
|
|
131
|
+
if (ent->pkt_num + 1 == pkt_num) {
|
|
132
|
+
ngtcp2_ksl_update_key(&acktr->ents, &ent->pkt_num, &pkt_num);
|
|
133
|
+
ent->pkt_num = pkt_num;
|
|
134
|
+
ent->tstamp = ts;
|
|
135
|
+
++ent->len;
|
|
136
|
+
added = 1;
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
prev_it = it;
|
|
140
|
+
ngtcp2_ksl_it_prev(&prev_it);
|
|
141
|
+
prev_ent = ngtcp2_ksl_it_get(&prev_it);
|
|
142
|
+
|
|
143
|
+
assert(prev_ent->pkt_num >= pkt_num + (int64_t)prev_ent->len);
|
|
144
|
+
|
|
145
|
+
if (ent->pkt_num + 1 == pkt_num) {
|
|
146
|
+
if (prev_ent->pkt_num == pkt_num + (int64_t)prev_ent->len) {
|
|
147
|
+
prev_ent->len += ent->len + 1;
|
|
148
|
+
ngtcp2_ksl_remove_hint(&acktr->ents, NULL, &it, &ent->pkt_num);
|
|
149
|
+
ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc);
|
|
150
|
+
added = 1;
|
|
151
|
+
} else {
|
|
152
|
+
ngtcp2_ksl_update_key(&acktr->ents, &ent->pkt_num, &pkt_num);
|
|
153
|
+
ent->pkt_num = pkt_num;
|
|
154
|
+
ent->tstamp = ts;
|
|
155
|
+
++ent->len;
|
|
156
|
+
added = 1;
|
|
157
|
+
}
|
|
158
|
+
} else if (prev_ent->pkt_num == pkt_num + (int64_t)prev_ent->len) {
|
|
159
|
+
++prev_ent->len;
|
|
160
|
+
added = 1;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (!added) {
|
|
167
|
+
rv = ngtcp2_acktr_entry_objalloc_new(&ent, pkt_num, ts, &acktr->objalloc);
|
|
168
|
+
if (rv != 0) {
|
|
169
|
+
return rv;
|
|
170
|
+
}
|
|
171
|
+
rv = ngtcp2_ksl_insert(&acktr->ents, NULL, &ent->pkt_num, ent);
|
|
172
|
+
if (rv != 0) {
|
|
173
|
+
ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc);
|
|
174
|
+
return rv;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (active_ack) {
|
|
179
|
+
acktr->flags |= NGTCP2_ACKTR_FLAG_ACTIVE_ACK;
|
|
180
|
+
if (acktr->first_unacked_ts == UINT64_MAX) {
|
|
181
|
+
acktr->first_unacked_ts = ts;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (ngtcp2_ksl_len(&acktr->ents) > NGTCP2_ACKTR_MAX_ENT) {
|
|
186
|
+
it = ngtcp2_ksl_end(&acktr->ents);
|
|
187
|
+
ngtcp2_ksl_it_prev(&it);
|
|
188
|
+
delent = ngtcp2_ksl_it_get(&it);
|
|
189
|
+
ngtcp2_ksl_remove_hint(&acktr->ents, NULL, &it, &delent->pkt_num);
|
|
190
|
+
ngtcp2_acktr_entry_objalloc_del(delent, &acktr->objalloc);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent) {
|
|
197
|
+
ngtcp2_ksl_it it;
|
|
198
|
+
|
|
199
|
+
it = ngtcp2_ksl_lower_bound(&acktr->ents, &ent->pkt_num);
|
|
200
|
+
assert(*(int64_t *)ngtcp2_ksl_it_key(&it) == (int64_t)ent->pkt_num);
|
|
201
|
+
|
|
202
|
+
for (; !ngtcp2_ksl_it_end(&it);) {
|
|
203
|
+
ent = ngtcp2_ksl_it_get(&it);
|
|
204
|
+
ngtcp2_ksl_remove_hint(&acktr->ents, &it, &it, &ent->pkt_num);
|
|
205
|
+
ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
ngtcp2_ksl_it ngtcp2_acktr_get(ngtcp2_acktr *acktr) {
|
|
210
|
+
return ngtcp2_ksl_begin(&acktr->ents);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
int ngtcp2_acktr_empty(ngtcp2_acktr *acktr) {
|
|
214
|
+
ngtcp2_ksl_it it = ngtcp2_ksl_begin(&acktr->ents);
|
|
215
|
+
return ngtcp2_ksl_it_end(&it);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
ngtcp2_acktr_ack_entry *ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr,
|
|
219
|
+
int64_t pkt_num,
|
|
220
|
+
int64_t largest_ack) {
|
|
221
|
+
ngtcp2_acktr_ack_entry *ent = ngtcp2_ringbuf_push_front(&acktr->acks);
|
|
222
|
+
|
|
223
|
+
ent->largest_ack = largest_ack;
|
|
224
|
+
ent->pkt_num = pkt_num;
|
|
225
|
+
|
|
226
|
+
return ent;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
* acktr_remove removes |ent| from |acktr|. |it| must point to the
|
|
231
|
+
* node whose key identifies |ent|. The iterator which points to the
|
|
232
|
+
* entry next to |ent| is assigned to |it|.
|
|
233
|
+
*/
|
|
234
|
+
static void acktr_remove(ngtcp2_acktr *acktr, ngtcp2_ksl_it *it,
|
|
235
|
+
ngtcp2_acktr_entry *ent) {
|
|
236
|
+
ngtcp2_ksl_remove_hint(&acktr->ents, it, it, &ent->pkt_num);
|
|
237
|
+
ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
static void acktr_on_ack(ngtcp2_acktr *acktr, ngtcp2_ringbuf *rb,
|
|
241
|
+
size_t ack_ent_offset) {
|
|
242
|
+
ngtcp2_acktr_ack_entry *ack_ent;
|
|
243
|
+
ngtcp2_acktr_entry *ent;
|
|
244
|
+
ngtcp2_ksl_it it;
|
|
245
|
+
|
|
246
|
+
assert(ngtcp2_ringbuf_len(rb));
|
|
247
|
+
|
|
248
|
+
ack_ent = ngtcp2_ringbuf_get(rb, ack_ent_offset);
|
|
249
|
+
|
|
250
|
+
/* Assume that ngtcp2_pkt_validate_ack(fr) returns 0 */
|
|
251
|
+
it = ngtcp2_ksl_lower_bound(&acktr->ents, &ack_ent->largest_ack);
|
|
252
|
+
for (; !ngtcp2_ksl_it_end(&it);) {
|
|
253
|
+
ent = ngtcp2_ksl_it_get(&it);
|
|
254
|
+
acktr_remove(acktr, &it, ent);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (ngtcp2_ksl_len(&acktr->ents)) {
|
|
258
|
+
assert(ngtcp2_ksl_it_end(&it));
|
|
259
|
+
|
|
260
|
+
ngtcp2_ksl_it_prev(&it);
|
|
261
|
+
ent = ngtcp2_ksl_it_get(&it);
|
|
262
|
+
if (ent->pkt_num > ack_ent->largest_ack &&
|
|
263
|
+
ack_ent->largest_ack >= ent->pkt_num - (int64_t)(ent->len - 1)) {
|
|
264
|
+
ent->len = (size_t)(ent->pkt_num - ack_ent->largest_ack);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
ngtcp2_ringbuf_resize(rb, ack_ent_offset);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) {
|
|
272
|
+
ngtcp2_acktr_ack_entry *ent;
|
|
273
|
+
int64_t largest_ack = fr->largest_ack, min_ack;
|
|
274
|
+
size_t i, j;
|
|
275
|
+
ngtcp2_ringbuf *rb = &acktr->acks;
|
|
276
|
+
size_t nacks = ngtcp2_ringbuf_len(rb);
|
|
277
|
+
|
|
278
|
+
/* Assume that ngtcp2_pkt_validate_ack(fr) returns 0 */
|
|
279
|
+
for (j = 0; j < nacks; ++j) {
|
|
280
|
+
ent = ngtcp2_ringbuf_get(rb, j);
|
|
281
|
+
if (largest_ack >= ent->pkt_num) {
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (j == nacks) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
min_ack = largest_ack - (int64_t)fr->first_ack_range;
|
|
290
|
+
|
|
291
|
+
if (min_ack <= ent->pkt_num && ent->pkt_num <= largest_ack) {
|
|
292
|
+
acktr_on_ack(acktr, rb, j);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
for (i = 0; i < fr->rangecnt && j < nacks; ++i) {
|
|
297
|
+
largest_ack = min_ack - (int64_t)fr->ranges[i].gap - 2;
|
|
298
|
+
min_ack = largest_ack - (int64_t)fr->ranges[i].len;
|
|
299
|
+
|
|
300
|
+
for (;;) {
|
|
301
|
+
if (ent->pkt_num > largest_ack) {
|
|
302
|
+
++j;
|
|
303
|
+
if (j == nacks) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
ent = ngtcp2_ringbuf_get(rb, j);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (ent->pkt_num < min_ack) {
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
acktr_on_ack(acktr, rb, j);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
void ngtcp2_acktr_commit_ack(ngtcp2_acktr *acktr) {
|
|
319
|
+
acktr->flags &= (uint16_t) ~(NGTCP2_ACKTR_FLAG_ACTIVE_ACK |
|
|
320
|
+
NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK |
|
|
321
|
+
NGTCP2_ACKTR_FLAG_CANCEL_TIMER);
|
|
322
|
+
acktr->first_unacked_ts = UINT64_MAX;
|
|
323
|
+
acktr->rx_npkt = 0;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr,
|
|
327
|
+
ngtcp2_duration max_ack_delay,
|
|
328
|
+
ngtcp2_tstamp ts) {
|
|
329
|
+
return acktr->first_unacked_ts != UINT64_MAX &&
|
|
330
|
+
acktr->first_unacked_ts + max_ack_delay <= ts;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr) {
|
|
334
|
+
acktr->flags |= NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK;
|
|
335
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ngtcp2
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2017 ngtcp2 contributors
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
7
|
+
* a copy of this software and associated documentation files (the
|
|
8
|
+
* "Software"), to deal in the Software without restriction, including
|
|
9
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
10
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
11
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
12
|
+
* the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be
|
|
15
|
+
* included in all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
21
|
+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
|
+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
|
+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
#ifndef NGTCP2_ACKTR_H
|
|
26
|
+
#define NGTCP2_ACKTR_H
|
|
27
|
+
|
|
28
|
+
#ifdef HAVE_CONFIG_H
|
|
29
|
+
# include <config.h>
|
|
30
|
+
#endif /* HAVE_CONFIG_H */
|
|
31
|
+
|
|
32
|
+
#include <ngtcp2/ngtcp2.h>
|
|
33
|
+
|
|
34
|
+
#include "ngtcp2_mem.h"
|
|
35
|
+
#include "ngtcp2_ringbuf.h"
|
|
36
|
+
#include "ngtcp2_ksl.h"
|
|
37
|
+
#include "ngtcp2_pkt.h"
|
|
38
|
+
#include "ngtcp2_objalloc.h"
|
|
39
|
+
|
|
40
|
+
/* NGTCP2_ACKTR_MAX_ENT is the maximum number of ngtcp2_acktr_entry
|
|
41
|
+
which ngtcp2_acktr stores. */
|
|
42
|
+
#define NGTCP2_ACKTR_MAX_ENT 1024
|
|
43
|
+
|
|
44
|
+
typedef struct ngtcp2_log ngtcp2_log;
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* ngtcp2_acktr_entry is a range of packets which need to be acked.
|
|
48
|
+
*/
|
|
49
|
+
typedef struct ngtcp2_acktr_entry {
|
|
50
|
+
union {
|
|
51
|
+
struct {
|
|
52
|
+
/* pkt_num is the largest packet number to acknowledge in this
|
|
53
|
+
range. */
|
|
54
|
+
int64_t pkt_num;
|
|
55
|
+
/* len is the consecutive packets started from pkt_num which
|
|
56
|
+
includes pkt_num itself counting in decreasing order. So pkt_num
|
|
57
|
+
= 987 and len = 2, this entry includes packet 987 and 986. */
|
|
58
|
+
size_t len;
|
|
59
|
+
/* tstamp is the timestamp when a packet denoted by pkt_num is
|
|
60
|
+
received. */
|
|
61
|
+
ngtcp2_tstamp tstamp;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
ngtcp2_opl_entry oplent;
|
|
65
|
+
};
|
|
66
|
+
} ngtcp2_acktr_entry;
|
|
67
|
+
|
|
68
|
+
ngtcp2_objalloc_def(acktr_entry, ngtcp2_acktr_entry, oplent);
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* ngtcp2_acktr_entry_objalloc_new allocates memory for ent, and
|
|
72
|
+
* initializes it with the given parameters. The pointer to the
|
|
73
|
+
* allocated object is stored to |*ent|.
|
|
74
|
+
*
|
|
75
|
+
* This function returns 0 if it succeeds, or one of the following
|
|
76
|
+
* negative error codes:
|
|
77
|
+
*
|
|
78
|
+
* NGTCP2_ERR_NOMEM
|
|
79
|
+
* Out of memory.
|
|
80
|
+
*/
|
|
81
|
+
int ngtcp2_acktr_entry_objalloc_new(ngtcp2_acktr_entry **ent, int64_t pkt_num,
|
|
82
|
+
ngtcp2_tstamp tstamp,
|
|
83
|
+
ngtcp2_objalloc *objalloc);
|
|
84
|
+
|
|
85
|
+
/*
|
|
86
|
+
* ngtcp2_acktr_entry_objalloc_del deallocates memory allocated for
|
|
87
|
+
* |ent|.
|
|
88
|
+
*/
|
|
89
|
+
void ngtcp2_acktr_entry_objalloc_del(ngtcp2_acktr_entry *ent,
|
|
90
|
+
ngtcp2_objalloc *objalloc);
|
|
91
|
+
|
|
92
|
+
typedef struct ngtcp2_acktr_ack_entry {
|
|
93
|
+
/* largest_ack is the largest packet number in outgoing ACK frame */
|
|
94
|
+
int64_t largest_ack;
|
|
95
|
+
/* pkt_num is the packet number that ACK frame is included. */
|
|
96
|
+
int64_t pkt_num;
|
|
97
|
+
} ngtcp2_acktr_ack_entry;
|
|
98
|
+
|
|
99
|
+
/* NGTCP2_ACKTR_FLAG_NONE indicates that no flag set. */
|
|
100
|
+
#define NGTCP2_ACKTR_FLAG_NONE 0x00u
|
|
101
|
+
/* NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK indicates that immediate
|
|
102
|
+
acknowledgement is required. */
|
|
103
|
+
#define NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK 0x01u
|
|
104
|
+
/* NGTCP2_ACKTR_FLAG_ACTIVE_ACK indicates that there are pending
|
|
105
|
+
protected packet to be acknowledged. */
|
|
106
|
+
#define NGTCP2_ACKTR_FLAG_ACTIVE_ACK 0x02u
|
|
107
|
+
/* NGTCP2_ACKTR_FLAG_CANCEL_TIMER is set when ACK delay timer is
|
|
108
|
+
expired and canceled. */
|
|
109
|
+
#define NGTCP2_ACKTR_FLAG_CANCEL_TIMER 0x0100u
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* ngtcp2_acktr tracks received packets which we have to send ack.
|
|
113
|
+
*/
|
|
114
|
+
typedef struct ngtcp2_acktr {
|
|
115
|
+
ngtcp2_objalloc objalloc;
|
|
116
|
+
ngtcp2_ringbuf acks;
|
|
117
|
+
/* ents includes ngtcp2_acktr_entry sorted by decreasing order of
|
|
118
|
+
packet number. */
|
|
119
|
+
ngtcp2_ksl ents;
|
|
120
|
+
ngtcp2_log *log;
|
|
121
|
+
const ngtcp2_mem *mem;
|
|
122
|
+
/* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */
|
|
123
|
+
uint16_t flags;
|
|
124
|
+
/* first_unacked_ts is timestamp when ngtcp2_acktr_entry is added
|
|
125
|
+
first time after the last outgoing ACK frame. */
|
|
126
|
+
ngtcp2_tstamp first_unacked_ts;
|
|
127
|
+
/* rx_npkt is the number of ACK eliciting packets received without
|
|
128
|
+
sending ACK. */
|
|
129
|
+
size_t rx_npkt;
|
|
130
|
+
} ngtcp2_acktr;
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
* ngtcp2_acktr_init initializes |acktr|.
|
|
134
|
+
*
|
|
135
|
+
* This function returns 0 if it succeeds, or one of the following
|
|
136
|
+
* negative error codes:
|
|
137
|
+
*
|
|
138
|
+
* NGTCP2_ERR_NOMEM
|
|
139
|
+
* Out of memory.
|
|
140
|
+
*/
|
|
141
|
+
int ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log,
|
|
142
|
+
const ngtcp2_mem *mem);
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* ngtcp2_acktr_free frees resources allocated for |acktr|. It frees
|
|
146
|
+
* any ngtcp2_acktr_entry added to |acktr|.
|
|
147
|
+
*/
|
|
148
|
+
void ngtcp2_acktr_free(ngtcp2_acktr *acktr);
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* ngtcp2_acktr_add adds packet number |pkt_num| to |acktr|.
|
|
152
|
+
* |active_ack| is nonzero if |pkt_num| is retransmittable packet.
|
|
153
|
+
*
|
|
154
|
+
* This function assumes that |acktr| does not contain |pkt_num|.
|
|
155
|
+
*
|
|
156
|
+
* This function returns 0 if it succeeds, or one of the following
|
|
157
|
+
* negative error codes:
|
|
158
|
+
*
|
|
159
|
+
* NGTCP2_ERR_NOMEM
|
|
160
|
+
* OUt of memory.
|
|
161
|
+
*/
|
|
162
|
+
int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack,
|
|
163
|
+
ngtcp2_tstamp ts);
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* ngtcp2_acktr_forget removes all entries which have the packet
|
|
167
|
+
* number that is equal to or less than ent->pkt_num. This function
|
|
168
|
+
* assumes that |acktr| includes |ent|.
|
|
169
|
+
*/
|
|
170
|
+
void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent);
|
|
171
|
+
|
|
172
|
+
/*
|
|
173
|
+
* ngtcp2_acktr_get returns the pointer to pointer to the entry which
|
|
174
|
+
* has the largest packet number to be acked. If there is no entry,
|
|
175
|
+
* returned value satisfies ngtcp2_ksl_it_end(&it) != 0.
|
|
176
|
+
*/
|
|
177
|
+
ngtcp2_ksl_it ngtcp2_acktr_get(ngtcp2_acktr *acktr);
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
* ngtcp2_acktr_empty returns nonzero if it has no packet to
|
|
181
|
+
* acknowledge.
|
|
182
|
+
*/
|
|
183
|
+
int ngtcp2_acktr_empty(ngtcp2_acktr *acktr);
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* ngtcp2_acktr_add_ack records outgoing ACK frame whose largest
|
|
187
|
+
* acknowledged packet number is |largest_ack|. |pkt_num| is the
|
|
188
|
+
* packet number of a packet in which ACK frame is included. This
|
|
189
|
+
* function returns a pointer to the object it adds.
|
|
190
|
+
*/
|
|
191
|
+
ngtcp2_acktr_ack_entry *
|
|
192
|
+
ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr, int64_t pkt_num, int64_t largest_ack);
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
* ngtcp2_acktr_recv_ack processes the incoming ACK frame |fr|.
|
|
196
|
+
* |pkt_num| is a packet number which includes |fr|. If we receive
|
|
197
|
+
* ACK which acknowledges the ACKs added by ngtcp2_acktr_add_ack,
|
|
198
|
+
* ngtcp2_acktr_entry which the outgoing ACK acknowledges is removed.
|
|
199
|
+
*/
|
|
200
|
+
void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr);
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* ngtcp2_acktr_commit_ack tells |acktr| that ACK frame is generated.
|
|
204
|
+
*/
|
|
205
|
+
void ngtcp2_acktr_commit_ack(ngtcp2_acktr *acktr);
|
|
206
|
+
|
|
207
|
+
/*
|
|
208
|
+
* ngtcp2_acktr_require_active_ack returns nonzero if ACK frame should
|
|
209
|
+
* be generated actively.
|
|
210
|
+
*/
|
|
211
|
+
int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr,
|
|
212
|
+
ngtcp2_duration max_ack_delay,
|
|
213
|
+
ngtcp2_tstamp ts);
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* ngtcp2_acktr_immediate_ack tells |acktr| that immediate
|
|
217
|
+
* acknowledgement is required.
|
|
218
|
+
*/
|
|
219
|
+
void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr);
|
|
220
|
+
|
|
221
|
+
#endif /* NGTCP2_ACKTR_H */
|