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,468 @@
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_RTB_H
26
+ #define NGTCP2_RTB_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_pkt.h"
35
+ #include "ngtcp2_ksl.h"
36
+ #include "ngtcp2_pq.h"
37
+ #include "ngtcp2_objalloc.h"
38
+
39
+ typedef struct ngtcp2_conn ngtcp2_conn;
40
+ typedef struct ngtcp2_pktns ngtcp2_pktns;
41
+ typedef struct ngtcp2_log ngtcp2_log;
42
+ typedef struct ngtcp2_qlog ngtcp2_qlog;
43
+ typedef struct ngtcp2_strm ngtcp2_strm;
44
+ typedef struct ngtcp2_rst ngtcp2_rst;
45
+ typedef struct ngtcp2_cc ngtcp2_cc;
46
+ typedef struct ngtcp2_conn_stat ngtcp2_conn_stat;
47
+
48
+ /* NGTCP2_FRAME_CHAIN_BINDER_FLAG_NONE indicates that no flag is
49
+ set. */
50
+ #define NGTCP2_FRAME_CHAIN_BINDER_FLAG_NONE 0x00u
51
+ /* NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK indicates that an information
52
+ which a frame carries has been acknowledged. */
53
+ #define NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK 0x01u
54
+
55
+ /*
56
+ * ngtcp2_frame_chain_binder binds 2 or more of ngtcp2_frame_chain to
57
+ * share the acknowledgement state. In general, all
58
+ * ngtcp2_frame_chains bound to the same binder must have the same
59
+ * information.
60
+ */
61
+ typedef struct ngtcp2_frame_chain_binder {
62
+ size_t refcount;
63
+ /* flags is bitwise OR of zero or more of
64
+ NGTCP2_FRAME_CHAIN_BINDER_FLAG_*. */
65
+ uint32_t flags;
66
+ } ngtcp2_frame_chain_binder;
67
+
68
+ int ngtcp2_frame_chain_binder_new(ngtcp2_frame_chain_binder **pbinder,
69
+ const ngtcp2_mem *mem);
70
+
71
+ typedef struct ngtcp2_frame_chain ngtcp2_frame_chain;
72
+
73
+ /*
74
+ * ngtcp2_frame_chain chains frames in a single packet.
75
+ */
76
+ struct ngtcp2_frame_chain {
77
+ union {
78
+ struct {
79
+ ngtcp2_frame_chain *next;
80
+ ngtcp2_frame_chain_binder *binder;
81
+ ngtcp2_frame fr;
82
+ };
83
+
84
+ ngtcp2_opl_entry oplent;
85
+ };
86
+ };
87
+
88
+ ngtcp2_objalloc_def(frame_chain, ngtcp2_frame_chain, oplent);
89
+
90
+ /*
91
+ * ngtcp2_bind_frame_chains binds two frame chains |a| and |b| using
92
+ * new or existing ngtcp2_frame_chain_binder. |a| might have non-NULL
93
+ * a->binder. |b| must not have non-NULL b->binder.
94
+ *
95
+ * This function returns 0 if it succeeds, or one of the following
96
+ * negative error codes:
97
+ *
98
+ * NGTCP2_ERR_NOMEM
99
+ * Out of memory
100
+ */
101
+ int ngtcp2_bind_frame_chains(ngtcp2_frame_chain *a, ngtcp2_frame_chain *b,
102
+ const ngtcp2_mem *mem);
103
+
104
+ /* NGTCP2_MAX_STREAM_DATACNT is the maximum number of ngtcp2_vec that
105
+ a ngtcp2_stream can include. */
106
+ #define NGTCP2_MAX_STREAM_DATACNT 256
107
+
108
+ /* NGTCP2_MAX_CRYPTO_DATACNT is the maximum number of ngtcp2_vec that
109
+ a ngtcp2_crypto can include. */
110
+ #define NGTCP2_MAX_CRYPTO_DATACNT 8
111
+
112
+ /*
113
+ * ngtcp2_frame_chain_new allocates ngtcp2_frame_chain object and
114
+ * assigns its pointer to |*pfrc|.
115
+ *
116
+ * This function returns 0 if it succeeds, or one of the following
117
+ * negative error codes:
118
+ *
119
+ * NGTCP2_ERR_NOMEM
120
+ * Out of memory.
121
+ */
122
+ int ngtcp2_frame_chain_new(ngtcp2_frame_chain **pfrc, const ngtcp2_mem *mem);
123
+
124
+ /*
125
+ * ngtcp2_frame_chain_objalloc_new behaves like
126
+ * ngtcp2_frame_chain_new, but it uses |objalloc| to allocate the object.
127
+ */
128
+ int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc,
129
+ ngtcp2_objalloc *objalloc);
130
+
131
+ /*
132
+ * ngtcp2_frame_chain_extralen_new works like ngtcp2_frame_chain_new,
133
+ * but it allocates extra memory |extralen| in order to extend
134
+ * ngtcp2_frame.
135
+ */
136
+ int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen,
137
+ const ngtcp2_mem *mem);
138
+
139
+ /*
140
+ * ngtcp2_frame_chain_stream_datacnt_objalloc_new works like
141
+ * ngtcp2_frame_chain_new, but it allocates enough data to store
142
+ * additional |datacnt| - 1 ngtcp2_vec object after ngtcp2_stream
143
+ * object. If no additional space is required,
144
+ * ngtcp2_frame_chain_objalloc_new is called internally.
145
+ */
146
+ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc,
147
+ size_t datacnt,
148
+ ngtcp2_objalloc *objalloc,
149
+ const ngtcp2_mem *mem);
150
+
151
+ /*
152
+ * ngtcp2_frame_chain_crypto_datacnt_objalloc_new works like
153
+ * ngtcp2_frame_chain_new, but it allocates enough data to store
154
+ * additional |datacnt| - 1 ngtcp2_vec object after ngtcp2_crypto
155
+ * object. If no additional space is required,
156
+ * ngtcp2_frame_chain_objalloc_new is called internally.
157
+ */
158
+ int ngtcp2_frame_chain_crypto_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc,
159
+ size_t datacnt,
160
+ ngtcp2_objalloc *objalloc,
161
+ const ngtcp2_mem *mem);
162
+
163
+ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc,
164
+ const uint8_t *token,
165
+ size_t tokenlen,
166
+ ngtcp2_objalloc *objalloc,
167
+ const ngtcp2_mem *mem);
168
+
169
+ /*
170
+ * ngtcp2_frame_chain_del deallocates |frc|. It also deallocates the
171
+ * memory pointed by |frc|.
172
+ */
173
+ void ngtcp2_frame_chain_del(ngtcp2_frame_chain *frc, const ngtcp2_mem *mem);
174
+
175
+ /*
176
+ * ngtcp2_frame_chain_objalloc_del adds |frc| to |objalloc| for reuse.
177
+ * It might just delete |frc| depending on the frame type and the size
178
+ * of |frc|.
179
+ */
180
+ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc,
181
+ ngtcp2_objalloc *objalloc,
182
+ const ngtcp2_mem *mem);
183
+
184
+ /*
185
+ * ngtcp2_frame_chain_init initializes |frc|.
186
+ */
187
+ void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc);
188
+
189
+ /*
190
+ * ngtcp2_frame_chain_list_objalloc_del adds all ngtcp2_frame_chain
191
+ * linked from |frc| to |objalloc| for reuse. Depending on the frame type
192
+ * and its size, ngtcp2_frame_chain might be deleted instead.
193
+ */
194
+ void ngtcp2_frame_chain_list_objalloc_del(ngtcp2_frame_chain *frc,
195
+ ngtcp2_objalloc *objalloc,
196
+ const ngtcp2_mem *mem);
197
+
198
+ /* NGTCP2_RTB_ENTRY_FLAG_NONE indicates that no flag is set. */
199
+ #define NGTCP2_RTB_ENTRY_FLAG_NONE 0x00u
200
+ /* NGTCP2_RTB_ENTRY_FLAG_PROBE indicates that the entry includes a
201
+ probe packet. */
202
+ #define NGTCP2_RTB_ENTRY_FLAG_PROBE 0x01u
203
+ /* NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE indicates that the entry
204
+ includes a frame which must be retransmitted until it is
205
+ acknowledged. In most cases, this flag is used along with
206
+ NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING and
207
+ NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING. */
208
+ #define NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE 0x02u
209
+ /* NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING indicates that the entry
210
+ elicits acknowledgement. */
211
+ #define NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING 0x04u
212
+ /* NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED indicates that the packet has
213
+ been reclaimed on PTO. It is not marked lost yet and still
214
+ consumes congestion window. */
215
+ #define NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED 0x08u
216
+ /* NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED indicates that the entry
217
+ has been marked lost and, optionally, scheduled to retransmit. */
218
+ #define NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED 0x10u
219
+ /* NGTCP2_RTB_ENTRY_FLAG_ECN indicates that the entry is included in a
220
+ UDP datagram with ECN marking. */
221
+ #define NGTCP2_RTB_ENTRY_FLAG_ECN 0x20u
222
+ /* NGTCP2_RTB_ENTRY_FLAG_DATAGRAM indicates that the entry includes
223
+ DATAGRAM frame. */
224
+ #define NGTCP2_RTB_ENTRY_FLAG_DATAGRAM 0x40u
225
+ /* NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE indicates that the entry includes
226
+ a PMTUD probe packet. */
227
+ #define NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE 0x80u
228
+ /* NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING indicates that the entry
229
+ includes a packet which elicits PTO probe packets. */
230
+ #define NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING 0x100u
231
+
232
+ typedef struct ngtcp2_rtb_entry ngtcp2_rtb_entry;
233
+
234
+ /*
235
+ * ngtcp2_rtb_entry is an object stored in ngtcp2_rtb. It corresponds
236
+ * to the one packet which is waiting for its ACK.
237
+ */
238
+ struct ngtcp2_rtb_entry {
239
+ union {
240
+ struct {
241
+ ngtcp2_rtb_entry *next;
242
+
243
+ struct {
244
+ int64_t pkt_num;
245
+ uint8_t type;
246
+ uint8_t flags;
247
+ } hd;
248
+ ngtcp2_frame_chain *frc;
249
+ /* ts is the time point when a packet included in this entry is sent
250
+ to a peer. */
251
+ ngtcp2_tstamp ts;
252
+ /* lost_ts is the time when this entry is marked lost. */
253
+ ngtcp2_tstamp lost_ts;
254
+ /* pktlen is the length of QUIC packet */
255
+ size_t pktlen;
256
+ struct {
257
+ uint64_t delivered;
258
+ ngtcp2_tstamp delivered_ts;
259
+ ngtcp2_tstamp first_sent_ts;
260
+ uint64_t tx_in_flight;
261
+ uint64_t lost;
262
+ int is_app_limited;
263
+ } rst;
264
+ /* flags is bitwise-OR of zero or more of
265
+ NGTCP2_RTB_ENTRY_FLAG_*. */
266
+ uint16_t flags;
267
+ };
268
+
269
+ ngtcp2_opl_entry oplent;
270
+ };
271
+ };
272
+
273
+ ngtcp2_objalloc_def(rtb_entry, ngtcp2_rtb_entry, oplent);
274
+
275
+ /*
276
+ * ngtcp2_rtb_entry_new allocates ngtcp2_rtb_entry object, and assigns
277
+ * its pointer to |*pent|.
278
+ */
279
+ int ngtcp2_rtb_entry_objalloc_new(ngtcp2_rtb_entry **pent,
280
+ const ngtcp2_pkt_hd *hd,
281
+ ngtcp2_frame_chain *frc, ngtcp2_tstamp ts,
282
+ size_t pktlen, uint16_t flags,
283
+ ngtcp2_objalloc *objalloc);
284
+
285
+ /*
286
+ * ngtcp2_rtb_entry_objalloc_del adds |ent| to |objalloc| for reuse.
287
+ * ngtcp2_frame_chain linked from ent->frc are also added to
288
+ * |frc_objalloc| depending on their frame type and size.
289
+ */
290
+ void ngtcp2_rtb_entry_objalloc_del(ngtcp2_rtb_entry *ent,
291
+ ngtcp2_objalloc *objalloc,
292
+ ngtcp2_objalloc *frc_objalloc,
293
+ const ngtcp2_mem *mem);
294
+
295
+ /*
296
+ * ngtcp2_rtb tracks sent packets, and its ACK timeout for
297
+ * retransmission.
298
+ */
299
+ typedef struct ngtcp2_rtb {
300
+ ngtcp2_objalloc *frc_objalloc;
301
+ ngtcp2_objalloc *rtb_entry_objalloc;
302
+ /* ents includes ngtcp2_rtb_entry sorted by decreasing order of
303
+ packet number. */
304
+ ngtcp2_ksl ents;
305
+ /* crypto is CRYPTO stream. */
306
+ ngtcp2_strm *crypto;
307
+ ngtcp2_rst *rst;
308
+ ngtcp2_cc *cc;
309
+ ngtcp2_log *log;
310
+ ngtcp2_qlog *qlog;
311
+ const ngtcp2_mem *mem;
312
+ /* largest_acked_tx_pkt_num is the largest packet number
313
+ acknowledged by the peer. */
314
+ int64_t largest_acked_tx_pkt_num;
315
+ /* num_ack_eliciting is the number of ACK eliciting entries. */
316
+ size_t num_ack_eliciting;
317
+ /* num_retransmittable is the number of packets which contain frames
318
+ that must be retransmitted on loss. */
319
+ size_t num_retransmittable;
320
+ /* num_pto_eliciting is the number of packets that elicit PTO probe
321
+ packets. */
322
+ size_t num_pto_eliciting;
323
+ /* probe_pkt_left is the number of probe packet to send */
324
+ size_t probe_pkt_left;
325
+ /* pktns_id is the identifier of packet number space. */
326
+ ngtcp2_pktns_id pktns_id;
327
+ /* cc_pkt_num is the smallest packet number that is contributed to
328
+ ngtcp2_conn_stat.bytes_in_flight. */
329
+ int64_t cc_pkt_num;
330
+ /* cc_bytes_in_flight is the number of in-flight bytes that is
331
+ contributed to ngtcp2_conn_stat.bytes_in_flight. It only
332
+ includes the bytes after congestion state is reset. */
333
+ uint64_t cc_bytes_in_flight;
334
+ /* persistent_congestion_start_ts is the time when persistent
335
+ congestion evaluation is started. It happens roughly after
336
+ handshake is confirmed. */
337
+ ngtcp2_tstamp persistent_congestion_start_ts;
338
+ /* num_lost_pkts is the number entries in ents which has
339
+ NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED flag set. */
340
+ size_t num_lost_pkts;
341
+ /* num_lost_pmtud_pkts is the number of entries in ents which have
342
+ both NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED and
343
+ NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE flags set. */
344
+ size_t num_lost_pmtud_pkts;
345
+ } ngtcp2_rtb;
346
+
347
+ /*
348
+ * ngtcp2_rtb_init initializes |rtb|.
349
+ */
350
+ void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id,
351
+ ngtcp2_strm *crypto, ngtcp2_rst *rst, ngtcp2_cc *cc,
352
+ ngtcp2_log *log, ngtcp2_qlog *qlog,
353
+ ngtcp2_objalloc *rtb_entry_objalloc,
354
+ ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem);
355
+
356
+ /*
357
+ * ngtcp2_rtb_free deallocates resources allocated for |rtb|.
358
+ */
359
+ void ngtcp2_rtb_free(ngtcp2_rtb *rtb);
360
+
361
+ /*
362
+ * ngtcp2_rtb_add adds |ent| to |rtb|.
363
+ *
364
+ * This function returns 0 if it succeeds, or one of the following
365
+ * negative error codes:
366
+ *
367
+ * NGTCP2_ERR_NOMEM
368
+ * Out of memory
369
+ */
370
+ int ngtcp2_rtb_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent,
371
+ ngtcp2_conn_stat *cstat);
372
+
373
+ /*
374
+ * ngtcp2_rtb_head returns the iterator which points to the entry
375
+ * which has the largest packet number. If there is no entry,
376
+ * returned value satisfies ngtcp2_ksl_it_end(&it) != 0.
377
+ */
378
+ ngtcp2_ksl_it ngtcp2_rtb_head(ngtcp2_rtb *rtb);
379
+
380
+ /*
381
+ * ngtcp2_rtb_recv_ack removes acked ngtcp2_rtb_entry from |rtb|.
382
+ * |pkt_num| is a packet number which includes |fr|. |pkt_ts| is the
383
+ * timestamp when packet is received. |ts| should be the current
384
+ * time. Usually they are the same, but for buffered packets,
385
+ * |pkt_ts| would be earlier than |ts|.
386
+ *
387
+ * This function returns the number of newly acknowledged packets if
388
+ * it succeeds, or one of the following negative error codes:
389
+ *
390
+ * NGTCP2_ERR_CALLBACK_FAILURE
391
+ * User callback failed
392
+ * NGTCP2_ERR_NOMEM
393
+ * Out of memory
394
+ */
395
+ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr,
396
+ ngtcp2_conn_stat *cstat, ngtcp2_conn *conn,
397
+ ngtcp2_pktns *pktns, ngtcp2_tstamp pkt_ts,
398
+ ngtcp2_tstamp ts);
399
+
400
+ /*
401
+ * ngtcp2_rtb_detect_lost_pkt detects lost packets and prepends the
402
+ * frames contained them to |*pfrc|. Even when this function fails,
403
+ * some frames might be prepended to |*pfrc| and the caller should
404
+ * handle them.
405
+ */
406
+ int ngtcp2_rtb_detect_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_conn *conn,
407
+ ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat,
408
+ ngtcp2_tstamp ts);
409
+
410
+ /*
411
+ * ngtcp2_rtb_remove_expired_lost_pkt removes expired lost packet.
412
+ */
413
+ void ngtcp2_rtb_remove_expired_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_duration pto,
414
+ ngtcp2_tstamp ts);
415
+
416
+ /*
417
+ * ngtcp2_rtb_lost_pkt_ts returns the earliest time when the still
418
+ * retained packet was lost. It returns UINT64_MAX if no such packet
419
+ * exists.
420
+ */
421
+ ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(ngtcp2_rtb *rtb);
422
+
423
+ /*
424
+ * ngtcp2_rtb_remove_all removes all packets from |rtb| and prepends
425
+ * all frames to |*pfrc|. Even when this function fails, some frames
426
+ * might be prepended to |*pfrc| and the caller should handle them.
427
+ */
428
+ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn,
429
+ ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat);
430
+
431
+ /*
432
+ * ngtcp2_rtb_remove_early_data removes all entries for 0RTT packets.
433
+ */
434
+ void ngtcp2_rtb_remove_early_data(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat);
435
+
436
+ /*
437
+ * ngtcp2_rtb_empty returns nonzero if |rtb| have no entry.
438
+ */
439
+ int ngtcp2_rtb_empty(ngtcp2_rtb *rtb);
440
+
441
+ /*
442
+ * ngtcp2_rtb_reset_cc_state resets congestion state in |rtb|.
443
+ * |cc_pkt_num| is the next outbound packet number which is sent under
444
+ * new congestion state.
445
+ */
446
+ void ngtcp2_rtb_reset_cc_state(ngtcp2_rtb *rtb, int64_t cc_pkt_num);
447
+
448
+ /*
449
+ * ngtcp2_rtb_remove_expired_lost_pkt ensures that the number of lost
450
+ * packets at most |n|.
451
+ */
452
+ void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n);
453
+
454
+ /*
455
+ * ngtcp2_rtb_reclaim_on_pto reclaims up to |num_pkts| packets which
456
+ * are in-flight and not marked lost to send them in PTO probe. The
457
+ * reclaimed frames are chained to |*pfrc|.
458
+ *
459
+ * This function returns the number of packets reclaimed if it
460
+ * succeeds, or one of the following negative error codes:
461
+ *
462
+ * NGTCP2_ERR_NOMEM
463
+ * Out of memory
464
+ */
465
+ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn,
466
+ ngtcp2_pktns *pktns, size_t num_pkts);
467
+
468
+ #endif /* NGTCP2_RTB_H */
@@ -0,0 +1,233 @@
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_str.h"
26
+
27
+ #include <string.h>
28
+
29
+ #include "ngtcp2_macro.h"
30
+
31
+ void *ngtcp2_cpymem(void *dest, const void *src, size_t n) {
32
+ memcpy(dest, src, n);
33
+ return (uint8_t *)dest + n;
34
+ }
35
+
36
+ uint8_t *ngtcp2_setmem(uint8_t *dest, uint8_t b, size_t n) {
37
+ memset(dest, b, n);
38
+ return dest + n;
39
+ }
40
+
41
+ const void *ngtcp2_get_bytes(void *dest, const void *src, size_t n) {
42
+ memcpy(dest, src, n);
43
+ return (uint8_t *)src + n;
44
+ }
45
+
46
+ #define LOWER_XDIGITS "0123456789abcdef"
47
+
48
+ uint8_t *ngtcp2_encode_hex(uint8_t *dest, const uint8_t *data, size_t len) {
49
+ size_t i;
50
+ uint8_t *p = dest;
51
+
52
+ for (i = 0; i < len; ++i) {
53
+ *p++ = (uint8_t)LOWER_XDIGITS[data[i] >> 4];
54
+ *p++ = (uint8_t)LOWER_XDIGITS[data[i] & 0xf];
55
+ }
56
+
57
+ *p = '\0';
58
+
59
+ return dest;
60
+ }
61
+
62
+ char *ngtcp2_encode_printable_ascii(char *dest, const uint8_t *data,
63
+ size_t len) {
64
+ size_t i;
65
+ char *p = dest;
66
+ uint8_t c;
67
+
68
+ for (i = 0; i < len; ++i) {
69
+ c = data[i];
70
+ if (0x20 <= c && c <= 0x7e) {
71
+ *p++ = (char)c;
72
+ } else {
73
+ *p++ = '.';
74
+ }
75
+ }
76
+
77
+ *p = '\0';
78
+
79
+ return dest;
80
+ }
81
+
82
+ /*
83
+ * write_uint writes |n| to the buffer pointed by |p| in decimal
84
+ * representation. It returns |p| plus the number of bytes written.
85
+ * The function assumes that the buffer has enough capacity to contain
86
+ * a string.
87
+ */
88
+ static uint8_t *write_uint(uint8_t *p, uint64_t n) {
89
+ size_t nlen = 0;
90
+ uint64_t t;
91
+ uint8_t *res;
92
+
93
+ if (n == 0) {
94
+ *p++ = '0';
95
+ return p;
96
+ }
97
+ for (t = n; t; t /= 10, ++nlen)
98
+ ;
99
+ p += nlen;
100
+ res = p;
101
+ for (; n; n /= 10) {
102
+ *--p = (uint8_t)((n % 10) + '0');
103
+ }
104
+ return res;
105
+ }
106
+
107
+ uint8_t *ngtcp2_encode_ipv4(uint8_t *dest, const uint8_t *addr) {
108
+ size_t i;
109
+ uint8_t *p = dest;
110
+
111
+ p = write_uint(p, addr[0]);
112
+
113
+ for (i = 1; i < 4; ++i) {
114
+ *p++ = '.';
115
+ p = write_uint(p, addr[i]);
116
+ }
117
+
118
+ *p = '\0';
119
+
120
+ return dest;
121
+ }
122
+
123
+ /*
124
+ * write_hex_zsup writes the content of buffer pointed by |data| of
125
+ * length |len| to |dest| in hex string. Any leading zeros are
126
+ * suppressed. It returns |dest| plus the number of bytes written.
127
+ */
128
+ static uint8_t *write_hex_zsup(uint8_t *dest, const uint8_t *data, size_t len) {
129
+ size_t i;
130
+ uint8_t *p = dest;
131
+ uint8_t d;
132
+
133
+ for (i = 0; i < len; ++i) {
134
+ d = data[i];
135
+ if (d >> 4) {
136
+ break;
137
+ }
138
+
139
+ d &= 0xf;
140
+
141
+ if (d) {
142
+ *p++ = (uint8_t)LOWER_XDIGITS[d];
143
+ ++i;
144
+ break;
145
+ }
146
+ }
147
+
148
+ if (p == dest && i == len) {
149
+ *p++ = '0';
150
+ return p;
151
+ }
152
+
153
+ for (; i < len; ++i) {
154
+ d = data[i];
155
+ *p++ = (uint8_t)LOWER_XDIGITS[d >> 4];
156
+ *p++ = (uint8_t)LOWER_XDIGITS[d & 0xf];
157
+ }
158
+
159
+ return p;
160
+ }
161
+
162
+ uint8_t *ngtcp2_encode_ipv6(uint8_t *dest, const uint8_t *addr) {
163
+ uint16_t blks[8];
164
+ size_t i;
165
+ size_t zlen, zoff;
166
+ size_t max_zlen = 0, max_zoff = 8;
167
+ uint8_t *p = dest;
168
+
169
+ for (i = 0; i < 16; i += sizeof(uint16_t)) {
170
+ /* Copy in network byte order. */
171
+ memcpy(&blks[i / sizeof(uint16_t)], addr + i, sizeof(uint16_t));
172
+ }
173
+
174
+ for (i = 0; i < 8;) {
175
+ if (blks[i]) {
176
+ ++i;
177
+ continue;
178
+ }
179
+
180
+ zlen = 1;
181
+ zoff = i;
182
+
183
+ ++i;
184
+ for (; i < 8 && blks[i] == 0; ++i, ++zlen)
185
+ ;
186
+ if (zlen > max_zlen) {
187
+ max_zlen = zlen;
188
+ max_zoff = zoff;
189
+ }
190
+ }
191
+
192
+ /* Do not suppress a single '0' block */
193
+ if (max_zlen == 1) {
194
+ max_zoff = 8;
195
+ }
196
+
197
+ if (max_zoff != 0) {
198
+ p = write_hex_zsup(p, (const uint8_t *)blks, sizeof(uint16_t));
199
+
200
+ for (i = 1; i < max_zoff; ++i) {
201
+ *p++ = ':';
202
+ p = write_hex_zsup(p, (const uint8_t *)(blks + i), sizeof(uint16_t));
203
+ }
204
+ }
205
+
206
+ if (max_zoff != 8) {
207
+ *p++ = ':';
208
+
209
+ if (max_zoff + max_zlen == 8) {
210
+ *p++ = ':';
211
+ } else {
212
+ for (i = max_zoff + max_zlen; i < 8; ++i) {
213
+ *p++ = ':';
214
+ p = write_hex_zsup(p, (const uint8_t *)(blks + i), sizeof(uint16_t));
215
+ }
216
+ }
217
+ }
218
+
219
+ *p = '\0';
220
+
221
+ return dest;
222
+ }
223
+
224
+ int ngtcp2_cmemeq(const uint8_t *a, const uint8_t *b, size_t n) {
225
+ size_t i;
226
+ int rv = 0;
227
+
228
+ for (i = 0; i < n; ++i) {
229
+ rv |= a[i] ^ b[i];
230
+ }
231
+
232
+ return rv == 0;
233
+ }