@fails-components/webtransport 0.0.1 → 0.0.2

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 (300) hide show
  1. package/package.json +1 -1
  2. package/readme.md +1 -3
  3. package/src/http3eventloop.cc +83 -9
  4. package/src/http3eventloop.h +13 -3
  5. package/src/http3server.cc +22 -22
  6. package/src/http3server.h +7 -20
  7. package/src/http3wtstreamvisitor.cc +31 -10
  8. package/src/http3wtstreamvisitor.h +38 -11
  9. package/src/webtransport.js +91 -23
  10. package/test/echoserver.js +29 -5
  11. package/test/testsuite.js +242 -220
  12. package/third_party/boringssl/src/CMakeLists.txt +2 -0
  13. package/third_party/boringssl/src/crypto/CMakeLists.txt +1 -0
  14. package/third_party/boringssl/src/crypto/asn1/a_bitstr.c +174 -177
  15. package/third_party/boringssl/src/crypto/asn1/a_bool.c +46 -48
  16. package/third_party/boringssl/src/crypto/asn1/a_d2i_fp.c +21 -23
  17. package/third_party/boringssl/src/crypto/asn1/a_dup.c +21 -23
  18. package/third_party/boringssl/src/crypto/asn1/a_gentm.c +84 -187
  19. package/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c +19 -21
  20. package/third_party/boringssl/src/crypto/asn1/a_int.c +305 -329
  21. package/third_party/boringssl/src/crypto/asn1/a_mbstr.c +190 -195
  22. package/third_party/boringssl/src/crypto/asn1/a_object.c +182 -189
  23. package/third_party/boringssl/src/crypto/asn1/a_octet.c +6 -9
  24. package/third_party/boringssl/src/crypto/asn1/a_print.c +15 -16
  25. package/third_party/boringssl/src/crypto/asn1/a_strex.c +386 -399
  26. package/third_party/boringssl/src/crypto/asn1/a_strnid.c +110 -131
  27. package/third_party/boringssl/src/crypto/asn1/a_time.c +118 -111
  28. package/third_party/boringssl/src/crypto/asn1/a_type.c +59 -60
  29. package/third_party/boringssl/src/crypto/asn1/a_utctm.c +114 -186
  30. package/third_party/boringssl/src/crypto/asn1/a_utf8.c +171 -159
  31. package/third_party/boringssl/src/crypto/asn1/asn1_lib.c +245 -260
  32. package/third_party/boringssl/src/crypto/asn1/asn1_par.c +41 -40
  33. package/third_party/boringssl/src/crypto/asn1/asn1_test.cc +31 -0
  34. package/third_party/boringssl/src/crypto/asn1/asn_pack.c +31 -33
  35. package/third_party/boringssl/src/crypto/asn1/f_int.c +36 -33
  36. package/third_party/boringssl/src/crypto/asn1/f_string.c +29 -26
  37. package/third_party/boringssl/src/crypto/asn1/internal.h +62 -61
  38. package/third_party/boringssl/src/crypto/asn1/tasn_dec.c +706 -702
  39. package/third_party/boringssl/src/crypto/asn1/tasn_enc.c +507 -524
  40. package/third_party/boringssl/src/crypto/asn1/tasn_fre.c +141 -133
  41. package/third_party/boringssl/src/crypto/asn1/tasn_new.c +207 -199
  42. package/third_party/boringssl/src/crypto/asn1/tasn_typ.c +19 -22
  43. package/third_party/boringssl/src/crypto/asn1/tasn_utl.c +24 -24
  44. package/third_party/boringssl/src/crypto/asn1/time_support.c +13 -13
  45. package/third_party/boringssl/src/crypto/bio/connect.c +9 -3
  46. package/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc +125 -1
  47. package/third_party/boringssl/src/crypto/bytestring/cbb.c +4 -7
  48. package/third_party/boringssl/src/crypto/bytestring/cbs.c +167 -9
  49. package/third_party/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c +0 -2
  50. package/third_party/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c +23 -54
  51. package/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c +0 -2
  52. package/third_party/boringssl/src/crypto/cipher_extra/e_tls.c +0 -2
  53. package/third_party/boringssl/src/crypto/curve25519/curve25519.c +6 -8
  54. package/third_party/boringssl/src/crypto/evp/evp_ctx.c +25 -22
  55. package/third_party/boringssl/src/crypto/evp/internal.h +15 -9
  56. package/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c +2 -0
  57. package/third_party/boringssl/src/crypto/evp/p_ec_asn1.c +2 -0
  58. package/third_party/boringssl/src/crypto/evp/p_ed25519.c +3 -3
  59. package/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c +10 -7
  60. package/third_party/boringssl/src/crypto/evp/p_hkdf.c +241 -0
  61. package/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c +2 -0
  62. package/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c +1 -0
  63. package/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.c +9 -10
  64. package/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.c +2 -6
  65. package/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c +5 -11
  66. package/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h +1 -1
  67. package/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c +2 -0
  68. package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c +10 -26
  69. package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.c +2 -3
  70. package/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.c +1 -0
  71. package/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c +44 -43
  72. package/third_party/boringssl/src/crypto/fipsmodule/modes/cbc.c +5 -9
  73. package/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c +14 -21
  74. package/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.c +8 -8
  75. package/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h +1 -4
  76. package/third_party/boringssl/src/crypto/hkdf/hkdf_test.cc +104 -0
  77. package/third_party/boringssl/src/crypto/internal.h +18 -4
  78. package/third_party/boringssl/src/crypto/lhash/internal.h +13 -1
  79. package/third_party/boringssl/src/crypto/obj/obj_dat.h +4 -1
  80. package/third_party/boringssl/src/crypto/obj/obj_mac.num +1 -0
  81. package/third_party/boringssl/src/crypto/obj/objects.txt +2 -0
  82. package/third_party/boringssl/src/crypto/pem/pem_all.c +77 -86
  83. package/third_party/boringssl/src/crypto/pem/pem_info.c +221 -233
  84. package/third_party/boringssl/src/crypto/pem/pem_lib.c +639 -608
  85. package/third_party/boringssl/src/crypto/pem/pem_oth.c +17 -16
  86. package/third_party/boringssl/src/crypto/pem/pem_pk8.c +133 -142
  87. package/third_party/boringssl/src/crypto/pem/pem_pkey.c +96 -92
  88. package/third_party/boringssl/src/crypto/poly1305/poly1305_vec.c +12 -28
  89. package/third_party/boringssl/src/crypto/siphash/siphash.c +8 -11
  90. package/third_party/boringssl/src/crypto/siphash/siphash_test.cc +5 -7
  91. package/third_party/boringssl/src/crypto/stack/stack.c +33 -16
  92. package/third_party/boringssl/src/crypto/thread_pthread.c +0 -2
  93. package/third_party/boringssl/src/crypto/thread_win.c +0 -2
  94. package/third_party/boringssl/src/crypto/trust_token/internal.h +14 -0
  95. package/third_party/boringssl/src/crypto/trust_token/pmbtoken.c +127 -30
  96. package/third_party/boringssl/src/crypto/trust_token/trust_token.c +40 -0
  97. package/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc +165 -0
  98. package/third_party/boringssl/src/crypto/trust_token/voprf.c +55 -6
  99. package/third_party/boringssl/src/crypto/x509/a_digest.c +23 -24
  100. package/third_party/boringssl/src/crypto/x509/a_sign.c +52 -55
  101. package/third_party/boringssl/src/crypto/x509/a_verify.c +33 -34
  102. package/third_party/boringssl/src/crypto/x509/algorithm.c +17 -18
  103. package/third_party/boringssl/src/crypto/x509/asn1_gen.c +618 -612
  104. package/third_party/boringssl/src/crypto/x509/by_dir.c +320 -337
  105. package/third_party/boringssl/src/crypto/x509/by_file.c +186 -186
  106. package/third_party/boringssl/src/crypto/x509/i2d_pr.c +11 -14
  107. package/third_party/boringssl/src/crypto/x509/internal.h +22 -22
  108. package/third_party/boringssl/src/crypto/x509/name_print.c +155 -150
  109. package/third_party/boringssl/src/crypto/x509/rsa_pss.c +27 -29
  110. package/third_party/boringssl/src/crypto/x509/t_crl.c +67 -70
  111. package/third_party/boringssl/src/crypto/x509/t_req.c +3 -5
  112. package/third_party/boringssl/src/crypto/x509/t_x509.c +280 -251
  113. package/third_party/boringssl/src/crypto/x509/t_x509a.c +52 -47
  114. package/third_party/boringssl/src/crypto/x509/x509.c +3 -4
  115. package/third_party/boringssl/src/crypto/x509/x509_att.c +234 -223
  116. package/third_party/boringssl/src/crypto/x509/x509_cmp.c +286 -296
  117. package/third_party/boringssl/src/crypto/x509/x509_d2.c +37 -32
  118. package/third_party/boringssl/src/crypto/x509/x509_def.c +14 -30
  119. package/third_party/boringssl/src/crypto/x509/x509_ext.c +55 -84
  120. package/third_party/boringssl/src/crypto/x509/x509_lu.c +545 -581
  121. package/third_party/boringssl/src/crypto/x509/x509_obj.c +131 -121
  122. package/third_party/boringssl/src/crypto/x509/x509_req.c +120 -139
  123. package/third_party/boringssl/src/crypto/x509/x509_set.c +128 -142
  124. package/third_party/boringssl/src/crypto/x509/x509_trs.c +185 -193
  125. package/third_party/boringssl/src/crypto/x509/x509_txt.c +70 -72
  126. package/third_party/boringssl/src/crypto/x509/x509_v3.c +172 -161
  127. package/third_party/boringssl/src/crypto/x509/x509_vfy.c +2041 -2053
  128. package/third_party/boringssl/src/crypto/x509/x509_vpm.c +441 -461
  129. package/third_party/boringssl/src/crypto/x509/x509cset.c +152 -170
  130. package/third_party/boringssl/src/crypto/x509/x509name.c +274 -260
  131. package/third_party/boringssl/src/crypto/x509/x509rset.c +43 -20
  132. package/third_party/boringssl/src/crypto/x509/x509spki.c +62 -63
  133. package/third_party/boringssl/src/crypto/x509/x_algor.c +64 -62
  134. package/third_party/boringssl/src/crypto/x509/x_all.c +103 -133
  135. package/third_party/boringssl/src/crypto/x509/x_attrib.c +23 -24
  136. package/third_party/boringssl/src/crypto/x509/x_crl.c +310 -321
  137. package/third_party/boringssl/src/crypto/x509/x_exten.c +6 -5
  138. package/third_party/boringssl/src/crypto/x509/x_info.c +31 -28
  139. package/third_party/boringssl/src/crypto/x509/x_name.c +361 -365
  140. package/third_party/boringssl/src/crypto/x509/x_pkey.c +38 -32
  141. package/third_party/boringssl/src/crypto/x509/x_pubkey.c +114 -117
  142. package/third_party/boringssl/src/crypto/x509/x_req.c +27 -29
  143. package/third_party/boringssl/src/crypto/x509/x_sig.c +2 -2
  144. package/third_party/boringssl/src/crypto/x509/x_spki.c +8 -10
  145. package/third_party/boringssl/src/crypto/x509/x_val.c +2 -2
  146. package/third_party/boringssl/src/crypto/x509/x_x509.c +212 -226
  147. package/third_party/boringssl/src/crypto/x509/x_x509a.c +112 -109
  148. package/third_party/boringssl/src/crypto/x509v3/ext_dat.h +10 -13
  149. package/third_party/boringssl/src/crypto/x509v3/internal.h +72 -87
  150. package/third_party/boringssl/src/crypto/x509v3/pcy_cache.c +184 -176
  151. package/third_party/boringssl/src/crypto/x509v3/pcy_data.c +58 -56
  152. package/third_party/boringssl/src/crypto/x509v3/pcy_lib.c +71 -70
  153. package/third_party/boringssl/src/crypto/x509v3/pcy_map.c +56 -58
  154. package/third_party/boringssl/src/crypto/x509v3/pcy_node.c +89 -91
  155. package/third_party/boringssl/src/crypto/x509v3/pcy_tree.c +585 -590
  156. package/third_party/boringssl/src/crypto/x509v3/v3_akey.c +118 -112
  157. package/third_party/boringssl/src/crypto/x509v3/v3_akeya.c +3 -3
  158. package/third_party/boringssl/src/crypto/x509v3/v3_alt.c +447 -451
  159. package/third_party/boringssl/src/crypto/x509v3/v3_bcons.c +44 -38
  160. package/third_party/boringssl/src/crypto/x509v3/v3_bitst.c +39 -43
  161. package/third_party/boringssl/src/crypto/x509v3/v3_conf.c +321 -320
  162. package/third_party/boringssl/src/crypto/x509v3/v3_cpols.c +352 -327
  163. package/third_party/boringssl/src/crypto/x509v3/v3_crld.c +437 -383
  164. package/third_party/boringssl/src/crypto/x509v3/v3_enum.c +23 -16
  165. package/third_party/boringssl/src/crypto/x509v3/v3_extku.c +62 -53
  166. package/third_party/boringssl/src/crypto/x509v3/v3_genn.c +118 -115
  167. package/third_party/boringssl/src/crypto/x509v3/v3_ia5.c +30 -31
  168. package/third_party/boringssl/src/crypto/x509v3/v3_info.c +112 -98
  169. package/third_party/boringssl/src/crypto/x509v3/v3_int.c +40 -15
  170. package/third_party/boringssl/src/crypto/x509v3/v3_lib.c +248 -252
  171. package/third_party/boringssl/src/crypto/x509v3/v3_ncons.c +390 -386
  172. package/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c +45 -32
  173. package/third_party/boringssl/src/crypto/x509v3/v3_pci.c +206 -209
  174. package/third_party/boringssl/src/crypto/x509v3/v3_pcia.c +6 -8
  175. package/third_party/boringssl/src/crypto/x509v3/v3_pcons.c +54 -50
  176. package/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c +66 -65
  177. package/third_party/boringssl/src/crypto/x509v3/v3_prn.c +144 -133
  178. package/third_party/boringssl/src/crypto/x509v3/v3_purp.c +695 -709
  179. package/third_party/boringssl/src/crypto/x509v3/v3_skey.c +75 -69
  180. package/third_party/boringssl/src/crypto/x509v3/v3_utl.c +1102 -1082
  181. package/third_party/boringssl/src/include/openssl/base.h +3 -1
  182. package/third_party/boringssl/src/include/openssl/bn.h +3 -0
  183. package/third_party/boringssl/src/include/openssl/bytestring.h +20 -0
  184. package/third_party/boringssl/src/include/openssl/evp.h +6 -5
  185. package/third_party/boringssl/src/include/openssl/kdf.h +91 -0
  186. package/third_party/boringssl/src/include/openssl/nid.h +4 -0
  187. package/third_party/boringssl/src/include/openssl/ssl.h +6 -1
  188. package/third_party/boringssl/src/include/openssl/stack.h +47 -32
  189. package/third_party/boringssl/src/include/openssl/trust_token.h +18 -3
  190. package/third_party/boringssl/src/include/openssl/x509.h +18 -0
  191. package/third_party/boringssl/src/ssl/ssl_file.cc +61 -99
  192. package/third_party/boringssl/src/ssl/ssl_test.cc +101 -0
  193. package/third_party/boringssl/src/util/doc.config +2 -1
  194. package/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go +8 -0
  195. package/third_party/googleurl/AUTHORS +16 -2
  196. package/third_party/googleurl/base/BUILD +1 -0
  197. package/third_party/googleurl/base/compiler_specific.h +16 -17
  198. package/third_party/googleurl/base/containers/contiguous_iterator.h +13 -9
  199. package/third_party/googleurl/base/containers/span.h +23 -8
  200. package/third_party/googleurl/base/memory/raw_ptr.h +17 -25
  201. package/third_party/googleurl/base/memory/raw_ptr_exclusion.h +21 -0
  202. package/third_party/googleurl/base/strings/escape.cc +14 -2
  203. package/third_party/googleurl/base/strings/safe_sprintf.h +1 -1
  204. package/third_party/googleurl/base/strings/string_number_conversions.cc +5 -3
  205. package/third_party/googleurl/base/strings/string_number_conversions_internal.h +5 -5
  206. package/third_party/googleurl/base/strings/string_piece.h +3 -3
  207. package/third_party/googleurl/base/strings/string_util.cc +4 -27
  208. package/third_party/googleurl/base/strings/string_util.h +43 -8
  209. package/third_party/googleurl/base/strings/string_util_internal.h +11 -12
  210. package/third_party/googleurl/base/strings/string_util_unittest.cc +33 -0
  211. package/third_party/googleurl/base/strings/string_util_win.cc +0 -5
  212. package/third_party/googleurl/base/strings/string_util_win.h +9 -1
  213. package/third_party/googleurl/base/strings/utf_offset_string_conversions.cc +1 -1
  214. package/third_party/googleurl/base/strings/utf_string_conversion_utils.cc +5 -8
  215. package/third_party/googleurl/base/strings/utf_string_conversion_utils.h +13 -10
  216. package/third_party/googleurl/base/strings/utf_string_conversions.cc +32 -25
  217. package/third_party/googleurl/base/template_util.h +23 -35
  218. package/third_party/googleurl/build/build_config.h +14 -3
  219. package/third_party/googleurl/copy.bara.sky +1 -1
  220. package/third_party/googleurl/url/gurl.cc +8 -4
  221. package/third_party/googleurl/url/gurl.h +1 -0
  222. package/third_party/googleurl/url/gurl_unittest.cc +1 -0
  223. package/third_party/googleurl/url/origin.h +36 -26
  224. package/third_party/googleurl/url/scheme_host_port.h +4 -1
  225. package/third_party/googleurl/url/url_canon.h +2 -1
  226. package/third_party/googleurl/url/url_canon_internal.cc +9 -7
  227. package/third_party/googleurl/url/url_canon_internal.h +16 -16
  228. package/third_party/googleurl/url/url_canon_stdstring.h +2 -1
  229. package/third_party/googleurl/url/url_util.cc +9 -8
  230. package/third_party/quiche/build/source_list.bzl +7 -0
  231. package/third_party/quiche/build/source_list.gni +7 -0
  232. package/third_party/quiche/build/source_list.json +7 -0
  233. package/third_party/quiche/quiche/common/platform/api/quiche_mem_slice.h +7 -3
  234. package/third_party/quiche/quiche/http2/adapter/nghttp2_adapter_test.cc +86 -2
  235. package/third_party/quiche/quiche/http2/adapter/oghttp2_adapter_test.cc +104 -2
  236. package/third_party/quiche/quiche/http2/adapter/oghttp2_session.cc +23 -0
  237. package/third_party/quiche/quiche/http2/adapter/oghttp2_session.h +6 -1
  238. package/third_party/quiche/quiche/quic/core/congestion_control/send_algorithm_test.cc +0 -16
  239. package/third_party/quiche/quiche/quic/core/crypto/crypto_protocol.h +1 -1
  240. package/third_party/quiche/quiche/quic/core/http/end_to_end_test.cc +56 -2
  241. package/third_party/quiche/quiche/quic/core/http/http_constants.cc +1 -0
  242. package/third_party/quiche/quiche/quic/core/http/http_constants.h +1 -0
  243. package/third_party/quiche/quiche/quic/core/http/http_encoder.cc +28 -17
  244. package/third_party/quiche/quiche/quic/core/http/http_encoder.h +5 -0
  245. package/third_party/quiche/quiche/quic/core/http/http_encoder_test.cc +26 -30
  246. package/third_party/quiche/quiche/quic/core/http/http_frames.h +1 -0
  247. package/third_party/quiche/quiche/quic/core/http/quic_server_session_base.cc +4 -4
  248. package/third_party/quiche/quiche/quic/core/http/quic_server_session_base_test.cc +1 -1
  249. package/third_party/quiche/quiche/quic/core/http/quic_spdy_client_session.cc +5 -1
  250. package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.cc +6 -33
  251. package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.h +0 -17
  252. package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream_test.cc +5 -20
  253. package/third_party/quiche/quiche/quic/core/io/quic_event_loop.h +81 -0
  254. package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.cc +265 -0
  255. package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.h +152 -0
  256. package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop_test.cc +341 -0
  257. package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.cc +3 -1
  258. package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.h +7 -7
  259. package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store_test.cc +4 -3
  260. package/third_party/quiche/quiche/quic/core/quic_connection.cc +69 -19
  261. package/third_party/quiche/quiche/quic/core/quic_connection.h +9 -3
  262. package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.cc +29 -10
  263. package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.h +5 -3
  264. package/third_party/quiche/quiche/quic/core/quic_connection_id_manager_test.cc +85 -22
  265. package/third_party/quiche/quiche/quic/core/quic_connection_test.cc +186 -30
  266. package/third_party/quiche/quiche/quic/core/quic_crypto_stream.cc +2 -1
  267. package/third_party/quiche/quiche/quic/core/quic_default_clock.cc +31 -0
  268. package/third_party/quiche/quiche/quic/core/quic_default_clock.h +34 -0
  269. package/third_party/quiche/quiche/quic/core/quic_default_connection_helper.h +49 -0
  270. package/third_party/quiche/quiche/quic/core/quic_dispatcher.cc +53 -37
  271. package/third_party/quiche/quiche/quic/core/quic_dispatcher.h +19 -11
  272. package/third_party/quiche/quiche/quic/core/quic_dispatcher_test.cc +15 -2
  273. package/third_party/quiche/quiche/quic/core/quic_flags_list.h +10 -4
  274. package/third_party/quiche/quiche/quic/core/quic_idle_network_detector.cc +2 -2
  275. package/third_party/quiche/quiche/quic/core/quic_idle_network_detector_test.cc +4 -4
  276. package/third_party/quiche/quiche/quic/core/quic_packet_creator.cc +14 -3
  277. package/third_party/quiche/quiche/quic/core/quic_packet_creator_test.cc +145 -2
  278. package/third_party/quiche/quiche/quic/core/quic_packets.cc +3 -1
  279. package/third_party/quiche/quiche/quic/core/quic_packets.h +4 -0
  280. package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.cc +13 -11
  281. package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.h +9 -0
  282. package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager_test.cc +6 -0
  283. package/third_party/quiche/quiche/quic/core/quic_session.cc +3 -2
  284. package/third_party/quiche/quiche/quic/core/quic_session.h +8 -3
  285. package/third_party/quiche/quiche/quic/core/quic_types.cc +18 -0
  286. package/third_party/quiche/quiche/quic/core/quic_types.h +3 -0
  287. package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.cc +3 -0
  288. package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.h +10 -0
  289. package/third_party/quiche/quiche/quic/test_tools/mock_quic_session_visitor.h +1 -1
  290. package/third_party/quiche/quiche/quic/test_tools/quic_test_utils.h +1 -1
  291. package/third_party/quiche/quiche/quic/test_tools/server_thread.cc +3 -2
  292. package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.cc +7 -1
  293. package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.h +3 -0
  294. package/third_party/quiche/quiche/quic/test_tools/simulator/quic_endpoint.h +4 -2
  295. package/certs/ca.cnf +0 -69
  296. package/certs/generate_certs.sh +0 -53
  297. package/certs/generate_certs_leaf.sh +0 -53
  298. package/certs/leaf.cnf +0 -24
  299. package/certs/readme.txt +0 -2
  300. package/third_party/quiche/build/BUILD.bazel +0 -7
