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.
Files changed (343) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/ext/ngtcp2/AUTHORS +44 -0
  4. data/ext/ngtcp2/CMakeLists.txt +431 -0
  5. data/ext/ngtcp2/CMakeOptions.txt +17 -0
  6. data/ext/ngtcp2/COPYING +22 -0
  7. data/ext/ngtcp2/ChangeLog +0 -0
  8. data/ext/ngtcp2/Makefile.am +60 -0
  9. data/ext/ngtcp2/NEWS +0 -0
  10. data/ext/ngtcp2/README +1 -0
  11. data/ext/ngtcp2/README.rst +258 -0
  12. data/ext/ngtcp2/ci/build_boringssl.sh +10 -0
  13. data/ext/ngtcp2/ci/build_nghttp3.sh +9 -0
  14. data/ext/ngtcp2/ci/build_openssl1.sh +8 -0
  15. data/ext/ngtcp2/ci/build_openssl1_cross.sh +9 -0
  16. data/ext/ngtcp2/ci/build_openssl3.sh +8 -0
  17. data/ext/ngtcp2/ci/build_picotls.sh +26 -0
  18. data/ext/ngtcp2/ci/build_wolfssl.sh +9 -0
  19. data/ext/ngtcp2/ci/gen-certificate.sh +8 -0
  20. data/ext/ngtcp2/cmake/ExtractValidFlags.cmake +31 -0
  21. data/ext/ngtcp2/cmake/FindCUnit.cmake +40 -0
  22. data/ext/ngtcp2/cmake/FindJemalloc.cmake +40 -0
  23. data/ext/ngtcp2/cmake/FindLibev.cmake +38 -0
  24. data/ext/ngtcp2/cmake/FindLibnghttp3.cmake +41 -0
  25. data/ext/ngtcp2/cmake/Findwolfssl.cmake +41 -0
  26. data/ext/ngtcp2/cmake/Version.cmake +11 -0
  27. data/ext/ngtcp2/cmakeconfig.h.in +36 -0
  28. data/ext/ngtcp2/configure.ac +755 -0
  29. data/ext/ngtcp2/crypto/CMakeLists.txt +56 -0
  30. data/ext/ngtcp2/crypto/Makefile.am +49 -0
  31. data/ext/ngtcp2/crypto/boringssl/CMakeLists.txt +64 -0
  32. data/ext/ngtcp2/crypto/boringssl/Makefile.am +39 -0
  33. data/ext/ngtcp2/crypto/boringssl/boringssl.c +630 -0
  34. data/ext/ngtcp2/crypto/boringssl/libngtcp2_crypto_boringssl.pc.in +33 -0
  35. data/ext/ngtcp2/crypto/gnutls/CMakeLists.txt +86 -0
  36. data/ext/ngtcp2/crypto/gnutls/Makefile.am +43 -0
  37. data/ext/ngtcp2/crypto/gnutls/gnutls.c +644 -0
  38. data/ext/ngtcp2/crypto/gnutls/libngtcp2_crypto_gnutls.pc.in +33 -0
  39. data/ext/ngtcp2/crypto/includes/CMakeLists.txt +56 -0
  40. data/ext/ngtcp2/crypto/includes/Makefile.am +45 -0
  41. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +893 -0
  42. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h +104 -0
  43. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_gnutls.h +107 -0
  44. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_openssl.h +132 -0
  45. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h +246 -0
  46. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
  47. data/ext/ngtcp2/crypto/openssl/CMakeLists.txt +86 -0
  48. data/ext/ngtcp2/crypto/openssl/Makefile.am +43 -0
  49. data/ext/ngtcp2/crypto/openssl/libngtcp2_crypto_openssl.pc.in +33 -0
  50. data/ext/ngtcp2/crypto/openssl/openssl.c +807 -0
  51. data/ext/ngtcp2/crypto/picotls/CMakeLists.txt +65 -0
  52. data/ext/ngtcp2/crypto/picotls/Makefile.am +39 -0
  53. data/ext/ngtcp2/crypto/picotls/libngtcp2_crypto_picotls.pc.in +33 -0
  54. data/ext/ngtcp2/crypto/picotls/picotls.c +707 -0
  55. data/ext/ngtcp2/crypto/shared.c +1431 -0
  56. data/ext/ngtcp2/crypto/shared.h +350 -0
  57. data/ext/ngtcp2/crypto/wolfssl/CMakeLists.txt +84 -0
  58. data/ext/ngtcp2/crypto/wolfssl/Makefile.am +43 -0
  59. data/ext/ngtcp2/crypto/wolfssl/libngtcp2_crypto_wolfssl.pc.in +33 -0
  60. data/ext/ngtcp2/crypto/wolfssl/wolfssl.c +534 -0
  61. data/ext/ngtcp2/doc/Makefile.am +65 -0
  62. data/ext/ngtcp2/doc/make.bat +35 -0
  63. data/ext/ngtcp2/doc/mkapiref.py +356 -0
  64. data/ext/ngtcp2/doc/source/conf.py.in +94 -0
  65. data/ext/ngtcp2/doc/source/index.rst +22 -0
  66. data/ext/ngtcp2/doc/source/programmers-guide.rst +476 -0
  67. data/ext/ngtcp2/docker/Dockerfile +39 -0
  68. data/ext/ngtcp2/examples/CMakeLists.txt +361 -0
  69. data/ext/ngtcp2/examples/Makefile.am +228 -0
  70. data/ext/ngtcp2/examples/client.cc +3049 -0
  71. data/ext/ngtcp2/examples/client.h +192 -0
  72. data/ext/ngtcp2/examples/client_base.cc +202 -0
  73. data/ext/ngtcp2/examples/client_base.h +213 -0
  74. data/ext/ngtcp2/examples/debug.cc +298 -0
  75. data/ext/ngtcp2/examples/debug.h +124 -0
  76. data/ext/ngtcp2/examples/examplestest.cc +84 -0
  77. data/ext/ngtcp2/examples/gtlssimpleclient.c +720 -0
  78. data/ext/ngtcp2/examples/h09client.cc +2601 -0
  79. data/ext/ngtcp2/examples/h09client.h +196 -0
  80. data/ext/ngtcp2/examples/h09server.cc +3024 -0
  81. data/ext/ngtcp2/examples/h09server.h +237 -0
  82. data/ext/ngtcp2/examples/http.cc +138 -0
  83. data/ext/ngtcp2/examples/http.h +44 -0
  84. data/ext/ngtcp2/examples/network.h +80 -0
  85. data/ext/ngtcp2/examples/server.cc +3731 -0
  86. data/ext/ngtcp2/examples/server.h +256 -0
  87. data/ext/ngtcp2/examples/server_base.cc +58 -0
  88. data/ext/ngtcp2/examples/server_base.h +195 -0
  89. data/ext/ngtcp2/examples/shared.cc +385 -0
  90. data/ext/ngtcp2/examples/shared.h +96 -0
  91. data/ext/ngtcp2/examples/simpleclient.c +683 -0
  92. data/ext/ngtcp2/examples/template.h +71 -0
  93. data/ext/ngtcp2/examples/tests/README.rst +60 -0
  94. data/ext/ngtcp2/examples/tests/__init__.py +0 -0
  95. data/ext/ngtcp2/examples/tests/config.ini.in +32 -0
  96. data/ext/ngtcp2/examples/tests/conftest.py +28 -0
  97. data/ext/ngtcp2/examples/tests/ngtcp2test/__init__.py +6 -0
  98. data/ext/ngtcp2/examples/tests/ngtcp2test/certs.py +476 -0
  99. data/ext/ngtcp2/examples/tests/ngtcp2test/client.py +187 -0
  100. data/ext/ngtcp2/examples/tests/ngtcp2test/env.py +191 -0
  101. data/ext/ngtcp2/examples/tests/ngtcp2test/log.py +101 -0
  102. data/ext/ngtcp2/examples/tests/ngtcp2test/server.py +137 -0
  103. data/ext/ngtcp2/examples/tests/ngtcp2test/tls.py +983 -0
  104. data/ext/ngtcp2/examples/tests/test_01_handshake.py +30 -0
  105. data/ext/ngtcp2/examples/tests/test_02_resume.py +46 -0
  106. data/ext/ngtcp2/examples/tests/test_03_earlydata.py +56 -0
  107. data/ext/ngtcp2/examples/tests/test_04_clientcert.py +57 -0
  108. data/ext/ngtcp2/examples/tests/test_05_ciphers.py +46 -0
  109. data/ext/ngtcp2/examples/tls_client_context.h +52 -0
  110. data/ext/ngtcp2/examples/tls_client_context_boringssl.cc +126 -0
  111. data/ext/ngtcp2/examples/tls_client_context_boringssl.h +49 -0
  112. data/ext/ngtcp2/examples/tls_client_context_gnutls.cc +74 -0
  113. data/ext/ngtcp2/examples/tls_client_context_gnutls.h +50 -0
  114. data/ext/ngtcp2/examples/tls_client_context_openssl.cc +137 -0
  115. data/ext/ngtcp2/examples/tls_client_context_openssl.h +49 -0
  116. data/ext/ngtcp2/examples/tls_client_context_picotls.cc +158 -0
  117. data/ext/ngtcp2/examples/tls_client_context_picotls.h +53 -0
  118. data/ext/ngtcp2/examples/tls_client_context_wolfssl.cc +177 -0
  119. data/ext/ngtcp2/examples/tls_client_context_wolfssl.h +51 -0
  120. data/ext/ngtcp2/examples/tls_client_session.h +52 -0
  121. data/ext/ngtcp2/examples/tls_client_session_boringssl.cc +110 -0
  122. data/ext/ngtcp2/examples/tls_client_session_boringssl.h +52 -0
  123. data/ext/ngtcp2/examples/tls_client_session_gnutls.cc +190 -0
  124. data/ext/ngtcp2/examples/tls_client_session_gnutls.h +52 -0
  125. data/ext/ngtcp2/examples/tls_client_session_openssl.cc +113 -0
  126. data/ext/ngtcp2/examples/tls_client_session_openssl.h +52 -0
  127. data/ext/ngtcp2/examples/tls_client_session_picotls.cc +147 -0
  128. data/ext/ngtcp2/examples/tls_client_session_picotls.h +52 -0
  129. data/ext/ngtcp2/examples/tls_client_session_wolfssl.cc +160 -0
  130. data/ext/ngtcp2/examples/tls_client_session_wolfssl.h +52 -0
  131. data/ext/ngtcp2/examples/tls_server_context.h +52 -0
  132. data/ext/ngtcp2/examples/tls_server_context_boringssl.cc +257 -0
  133. data/ext/ngtcp2/examples/tls_server_context_boringssl.h +54 -0
  134. data/ext/ngtcp2/examples/tls_server_context_gnutls.cc +99 -0
  135. data/ext/ngtcp2/examples/tls_server_context_gnutls.h +59 -0
  136. data/ext/ngtcp2/examples/tls_server_context_openssl.cc +338 -0
  137. data/ext/ngtcp2/examples/tls_server_context_openssl.h +54 -0
  138. data/ext/ngtcp2/examples/tls_server_context_picotls.cc +321 -0
  139. data/ext/ngtcp2/examples/tls_server_context_picotls.h +58 -0
  140. data/ext/ngtcp2/examples/tls_server_context_wolfssl.cc +284 -0
  141. data/ext/ngtcp2/examples/tls_server_context_wolfssl.h +55 -0
  142. data/ext/ngtcp2/examples/tls_server_session.h +52 -0
  143. data/ext/ngtcp2/examples/tls_server_session_boringssl.cc +84 -0
  144. data/ext/ngtcp2/examples/tls_server_session_boringssl.h +47 -0
  145. data/ext/ngtcp2/examples/tls_server_session_gnutls.cc +155 -0
  146. data/ext/ngtcp2/examples/tls_server_session_gnutls.h +46 -0
  147. data/ext/ngtcp2/examples/tls_server_session_openssl.cc +54 -0
  148. data/ext/ngtcp2/examples/tls_server_session_openssl.h +47 -0
  149. data/ext/ngtcp2/examples/tls_server_session_picotls.cc +70 -0
  150. data/ext/ngtcp2/examples/tls_server_session_picotls.h +47 -0
  151. data/ext/ngtcp2/examples/tls_server_session_wolfssl.cc +55 -0
  152. data/ext/ngtcp2/examples/tls_server_session_wolfssl.h +47 -0
  153. data/ext/ngtcp2/examples/tls_session_base_gnutls.cc +87 -0
  154. data/ext/ngtcp2/examples/tls_session_base_gnutls.h +51 -0
  155. data/ext/ngtcp2/examples/tls_session_base_openssl.cc +54 -0
  156. data/ext/ngtcp2/examples/tls_session_base_openssl.h +52 -0
  157. data/ext/ngtcp2/examples/tls_session_base_picotls.cc +56 -0
  158. data/ext/ngtcp2/examples/tls_session_base_picotls.h +54 -0
  159. data/ext/ngtcp2/examples/tls_session_base_wolfssl.cc +54 -0
  160. data/ext/ngtcp2/examples/tls_session_base_wolfssl.h +54 -0
  161. data/ext/ngtcp2/examples/tls_shared_picotls.cc +59 -0
  162. data/ext/ngtcp2/examples/tls_shared_picotls.h +36 -0
  163. data/ext/ngtcp2/examples/util.cc +646 -0
  164. data/ext/ngtcp2/examples/util.h +361 -0
  165. data/ext/ngtcp2/examples/util_gnutls.cc +136 -0
  166. data/ext/ngtcp2/examples/util_openssl.cc +131 -0
  167. data/ext/ngtcp2/examples/util_test.cc +237 -0
  168. data/ext/ngtcp2/examples/util_test.h +45 -0
  169. data/ext/ngtcp2/examples/util_wolfssl.cc +130 -0
  170. data/ext/ngtcp2/fuzz/corpus/decode_frame/ack +0 -0
  171. data/ext/ngtcp2/fuzz/corpus/decode_frame/ack_ecn +0 -0
  172. data/ext/ngtcp2/fuzz/corpus/decode_frame/connection_close +0 -0
  173. data/ext/ngtcp2/fuzz/corpus/decode_frame/crypto +1 -0
  174. data/ext/ngtcp2/fuzz/corpus/decode_frame/data_blocked +1 -0
  175. data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram +1 -0
  176. data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram_len +1 -0
  177. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_data +1 -0
  178. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_stream_data +0 -0
  179. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_streams +0 -0
  180. data/ext/ngtcp2/fuzz/corpus/decode_frame/new_connection_id +1 -0
  181. data/ext/ngtcp2/fuzz/corpus/decode_frame/new_token +1 -0
  182. data/ext/ngtcp2/fuzz/corpus/decode_frame/path_challenge +1 -0
  183. data/ext/ngtcp2/fuzz/corpus/decode_frame/path_response +1 -0
  184. data/ext/ngtcp2/fuzz/corpus/decode_frame/reset_stream +0 -0
  185. data/ext/ngtcp2/fuzz/corpus/decode_frame/retire_connection_id +1 -0
  186. data/ext/ngtcp2/fuzz/corpus/decode_frame/stop_sending +0 -0
  187. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream +0 -0
  188. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_data_blocked +0 -0
  189. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_len +0 -0
  190. data/ext/ngtcp2/fuzz/corpus/decode_frame/streams_blocked +0 -0
  191. data/ext/ngtcp2/fuzz/corpus/ksl/random +0 -0
  192. data/ext/ngtcp2/fuzz/decode_frame.cc +25 -0
  193. data/ext/ngtcp2/fuzz/ksl.cc +77 -0
  194. data/ext/ngtcp2/interop/Dockerfile +39 -0
  195. data/ext/ngtcp2/interop/run_endpoint.sh +93 -0
  196. data/ext/ngtcp2/lib/CMakeLists.txt +110 -0
  197. data/ext/ngtcp2/lib/Makefile.am +122 -0
  198. data/ext/ngtcp2/lib/includes/CMakeLists.txt +4 -0
  199. data/ext/ngtcp2/lib/includes/Makefile.am +25 -0
  200. data/ext/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +5843 -0
  201. data/ext/ngtcp2/lib/includes/ngtcp2/version.h.in +51 -0
  202. data/ext/ngtcp2/lib/libngtcp2.pc.in +33 -0
  203. data/ext/ngtcp2/lib/ngtcp2_acktr.c +335 -0
  204. data/ext/ngtcp2/lib/ngtcp2_acktr.h +221 -0
  205. data/ext/ngtcp2/lib/ngtcp2_addr.c +117 -0
  206. data/ext/ngtcp2/lib/ngtcp2_addr.h +69 -0
  207. data/ext/ngtcp2/lib/ngtcp2_balloc.c +90 -0
  208. data/ext/ngtcp2/lib/ngtcp2_balloc.h +91 -0
  209. data/ext/ngtcp2/lib/ngtcp2_bbr.c +693 -0
  210. data/ext/ngtcp2/lib/ngtcp2_bbr.h +157 -0
  211. data/ext/ngtcp2/lib/ngtcp2_bbr2.c +1490 -0
  212. data/ext/ngtcp2/lib/ngtcp2_bbr2.h +149 -0
  213. data/ext/ngtcp2/lib/ngtcp2_buf.c +56 -0
  214. data/ext/ngtcp2/lib/ngtcp2_buf.h +108 -0
  215. data/ext/ngtcp2/lib/ngtcp2_cc.c +616 -0
  216. data/ext/ngtcp2/lib/ngtcp2_cc.h +422 -0
  217. data/ext/ngtcp2/lib/ngtcp2_cid.c +147 -0
  218. data/ext/ngtcp2/lib/ngtcp2_cid.h +175 -0
  219. data/ext/ngtcp2/lib/ngtcp2_conn.c +13731 -0
  220. data/ext/ngtcp2/lib/ngtcp2_conn.h +1119 -0
  221. data/ext/ngtcp2/lib/ngtcp2_conn_stat.h +131 -0
  222. data/ext/ngtcp2/lib/ngtcp2_conv.c +291 -0
  223. data/ext/ngtcp2/lib/ngtcp2_conv.h +208 -0
  224. data/ext/ngtcp2/lib/ngtcp2_crypto.c +895 -0
  225. data/ext/ngtcp2/lib/ngtcp2_crypto.h +148 -0
  226. data/ext/ngtcp2/lib/ngtcp2_err.c +154 -0
  227. data/ext/ngtcp2/lib/ngtcp2_err.h +34 -0
  228. data/ext/ngtcp2/lib/ngtcp2_gaptr.c +167 -0
  229. data/ext/ngtcp2/lib/ngtcp2_gaptr.h +98 -0
  230. data/ext/ngtcp2/lib/ngtcp2_idtr.c +79 -0
  231. data/ext/ngtcp2/lib/ngtcp2_idtr.h +89 -0
  232. data/ext/ngtcp2/lib/ngtcp2_ksl.c +819 -0
  233. data/ext/ngtcp2/lib/ngtcp2_ksl.h +345 -0
  234. data/ext/ngtcp2/lib/ngtcp2_log.c +822 -0
  235. data/ext/ngtcp2/lib/ngtcp2_log.h +123 -0
  236. data/ext/ngtcp2/lib/ngtcp2_macro.h +58 -0
  237. data/ext/ngtcp2/lib/ngtcp2_map.c +336 -0
  238. data/ext/ngtcp2/lib/ngtcp2_map.h +136 -0
  239. data/ext/ngtcp2/lib/ngtcp2_mem.c +113 -0
  240. data/ext/ngtcp2/lib/ngtcp2_mem.h +72 -0
  241. data/ext/ngtcp2/lib/ngtcp2_net.h +136 -0
  242. data/ext/ngtcp2/lib/ngtcp2_objalloc.c +40 -0
  243. data/ext/ngtcp2/lib/ngtcp2_objalloc.h +140 -0
  244. data/ext/ngtcp2/lib/ngtcp2_opl.c +46 -0
  245. data/ext/ngtcp2/lib/ngtcp2_opl.h +65 -0
  246. data/ext/ngtcp2/lib/ngtcp2_path.c +77 -0
  247. data/ext/ngtcp2/lib/ngtcp2_path.h +49 -0
  248. data/ext/ngtcp2/lib/ngtcp2_pkt.c +2527 -0
  249. data/ext/ngtcp2/lib/ngtcp2_pkt.h +1235 -0
  250. data/ext/ngtcp2/lib/ngtcp2_pmtud.c +160 -0
  251. data/ext/ngtcp2/lib/ngtcp2_pmtud.h +123 -0
  252. data/ext/ngtcp2/lib/ngtcp2_ppe.c +230 -0
  253. data/ext/ngtcp2/lib/ngtcp2_ppe.h +153 -0
  254. data/ext/ngtcp2/lib/ngtcp2_pq.c +164 -0
  255. data/ext/ngtcp2/lib/ngtcp2_pq.h +126 -0
  256. data/ext/ngtcp2/lib/ngtcp2_pv.c +172 -0
  257. data/ext/ngtcp2/lib/ngtcp2_pv.h +194 -0
  258. data/ext/ngtcp2/lib/ngtcp2_qlog.c +1219 -0
  259. data/ext/ngtcp2/lib/ngtcp2_qlog.h +161 -0
  260. data/ext/ngtcp2/lib/ngtcp2_range.c +61 -0
  261. data/ext/ngtcp2/lib/ngtcp2_range.h +80 -0
  262. data/ext/ngtcp2/lib/ngtcp2_rcvry.h +40 -0
  263. data/ext/ngtcp2/lib/ngtcp2_ringbuf.c +121 -0
  264. data/ext/ngtcp2/lib/ngtcp2_ringbuf.h +132 -0
  265. data/ext/ngtcp2/lib/ngtcp2_rob.c +319 -0
  266. data/ext/ngtcp2/lib/ngtcp2_rob.h +197 -0
  267. data/ext/ngtcp2/lib/ngtcp2_rst.c +138 -0
  268. data/ext/ngtcp2/lib/ngtcp2_rst.h +86 -0
  269. data/ext/ngtcp2/lib/ngtcp2_rtb.c +1676 -0
  270. data/ext/ngtcp2/lib/ngtcp2_rtb.h +468 -0
  271. data/ext/ngtcp2/lib/ngtcp2_str.c +233 -0
  272. data/ext/ngtcp2/lib/ngtcp2_str.h +94 -0
  273. data/ext/ngtcp2/lib/ngtcp2_strm.c +698 -0
  274. data/ext/ngtcp2/lib/ngtcp2_strm.h +310 -0
  275. data/ext/ngtcp2/lib/ngtcp2_unreachable.c +71 -0
  276. data/ext/ngtcp2/lib/ngtcp2_unreachable.h +46 -0
  277. data/ext/ngtcp2/lib/ngtcp2_vec.c +243 -0
  278. data/ext/ngtcp2/lib/ngtcp2_vec.h +120 -0
  279. data/ext/ngtcp2/lib/ngtcp2_version.c +39 -0
  280. data/ext/ngtcp2/lib/ngtcp2_window_filter.c +99 -0
  281. data/ext/ngtcp2/lib/ngtcp2_window_filter.h +65 -0
  282. data/ext/ngtcp2/m4/ax_check_compile_flag.m4 +74 -0
  283. data/ext/ngtcp2/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
  284. data/ext/ngtcp2/tests/CMakeLists.txt +68 -0
  285. data/ext/ngtcp2/tests/Makefile.am +94 -0
  286. data/ext/ngtcp2/tests/main.c +358 -0
  287. data/ext/ngtcp2/tests/ngtcp2_acktr_test.c +367 -0
  288. data/ext/ngtcp2/tests/ngtcp2_acktr_test.h +37 -0
  289. data/ext/ngtcp2/tests/ngtcp2_conn_test.c +9821 -0
  290. data/ext/ngtcp2/tests/ngtcp2_conn_test.h +104 -0
  291. data/ext/ngtcp2/tests/ngtcp2_conv_test.c +430 -0
  292. data/ext/ngtcp2/tests/ngtcp2_conv_test.h +46 -0
  293. data/ext/ngtcp2/tests/ngtcp2_crypto_test.c +667 -0
  294. data/ext/ngtcp2/tests/ngtcp2_crypto_test.h +35 -0
  295. data/ext/ngtcp2/tests/ngtcp2_gaptr_test.c +127 -0
  296. data/ext/ngtcp2/tests/ngtcp2_gaptr_test.h +36 -0
  297. data/ext/ngtcp2/tests/ngtcp2_idtr_test.c +79 -0
  298. data/ext/ngtcp2/tests/ngtcp2_idtr_test.h +34 -0
  299. data/ext/ngtcp2/tests/ngtcp2_ksl_test.c +502 -0
  300. data/ext/ngtcp2/tests/ngtcp2_ksl_test.h +39 -0
  301. data/ext/ngtcp2/tests/ngtcp2_map_test.c +206 -0
  302. data/ext/ngtcp2/tests/ngtcp2_map_test.h +38 -0
  303. data/ext/ngtcp2/tests/ngtcp2_pkt_test.c +1645 -0
  304. data/ext/ngtcp2/tests/ngtcp2_pkt_test.h +68 -0
  305. data/ext/ngtcp2/tests/ngtcp2_pmtud_test.c +153 -0
  306. data/ext/ngtcp2/tests/ngtcp2_pmtud_test.h +34 -0
  307. data/ext/ngtcp2/tests/ngtcp2_pv_test.c +129 -0
  308. data/ext/ngtcp2/tests/ngtcp2_pv_test.h +35 -0
  309. data/ext/ngtcp2/tests/ngtcp2_range_test.c +105 -0
  310. data/ext/ngtcp2/tests/ngtcp2_range_test.h +36 -0
  311. data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.c +91 -0
  312. data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.h +35 -0
  313. data/ext/ngtcp2/tests/ngtcp2_rob_test.c +552 -0
  314. data/ext/ngtcp2/tests/ngtcp2_rob_test.h +37 -0
  315. data/ext/ngtcp2/tests/ngtcp2_rtb_test.c +470 -0
  316. data/ext/ngtcp2/tests/ngtcp2_rtb_test.h +38 -0
  317. data/ext/ngtcp2/tests/ngtcp2_str_test.c +96 -0
  318. data/ext/ngtcp2/tests/ngtcp2_str_test.h +36 -0
  319. data/ext/ngtcp2/tests/ngtcp2_strm_test.c +575 -0
  320. data/ext/ngtcp2/tests/ngtcp2_strm_test.h +36 -0
  321. data/ext/ngtcp2/tests/ngtcp2_test_helper.c +404 -0
  322. data/ext/ngtcp2/tests/ngtcp2_test_helper.h +191 -0
  323. data/ext/ngtcp2/tests/ngtcp2_vec_test.c +426 -0
  324. data/ext/ngtcp2/tests/ngtcp2_vec_test.h +36 -0
  325. data/ext/ngtcp2/third-party/CMakeLists.txt +34 -0
  326. data/ext/ngtcp2/third-party/Makefile.am +31 -0
  327. data/ext/ngtcp2/third-party/http-parser/AUTHORS +68 -0
  328. data/ext/ngtcp2/third-party/http-parser/LICENSE-MIT +23 -0
  329. data/ext/ngtcp2/third-party/http-parser/Makefile +157 -0
  330. data/ext/ngtcp2/third-party/http-parser/README.md +246 -0
  331. data/ext/ngtcp2/third-party/http-parser/bench.c +111 -0
  332. data/ext/ngtcp2/third-party/http-parser/contrib/parsertrace.c +160 -0
  333. data/ext/ngtcp2/third-party/http-parser/contrib/url_parser.c +47 -0
  334. data/ext/ngtcp2/third-party/http-parser/http_parser.c +2419 -0
  335. data/ext/ngtcp2/third-party/http-parser/http_parser.gyp +111 -0
  336. data/ext/ngtcp2/third-party/http-parser/http_parser.h +431 -0
  337. data/ext/ngtcp2/third-party/http-parser/test.c +4411 -0
  338. data/lib/protocol/quic/version.rb +10 -0
  339. data/lib/protocol/quic.rb +9 -0
  340. data/license.md +21 -0
  341. data.tar.gz.sig +1 -0
  342. metadata +424 -0
  343. metadata.gz.sig +1 -0
