protocol-quic 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,819 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2018 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_ksl.h"
26
+
27
+ #include <stdlib.h>
28
+ #include <string.h>
29
+ #include <assert.h>
30
+ #include <stdio.h>
31
+
32
+ #include "ngtcp2_macro.h"
33
+ #include "ngtcp2_mem.h"
34
+ #include "ngtcp2_range.h"
35
+
36
+ static ngtcp2_ksl_blk null_blk = {{{NULL, NULL, 0, 0, {0}}}};
37
+
38
+ static size_t ksl_nodelen(size_t keylen) {
39
+ return (sizeof(ngtcp2_ksl_node) + keylen - sizeof(uint64_t) + 0xfu) &
40
+ ~(uintptr_t)0xfu;
41
+ }
42
+
43
+ static size_t ksl_blklen(size_t nodelen) {
44
+ return sizeof(ngtcp2_ksl_blk) + nodelen * NGTCP2_KSL_MAX_NBLK -
45
+ sizeof(uint64_t);
46
+ }
47
+
48
+ /*
49
+ * ksl_node_set_key sets |key| to |node|.
50
+ */
51
+ static void ksl_node_set_key(ngtcp2_ksl *ksl, ngtcp2_ksl_node *node,
52
+ const void *key) {
53
+ memcpy(node->key, key, ksl->keylen);
54
+ }
55
+
56
+ void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, size_t keylen,
57
+ const ngtcp2_mem *mem) {
58
+ size_t nodelen = ksl_nodelen(keylen);
59
+
60
+ ngtcp2_objalloc_init(&ksl->blkalloc,
61
+ ((ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu) * 8,
62
+ mem);
63
+
64
+ ksl->head = NULL;
65
+ ksl->front = ksl->back = NULL;
66
+ ksl->compar = compar;
67
+ ksl->keylen = keylen;
68
+ ksl->nodelen = nodelen;
69
+ ksl->n = 0;
70
+ }
71
+
72
+ static ngtcp2_ksl_blk *ksl_blk_objalloc_new(ngtcp2_ksl *ksl) {
73
+ return ngtcp2_objalloc_ksl_blk_len_get(&ksl->blkalloc,
74
+ ksl_blklen(ksl->nodelen));
75
+ }
76
+
77
+ static void ksl_blk_objalloc_del(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) {
78
+ ngtcp2_objalloc_ksl_blk_release(&ksl->blkalloc, blk);
79
+ }
80
+
81
+ static int ksl_head_init(ngtcp2_ksl *ksl) {
82
+ ngtcp2_ksl_blk *head = ksl_blk_objalloc_new(ksl);
83
+ if (!head) {
84
+ return NGTCP2_ERR_NOMEM;
85
+ }
86
+
87
+ head->next = head->prev = NULL;
88
+ head->n = 0;
89
+ head->leaf = 1;
90
+
91
+ ksl->head = head;
92
+ ksl->front = ksl->back = head;
93
+
94
+ return 0;
95
+ }
96
+
97
+ #ifdef NOMEMPOOL
98
+ /*
99
+ * ksl_free_blk frees |blk| recursively.
100
+ */
101
+ static void ksl_free_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) {
102
+ size_t i;
103
+
104
+ if (!blk->leaf) {
105
+ for (i = 0; i < blk->n; ++i) {
106
+ ksl_free_blk(ksl, ngtcp2_ksl_nth_node(ksl, blk, i)->blk);
107
+ }
108
+ }
109
+
110
+ ksl_blk_objalloc_del(ksl, blk);
111
+ }
112
+ #endif /* NOMEMPOOL */
113
+
114
+ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) {
115
+ if (!ksl || !ksl->head) {
116
+ return;
117
+ }
118
+
119
+ #ifdef NOMEMPOOL
120
+ ksl_free_blk(ksl, ksl->head);
121
+ #endif /* NOMEMPOOL */
122
+
123
+ ngtcp2_objalloc_free(&ksl->blkalloc);
124
+ }
125
+
126
+ /*
127
+ * ksl_split_blk splits |blk| into 2 ngtcp2_ksl_blk objects. The new
128
+ * ngtcp2_ksl_blk is always the "right" block.
129
+ *
130
+ * It returns the pointer to the ngtcp2_ksl_blk created which is the
131
+ * located at the right of |blk|, or NULL which indicates out of
132
+ * memory error.
133
+ */
134
+ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) {
135
+ ngtcp2_ksl_blk *rblk;
136
+
137
+ rblk = ksl_blk_objalloc_new(ksl);
138
+ if (rblk == NULL) {
139
+ return NULL;
140
+ }
141
+
142
+ rblk->next = blk->next;
143
+ blk->next = rblk;
144
+ if (rblk->next) {
145
+ rblk->next->prev = rblk;
146
+ } else if (ksl->back == blk) {
147
+ ksl->back = rblk;
148
+ }
149
+ rblk->prev = blk;
150
+ rblk->leaf = blk->leaf;
151
+
152
+ rblk->n = blk->n / 2;
153
+
154
+ memcpy(rblk->nodes, blk->nodes + ksl->nodelen * (blk->n - rblk->n),
155
+ ksl->nodelen * rblk->n);
156
+
157
+ blk->n -= rblk->n;
158
+
159
+ assert(blk->n >= NGTCP2_KSL_MIN_NBLK);
160
+ assert(rblk->n >= NGTCP2_KSL_MIN_NBLK);
161
+
162
+ return rblk;
163
+ }
164
+
165
+ /*
166
+ * ksl_split_node splits a node included in |blk| at the position |i|
167
+ * into 2 adjacent nodes. The new node is always inserted at the
168
+ * position |i+1|.
169
+ *
170
+ * It returns 0 if it succeeds, or one of the following negative error
171
+ * codes:
172
+ *
173
+ * NGTCP2_ERR_NOMEM
174
+ * Out of memory.
175
+ */
176
+ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) {
177
+ ngtcp2_ksl_node *node;
178
+ ngtcp2_ksl_blk *lblk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk, *rblk;
179
+
180
+ rblk = ksl_split_blk(ksl, lblk);
181
+ if (rblk == NULL) {
182
+ return NGTCP2_ERR_NOMEM;
183
+ }
184
+
185
+ memmove(blk->nodes + (i + 2) * ksl->nodelen,
186
+ blk->nodes + (i + 1) * ksl->nodelen,
187
+ ksl->nodelen * (blk->n - (i + 1)));
188
+
189
+ node = ngtcp2_ksl_nth_node(ksl, blk, i + 1);
190
+ node->blk = rblk;
191
+ ++blk->n;
192
+ ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, rblk, rblk->n - 1)->key);
193
+
194
+ node = ngtcp2_ksl_nth_node(ksl, blk, i);
195
+ ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key);
196
+
197
+ return 0;
198
+ }
199
+
200
+ /*
201
+ * ksl_split_head splits a head (root) block. It increases the height
202
+ * of skip list by 1.
203
+ *
204
+ * It returns 0 if it succeeds, or one of the following negative error
205
+ * codes:
206
+ *
207
+ * NGTCP2_ERR_NOMEM
208
+ * Out of memory.
209
+ */
210
+ static int ksl_split_head(ngtcp2_ksl *ksl) {
211
+ ngtcp2_ksl_blk *rblk = NULL, *lblk, *nhead = NULL;
212
+ ngtcp2_ksl_node *node;
213
+
214
+ rblk = ksl_split_blk(ksl, ksl->head);
215
+ if (rblk == NULL) {
216
+ return NGTCP2_ERR_NOMEM;
217
+ }
218
+
219
+ lblk = ksl->head;
220
+
221
+ nhead = ksl_blk_objalloc_new(ksl);
222
+ if (nhead == NULL) {
223
+ ksl_blk_objalloc_del(ksl, rblk);
224
+ return NGTCP2_ERR_NOMEM;
225
+ }
226
+ nhead->next = nhead->prev = NULL;
227
+ nhead->n = 2;
228
+ nhead->leaf = 0;
229
+
230
+ node = ngtcp2_ksl_nth_node(ksl, nhead, 0);
231
+ ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key);
232
+ node->blk = lblk;
233
+
234
+ node = ngtcp2_ksl_nth_node(ksl, nhead, 1);
235
+ ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, rblk, rblk->n - 1)->key);
236
+ node->blk = rblk;
237
+
238
+ ksl->head = nhead;
239
+
240
+ return 0;
241
+ }
242
+
243
+ /*
244
+ * insert_node inserts a node whose key is |key| with the associated
245
+ * |data| at the index of |i|. This function assumes that the number
246
+ * of nodes contained by |blk| is strictly less than
247
+ * NGTCP2_KSL_MAX_NBLK.
248
+ */
249
+ static void ksl_insert_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i,
250
+ const ngtcp2_ksl_key *key, void *data) {
251
+ ngtcp2_ksl_node *node;
252
+
253
+ assert(blk->n < NGTCP2_KSL_MAX_NBLK);
254
+
255
+ memmove(blk->nodes + (i + 1) * ksl->nodelen, blk->nodes + i * ksl->nodelen,
256
+ ksl->nodelen * (blk->n - i));
257
+
258
+ node = ngtcp2_ksl_nth_node(ksl, blk, i);
259
+ ksl_node_set_key(ksl, node, key);
260
+ node->data = data;
261
+
262
+ ++blk->n;
263
+ }
264
+
265
+ static size_t ksl_bsearch(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk,
266
+ const ngtcp2_ksl_key *key, ngtcp2_ksl_compar compar) {
267
+ size_t i;
268
+ ngtcp2_ksl_node *node;
269
+
270
+ for (i = 0, node = (ngtcp2_ksl_node *)(void *)blk->nodes;
271
+ i < blk->n && compar((ngtcp2_ksl_key *)node->key, key);
272
+ ++i, node = (ngtcp2_ksl_node *)(void *)((uint8_t *)node + ksl->nodelen))
273
+ ;
274
+
275
+ return i;
276
+ }
277
+
278
+ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it,
279
+ const ngtcp2_ksl_key *key, void *data) {
280
+ ngtcp2_ksl_blk *blk;
281
+ ngtcp2_ksl_node *node;
282
+ size_t i;
283
+ int rv;
284
+
285
+ if (!ksl->head) {
286
+ rv = ksl_head_init(ksl);
287
+ if (rv != 0) {
288
+ return rv;
289
+ }
290
+ }
291
+
292
+ blk = ksl->head;
293
+
294
+ if (blk->n == NGTCP2_KSL_MAX_NBLK) {
295
+ rv = ksl_split_head(ksl);
296
+ if (rv != 0) {
297
+ return rv;
298
+ }
299
+ blk = ksl->head;
300
+ }
301
+
302
+ for (;;) {
303
+ i = ksl_bsearch(ksl, blk, key, ksl->compar);
304
+
305
+ if (blk->leaf) {
306
+ if (i < blk->n &&
307
+ !ksl->compar(key, ngtcp2_ksl_nth_node(ksl, blk, i)->key)) {
308
+ if (it) {
309
+ *it = ngtcp2_ksl_end(ksl);
310
+ }
311
+ return NGTCP2_ERR_INVALID_ARGUMENT;
312
+ }
313
+ ksl_insert_node(ksl, blk, i, key, data);
314
+ ++ksl->n;
315
+ if (it) {
316
+ ngtcp2_ksl_it_init(it, ksl, blk, i);
317
+ }
318
+ return 0;
319
+ }
320
+
321
+ if (i == blk->n) {
322
+ /* This insertion extends the largest key in this subtree. */
323
+ for (; !blk->leaf;) {
324
+ node = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1);
325
+ if (node->blk->n == NGTCP2_KSL_MAX_NBLK) {
326
+ rv = ksl_split_node(ksl, blk, blk->n - 1);
327
+ if (rv != 0) {
328
+ return rv;
329
+ }
330
+ node = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1);
331
+ }
332
+ ksl_node_set_key(ksl, node, key);
333
+ blk = node->blk;
334
+ }
335
+ ksl_insert_node(ksl, blk, blk->n, key, data);
336
+ ++ksl->n;
337
+ if (it) {
338
+ ngtcp2_ksl_it_init(it, ksl, blk, blk->n - 1);
339
+ }
340
+ return 0;
341
+ }
342
+
343
+ node = ngtcp2_ksl_nth_node(ksl, blk, i);
344
+
345
+ if (node->blk->n == NGTCP2_KSL_MAX_NBLK) {
346
+ rv = ksl_split_node(ksl, blk, i);
347
+ if (rv != 0) {
348
+ return rv;
349
+ }
350
+ if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) {
351
+ node = ngtcp2_ksl_nth_node(ksl, blk, i + 1);
352
+ if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) {
353
+ ksl_node_set_key(ksl, node, key);
354
+ }
355
+ }
356
+ }
357
+
358
+ blk = node->blk;
359
+ }
360
+ }
361
+
362
+ /*
363
+ * ksl_remove_node removes the node included in |blk| at the index of
364
+ * |i|.
365
+ */
366
+ static void ksl_remove_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) {
367
+ memmove(blk->nodes + i * ksl->nodelen, blk->nodes + (i + 1) * ksl->nodelen,
368
+ ksl->nodelen * (blk->n - (i + 1)));
369
+
370
+ --blk->n;
371
+ }
372
+
373
+ /*
374
+ * ksl_merge_node merges 2 nodes which are the nodes at the index of
375
+ * |i| and |i + 1|.
376
+ *
377
+ * If |blk| is the direct descendant of head (root) block and the head
378
+ * block contains just 2 nodes, the merged block becomes head block,
379
+ * which decreases the height of |ksl| by 1.
380
+ *
381
+ * This function returns the pointer to the merged block.
382
+ */
383
+ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk,
384
+ size_t i) {
385
+ ngtcp2_ksl_blk *lblk, *rblk;
386
+
387
+ assert(i + 1 < blk->n);
388
+
389
+ lblk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk;
390
+ rblk = ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk;
391
+
392
+ assert(lblk->n + rblk->n < NGTCP2_KSL_MAX_NBLK);
393
+
394
+ memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes,
395
+ ksl->nodelen * rblk->n);
396
+
397
+ lblk->n += rblk->n;
398
+ lblk->next = rblk->next;
399
+ if (lblk->next) {
400
+ lblk->next->prev = lblk;
401
+ } else if (ksl->back == rblk) {
402
+ ksl->back = lblk;
403
+ }
404
+
405
+ ksl_blk_objalloc_del(ksl, rblk);
406
+
407
+ if (ksl->head == blk && blk->n == 2) {
408
+ ksl_blk_objalloc_del(ksl, ksl->head);
409
+ ksl->head = lblk;
410
+ } else {
411
+ ksl_remove_node(ksl, blk, i + 1);
412
+ ksl_node_set_key(ksl, ngtcp2_ksl_nth_node(ksl, blk, i),
413
+ ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key);
414
+ }
415
+
416
+ return lblk;
417
+ }
418
+
419
+ /*
420
+ * ksl_shift_left moves the first nodes in blk->nodes[i]->blk->nodes
421
+ * to blk->nodes[i - 1]->blk->nodes in a manner that they have the
422
+ * same amount of nodes as much as possible.
423
+ */
424
+ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) {
425
+ ngtcp2_ksl_node *lnode, *rnode;
426
+ size_t n;
427
+
428
+ assert(i > 0);
429
+
430
+ lnode = ngtcp2_ksl_nth_node(ksl, blk, i - 1);
431
+ rnode = ngtcp2_ksl_nth_node(ksl, blk, i);
432
+
433
+ assert(lnode->blk->n < NGTCP2_KSL_MAX_NBLK);
434
+ assert(rnode->blk->n > NGTCP2_KSL_MIN_NBLK);
435
+
436
+ n = (lnode->blk->n + rnode->blk->n + 1) / 2 - lnode->blk->n;
437
+
438
+ assert(n > 0);
439
+ assert(lnode->blk->n <= NGTCP2_KSL_MAX_NBLK - n);
440
+ assert(rnode->blk->n >= NGTCP2_KSL_MIN_NBLK + n);
441
+
442
+ memcpy(lnode->blk->nodes + ksl->nodelen * lnode->blk->n, rnode->blk->nodes,
443
+ ksl->nodelen * n);
444
+
445
+ lnode->blk->n += (uint32_t)n;
446
+ rnode->blk->n -= (uint32_t)n;
447
+
448
+ ksl_node_set_key(
449
+ ksl, lnode, ngtcp2_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key);
450
+
451
+ memmove(rnode->blk->nodes, rnode->blk->nodes + ksl->nodelen * n,
452
+ ksl->nodelen * rnode->blk->n);
453
+ }
454
+
455
+ /*
456
+ * ksl_shift_right moves the last nodes in blk->nodes[i]->blk->nodes
457
+ * to blk->nodes[i + 1]->blk->nodes in a manner that they have the
458
+ * same amount of nodes as much as possible..
459
+ */
460
+ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) {
461
+ ngtcp2_ksl_node *lnode, *rnode;
462
+ size_t n;
463
+
464
+ assert(i < blk->n - 1);
465
+
466
+ lnode = ngtcp2_ksl_nth_node(ksl, blk, i);
467
+ rnode = ngtcp2_ksl_nth_node(ksl, blk, i + 1);
468
+
469
+ assert(lnode->blk->n > NGTCP2_KSL_MIN_NBLK);
470
+ assert(rnode->blk->n < NGTCP2_KSL_MAX_NBLK);
471
+
472
+ n = (lnode->blk->n + rnode->blk->n + 1) / 2 - rnode->blk->n;
473
+
474
+ assert(n > 0);
475
+ assert(lnode->blk->n >= NGTCP2_KSL_MIN_NBLK + n);
476
+ assert(rnode->blk->n <= NGTCP2_KSL_MAX_NBLK - n);
477
+
478
+ memmove(rnode->blk->nodes + ksl->nodelen * n, rnode->blk->nodes,
479
+ ksl->nodelen * rnode->blk->n);
480
+
481
+ rnode->blk->n += (uint32_t)n;
482
+ lnode->blk->n -= (uint32_t)n;
483
+
484
+ memcpy(rnode->blk->nodes, lnode->blk->nodes + ksl->nodelen * lnode->blk->n,
485
+ ksl->nodelen * n);
486
+
487
+ ksl_node_set_key(
488
+ ksl, lnode, ngtcp2_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key);
489
+ }
490
+
491
+ /*
492
+ * key_equal returns nonzero if |lhs| and |rhs| are equal using the
493
+ * function |compar|.
494
+ */
495
+ static int key_equal(ngtcp2_ksl_compar compar, const ngtcp2_ksl_key *lhs,
496
+ const ngtcp2_ksl_key *rhs) {
497
+ return !compar(lhs, rhs) && !compar(rhs, lhs);
498
+ }
499
+
500
+ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it,
501
+ const ngtcp2_ksl_it *hint,
502
+ const ngtcp2_ksl_key *key) {
503
+ ngtcp2_ksl_blk *blk = hint->blk;
504
+
505
+ assert(ksl->head);
506
+
507
+ if (blk->n <= NGTCP2_KSL_MIN_NBLK) {
508
+ return ngtcp2_ksl_remove(ksl, it, key);
509
+ }
510
+
511
+ ksl_remove_node(ksl, blk, hint->i);
512
+
513
+ --ksl->n;
514
+
515
+ if (it) {
516
+ if (hint->i == blk->n && blk->next) {
517
+ ngtcp2_ksl_it_init(it, ksl, blk->next, 0);
518
+ } else {
519
+ ngtcp2_ksl_it_init(it, ksl, blk, hint->i);
520
+ }
521
+ }
522
+
523
+ return 0;
524
+ }
525
+
526
+ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it,
527
+ const ngtcp2_ksl_key *key) {
528
+ ngtcp2_ksl_blk *blk = ksl->head;
529
+ ngtcp2_ksl_node *node;
530
+ size_t i;
531
+
532
+ if (!ksl->head) {
533
+ return NGTCP2_ERR_INVALID_ARGUMENT;
534
+ }
535
+
536
+ if (!blk->leaf && blk->n == 2 &&
537
+ ngtcp2_ksl_nth_node(ksl, blk, 0)->blk->n == NGTCP2_KSL_MIN_NBLK &&
538
+ ngtcp2_ksl_nth_node(ksl, blk, 1)->blk->n == NGTCP2_KSL_MIN_NBLK) {
539
+ blk = ksl_merge_node(ksl, ksl->head, 0);
540
+ }
541
+
542
+ for (;;) {
543
+ i = ksl_bsearch(ksl, blk, key, ksl->compar);
544
+
545
+ if (i == blk->n) {
546
+ if (it) {
547
+ *it = ngtcp2_ksl_end(ksl);
548
+ }
549
+ return NGTCP2_ERR_INVALID_ARGUMENT;
550
+ }
551
+
552
+ if (blk->leaf) {
553
+ if (ksl->compar(key, ngtcp2_ksl_nth_node(ksl, blk, i)->key)) {
554
+ if (it) {
555
+ *it = ngtcp2_ksl_end(ksl);
556
+ }
557
+ return NGTCP2_ERR_INVALID_ARGUMENT;
558
+ }
559
+ ksl_remove_node(ksl, blk, i);
560
+ --ksl->n;
561
+ if (it) {
562
+ if (blk->n == i && blk->next) {
563
+ ngtcp2_ksl_it_init(it, ksl, blk->next, 0);
564
+ } else {
565
+ ngtcp2_ksl_it_init(it, ksl, blk, i);
566
+ }
567
+ }
568
+ return 0;
569
+ }
570
+
571
+ node = ngtcp2_ksl_nth_node(ksl, blk, i);
572
+
573
+ if (node->blk->n > NGTCP2_KSL_MIN_NBLK) {
574
+ blk = node->blk;
575
+ continue;
576
+ }
577
+
578
+ assert(node->blk->n == NGTCP2_KSL_MIN_NBLK);
579
+
580
+ if (i + 1 < blk->n &&
581
+ ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk->n > NGTCP2_KSL_MIN_NBLK) {
582
+ ksl_shift_left(ksl, blk, i + 1);
583
+ blk = node->blk;
584
+ continue;
585
+ }
586
+
587
+ if (i > 0 &&
588
+ ngtcp2_ksl_nth_node(ksl, blk, i - 1)->blk->n > NGTCP2_KSL_MIN_NBLK) {
589
+ ksl_shift_right(ksl, blk, i - 1);
590
+ blk = node->blk;
591
+ continue;
592
+ }
593
+
594
+ if (i + 1 < blk->n) {
595
+ blk = ksl_merge_node(ksl, blk, i);
596
+ continue;
597
+ }
598
+
599
+ assert(i > 0);
600
+
601
+ blk = ksl_merge_node(ksl, blk, i - 1);
602
+ }
603
+ }
604
+
605
+ ngtcp2_ksl_it ngtcp2_ksl_lower_bound(ngtcp2_ksl *ksl,
606
+ const ngtcp2_ksl_key *key) {
607
+ ngtcp2_ksl_blk *blk = ksl->head;
608
+ ngtcp2_ksl_it it;
609
+ size_t i;
610
+
611
+ if (!blk) {
612
+ ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0);
613
+ return it;
614
+ }
615
+
616
+ for (;;) {
617
+ i = ksl_bsearch(ksl, blk, key, ksl->compar);
618
+
619
+ if (blk->leaf) {
620
+ if (i == blk->n && blk->next) {
621
+ blk = blk->next;
622
+ i = 0;
623
+ }
624
+ ngtcp2_ksl_it_init(&it, ksl, blk, i);
625
+ return it;
626
+ }
627
+
628
+ if (i == blk->n) {
629
+ /* This happens if descendant has smaller key. Fast forward to
630
+ find last node in this subtree. */
631
+ for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk)
632
+ ;
633
+ if (blk->next) {
634
+ blk = blk->next;
635
+ i = 0;
636
+ } else {
637
+ i = blk->n;
638
+ }
639
+ ngtcp2_ksl_it_init(&it, ksl, blk, i);
640
+ return it;
641
+ }
642
+ blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk;
643
+ }
644
+ }
645
+
646
+ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl,
647
+ const ngtcp2_ksl_key *key,
648
+ ngtcp2_ksl_compar compar) {
649
+ ngtcp2_ksl_blk *blk = ksl->head;
650
+ ngtcp2_ksl_it it;
651
+ size_t i;
652
+
653
+ if (!blk) {
654
+ ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0);
655
+ return it;
656
+ }
657
+
658
+ for (;;) {
659
+ i = ksl_bsearch(ksl, blk, key, compar);
660
+
661
+ if (blk->leaf) {
662
+ if (i == blk->n && blk->next) {
663
+ blk = blk->next;
664
+ i = 0;
665
+ }
666
+ ngtcp2_ksl_it_init(&it, ksl, blk, i);
667
+ return it;
668
+ }
669
+
670
+ if (i == blk->n) {
671
+ /* This happens if descendant has smaller key. Fast forward to
672
+ find last node in this subtree. */
673
+ for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk)
674
+ ;
675
+ if (blk->next) {
676
+ blk = blk->next;
677
+ i = 0;
678
+ } else {
679
+ i = blk->n;
680
+ }
681
+ ngtcp2_ksl_it_init(&it, ksl, blk, i);
682
+ return it;
683
+ }
684
+ blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk;
685
+ }
686
+ }
687
+
688
+ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key,
689
+ const ngtcp2_ksl_key *new_key) {
690
+ ngtcp2_ksl_blk *blk = ksl->head;
691
+ ngtcp2_ksl_node *node;
692
+ size_t i;
693
+
694
+ assert(ksl->head);
695
+
696
+ for (;;) {
697
+ i = ksl_bsearch(ksl, blk, old_key, ksl->compar);
698
+
699
+ assert(i < blk->n);
700
+ node = ngtcp2_ksl_nth_node(ksl, blk, i);
701
+
702
+ if (blk->leaf) {
703
+ assert(key_equal(ksl->compar, (ngtcp2_ksl_key *)node->key, old_key));
704
+ ksl_node_set_key(ksl, node, new_key);
705
+ return;
706
+ }
707
+
708
+ if (key_equal(ksl->compar, (ngtcp2_ksl_key *)node->key, old_key) ||
709
+ ksl->compar((ngtcp2_ksl_key *)node->key, new_key)) {
710
+ ksl_node_set_key(ksl, node, new_key);
711
+ }
712
+
713
+ blk = node->blk;
714
+ }
715
+ }
716
+
717
+ static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) {
718
+ size_t i;
719
+ ngtcp2_ksl_node *node;
720
+
721
+ fprintf(stderr, "LV=%zu n=%u\n", level, blk->n);
722
+
723
+ if (blk->leaf) {
724
+ for (i = 0; i < blk->n; ++i) {
725
+ node = ngtcp2_ksl_nth_node(ksl, blk, i);
726
+ fprintf(stderr, " %" PRId64, *(int64_t *)(void *)node->key);
727
+ }
728
+ fprintf(stderr, "\n");
729
+ return;
730
+ }
731
+
732
+ for (i = 0; i < blk->n; ++i) {
733
+ ksl_print(ksl, ngtcp2_ksl_nth_node(ksl, blk, i)->blk, level + 1);
734
+ }
735
+ }
736
+
737
+ size_t ngtcp2_ksl_len(ngtcp2_ksl *ksl) { return ksl->n; }
738
+
739
+ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) {
740
+ if (!ksl->head) {
741
+ return;
742
+ }
743
+
744
+ #ifdef NOMEMPOOL
745
+ ksl_free_blk(ksl, ksl->head);
746
+ #endif /* NOMEMPOOL */
747
+
748
+ ksl->front = ksl->back = ksl->head = NULL;
749
+ ksl->n = 0;
750
+
751
+ ngtcp2_objalloc_clear(&ksl->blkalloc);
752
+ }
753
+
754
+ void ngtcp2_ksl_print(ngtcp2_ksl *ksl) {
755
+ if (!ksl->head) {
756
+ return;
757
+ }
758
+
759
+ ksl_print(ksl, ksl->head, 0);
760
+ }
761
+
762
+ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) {
763
+ ngtcp2_ksl_it it;
764
+
765
+ if (ksl->head) {
766
+ ngtcp2_ksl_it_init(&it, ksl, ksl->front, 0);
767
+ } else {
768
+ ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0);
769
+ }
770
+
771
+ return it;
772
+ }
773
+
774
+ ngtcp2_ksl_it ngtcp2_ksl_end(const ngtcp2_ksl *ksl) {
775
+ ngtcp2_ksl_it it;
776
+
777
+ if (ksl->head) {
778
+ ngtcp2_ksl_it_init(&it, ksl, ksl->back, ksl->back->n);
779
+ } else {
780
+ ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0);
781
+ }
782
+
783
+ return it;
784
+ }
785
+
786
+ void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl,
787
+ ngtcp2_ksl_blk *blk, size_t i) {
788
+ it->ksl = ksl;
789
+ it->blk = blk;
790
+ it->i = i;
791
+ }
792
+
793
+ void ngtcp2_ksl_it_prev(ngtcp2_ksl_it *it) {
794
+ assert(!ngtcp2_ksl_it_begin(it));
795
+
796
+ if (it->i == 0) {
797
+ it->blk = it->blk->prev;
798
+ it->i = it->blk->n - 1;
799
+ } else {
800
+ --it->i;
801
+ }
802
+ }
803
+
804
+ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it) {
805
+ return it->i == 0 && it->blk->prev == NULL;
806
+ }
807
+
808
+ int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs,
809
+ const ngtcp2_ksl_key *rhs) {
810
+ const ngtcp2_range *a = lhs, *b = rhs;
811
+ return a->begin < b->begin;
812
+ }
813
+
814
+ int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs,
815
+ const ngtcp2_ksl_key *rhs) {
816
+ const ngtcp2_range *a = lhs, *b = rhs;
817
+ return a->begin < b->begin &&
818
+ !(ngtcp2_max(a->begin, b->begin) < ngtcp2_min(a->end, b->end));
819
+ }