@@ -0,0 +1,341 @@
1
+ // Copyright 2022 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ #include "quiche/quic/core/io/quic_poll_event_loop.h"
6
+
7
+ #include <fcntl.h>
8
+ #include <unistd.h>
9
+
10
+ #include <cerrno>
11
+ #include <memory>
12
+ #include <vector>
13
+
14
+ #include "absl/memory/memory.h"
15
+ #include "quiche/quic/core/io/quic_event_loop.h"
16
+ #include "quiche/quic/core/quic_alarm.h"
17
+ #include "quiche/quic/core/quic_alarm_factory.h"
18
+ #include "quiche/quic/core/quic_time.h"
19
+ #include "quiche/quic/platform/api/quic_test.h"
20
+ #include "quiche/quic/test_tools/mock_clock.h"
21
+
22
+ namespace quic {
23
+
24
+ class QuicPollEventLoopPeer {
25
+ public:
26
+ static QuicTime::Delta ComputePollTimeout(const QuicPollEventLoop& loop,
27
+ QuicTime now,
28
+ QuicTime::Delta default_timeout) {
29
+ return loop.ComputePollTimeout(now, default_timeout);
30
+ }
31
+ };
32
+
33
+ } // namespace quic
34
+
35
+ namespace quic::test {
36
+ namespace {
37
+
38
+ using testing::_;
39
+ using testing::AtMost;
40
+ using testing::ElementsAre;
41
+
42
+ constexpr QuicSocketEventMask kAllEvents =
43
+ kSocketEventReadable | kSocketEventWritable | kSocketEventError;
44
+ constexpr QuicTime::Delta kDefaultTimeout = QuicTime::Delta::FromSeconds(100);
45
+
46
+ class MockQuicSocketEventListener : public QuicSocketEventListener {
47
+ public:
48
+ MOCK_METHOD(void, OnSocketEvent,
49
+ (QuicEventLoop* /*event_loop*/, QuicUdpSocketFd /*fd*/,
50
+ QuicSocketEventMask /*events*/),
51
+ (override));
52
+ };
53
+
54
+ class MockDelegate : public QuicAlarm::Delegate {
55
+ public:
56
+ QuicConnectionContext* GetConnectionContext() override { return nullptr; }
57
+ MOCK_METHOD(void, OnAlarm, (), (override));
58
+ };
59
+
60
+ class QuicPollEventLoopForTest : public QuicPollEventLoop {
61
+ public:
62
+ QuicPollEventLoopForTest(MockClock* clock)
63
+ : QuicPollEventLoop(clock), clock_(clock) {}
64
+
65
+ int PollSyscall(pollfd* fds, nfds_t nfds, int timeout) override {
66
+ timeouts_.push_back(timeout);
67
+ if (eintr_after_ != QuicTime::Delta::Infinite()) {
68
+ errno = EINTR;
69
+ clock_->AdvanceTime(eintr_after_);
70
+ eintr_after_ = QuicTime::Delta::Infinite();
71
+ return -1;
72
+ }
73
+ clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(timeout));
74
+ return QuicPollEventLoop::PollSyscall(fds, nfds, timeout);
75
+ }
76
+
77
+ void TriggerEintrAfter(QuicTime::Delta time) { eintr_after_ = time; }
78
+
79
+ const std::vector<int>& timeouts() const { return timeouts_; }
80
+
81
+ private:
82
+ MockClock* clock_;
83
+ QuicTime::Delta eintr_after_ = QuicTime::Delta::Infinite();
84
+ std::vector<int> timeouts_;
85
+ };
86
+
87
+ class QuicPollEventLoopTest : public QuicTest {
88
+ public:
89
+ QuicPollEventLoopTest() : loop_(&clock_), factory_(loop_.GetAlarmFactory()) {
90
+ int fds[2];
91
+ int result = ::pipe(fds);
92
+ QUICHE_CHECK(result >= 0) << "Failed to create a pipe, errno: " << errno;
93
+ read_fd_ = fds[0];
94
+ write_fd_ = fds[1];
95
+
96
+ QUICHE_CHECK(::fcntl(read_fd_, F_SETFL,
97
+ ::fcntl(read_fd_, F_GETFL) | O_NONBLOCK) == 0)
98
+ << "Failed to mark pipe FD non-blocking, errno: " << errno;
99
+ QUICHE_CHECK(::fcntl(write_fd_, F_SETFL,
100
+ ::fcntl(write_fd_, F_GETFL) | O_NONBLOCK) == 0)
101
+ << "Failed to mark pipe FD non-blocking, errno: " << errno;
102
+
103
+ clock_.AdvanceTime(10 * kDefaultTimeout);
104
+ }
105
+
106
+ ~QuicPollEventLoopTest() {
107
+ close(read_fd_);
108
+ close(write_fd_);
109
+ }
110
+
111
+ QuicTime::Delta ComputePollTimeout() {
112
+ return QuicPollEventLoopPeer::ComputePollTimeout(loop_, clock_.Now(),
113
+ kDefaultTimeout);
114
+ }
115
+
116
+ std::pair<std::unique_ptr<QuicAlarm>, MockDelegate*> CreateAlarm() {
117
+ auto delegate = std::make_unique<testing::StrictMock<MockDelegate>>();
118
+ MockDelegate* delegate_unowned = delegate.get();
119
+ auto alarm = absl::WrapUnique(factory_->CreateAlarm(delegate.release()));
120
+ return std::make_pair(std::move(alarm), delegate_unowned);
121
+ }
122
+
123
+ protected:
124
+ MockClock clock_;
125
+ QuicPollEventLoopForTest loop_;
126
+ QuicAlarmFactory* factory_;
127
+ int read_fd_;
128
+ int write_fd_;
129
+ };
130
+
131
+ TEST_F(QuicPollEventLoopTest, NothingHappens) {
132
+ testing::StrictMock<MockQuicSocketEventListener> listener;
133
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
134
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
135
+
136
+ // Attempt double-registration.
137
+ EXPECT_FALSE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
138
+
139
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
140
+
141
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
142
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
143
+ // Expect no further calls.
144
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(5));
145
+ EXPECT_THAT(loop_.timeouts(), ElementsAre(4, 5));
146
+ }
147
+
148
+ TEST_F(QuicPollEventLoopTest, RearmWriter) {
149
+ testing::StrictMock<MockQuicSocketEventListener> listener;
150
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
151
+
152
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
153
+ .Times(2);
154
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
155
+ ASSERT_TRUE(loop_.RearmSocket(write_fd_, kSocketEventWritable));
156
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
157
+ }
158
+
159
+ TEST_F(QuicPollEventLoopTest, Readable) {
160
+ testing::StrictMock<MockQuicSocketEventListener> listener;
161
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
162
+
163
+ ASSERT_EQ(4, write(write_fd_, "test", 4));
164
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
165
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
166
+ // Expect no further calls.
167
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
168
+ }
169
+
170
+ TEST_F(QuicPollEventLoopTest, RearmReader) {
171
+ testing::StrictMock<MockQuicSocketEventListener> listener;
172
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
173
+
174
+ ASSERT_EQ(4, write(write_fd_, "test", 4));
175
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
176
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
177
+ // Expect no further calls.
178
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
179
+ }
180
+
181
+ TEST_F(QuicPollEventLoopTest, WriterUnblocked) {
182
+ testing::StrictMock<MockQuicSocketEventListener> listener;
183
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
184
+
185
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
186
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
187
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
188
+
189
+ int io_result;
190
+ std::string data(2048, 'a');
191
+ do {
192
+ io_result = write(write_fd_, data.data(), data.size());
193
+ } while (io_result > 0);
194
+ ASSERT_EQ(errno, EAGAIN);
195
+
196
+ // Rearm and expect no immediate calls.
197
+ ASSERT_TRUE(loop_.RearmSocket(write_fd_, kSocketEventWritable));
198
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
199
+
200
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
201
+ do {
202
+ io_result = read(read_fd_, data.data(), data.size());
203
+ } while (io_result > 0);
204
+ ASSERT_EQ(errno, EAGAIN);
205
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
206
+ }
207
+
208
+ TEST_F(QuicPollEventLoopTest, ArtificialEvent) {
209
+ testing::StrictMock<MockQuicSocketEventListener> listener;
210
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
211
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
212
+
213
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
214
+ ASSERT_TRUE(loop_.ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
215
+ EXPECT_EQ(ComputePollTimeout(), QuicTime::Delta::Zero());
216
+
217
+ {
218
+ testing::InSequence s;
219
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
220
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
221
+ }
222
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
223
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
224
+ }
225
+
226
+ TEST_F(QuicPollEventLoopTest, Unregister) {
227
+ testing::StrictMock<MockQuicSocketEventListener> listener;
228
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
229
+ ASSERT_TRUE(loop_.UnregisterSocket(write_fd_));
230
+
231
+ // Expect nothing to happen.
232
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
233
+
234
+ EXPECT_FALSE(loop_.UnregisterSocket(write_fd_));
235
+ EXPECT_FALSE(loop_.RearmSocket(write_fd_, kSocketEventWritable));
236
+ EXPECT_FALSE(loop_.ArtificiallyNotifyEvent(write_fd_, kSocketEventWritable));
237
+ }
238
+
239
+ TEST_F(QuicPollEventLoopTest, UnregisterInsideEventHandler) {
240
+ testing::StrictMock<MockQuicSocketEventListener> listener;
241
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
242
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
243
+
244
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable))
245
+ .WillOnce([this]() { ASSERT_TRUE(loop_.UnregisterSocket(write_fd_)); });
246
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
247
+ .Times(0);
248
+ ASSERT_TRUE(loop_.ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
249
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
250
+ }
251
+
252
+ TEST_F(QuicPollEventLoopTest, EintrHandler) {
253
+ testing::StrictMock<MockQuicSocketEventListener> listener;
254
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
255
+
256
+ loop_.TriggerEintrAfter(QuicTime::Delta::FromMilliseconds(25));
257
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
258
+ EXPECT_THAT(loop_.timeouts(), ElementsAre(100, 75));
259
+ }
260
+
261
+ TEST_F(QuicPollEventLoopTest, AlarmInFuture) {
262
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
263
+
264
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
265
+ auto [alarm, delegate] = CreateAlarm();
266
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
267
+
268
+ alarm->Set(clock_.Now() + kAlarmTimeout);
269
+ EXPECT_EQ(ComputePollTimeout(), kAlarmTimeout);
270
+
271
+ EXPECT_CALL(*delegate, OnAlarm());
272
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
273
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
274
+ }
275
+
276
+ TEST_F(QuicPollEventLoopTest, AlarmsInPast) {
277
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
278
+
279
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
280
+ auto [alarm1, delegate1] = CreateAlarm();
281
+ auto [alarm2, delegate2] = CreateAlarm();
282
+
283
+ alarm1->Set(clock_.Now() - 2 * kAlarmTimeout);
284
+ alarm2->Set(clock_.Now() - kAlarmTimeout);
285
+
286
+ {
287
+ testing::InSequence s;
288
+ EXPECT_CALL(*delegate1, OnAlarm());
289
+ EXPECT_CALL(*delegate2, OnAlarm());
290
+ }
291
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
292
+ }
293
+
294
+ TEST_F(QuicPollEventLoopTest, AlarmCancelled) {
295
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
296
+
297
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
298
+ auto [alarm, delegate] = CreateAlarm();
299
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
300
+
301
+ alarm->Set(clock_.Now() + kAlarmTimeout);
302
+ alarm->Cancel();
303
+ alarm->Set(clock_.Now() + 2 * kAlarmTimeout);
304
+ EXPECT_EQ(ComputePollTimeout(), kAlarmTimeout);
305
+
306
+ EXPECT_CALL(*delegate, OnAlarm());
307
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
308
+ EXPECT_THAT(loop_.timeouts(), ElementsAre(10));
309
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
310
+ }
311
+
312
+ TEST_F(QuicPollEventLoopTest, AlarmCancelsAnotherAlarm) {
313
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
314
+
315
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
316
+ auto [alarm1_ptr, delegate1] = CreateAlarm();
317
+ auto [alarm2_ptr, delegate2] = CreateAlarm();
318
+
319
+ QuicAlarm& alarm1 = *alarm1_ptr;
320
+ QuicAlarm& alarm2 = *alarm2_ptr;
321
+ alarm1.Set(clock_.Now() - kAlarmTimeout);
322
+ alarm2.Set(clock_.Now() - kAlarmTimeout);
323
+
324
+ int alarms_called = 0;
325
+ // Since the order in which alarms are cancelled is not well-determined, make
326
+ // each one cancel another.
327
+ EXPECT_CALL(*delegate1, OnAlarm()).Times(AtMost(1)).WillOnce([&]() {
328
+ alarm2.Cancel();
329
+ ++alarms_called;
330
+ });
331
+ EXPECT_CALL(*delegate2, OnAlarm()).Times(AtMost(1)).WillOnce([&]() {
332
+ alarm1.Cancel();
333
+ ++alarms_called;
334
+ });
335
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
336
+ EXPECT_EQ(alarms_called, 1);
337
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
338
+ }
339
+
340
+ } // namespace
341
+ } // namespace quic::test
@@ -294,9 +294,10 @@ bool QuicBufferedPacketStore::IngestPacketForTlsChloExtraction(
294
294
  const QuicConnectionId& connection_id, const ParsedQuicVersion& version,
295
295
  const QuicReceivedPacket& packet, std::vector<std::string>* out_alpns,
296
296
  std::string* out_sni, bool* out_resumption_attempted,
297
- bool* out_early_data_attempted) {
297
+ bool* out_early_data_attempted, absl::optional<uint8_t>* tls_alert) {
298
298
  QUICHE_DCHECK_NE(out_alpns, nullptr);
299
299
  QUICHE_DCHECK_NE(out_sni, nullptr);
300
+ QUICHE_DCHECK_NE(tls_alert, nullptr);
300
301
  QUICHE_DCHECK_EQ(version.handshake_protocol, PROTOCOL_TLS1_3);
301
302
  auto it = undecryptable_packets_.find(connection_id);
302
303
  if (it == undecryptable_packets_.end()) {
@@ -306,6 +307,7 @@ bool QuicBufferedPacketStore::IngestPacketForTlsChloExtraction(
306
307
  }
307
308
  it->second.tls_chlo_extractor.IngestPacket(version, packet);
308
309
  if (!it->second.tls_chlo_extractor.HasParsedFullChlo()) {
310
+ *tls_alert = it->second.tls_chlo_extractor.tls_alert();
309
311
  return false;
310
312
  }
311
313
  const TlsChloExtractor& tls_chlo_extractor = it->second.tls_chlo_extractor;
@@ -119,13 +119,13 @@ class QUIC_NO_EXPORT QuicBufferedPacketStore {
119
119
  // |out_resumption_attempted| is populated if the CHLO has the
120
120
  // 'pre_shared_key' TLS extension. |out_early_data_attempted| is populated if
121
121
  // the CHLO has the 'early_data' TLS extension.
122
- bool IngestPacketForTlsChloExtraction(const QuicConnectionId& connection_id,
123
- const ParsedQuicVersion& version,
124
- const QuicReceivedPacket& packet,
125
- std::vector<std::string>* out_alpns,
126
- std::string* out_sni,
127
- bool* out_resumption_attempted,
128
- bool* out_early_data_attempted);
122
+ // When this returns false, and an unrecoverable error happened due to a TLS
123
+ // alert, |*tls_alert| will be set to the alert value.
124
+ bool IngestPacketForTlsChloExtraction(
125
+ const QuicConnectionId& connection_id, const ParsedQuicVersion& version,
126
+ const QuicReceivedPacket& packet, std::vector<std::string>* out_alpns,
127
+ std::string* out_sni, bool* out_resumption_attempted,
128
+ bool* out_early_data_attempted, absl::optional<uint8_t>* tls_alert);
129
129
 
130
130
  // Returns the list of buffered packets for |connection_id| and removes them
131
131
  // from the store. Returns an empty list if no early arrived packets for this
@@ -468,6 +468,7 @@ TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
468
468
  bool resumption_attempted = false;
469
469
  bool early_data_attempted = false;
470
470
  QuicConfig config;
471
+ absl::optional<uint8_t> tls_alert;
471
472
 
472
473
  EXPECT_FALSE(store_.HasBufferedPackets(connection_id));
473
474
  store_.EnqueuePacket(connection_id, false, packet_, self_address_,
@@ -477,7 +478,7 @@ TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
477
478
  // The packet in 'packet_' is not a TLS CHLO packet.
478
479
  EXPECT_FALSE(store_.IngestPacketForTlsChloExtraction(
479
480
  connection_id, valid_version_, packet_, &alpns, &sni,
480
- &resumption_attempted, &early_data_attempted));
481
+ &resumption_attempted, &early_data_attempted, &tls_alert));
481
482
 
482
483
  store_.DiscardPackets(connection_id);
483
484
 
@@ -498,10 +499,10 @@ TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
498
499
  EXPECT_TRUE(store_.HasBufferedPackets(connection_id));
499
500
  EXPECT_FALSE(store_.IngestPacketForTlsChloExtraction(
500
501
  connection_id, valid_version_, *packets[0], &alpns, &sni,
501
- &resumption_attempted, &early_data_attempted));
502
+ &resumption_attempted, &early_data_attempted, &tls_alert));
502
503
  EXPECT_TRUE(store_.IngestPacketForTlsChloExtraction(
503
504
  connection_id, valid_version_, *packets[1], &alpns, &sni,
504
- &resumption_attempted, &early_data_attempted));
505
+ &resumption_attempted, &early_data_attempted, &tls_alert));
505
506
 
