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,683 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ngtcp2
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2021 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
|
+
#ifdef HAVE_CONFIG_H
|
|
26
|
+
# include <config.h>
|
|
27
|
+
#endif /* HAVE_CONFIG_H */
|
|
28
|
+
|
|
29
|
+
#include <time.h>
|
|
30
|
+
#include <sys/types.h>
|
|
31
|
+
#include <sys/socket.h>
|
|
32
|
+
#include <netdb.h>
|
|
33
|
+
#include <arpa/inet.h>
|
|
34
|
+
#include <string.h>
|
|
35
|
+
#include <stdio.h>
|
|
36
|
+
#include <errno.h>
|
|
37
|
+
|
|
38
|
+
#include <ngtcp2/ngtcp2.h>
|
|
39
|
+
#include <ngtcp2/ngtcp2_crypto.h>
|
|
40
|
+
#include <ngtcp2/ngtcp2_crypto_openssl.h>
|
|
41
|
+
|
|
42
|
+
#include <openssl/ssl.h>
|
|
43
|
+
#include <openssl/rand.h>
|
|
44
|
+
#include <openssl/err.h>
|
|
45
|
+
|
|
46
|
+
#include <ev.h>
|
|
47
|
+
|
|
48
|
+
#define REMOTE_HOST "127.0.0.1"
|
|
49
|
+
#define REMOTE_PORT "4433"
|
|
50
|
+
#define ALPN "\xahq-interop"
|
|
51
|
+
#define MESSAGE "GET /\r\n"
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* Example 1: Handshake with www.google.com
|
|
55
|
+
*
|
|
56
|
+
* #define REMOTE_HOST "www.google.com"
|
|
57
|
+
* #define REMOTE_PORT "443"
|
|
58
|
+
* #define ALPN "\x2h3"
|
|
59
|
+
*
|
|
60
|
+
* and undefine MESSAGE macro.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
static uint64_t timestamp(void) {
|
|
64
|
+
struct timespec tp;
|
|
65
|
+
|
|
66
|
+
if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) {
|
|
67
|
+
fprintf(stderr, "clock_gettime: %s\n", strerror(errno));
|
|
68
|
+
exit(EXIT_FAILURE);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return (uint64_t)tp.tv_sec * NGTCP2_SECONDS + (uint64_t)tp.tv_nsec;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static int create_sock(struct sockaddr *addr, socklen_t *paddrlen,
|
|
75
|
+
const char *host, const char *port) {
|
|
76
|
+
struct addrinfo hints = {0};
|
|
77
|
+
struct addrinfo *res, *rp;
|
|
78
|
+
int rv;
|
|
79
|
+
int fd = -1;
|
|
80
|
+
|
|
81
|
+
hints.ai_flags = AF_UNSPEC;
|
|
82
|
+
hints.ai_socktype = SOCK_DGRAM;
|
|
83
|
+
|
|
84
|
+
rv = getaddrinfo(host, port, &hints, &res);
|
|
85
|
+
if (rv != 0) {
|
|
86
|
+
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
|
|
87
|
+
return -1;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
for (rp = res; rp; rp = rp->ai_next) {
|
|
91
|
+
fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
|
|
92
|
+
if (fd == -1) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (fd == -1) {
|
|
100
|
+
goto end;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
*paddrlen = rp->ai_addrlen;
|
|
104
|
+
memcpy(addr, rp->ai_addr, rp->ai_addrlen);
|
|
105
|
+
|
|
106
|
+
end:
|
|
107
|
+
freeaddrinfo(res);
|
|
108
|
+
|
|
109
|
+
return fd;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static int connect_sock(struct sockaddr *local_addr, socklen_t *plocal_addrlen,
|
|
113
|
+
int fd, const struct sockaddr *remote_addr,
|
|
114
|
+
size_t remote_addrlen) {
|
|
115
|
+
socklen_t len;
|
|
116
|
+
|
|
117
|
+
if (connect(fd, remote_addr, (socklen_t)remote_addrlen) != 0) {
|
|
118
|
+
fprintf(stderr, "connect: %s\n", strerror(errno));
|
|
119
|
+
return -1;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
len = *plocal_addrlen;
|
|
123
|
+
|
|
124
|
+
if (getsockname(fd, local_addr, &len) == -1) {
|
|
125
|
+
fprintf(stderr, "getsockname: %s\n", strerror(errno));
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
*plocal_addrlen = len;
|
|
130
|
+
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
struct client {
|
|
135
|
+
ngtcp2_crypto_conn_ref conn_ref;
|
|
136
|
+
int fd;
|
|
137
|
+
struct sockaddr_storage local_addr;
|
|
138
|
+
socklen_t local_addrlen;
|
|
139
|
+
SSL_CTX *ssl_ctx;
|
|
140
|
+
SSL *ssl;
|
|
141
|
+
ngtcp2_conn *conn;
|
|
142
|
+
|
|
143
|
+
struct {
|
|
144
|
+
int64_t stream_id;
|
|
145
|
+
const uint8_t *data;
|
|
146
|
+
size_t datalen;
|
|
147
|
+
size_t nwrite;
|
|
148
|
+
} stream;
|
|
149
|
+
|
|
150
|
+
ngtcp2_connection_close_error last_error;
|
|
151
|
+
|
|
152
|
+
ev_io rev;
|
|
153
|
+
ev_timer timer;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
static int numeric_host_family(const char *hostname, int family) {
|
|
157
|
+
uint8_t dst[sizeof(struct in6_addr)];
|
|
158
|
+
return inet_pton(family, hostname, dst) == 1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static int numeric_host(const char *hostname) {
|
|
162
|
+
return numeric_host_family(hostname, AF_INET) ||
|
|
163
|
+
numeric_host_family(hostname, AF_INET6);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
static int client_ssl_init(struct client *c) {
|
|
167
|
+
c->ssl_ctx = SSL_CTX_new(TLS_client_method());
|
|
168
|
+
if (!c->ssl_ctx) {
|
|
169
|
+
fprintf(stderr, "SSL_CTX_new: %s\n",
|
|
170
|
+
ERR_error_string(ERR_get_error(), NULL));
|
|
171
|
+
return -1;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (ngtcp2_crypto_openssl_configure_client_context(c->ssl_ctx) != 0) {
|
|
175
|
+
fprintf(stderr, "ngtcp2_crypto_openssl_configure_client_context failed\n");
|
|
176
|
+
return -1;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
c->ssl = SSL_new(c->ssl_ctx);
|
|
180
|
+
if (!c->ssl) {
|
|
181
|
+
fprintf(stderr, "SSL_new: %s\n", ERR_error_string(ERR_get_error(), NULL));
|
|
182
|
+
return -1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
SSL_set_app_data(c->ssl, &c->conn_ref);
|
|
186
|
+
SSL_set_connect_state(c->ssl);
|
|
187
|
+
SSL_set_alpn_protos(c->ssl, (const unsigned char *)ALPN, sizeof(ALPN) - 1);
|
|
188
|
+
if (!numeric_host(REMOTE_HOST)) {
|
|
189
|
+
SSL_set_tlsext_host_name(c->ssl, REMOTE_HOST);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* For NGTCP2_PROTO_VER_V1 */
|
|
193
|
+
SSL_set_quic_transport_version(c->ssl, TLSEXT_TYPE_quic_transport_parameters);
|
|
194
|
+
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static void rand_cb(uint8_t *dest, size_t destlen,
|
|
199
|
+
const ngtcp2_rand_ctx *rand_ctx) {
|
|
200
|
+
size_t i;
|
|
201
|
+
(void)rand_ctx;
|
|
202
|
+
|
|
203
|
+
for (i = 0; i < destlen; ++i) {
|
|
204
|
+
*dest = (uint8_t)random();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
static int get_new_connection_id_cb(ngtcp2_conn *conn, ngtcp2_cid *cid,
|
|
209
|
+
uint8_t *token, size_t cidlen,
|
|
210
|
+
void *user_data) {
|
|
211
|
+
(void)conn;
|
|
212
|
+
(void)user_data;
|
|
213
|
+
|
|
214
|
+
if (RAND_bytes(cid->data, (int)cidlen) != 1) {
|
|
215
|
+
return NGTCP2_ERR_CALLBACK_FAILURE;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
cid->datalen = cidlen;
|
|
219
|
+
|
|
220
|
+
if (RAND_bytes(token, NGTCP2_STATELESS_RESET_TOKENLEN) != 1) {
|
|
221
|
+
return NGTCP2_ERR_CALLBACK_FAILURE;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
static int extend_max_local_streams_bidi(ngtcp2_conn *conn,
|
|
228
|
+
uint64_t max_streams,
|
|
229
|
+
void *user_data) {
|
|
230
|
+
#ifdef MESSAGE
|
|
231
|
+
struct client *c = user_data;
|
|
232
|
+
int rv;
|
|
233
|
+
int64_t stream_id;
|
|
234
|
+
(void)max_streams;
|
|
235
|
+
|
|
236
|
+
if (c->stream.stream_id != -1) {
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
rv = ngtcp2_conn_open_bidi_stream(conn, &stream_id, NULL);
|
|
241
|
+
if (rv != 0) {
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
c->stream.stream_id = stream_id;
|
|
246
|
+
c->stream.data = (const uint8_t *)MESSAGE;
|
|
247
|
+
c->stream.datalen = sizeof(MESSAGE) - 1;
|
|
248
|
+
|
|
249
|
+
return 0;
|
|
250
|
+
#else /* !MESSAGE */
|
|
251
|
+
(void)conn;
|
|
252
|
+
(void)max_streams;
|
|
253
|
+
(void)user_data;
|
|
254
|
+
|
|
255
|
+
return 0;
|
|
256
|
+
#endif /* !MESSAGE */
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
static void log_printf(void *user_data, const char *fmt, ...) {
|
|
260
|
+
va_list ap;
|
|
261
|
+
(void)user_data;
|
|
262
|
+
|
|
263
|
+
va_start(ap, fmt);
|
|
264
|
+
vfprintf(stderr, fmt, ap);
|
|
265
|
+
va_end(ap);
|
|
266
|
+
|
|
267
|
+
fprintf(stderr, "\n");
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
static int client_quic_init(struct client *c,
|
|
271
|
+
const struct sockaddr *remote_addr,
|
|
272
|
+
socklen_t remote_addrlen,
|
|
273
|
+
const struct sockaddr *local_addr,
|
|
274
|
+
socklen_t local_addrlen) {
|
|
275
|
+
ngtcp2_path path = {
|
|
276
|
+
{
|
|
277
|
+
(struct sockaddr *)local_addr,
|
|
278
|
+
local_addrlen,
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
(struct sockaddr *)remote_addr,
|
|
282
|
+
remote_addrlen,
|
|
283
|
+
},
|
|
284
|
+
NULL,
|
|
285
|
+
};
|
|
286
|
+
ngtcp2_callbacks callbacks = {
|
|
287
|
+
ngtcp2_crypto_client_initial_cb,
|
|
288
|
+
NULL, /* recv_client_initial */
|
|
289
|
+
ngtcp2_crypto_recv_crypto_data_cb,
|
|
290
|
+
NULL, /* handshake_completed */
|
|
291
|
+
NULL, /* recv_version_negotiation */
|
|
292
|
+
ngtcp2_crypto_encrypt_cb,
|
|
293
|
+
ngtcp2_crypto_decrypt_cb,
|
|
294
|
+
ngtcp2_crypto_hp_mask_cb,
|
|
295
|
+
NULL, /* recv_stream_data */
|
|
296
|
+
NULL, /* acked_stream_data_offset */
|
|
297
|
+
NULL, /* stream_open */
|
|
298
|
+
NULL, /* stream_close */
|
|
299
|
+
NULL, /* recv_stateless_reset */
|
|
300
|
+
ngtcp2_crypto_recv_retry_cb,
|
|
301
|
+
extend_max_local_streams_bidi,
|
|
302
|
+
NULL, /* extend_max_local_streams_uni */
|
|
303
|
+
rand_cb,
|
|
304
|
+
get_new_connection_id_cb,
|
|
305
|
+
NULL, /* remove_connection_id */
|
|
306
|
+
ngtcp2_crypto_update_key_cb,
|
|
307
|
+
NULL, /* path_validation */
|
|
308
|
+
NULL, /* select_preferred_address */
|
|
309
|
+
NULL, /* stream_reset */
|
|
310
|
+
NULL, /* extend_max_remote_streams_bidi */
|
|
311
|
+
NULL, /* extend_max_remote_streams_uni */
|
|
312
|
+
NULL, /* extend_max_stream_data */
|
|
313
|
+
NULL, /* dcid_status */
|
|
314
|
+
NULL, /* handshake_confirmed */
|
|
315
|
+
NULL, /* recv_new_token */
|
|
316
|
+
ngtcp2_crypto_delete_crypto_aead_ctx_cb,
|
|
317
|
+
ngtcp2_crypto_delete_crypto_cipher_ctx_cb,
|
|
318
|
+
NULL, /* recv_datagram */
|
|
319
|
+
NULL, /* ack_datagram */
|
|
320
|
+
NULL, /* lost_datagram */
|
|
321
|
+
ngtcp2_crypto_get_path_challenge_data_cb,
|
|
322
|
+
NULL, /* stream_stop_sending */
|
|
323
|
+
ngtcp2_crypto_version_negotiation_cb,
|
|
324
|
+
NULL, /* recv_rx_key */
|
|
325
|
+
NULL, /* recv_tx_key */
|
|
326
|
+
NULL, /* early_data_rejected */
|
|
327
|
+
};
|
|
328
|
+
ngtcp2_cid dcid, scid;
|
|
329
|
+
ngtcp2_settings settings;
|
|
330
|
+
ngtcp2_transport_params params;
|
|
331
|
+
int rv;
|
|
332
|
+
|
|
333
|
+
dcid.datalen = NGTCP2_MIN_INITIAL_DCIDLEN;
|
|
334
|
+
if (RAND_bytes(dcid.data, (int)dcid.datalen) != 1) {
|
|
335
|
+
fprintf(stderr, "RAND_bytes failed\n");
|
|
336
|
+
return -1;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
scid.datalen = 8;
|
|
340
|
+
if (RAND_bytes(scid.data, (int)scid.datalen) != 1) {
|
|
341
|
+
fprintf(stderr, "RAND_bytes failed\n");
|
|
342
|
+
return -1;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
ngtcp2_settings_default(&settings);
|
|
346
|
+
|
|
347
|
+
settings.initial_ts = timestamp();
|
|
348
|
+
settings.log_printf = log_printf;
|
|
349
|
+
|
|
350
|
+
ngtcp2_transport_params_default(¶ms);
|
|
351
|
+
|
|
352
|
+
params.initial_max_streams_uni = 3;
|
|
353
|
+
params.initial_max_stream_data_bidi_local = 128 * 1024;
|
|
354
|
+
params.initial_max_data = 1024 * 1024;
|
|
355
|
+
|
|
356
|
+
rv =
|
|
357
|
+
ngtcp2_conn_client_new(&c->conn, &dcid, &scid, &path, NGTCP2_PROTO_VER_V1,
|
|
358
|
+
&callbacks, &settings, ¶ms, NULL, c);
|
|
359
|
+
if (rv != 0) {
|
|
360
|
+
fprintf(stderr, "ngtcp2_conn_client_new: %s\n", ngtcp2_strerror(rv));
|
|
361
|
+
return -1;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
ngtcp2_conn_set_tls_native_handle(c->conn, c->ssl);
|
|
365
|
+
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
static int client_read(struct client *c) {
|
|
370
|
+
uint8_t buf[65536];
|
|
371
|
+
struct sockaddr_storage addr;
|
|
372
|
+
struct iovec iov = {buf, sizeof(buf)};
|
|
373
|
+
struct msghdr msg = {0};
|
|
374
|
+
ssize_t nread;
|
|
375
|
+
ngtcp2_path path;
|
|
376
|
+
ngtcp2_pkt_info pi = {0};
|
|
377
|
+
int rv;
|
|
378
|
+
|
|
379
|
+
msg.msg_name = &addr;
|
|
380
|
+
msg.msg_iov = &iov;
|
|
381
|
+
msg.msg_iovlen = 1;
|
|
382
|
+
|
|
383
|
+
for (;;) {
|
|
384
|
+
msg.msg_namelen = sizeof(addr);
|
|
385
|
+
|
|
386
|
+
nread = recvmsg(c->fd, &msg, MSG_DONTWAIT);
|
|
387
|
+
|
|
388
|
+
if (nread == -1) {
|
|
389
|
+
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
|
390
|
+
fprintf(stderr, "recvmsg: %s\n", strerror(errno));
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
path.local.addrlen = c->local_addrlen;
|
|
397
|
+
path.local.addr = (struct sockaddr *)&c->local_addr;
|
|
398
|
+
path.remote.addrlen = msg.msg_namelen;
|
|
399
|
+
path.remote.addr = msg.msg_name;
|
|
400
|
+
|
|
401
|
+
rv = ngtcp2_conn_read_pkt(c->conn, &path, &pi, buf, (size_t)nread,
|
|
402
|
+
timestamp());
|
|
403
|
+
if (rv != 0) {
|
|
404
|
+
fprintf(stderr, "ngtcp2_conn_read_pkt: %s\n", ngtcp2_strerror(rv));
|
|
405
|
+
if (!c->last_error.error_code) {
|
|
406
|
+
if (rv == NGTCP2_ERR_CRYPTO) {
|
|
407
|
+
ngtcp2_connection_close_error_set_transport_error_tls_alert(
|
|
408
|
+
&c->last_error, ngtcp2_conn_get_tls_alert(c->conn), NULL, 0);
|
|
409
|
+
} else {
|
|
410
|
+
ngtcp2_connection_close_error_set_transport_error_liberr(
|
|
411
|
+
&c->last_error, rv, NULL, 0);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return -1;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return 0;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
static int client_send_packet(struct client *c, const uint8_t *data,
|
|
422
|
+
size_t datalen) {
|
|
423
|
+
struct iovec iov = {(uint8_t *)data, datalen};
|
|
424
|
+
struct msghdr msg = {0};
|
|
425
|
+
ssize_t nwrite;
|
|
426
|
+
|
|
427
|
+
msg.msg_iov = &iov;
|
|
428
|
+
msg.msg_iovlen = 1;
|
|
429
|
+
|
|
430
|
+
do {
|
|
431
|
+
nwrite = sendmsg(c->fd, &msg, 0);
|
|
432
|
+
} while (nwrite == -1 && errno == EINTR);
|
|
433
|
+
|
|
434
|
+
if (nwrite == -1) {
|
|
435
|
+
fprintf(stderr, "sendmsg: %s\n", strerror(errno));
|
|
436
|
+
|
|
437
|
+
return -1;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
return 0;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
static size_t client_get_message(struct client *c, int64_t *pstream_id,
|
|
444
|
+
int *pfin, ngtcp2_vec *datav,
|
|
445
|
+
size_t datavcnt) {
|
|
446
|
+
if (datavcnt == 0) {
|
|
447
|
+
return 0;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (c->stream.stream_id != -1 && c->stream.nwrite < c->stream.datalen) {
|
|
451
|
+
*pstream_id = c->stream.stream_id;
|
|
452
|
+
*pfin = 1;
|
|
453
|
+
datav->base = (uint8_t *)c->stream.data + c->stream.nwrite;
|
|
454
|
+
datav->len = c->stream.datalen - c->stream.nwrite;
|
|
455
|
+
return 1;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
*pstream_id = -1;
|
|
459
|
+
*pfin = 0;
|
|
460
|
+
datav->base = NULL;
|
|
461
|
+
datav->len = 0;
|
|
462
|
+
|
|
463
|
+
return 0;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
static int client_write_streams(struct client *c) {
|
|
467
|
+
ngtcp2_tstamp ts = timestamp();
|
|
468
|
+
ngtcp2_pkt_info pi;
|
|
469
|
+
ngtcp2_ssize nwrite;
|
|
470
|
+
uint8_t buf[1280];
|
|
471
|
+
ngtcp2_path_storage ps;
|
|
472
|
+
ngtcp2_vec datav;
|
|
473
|
+
size_t datavcnt;
|
|
474
|
+
int64_t stream_id;
|
|
475
|
+
ngtcp2_ssize wdatalen;
|
|
476
|
+
uint32_t flags;
|
|
477
|
+
int fin;
|
|
478
|
+
|
|
479
|
+
ngtcp2_path_storage_zero(&ps);
|
|
480
|
+
|
|
481
|
+
for (;;) {
|
|
482
|
+
datavcnt = client_get_message(c, &stream_id, &fin, &datav, 1);
|
|
483
|
+
|
|
484
|
+
flags = NGTCP2_WRITE_STREAM_FLAG_MORE;
|
|
485
|
+
if (fin) {
|
|
486
|
+
flags |= NGTCP2_WRITE_STREAM_FLAG_FIN;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
nwrite = ngtcp2_conn_writev_stream(c->conn, &ps.path, &pi, buf, sizeof(buf),
|
|
490
|
+
&wdatalen, flags, stream_id, &datav,
|
|
491
|
+
datavcnt, ts);
|
|
492
|
+
if (nwrite < 0) {
|
|
493
|
+
switch (nwrite) {
|
|
494
|
+
case NGTCP2_ERR_WRITE_MORE:
|
|
495
|
+
c->stream.nwrite += (size_t)wdatalen;
|
|
496
|
+
continue;
|
|
497
|
+
default:
|
|
498
|
+
fprintf(stderr, "ngtcp2_conn_writev_stream: %s\n",
|
|
499
|
+
ngtcp2_strerror((int)nwrite));
|
|
500
|
+
ngtcp2_connection_close_error_set_transport_error_liberr(
|
|
501
|
+
&c->last_error, (int)nwrite, NULL, 0);
|
|
502
|
+
return -1;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
if (nwrite == 0) {
|
|
507
|
+
return 0;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
if (wdatalen > 0) {
|
|
511
|
+
c->stream.nwrite += (size_t)wdatalen;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if (client_send_packet(c, buf, (size_t)nwrite) != 0) {
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return 0;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
static int client_write(struct client *c) {
|
|
523
|
+
ngtcp2_tstamp expiry, now;
|
|
524
|
+
ev_tstamp t;
|
|
525
|
+
|
|
526
|
+
if (client_write_streams(c) != 0) {
|
|
527
|
+
return -1;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
expiry = ngtcp2_conn_get_expiry(c->conn);
|
|
531
|
+
now = timestamp();
|
|
532
|
+
|
|
533
|
+
t = expiry < now ? 1e-9 : (ev_tstamp)(expiry - now) / NGTCP2_SECONDS;
|
|
534
|
+
|
|
535
|
+
c->timer.repeat = t;
|
|
536
|
+
ev_timer_again(EV_DEFAULT, &c->timer);
|
|
537
|
+
|
|
538
|
+
return 0;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
static int client_handle_expiry(struct client *c) {
|
|
542
|
+
int rv = ngtcp2_conn_handle_expiry(c->conn, timestamp());
|
|
543
|
+
if (rv != 0) {
|
|
544
|
+
fprintf(stderr, "ngtcp2_conn_handle_expiry: %s\n", ngtcp2_strerror(rv));
|
|
545
|
+
return -1;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return 0;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
static void client_close(struct client *c) {
|
|
552
|
+
ngtcp2_ssize nwrite;
|
|
553
|
+
ngtcp2_pkt_info pi;
|
|
554
|
+
ngtcp2_path_storage ps;
|
|
555
|
+
uint8_t buf[1280];
|
|
556
|
+
|
|
557
|
+
if (ngtcp2_conn_is_in_closing_period(c->conn) ||
|
|
558
|
+
ngtcp2_conn_is_in_draining_period(c->conn)) {
|
|
559
|
+
goto fin;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
ngtcp2_path_storage_zero(&ps);
|
|
563
|
+
|
|
564
|
+
nwrite = ngtcp2_conn_write_connection_close(
|
|
565
|
+
c->conn, &ps.path, &pi, buf, sizeof(buf), &c->last_error, timestamp());
|
|
566
|
+
if (nwrite < 0) {
|
|
567
|
+
fprintf(stderr, "ngtcp2_conn_write_connection_close: %s\n",
|
|
568
|
+
ngtcp2_strerror((int)nwrite));
|
|
569
|
+
goto fin;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
client_send_packet(c, buf, (size_t)nwrite);
|
|
573
|
+
|
|
574
|
+
fin:
|
|
575
|
+
ev_break(EV_DEFAULT, EVBREAK_ALL);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
static void read_cb(struct ev_loop *loop, ev_io *w, int revents) {
|
|
579
|
+
struct client *c = w->data;
|
|
580
|
+
(void)loop;
|
|
581
|
+
(void)revents;
|
|
582
|
+
|
|
583
|
+
if (client_read(c) != 0) {
|
|
584
|
+
client_close(c);
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
if (client_write(c) != 0) {
|
|
589
|
+
client_close(c);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
static void timer_cb(struct ev_loop *loop, ev_timer *w, int revents) {
|
|
594
|
+
struct client *c = w->data;
|
|
595
|
+
(void)loop;
|
|
596
|
+
(void)revents;
|
|
597
|
+
|
|
598
|
+
if (client_handle_expiry(c) != 0) {
|
|
599
|
+
client_close(c);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
if (client_write(c) != 0) {
|
|
604
|
+
client_close(c);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) {
|
|
609
|
+
struct client *c = conn_ref->user_data;
|
|
610
|
+
return c->conn;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
static int client_init(struct client *c) {
|
|
614
|
+
struct sockaddr_storage remote_addr, local_addr;
|
|
615
|
+
socklen_t remote_addrlen, local_addrlen = sizeof(local_addr);
|
|
616
|
+
|
|
617
|
+
memset(c, 0, sizeof(*c));
|
|
618
|
+
|
|
619
|
+
ngtcp2_connection_close_error_default(&c->last_error);
|
|
620
|
+
|
|
621
|
+
c->fd = create_sock((struct sockaddr *)&remote_addr, &remote_addrlen,
|
|
622
|
+
REMOTE_HOST, REMOTE_PORT);
|
|
623
|
+
if (c->fd == -1) {
|
|
624
|
+
return -1;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
if (connect_sock((struct sockaddr *)&local_addr, &local_addrlen, c->fd,
|
|
628
|
+
(struct sockaddr *)&remote_addr, remote_addrlen) != 0) {
|
|
629
|
+
return -1;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
memcpy(&c->local_addr, &local_addr, sizeof(c->local_addr));
|
|
633
|
+
c->local_addrlen = local_addrlen;
|
|
634
|
+
|
|
635
|
+
if (client_ssl_init(c) != 0) {
|
|
636
|
+
return -1;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if (client_quic_init(c, (struct sockaddr *)&remote_addr, remote_addrlen,
|
|
640
|
+
(struct sockaddr *)&local_addr, local_addrlen) != 0) {
|
|
641
|
+
return -1;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
c->stream.stream_id = -1;
|
|
645
|
+
|
|
646
|
+
c->conn_ref.get_conn = get_conn;
|
|
647
|
+
c->conn_ref.user_data = c;
|
|
648
|
+
|
|
649
|
+
ev_io_init(&c->rev, read_cb, c->fd, EV_READ);
|
|
650
|
+
c->rev.data = c;
|
|
651
|
+
ev_io_start(EV_DEFAULT, &c->rev);
|
|
652
|
+
|
|
653
|
+
ev_timer_init(&c->timer, timer_cb, 0., 0.);
|
|
654
|
+
c->timer.data = c;
|
|
655
|
+
|
|
656
|
+
return 0;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
static void client_free(struct client *c) {
|
|
660
|
+
ngtcp2_conn_del(c->conn);
|
|
661
|
+
SSL_free(c->ssl);
|
|
662
|
+
SSL_CTX_free(c->ssl_ctx);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
int main(void) {
|
|
666
|
+
struct client c;
|
|
667
|
+
|
|
668
|
+
srandom((unsigned int)timestamp());
|
|
669
|
+
|
|
670
|
+
if (client_init(&c) != 0) {
|
|
671
|
+
exit(EXIT_FAILURE);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
if (client_write(&c) != 0) {
|
|
675
|
+
exit(EXIT_FAILURE);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
ev_run(EV_DEFAULT, 0);
|
|
679
|
+
|
|
680
|
+
client_free(&c);
|
|
681
|
+
|
|
682
|
+
return 0;
|
|
683
|
+
}
|