@@ -0,0 +1,720 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2021-2022 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_gnutls.h>
41
+
42
+ #include <gnutls/crypto.h>
43
+ #include <gnutls/gnutls.h>
44
+
45
+ #include <ev.h>
46
+
47
+ #define REMOTE_HOST "127.0.0.1"
48
+ #define REMOTE_PORT "4433"
49
+ #define ALPN "hq-interop"
50
+ #define MESSAGE "GET /\r\n"
51
+
52
+ /*
53
+ * Example 1: Handshake with www.google.com
54
+ *
55
+ * #define REMOTE_HOST "www.google.com"
56
+ * #define REMOTE_PORT "443"
57
+ * #define ALPN "h3"
58
+ *
59
+ * and undefine MESSAGE macro.
60
+ */
61
+
62
+ static uint64_t timestamp(void) {
63
+ struct timespec tp;
64
+
65
+ if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) {
66
+ fprintf(stderr, "clock_gettime: %s\n", strerror(errno));
67
+ exit(EXIT_FAILURE);
68
+ }
69
+
70
+ return (uint64_t)tp.tv_sec * NGTCP2_SECONDS + (uint64_t)tp.tv_nsec;
71
+ }
72
+
73
+ static int create_sock(struct sockaddr *addr, socklen_t *paddrlen,
74
+ const char *host, const char *port) {
75
+ struct addrinfo hints = {0};
76
+ struct addrinfo *res, *rp;
77
+ int rv;
78
+ int fd = -1;
79
+
80
+ hints.ai_flags = AF_UNSPEC;
81
+ hints.ai_socktype = SOCK_DGRAM;
82
+
83
+ rv = getaddrinfo(host, port, &hints, &res);
84
+ if (rv != 0) {
85
+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
86
+ return -1;
87
+ }
88
+
89
+ for (rp = res; rp; rp = rp->ai_next) {
90
+ fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
91
+ if (fd == -1) {
92
+ continue;
93
+ }
94
+
95
+ break;
96
+ }
97
+
98
+ if (fd == -1) {
99
+ goto end;
100
+ }
101
+
102
+ *paddrlen = rp->ai_addrlen;
103
+ memcpy(addr, rp->ai_addr, rp->ai_addrlen);
104
+
105
+ end:
106
+ freeaddrinfo(res);
107
+
108
+ return fd;
109
+ }
110
+
111
+ static int connect_sock(struct sockaddr *local_addr, socklen_t *plocal_addrlen,
112
+ int fd, const struct sockaddr *remote_addr,
113
+ size_t remote_addrlen) {
114
+ socklen_t len;
115
+
116
+ if (connect(fd, remote_addr, (socklen_t)remote_addrlen) != 0) {
117
+ fprintf(stderr, "connect: %s\n", strerror(errno));
118
+ return -1;
119
+ }
120
+
121
+ len = *plocal_addrlen;
122
+
123
+ if (getsockname(fd, local_addr, &len) == -1) {
124
+ fprintf(stderr, "getsockname: %s\n", strerror(errno));
125
+ return -1;
126
+ }
127
+
128
+ *plocal_addrlen = len;
129
+
130
+ return 0;
131
+ }
132
+
133
+ struct client {
134
+ ngtcp2_crypto_conn_ref conn_ref;
135
+ int fd;
136
+ struct sockaddr_storage local_addr;
137
+ socklen_t local_addrlen;
138
+ gnutls_certificate_credentials_t cred;
139
+ gnutls_session_t session;
140
+ ngtcp2_conn *conn;
141
+
142
+ struct {
143
+ int64_t stream_id;
144
+ const uint8_t *data;
145
+ size_t datalen;
146
+ size_t nwrite;
147
+ } stream;
148
+
149
+ ngtcp2_connection_close_error last_error;
150
+
151
+ ev_io rev;
152
+ ev_timer timer;
153
+ };
154
+
155
+ static int hook_func(gnutls_session_t session, unsigned int htype,
156
+ unsigned when, unsigned int incoming,
157
+ const gnutls_datum_t *msg) {
158
+ (void)session;
159
+ (void)htype;
160
+ (void)when;
161
+ (void)incoming;
162
+ (void)msg;
163
+ /* we could save session data here */
164
+
165
+ return 0;
166
+ }
167
+
168
+ static int numeric_host_family(const char *hostname, int family) {
169
+ uint8_t dst[sizeof(struct in6_addr)];
170
+ return inet_pton(family, hostname, dst) == 1;
171
+ }
172
+
173
+ static int numeric_host(const char *hostname) {
174
+ return numeric_host_family(hostname, AF_INET) ||
175
+ numeric_host_family(hostname, AF_INET6);
176
+ }
177
+
178
+ static const char priority[] =
179
+ "NORMAL:-VERS-ALL:+VERS-TLS1.3:-CIPHER-ALL:+AES-128-GCM:+AES-256-GCM:"
180
+ "+CHACHA20-POLY1305:+AES-128-CCM:-GROUP-ALL:+GROUP-SECP256R1:+GROUP-X25519:"
181
+ "+GROUP-SECP384R1:"
182
+ "+GROUP-SECP521R1:%DISABLE_TLS13_COMPAT_MODE";
183
+
184
+ static const gnutls_datum_t alpn = {(uint8_t *)ALPN, sizeof(ALPN) - 1};
185
+
186
+ static int client_gnutls_init(struct client *c) {
187
+ int rv = gnutls_certificate_allocate_credentials(&c->cred);
188
+
189
+ if (rv == 0)
190
+ rv = gnutls_certificate_set_x509_system_trust(c->cred);
191
+ if (rv < 0) {
192
+ fprintf(stderr, "cred init failed: %d: %s\n", rv, gnutls_strerror(rv));
193
+ return -1;
194
+ }
195
+
196
+ rv = gnutls_init(&c->session, GNUTLS_CLIENT | GNUTLS_ENABLE_EARLY_DATA |
197
+ GNUTLS_NO_END_OF_EARLY_DATA);
198
+ if (rv != 0) {
199
+ fprintf(stderr, "gnutls_init: %s\n", gnutls_strerror(rv));
200
+ return -1;
201
+ }
202
+
203
+ if (ngtcp2_crypto_gnutls_configure_client_session(c->session) != 0) {
204
+ fprintf(stderr, "ngtcp2_crypto_gnutls_configure_client_session failed\n");
205
+ return -1;
206
+ }
207
+
208
+ rv = gnutls_priority_set_direct(c->session, priority, NULL);
209
+ if (rv != 0) {
210
+ fprintf(stderr, "gnutls_priority_set_direct: %s\n", gnutls_strerror(rv));
211
+ return -1;
212
+ }
213
+
214
+ gnutls_handshake_set_hook_function(c->session, GNUTLS_HANDSHAKE_ANY,
215
+ GNUTLS_HOOK_POST, hook_func);
216
+
217
+ gnutls_session_set_ptr(c->session, &c->conn_ref);
218
+
219
+ rv = gnutls_credentials_set(c->session, GNUTLS_CRD_CERTIFICATE, c->cred);
220
+
221
+ if (rv != 0) {
222
+ fprintf(stderr, "gnutls_credentials_set: %s\n", gnutls_strerror(rv));
223
+ return -1;
224
+ }
225
+
226
+ gnutls_alpn_set_protocols(c->session, &alpn, 1, GNUTLS_ALPN_MANDATORY);
227
+
228
+ if (!numeric_host(REMOTE_HOST)) {
229
+ gnutls_server_name_set(c->session, GNUTLS_NAME_DNS, REMOTE_HOST,
230
+ strlen(REMOTE_HOST));
231
+ } else {
232
+ gnutls_server_name_set(c->session, GNUTLS_NAME_DNS, "localhost",
233
+ strlen("localhost"));
234
+ }
235
+
236
+ return 0;
237
+ }
238
+
239
+ static void rand_cb(uint8_t *dest, size_t destlen,
240
+ const ngtcp2_rand_ctx *rand_ctx) {
241
+ (void)rand_ctx;
242
+
243
+ (void)gnutls_rnd(GNUTLS_RND_RANDOM, dest, destlen);
244
+ }
245
+
246
+ static int get_new_connection_id_cb(ngtcp2_conn *conn, ngtcp2_cid *cid,
247
+ uint8_t *token, size_t cidlen,
248
+ void *user_data) {
249
+ (void)conn;
250
+ (void)user_data;
251
+
252
+ if (gnutls_rnd(GNUTLS_RND_RANDOM, cid->data, cidlen) != 0) {
253
+ return NGTCP2_ERR_CALLBACK_FAILURE;
254
+ }
255
+
256
+ cid->datalen = cidlen;
257
+
258
+ if (gnutls_rnd(GNUTLS_RND_RANDOM, token, NGTCP2_STATELESS_RESET_TOKENLEN) !=
259
+ 0) {
260
+ return NGTCP2_ERR_CALLBACK_FAILURE;
261
+ }
262
+
263
+ return 0;
264
+ }
265
+
266
+ static int extend_max_local_streams_bidi(ngtcp2_conn *conn,
267
+ uint64_t max_streams,
268
+ void *user_data) {
269
+ #ifdef MESSAGE
270
+ struct client *c = user_data;
271
+ int rv;
272
+ int64_t stream_id;
273
+ (void)max_streams;
274
+
275
+ if (c->stream.stream_id != -1) {
276
+ return 0;
277
+ }
278
+
279
+ rv = ngtcp2_conn_open_bidi_stream(conn, &stream_id, NULL);
280
+ if (rv != 0) {
281
+ return 0;
282
+ }
283
+
284
+ c->stream.stream_id = stream_id;
285
+ c->stream.data = (const uint8_t *)MESSAGE;
286
+ c->stream.datalen = sizeof(MESSAGE) - 1;
287
+
288
+ return 0;
289
+ #else /* !MESSAGE */
290
+ (void)conn;
291
+ (void)max_streams;
292
+ (void)user_data;
293
+
294
+ return 0;
295
+ #endif /* !MESSAGE */
296
+ }
297
+
298
+ static void log_printf(void *user_data, const char *fmt, ...) {
299
+ va_list ap;
300
+ (void)user_data;
301
+
302
+ va_start(ap, fmt);
303
+ vfprintf(stderr, fmt, ap);
304
+ va_end(ap);
305
+
306
+ fprintf(stderr, "\n");
307
+ }
308
+
309
+ static int client_quic_init(struct client *c,
310
+ const struct sockaddr *remote_addr,
311
+ socklen_t remote_addrlen,
312
+ const struct sockaddr *local_addr,
313
+ socklen_t local_addrlen) {
314
+ ngtcp2_path path = {
315
+ {
316
+ (struct sockaddr *)local_addr,
317
+ local_addrlen,
318
+ },
319
+ {
320
+ (struct sockaddr *)remote_addr,
321
+ remote_addrlen,
322
+ },
323
+ NULL,
324
+ };
325
+ ngtcp2_callbacks callbacks = {
326
+ ngtcp2_crypto_client_initial_cb,
327
+ NULL, /* recv_client_initial */
328
+ ngtcp2_crypto_recv_crypto_data_cb,
329
+ NULL, /* handshake_completed */
330
+ NULL, /* recv_version_negotiation */
331
+ ngtcp2_crypto_encrypt_cb,
332
+ ngtcp2_crypto_decrypt_cb,
333
+ ngtcp2_crypto_hp_mask_cb,
334
+ NULL, /* recv_stream_data */
335
+ NULL, /* acked_stream_data_offset */
336
+ NULL, /* stream_open */
337
+ NULL, /* stream_close */
338
+ NULL, /* recv_stateless_reset */
339
+ ngtcp2_crypto_recv_retry_cb,
340
+ extend_max_local_streams_bidi,
341
+ NULL, /* extend_max_local_streams_uni */
342
+ rand_cb,
343
+ get_new_connection_id_cb,
344
+ NULL, /* remove_connection_id */
345
+ ngtcp2_crypto_update_key_cb,
346
+ NULL, /* path_validation */
347
+ NULL, /* select_preferred_address */
348
+ NULL, /* stream_reset */
349
+ NULL, /* extend_max_remote_streams_bidi */
350
+ NULL, /* extend_max_remote_streams_uni */
351
+ NULL, /* extend_max_stream_data */
352
+ NULL, /* dcid_status */
353
+ NULL, /* handshake_confirmed */
354
+ NULL, /* recv_new_token */
355
+ ngtcp2_crypto_delete_crypto_aead_ctx_cb,
356
+ ngtcp2_crypto_delete_crypto_cipher_ctx_cb,
357
+ NULL, /* recv_datagram */
358
+ NULL, /* ack_datagram */
359
+ NULL, /* lost_datagram */
360
+ ngtcp2_crypto_get_path_challenge_data_cb,
361
+ NULL, /* stream_stop_sending */
362
+ ngtcp2_crypto_version_negotiation_cb,
363
+ NULL, /* recv_rx_key */
364
+ NULL, /* recv_tx_key */
365
+ NULL, /* early_data_rejected */
366
+ };
367
+ ngtcp2_cid dcid, scid;
368
+ ngtcp2_settings settings;
369
+ ngtcp2_transport_params params;
370
+ int rv;
371
+
372
+ dcid.datalen = NGTCP2_MIN_INITIAL_DCIDLEN;
373
+ if (gnutls_rnd(GNUTLS_RND_RANDOM, dcid.data, dcid.datalen) != 0) {
374
+ fprintf(stderr, "gnutls_rnd failed\n");
375
+ return -1;
376
+ }
377
+
378
+ scid.datalen = 8;
379
+ if (gnutls_rnd(GNUTLS_RND_RANDOM, scid.data, scid.datalen) != 0) {
380
+ fprintf(stderr, "gnutls_rnd failed\n");
381
+ return -1;
382
+ }
383
+
384
+ ngtcp2_settings_default(&settings);
385
+
386
+ settings.initial_ts = timestamp();
387
+ settings.log_printf = log_printf;
388
+
389
+ ngtcp2_transport_params_default(&params);
390
+
391
+ params.initial_max_streams_uni = 3;
392
+ params.initial_max_stream_data_bidi_local = 128 * 1024;
393
+ params.initial_max_data = 1024 * 1024;
394
+
395
+ rv =
396
+ ngtcp2_conn_client_new(&c->conn, &dcid, &scid, &path, NGTCP2_PROTO_VER_V1,
397
+ &callbacks, &settings, &params, NULL, c);
398
+ if (rv != 0) {
399
+ fprintf(stderr, "ngtcp2_conn_client_new: %s\n", ngtcp2_strerror(rv));
400
+ return -1;
401
+ }
402
+
403
+ ngtcp2_conn_set_tls_native_handle(c->conn, c->session);
404
+
405
+ return 0;
406
+ }
407
+
408
+ static int client_read(struct client *c) {
409
+ uint8_t buf[65536];
410
+ struct sockaddr_storage addr;
411
+ struct iovec iov = {buf, sizeof(buf)};
412
+ struct msghdr msg = {0};
413
+ ssize_t nread;
414
+ ngtcp2_path path;
415
+ ngtcp2_pkt_info pi = {0};
416
+ int rv;
417
+
418
+ msg.msg_name = &addr;
419
+ msg.msg_iov = &iov;
420
+ msg.msg_iovlen = 1;
421
+
422
+ for (;;) {
423
+ msg.msg_namelen = sizeof(addr);
424
+
425
+ nread = recvmsg(c->fd, &msg, MSG_DONTWAIT);
426
+
427
+ if (nread == -1) {
428
+ if (errno != EAGAIN && errno != EWOULDBLOCK) {
429
+ fprintf(stderr, "recvmsg: %s\n", strerror(errno));
430
+ }
431
+
432
+ break;
433
+ }
434
+
435
+ path.local.addrlen = c->local_addrlen;
436
+ path.local.addr = (struct sockaddr *)&c->local_addr;
437
+ path.remote.addrlen = msg.msg_namelen;
438
+ path.remote.addr = msg.msg_name;
439
+
440
+ rv = ngtcp2_conn_read_pkt(c->conn, &path, &pi, buf, (size_t)nread,
441
+ timestamp());
442
+ if (rv != 0) {
443
+ fprintf(stderr, "ngtcp2_conn_read_pkt: %s\n", ngtcp2_strerror(rv));
444
+ if (!c->last_error.error_code) {
445
+ if (rv == NGTCP2_ERR_CRYPTO) {
446
+ ngtcp2_connection_close_error_set_transport_error_tls_alert(
447
+ &c->last_error, ngtcp2_conn_get_tls_alert(c->conn), NULL, 0);
448
+ } else {
449
+ ngtcp2_connection_close_error_set_transport_error_liberr(
450
+ &c->last_error, rv, NULL, 0);
451
+ }
452
+ }
453
+ return -1;
454
+ }
455
+ }
456
+
457
+ return 0;
458
+ }
459
+
460
+ static int client_send_packet(struct client *c, const uint8_t *data,
461
+ size_t datalen) {
462
+ struct iovec iov = {(uint8_t *)data, datalen};
463
+ struct msghdr msg = {0};
464
+ ssize_t nwrite;
465
+
466
+ msg.msg_iov = &iov;
467
+ msg.msg_iovlen = 1;
468
+
469
+ do {
470
+ nwrite = sendmsg(c->fd, &msg, 0);
471
+ } while (nwrite == -1 && errno == EINTR);
472
+
473
+ if (nwrite == -1) {
474
+ fprintf(stderr, "sendmsg: %s\n", strerror(errno));
475
+
476
+ return -1;
477
+ }
478
+
479
+ return 0;
480
+ }
481
+
482
+ static size_t client_get_message(struct client *c, int64_t *pstream_id,
483
+ int *pfin, ngtcp2_vec *datav,
484
+ size_t datavcnt) {
485
+ if (datavcnt == 0) {
486
+ return 0;
487
+ }
488
+
489
+ if (c->stream.stream_id != -1 && c->stream.nwrite < c->stream.datalen) {
490
+ *pstream_id = c->stream.stream_id;
491
+ *pfin = 1;
492
+ datav->base = (uint8_t *)c->stream.data + c->stream.nwrite;
493
+ datav->len = c->stream.datalen - c->stream.nwrite;
494
+ return 1;
495
+ }
496
+
497
+ *pstream_id = -1;
498
+ *pfin = 0;
499
+ datav->base = NULL;
500
+ datav->len = 0;
501
+
502
+ return 0;
503
+ }
504
+
505
+ static int client_write_streams(struct client *c) {
506
+ ngtcp2_tstamp ts = timestamp();
507
+ ngtcp2_pkt_info pi;
508
+ ngtcp2_ssize nwrite;
509
+ uint8_t buf[1280];
510
+ ngtcp2_path_storage ps;
511
+ ngtcp2_vec datav;
512
+ size_t datavcnt;
513
+ int64_t stream_id;
514
+ ngtcp2_ssize wdatalen;
515
+ uint32_t flags;
516
+ int fin;
517
+
518
+ ngtcp2_path_storage_zero(&ps);
519
+
520
+ for (;;) {
521
+ datavcnt = client_get_message(c, &stream_id, &fin, &datav, 1);
522
+
523
+ flags = NGTCP2_WRITE_STREAM_FLAG_MORE;
524
+ if (fin) {
525
+ flags |= NGTCP2_WRITE_STREAM_FLAG_FIN;
526
+ }
527
+
528
+ nwrite = ngtcp2_conn_writev_stream(c->conn, &ps.path, &pi, buf, sizeof(buf),
529
+ &wdatalen, flags, stream_id, &datav,
530
+ datavcnt, ts);
531
+ if (nwrite < 0) {
532
+ switch (nwrite) {
533
+ case NGTCP2_ERR_WRITE_MORE:
534
+ c->stream.nwrite += (size_t)wdatalen;
535
+ continue;
536
+ default:
537
+ fprintf(stderr, "ngtcp2_conn_writev_stream: %s\n",
538
+ ngtcp2_strerror((int)nwrite));
539
+ ngtcp2_connection_close_error_set_transport_error_liberr(
540
+ &c->last_error, (int)nwrite, NULL, 0);
541
+ return -1;
542
+ }
543
+ }
544
+
545
+ if (nwrite == 0) {
546
+ return 0;
547
+ }
548
+
549
+ if (wdatalen > 0) {
550
+ c->stream.nwrite += (size_t)wdatalen;
551
+ }
552
+
553
+ if (client_send_packet(c, buf, (size_t)nwrite) != 0) {
554
+ break;
555
+ }
556
+ }
557
+
558
+ return 0;
559
+ }
560
+
561
+ static int client_write(struct client *c) {
562
+ ngtcp2_tstamp expiry, now;
563
+ ev_tstamp t;
564
+
565
+ if (client_write_streams(c) != 0) {
566
+ return -1;
567
+ }
568
+
569
+ expiry = ngtcp2_conn_get_expiry(c->conn);
570
+ now = timestamp();
571
+
572
+ t = expiry < now ? 1e-9 : (ev_tstamp)(expiry - now) / NGTCP2_SECONDS;
573
+
574
+ c->timer.repeat = t;
575
+ ev_timer_again(EV_DEFAULT, &c->timer);
576
+
577
+ return 0;
578
+ }
579
+
580
+ static int client_handle_expiry(struct client *c) {
581
+ int rv = ngtcp2_conn_handle_expiry(c->conn, timestamp());
582
+ if (rv != 0) {
583
+ fprintf(stderr, "ngtcp2_conn_handle_expiry: %s\n", ngtcp2_strerror(rv));
584
+ return -1;
585
+ }
586
+
587
+ return 0;
588
+ }
589
+
590
+ static void client_close(struct client *c) {
591
+ ngtcp2_ssize nwrite;
592
+ ngtcp2_pkt_info pi;
593
+ ngtcp2_path_storage ps;
594
+ uint8_t buf[1280];
595
+
596
+ if (ngtcp2_conn_is_in_closing_period(c->conn) ||
597
+ ngtcp2_conn_is_in_draining_period(c->conn)) {
598
+ goto fin;
599
+ }
600
+
601
+ ngtcp2_path_storage_zero(&ps);
602
+
603
+ nwrite = ngtcp2_conn_write_connection_close(
604
+ c->conn, &ps.path, &pi, buf, sizeof(buf), &c->last_error, timestamp());
605
+ if (nwrite < 0) {
606
+ fprintf(stderr, "ngtcp2_conn_write_connection_close: %s\n",
607
+ ngtcp2_strerror((int)nwrite));
608
+ goto fin;
609
+ }
610
+
611
+ client_send_packet(c, buf, (size_t)nwrite);
612
+
613
+ fin:
614
+ ev_break(EV_DEFAULT, EVBREAK_ALL);
615
+ }
616
+
617
+ static void read_cb(struct ev_loop *loop, ev_io *w, int revents) {
618
+ struct client *c = w->data;
619
+ (void)loop;
620
+ (void)revents;
621
+
622
+ if (client_read(c) != 0) {
623
+ client_close(c);
624
+ return;
625
+ }
626
+
627
+ if (client_write(c) != 0) {
628
+ client_close(c);
629
+ }
630
+ }
631
+
632
+ static void timer_cb(struct ev_loop *loop, ev_timer *w, int revents) {
633
+ struct client *c = w->data;
634
+ (void)loop;
635
+ (void)revents;
636
+
637
+ if (client_handle_expiry(c) != 0) {
638
+ client_close(c);
639
+ return;
640
+ }
641
+
642
+ if (client_write(c) != 0) {
643
+ client_close(c);
644
+ }
645
+ }
646
+
647
+ static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) {
648
+ struct client *c = conn_ref->user_data;
649
+ return c->conn;
650
+ }
651
+
652
+ static int client_init(struct client *c) {
653
+ struct sockaddr_storage remote_addr, local_addr;
654
+ socklen_t remote_addrlen, local_addrlen = sizeof(local_addr);
655
+
656
+ memset(c, 0, sizeof(*c));
657
+
658
+ ngtcp2_connection_close_error_default(&c->last_error);
659
+
660
+ c->fd = create_sock((struct sockaddr *)&remote_addr, &remote_addrlen,
661
+ REMOTE_HOST, REMOTE_PORT);
662
+ if (c->fd == -1) {
663
+ return -1;
664
+ }
665
+
666
+ if (connect_sock((struct sockaddr *)&local_addr, &local_addrlen, c->fd,
667
+ (struct sockaddr *)&remote_addr, remote_addrlen) != 0) {
668
+ return -1;
669
+ }
670
+
671
+ memcpy(&c->local_addr, &local_addr, sizeof(c->local_addr));
672
+ c->local_addrlen = local_addrlen;
673
+
674
+ if (client_gnutls_init(c) != 0) {
675
+ return -1;
676
+ }
677
+
678
+ if (client_quic_init(c, (struct sockaddr *)&remote_addr, remote_addrlen,
679
+ (struct sockaddr *)&local_addr, local_addrlen) != 0) {
680
+ return -1;
681
+ }
682
+
683
+ c->stream.stream_id = -1;
684
+
685
+ c->conn_ref.get_conn = get_conn;
686
+ c->conn_ref.user_data = c;
687
+
688
+ ev_io_init(&c->rev, read_cb, c->fd, EV_READ);
689
+ c->rev.data = c;
690
+ ev_io_start(EV_DEFAULT, &c->rev);
691
+
692
+ ev_timer_init(&c->timer, timer_cb, 0., 0.);
693
+ c->timer.data = c;
694
+
695
+ return 0;
696
+ }
697
+
698
+ static void client_free(struct client *c) {
699
+ ngtcp2_conn_del(c->conn);
700
+ gnutls_deinit(c->session);
701
+ gnutls_certificate_free_credentials(c->cred);
702
+ }
703
+
704
+ int main(void) {
705
+ struct client c;
706
+
707
+ if (client_init(&c) != 0) {
708
+ exit(EXIT_FAILURE);
709
+ }
710
+
711
+ if (client_write(&c) != 0) {
712
+ exit(EXIT_FAILURE);
713
+ }
714
+
715
+ ev_run(EV_DEFAULT, 0);
716
+
717
+ client_free(&c);
718
+
719
+ return 0;
720
+ }