506
507
  EXPECT_THAT(alpns, ElementsAre(AlpnForVersion(valid_version_)));
507
508
  EXPECT_EQ(sni, TestHostname());
@@ -8,6 +8,7 @@
8
8
  #include <sys/types.h>
9
9
 
10
10
  #include <algorithm>
11
+ #include <cstdint>
11
12
  #include <iterator>
12
13
  #include <limits>
13
14
  #include <memory>
@@ -562,21 +563,23 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) {
562
563
  if (config.HasClientSentConnectionOption(kNBHD, perspective_)) {
563
564
  blackhole_detection_disabled_ = true;
564
565
  }
565
- if (config.HasClientSentConnectionOption(k2RTO, perspective_)) {
566
- QUIC_CODE_COUNT(quic_2rto_blackhole_detection);
567
- num_rtos_for_blackhole_detection_ = 2;
568
- }
569
- if (config.HasClientSentConnectionOption(k3RTO, perspective_)) {
570
- QUIC_CODE_COUNT(quic_3rto_blackhole_detection);
571
- num_rtos_for_blackhole_detection_ = 3;
572
- }
573
- if (config.HasClientSentConnectionOption(k4RTO, perspective_)) {
574
- QUIC_CODE_COUNT(quic_4rto_blackhole_detection);
575
- num_rtos_for_blackhole_detection_ = 4;
576
- }
577
- if (config.HasClientSentConnectionOption(k6RTO, perspective_)) {
578
- QUIC_CODE_COUNT(quic_6rto_blackhole_detection);
579
- num_rtos_for_blackhole_detection_ = 6;
566
+ if (!sent_packet_manager_.remove_blackhole_detection_experiments()) {
567
+ if (config.HasClientSentConnectionOption(k2RTO, perspective_)) {
568
+ QUIC_CODE_COUNT(quic_2rto_blackhole_detection);
569
+ num_rtos_for_blackhole_detection_ = 2;
570
+ }
571
+ if (config.HasClientSentConnectionOption(k3RTO, perspective_)) {
572
+ QUIC_CODE_COUNT(quic_3rto_blackhole_detection);
573
+ num_rtos_for_blackhole_detection_ = 3;
574
+ }
575
+ if (config.HasClientSentConnectionOption(k4RTO, perspective_)) {
576
+ QUIC_CODE_COUNT(quic_4rto_blackhole_detection);
577
+ num_rtos_for_blackhole_detection_ = 4;
578
+ }
579
+ if (config.HasClientSentConnectionOption(k6RTO, perspective_)) {
580
+ QUIC_CODE_COUNT(quic_6rto_blackhole_detection);
581
+ num_rtos_for_blackhole_detection_ = 6;
582
+ }
580
583
  }
581
584
  }
582
585
 
@@ -3655,10 +3658,24 @@ bool QuicConnection::WritePacket(SerializedPacket* packet) {
3655
3658
  sent_packet_manager_.GetLeastPacketAwaitedByPeer(encryption_level_),
3656
3659
  sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
3657
3660
 
3658
- stats_.bytes_sent += result.bytes_written;
3661
+ stats_.bytes_sent += encrypted_length;
3659
3662
  ++stats_.packets_sent;
3663
+
3664
+ QuicByteCount bytes_not_retransmitted =
3665
+ packet->bytes_not_retransmitted.value_or(0);
3660
3666
  if (packet->transmission_type != NOT_RETRANSMISSION) {
3661
- stats_.bytes_retransmitted += result.bytes_written;
3667
+ if (static_cast<uint64_t>(encrypted_length) < bytes_not_retransmitted) {
3668
+ QUIC_BUG(quic_packet_bytes_written_lt_bytes_not_retransmitted)
3669
+ << "Total bytes written to the packet should be larger than the "
3670
+ "bytes in not-retransmitted frames. Bytes written: "
3671
+ << encrypted_length
3672
+ << ", bytes not retransmitted: " << bytes_not_retransmitted;
3673
+ } else {
3674
+ // bytes_retransmitted includes packet's headers and encryption
3675
+ // overhead.
3676
+ stats_.bytes_retransmitted +=
3677
+ (encrypted_length - bytes_not_retransmitted);
3678
+ }
3662
3679
  ++stats_.packets_retransmitted;
3663
3680
  }
3664
3681
 
@@ -4827,6 +4844,14 @@ QuicConnection::ScopedPacketFlusher::~ScopedPacketFlusher() {
4827
4844
  connection_->FlushCoalescedPacket();
4828
4845
  }
4829
4846
  connection_->FlushPackets();
4847
+ if (GetQuicReloadableFlag(
4848
+ quic_packet_flusher_check_connected_after_flush_packets)) {
4849
+ QUIC_RELOADABLE_FLAG_COUNT(
4850
+ quic_packet_flusher_check_connected_after_flush_packets);
4851
+ if (!connection_->connected()) {
4852
+ return;
4853
+ }
4854
+ }
4830
4855
  if (!handshake_packet_sent_ && connection_->handshake_packet_sent_) {
4831
4856
  // This would cause INITIAL key to be dropped. Drop keys here to avoid
4832
4857
  // missing the write keys in the middle of writing.
@@ -6373,11 +6398,12 @@ bool QuicConnection::SendNewConnectionId(
6373
6398
  return connected_;
6374
6399
  }
6375
6400
 
6376
- void QuicConnection::OnNewConnectionIdIssued(
6401
+ bool QuicConnection::MaybeReserveConnectionId(
6377
6402
  const QuicConnectionId& connection_id) {
6378
6403
  if (perspective_ == Perspective::IS_SERVER) {
6379
- visitor_->OnServerConnectionIdIssued(connection_id);
6404
+ return visitor_->MaybeReserveConnectionId(connection_id);
6380
6405
  }
6406
+ return true;
6381
6407
  }
6382
6408
 
6383
6409
  void QuicConnection::OnSelfIssuedConnectionIdRetired(
@@ -6424,11 +6450,35 @@ QuicTime QuicConnection::GetNetworkBlackholeDeadline() const {
6424
6450
  return QuicTime::Zero();
6425
6451
  }
6426
6452
  QUICHE_DCHECK_LT(0u, num_rtos_for_blackhole_detection_);
6453
+ if (sent_packet_manager_.remove_blackhole_detection_experiments()) {
6454
+ QUIC_RELOADABLE_FLAG_COUNT(quic_remove_blackhole_detection_experiments);
6455
+ const QuicTime::Delta blackhole_delay =
6456
+ sent_packet_manager_.GetNetworkBlackholeDelay(
6457
+ num_rtos_for_blackhole_detection_);
6458
+ if (!ShouldDetectPathDegrading()) {
6459
+ return clock_->ApproximateNow() + blackhole_delay;
6460
+ }
6461
+ return clock_->ApproximateNow() +
6462
+ CalculateNetworkBlackholeDelay(
6463
+ blackhole_delay, sent_packet_manager_.GetPathDegradingDelay(),
6464
+ sent_packet_manager_.GetPtoDelay());
6465
+ }
6427
6466
  return clock_->ApproximateNow() +
6428
6467
  sent_packet_manager_.GetNetworkBlackholeDelay(
6429
6468
  num_rtos_for_blackhole_detection_);
6430
6469
  }
6431
6470
 
6471
+ // static
6472
+ QuicTime::Delta QuicConnection::CalculateNetworkBlackholeDelay(
6473
+ QuicTime::Delta blackhole_delay, QuicTime::Delta path_degrading_delay,
6474
+ QuicTime::Delta pto_delay) {
6475
+ const QuicTime::Delta min_delay = path_degrading_delay + pto_delay * 2;
6476
+ if (blackhole_delay < min_delay) {
6477
+ QUIC_CODE_COUNT(quic_extending_short_blackhole_delay);
6478
+ }
6479
+ return std::max(min_delay, blackhole_delay);
6480
+ }
6481
+
6432
6482
  bool QuicConnection::ShouldDetectBlackhole() const {
6433
6483
  if (!connected_ || blackhole_detection_disabled_) {
6434
6484
  return false;
@@ -164,8 +164,9 @@ class QUIC_EXPORT_PRIVATE QuicConnectionVisitorInterface {
164
164
  // Called to send a RETIRE_CONNECTION_ID frame.
165
165
  virtual void SendRetireConnectionId(uint64_t sequence_number) = 0;
166
166
 
167
- // Called when server starts to use a server issued connection ID.
168
- virtual void OnServerConnectionIdIssued(
167
+ // Called when server starts to use a server issued connection ID. Returns
168
+ // true if this connection ID hasn't been used by another connection.
169
+ virtual bool MaybeReserveConnectionId(
169
170
  const QuicConnectionId& server_connection_id) = 0;
170
171
 
171
172
  // Called when server stops to use a server issued connection ID.
@@ -718,7 +719,7 @@ class QUIC_EXPORT_PRIVATE QuicConnection
718
719
  // QuicConnectionIdManagerVisitorInterface
719
720
  void OnPeerIssuedConnectionIdRetired() override;
720
721
  bool SendNewConnectionId(const QuicNewConnectionIdFrame& frame) override;
721
- void OnNewConnectionIdIssued(const QuicConnectionId& connection_id) override;
722
+ bool MaybeReserveConnectionId(const QuicConnectionId& connection_id) override;
722
723
  void OnSelfIssuedConnectionIdRetired(
723
724
  const QuicConnectionId& connection_id) override;
724
725
 
@@ -1230,6 +1231,11 @@ class QUIC_EXPORT_PRIVATE QuicConnection
1230
1231
  return quic_bug_10511_43_error_detail_;
1231
1232
  }
1232
1233
 
1234
+ // Ensures the network blackhole delay is longer than path degrading delay.
1235
+ static QuicTime::Delta CalculateNetworkBlackholeDelay(
1236
+ QuicTime::Delta blackhole_delay, QuicTime::Delta path_degrading_delay,
1237
+ QuicTime::Delta pto_delay);
1238
+
1233
1239
  protected:
1234
1240
  // Calls cancel() on all the alarms owned by this connection.
1235
1241
  void CancelAllAlarms();
@@ -10,6 +10,7 @@
10
10
  #include "quiche/quic/core/quic_connection_id.h"
11
11
  #include "quiche/quic/core/quic_error_codes.h"
12
12
  #include "quiche/quic/core/quic_utils.h"
13
+ #include "quiche/quic/platform/api/quic_flag_utils.h"
13
14
  #include "quiche/common/platform/api/quiche_logging.h"
14
15
 
15
16
  namespace quic {
@@ -298,14 +299,28 @@ QuicConnectionId QuicSelfIssuedConnectionIdManager::GenerateNewConnectionId(
298
299
  return QuicUtils::CreateReplacementConnectionId(old_connection_id);
299
300
  }
300
301
 
301
- QuicNewConnectionIdFrame
302
- QuicSelfIssuedConnectionIdManager::IssueNewConnectionId() {
302
+ absl::optional<QuicNewConnectionIdFrame>
303
+ QuicSelfIssuedConnectionIdManager::MaybeIssueNewConnectionId() {
304
+ const bool check_cid_collision_when_issue_new_cid =
305
+ GetQuicReloadableFlag(quic_check_cid_collision_when_issue_new_cid);
306
+ QuicConnectionId new_cid = GenerateNewConnectionId(last_connection_id_);
307
+ if (check_cid_collision_when_issue_new_cid) {
308
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_check_cid_collision_when_issue_new_cid, 1,
309
+ 2);
310
+ if (!visitor_->MaybeReserveConnectionId(new_cid)) {
311
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_check_cid_collision_when_issue_new_cid,
312
+ 2, 2);
313
+ return {};
314
+ }
315
+ }
303
316
  QuicNewConnectionIdFrame frame;
304
- frame.connection_id = GenerateNewConnectionId(last_connection_id_);
317
+ frame.connection_id = new_cid;
305
318
  frame.sequence_number = next_connection_id_sequence_number_++;
306
319
  frame.stateless_reset_token =
307
320
  QuicUtils::GenerateStatelessResetToken(frame.connection_id);
308
- visitor_->OnNewConnectionIdIssued(frame.connection_id);
321
+ if (!check_cid_collision_when_issue_new_cid) {
322
+ visitor_->MaybeReserveConnectionId(frame.connection_id);
323
+ }
309
324
  active_connection_ids_.emplace_back(frame.connection_id,
310
325
  frame.sequence_number);
311
326
  frame.retire_prior_to = active_connection_ids_.front().second;
@@ -313,10 +328,10 @@ QuicSelfIssuedConnectionIdManager::IssueNewConnectionId() {
313
328
  return frame;
314
329
  }
315
330
 
316
- QuicNewConnectionIdFrame
317
- QuicSelfIssuedConnectionIdManager::IssueNewConnectionIdForPreferredAddress() {
318
- QuicNewConnectionIdFrame frame = IssueNewConnectionId();
319
- QUICHE_DCHECK_EQ(frame.sequence_number, 1u);
331
+ absl::optional<QuicNewConnectionIdFrame> QuicSelfIssuedConnectionIdManager::
332
+ MaybeIssueNewConnectionIdForPreferredAddress() {
333
+ absl::optional<QuicNewConnectionIdFrame> frame = MaybeIssueNewConnectionId();
334
+ QUICHE_DCHECK(!frame.has_value() || (frame->sequence_number == 1u));
320
335
  return frame;
321
336
  }
322
337
 
@@ -406,8 +421,12 @@ void QuicSelfIssuedConnectionIdManager::RetireConnectionId() {
406
421
 
407
422
  void QuicSelfIssuedConnectionIdManager::MaybeSendNewConnectionIds() {
408
423
  while (active_connection_ids_.size() < active_connection_id_limit_) {
409
- QuicNewConnectionIdFrame frame = IssueNewConnectionId();
410
- if (!visitor_->SendNewConnectionId(frame)) {
424
+ absl::optional<QuicNewConnectionIdFrame> frame =
425
+ MaybeIssueNewConnectionId();
426
+ if (!frame.has_value()) {
427
+ break;
428
+ }
429
+ if (!visitor_->SendNewConnectionId(*frame)) {
411
430
  break;
412
431
  }
413
432
  }