@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.
- package/package.json +1 -1
- package/readme.md +1 -3
- package/src/http3eventloop.cc +83 -9
- package/src/http3eventloop.h +13 -3
- package/src/http3server.cc +22 -22
- package/src/http3server.h +7 -20
- package/src/http3wtstreamvisitor.cc +31 -10
- package/src/http3wtstreamvisitor.h +38 -11
- package/src/webtransport.js +91 -23
- package/test/echoserver.js +29 -5
- package/test/testsuite.js +242 -220
- package/third_party/boringssl/src/CMakeLists.txt +2 -0
- package/third_party/boringssl/src/crypto/CMakeLists.txt +1 -0
- package/third_party/boringssl/src/crypto/asn1/a_bitstr.c +174 -177
- package/third_party/boringssl/src/crypto/asn1/a_bool.c +46 -48
- package/third_party/boringssl/src/crypto/asn1/a_d2i_fp.c +21 -23
- package/third_party/boringssl/src/crypto/asn1/a_dup.c +21 -23
- package/third_party/boringssl/src/crypto/asn1/a_gentm.c +84 -187
- package/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c +19 -21
- package/third_party/boringssl/src/crypto/asn1/a_int.c +305 -329
- package/third_party/boringssl/src/crypto/asn1/a_mbstr.c +190 -195
- package/third_party/boringssl/src/crypto/asn1/a_object.c +182 -189
- package/third_party/boringssl/src/crypto/asn1/a_octet.c +6 -9
- package/third_party/boringssl/src/crypto/asn1/a_print.c +15 -16
- package/third_party/boringssl/src/crypto/asn1/a_strex.c +386 -399
- package/third_party/boringssl/src/crypto/asn1/a_strnid.c +110 -131
- package/third_party/boringssl/src/crypto/asn1/a_time.c +118 -111
- package/third_party/boringssl/src/crypto/asn1/a_type.c +59 -60
- package/third_party/boringssl/src/crypto/asn1/a_utctm.c +114 -186
- package/third_party/boringssl/src/crypto/asn1/a_utf8.c +171 -159
- package/third_party/boringssl/src/crypto/asn1/asn1_lib.c +245 -260
- package/third_party/boringssl/src/crypto/asn1/asn1_par.c +41 -40
- package/third_party/boringssl/src/crypto/asn1/asn1_test.cc +31 -0
- package/third_party/boringssl/src/crypto/asn1/asn_pack.c +31 -33
- package/third_party/boringssl/src/crypto/asn1/f_int.c +36 -33
- package/third_party/boringssl/src/crypto/asn1/f_string.c +29 -26
- package/third_party/boringssl/src/crypto/asn1/internal.h +62 -61
- package/third_party/boringssl/src/crypto/asn1/tasn_dec.c +706 -702
- package/third_party/boringssl/src/crypto/asn1/tasn_enc.c +507 -524
- package/third_party/boringssl/src/crypto/asn1/tasn_fre.c +141 -133
- package/third_party/boringssl/src/crypto/asn1/tasn_new.c +207 -199
- package/third_party/boringssl/src/crypto/asn1/tasn_typ.c +19 -22
- package/third_party/boringssl/src/crypto/asn1/tasn_utl.c +24 -24
- package/third_party/boringssl/src/crypto/asn1/time_support.c +13 -13
- package/third_party/boringssl/src/crypto/bio/connect.c +9 -3
- package/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc +125 -1
- package/third_party/boringssl/src/crypto/bytestring/cbb.c +4 -7
- package/third_party/boringssl/src/crypto/bytestring/cbs.c +167 -9
- package/third_party/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c +0 -2
- package/third_party/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c +23 -54
- package/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c +0 -2
- package/third_party/boringssl/src/crypto/cipher_extra/e_tls.c +0 -2
- package/third_party/boringssl/src/crypto/curve25519/curve25519.c +6 -8
- package/third_party/boringssl/src/crypto/evp/evp_ctx.c +25 -22
- package/third_party/boringssl/src/crypto/evp/internal.h +15 -9
- package/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_ec_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_ed25519.c +3 -3
- package/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c +10 -7
- package/third_party/boringssl/src/crypto/evp/p_hkdf.c +241 -0
- package/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c +1 -0
- package/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.c +9 -10
- package/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.c +2 -6
- package/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c +5 -11
- package/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h +1 -1
- package/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c +2 -0
- package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c +10 -26
- package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.c +2 -3
- package/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.c +1 -0
- package/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c +44 -43
- package/third_party/boringssl/src/crypto/fipsmodule/modes/cbc.c +5 -9
- package/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c +14 -21
- package/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.c +8 -8
- package/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h +1 -4
- package/third_party/boringssl/src/crypto/hkdf/hkdf_test.cc +104 -0
- package/third_party/boringssl/src/crypto/internal.h +18 -4
- package/third_party/boringssl/src/crypto/lhash/internal.h +13 -1
- package/third_party/boringssl/src/crypto/obj/obj_dat.h +4 -1
- package/third_party/boringssl/src/crypto/obj/obj_mac.num +1 -0
- package/third_party/boringssl/src/crypto/obj/objects.txt +2 -0
- package/third_party/boringssl/src/crypto/pem/pem_all.c +77 -86
- package/third_party/boringssl/src/crypto/pem/pem_info.c +221 -233
- package/third_party/boringssl/src/crypto/pem/pem_lib.c +639 -608
- package/third_party/boringssl/src/crypto/pem/pem_oth.c +17 -16
- package/third_party/boringssl/src/crypto/pem/pem_pk8.c +133 -142
- package/third_party/boringssl/src/crypto/pem/pem_pkey.c +96 -92
- package/third_party/boringssl/src/crypto/poly1305/poly1305_vec.c +12 -28
- package/third_party/boringssl/src/crypto/siphash/siphash.c +8 -11
- package/third_party/boringssl/src/crypto/siphash/siphash_test.cc +5 -7
- package/third_party/boringssl/src/crypto/stack/stack.c +33 -16
- package/third_party/boringssl/src/crypto/thread_pthread.c +0 -2
- package/third_party/boringssl/src/crypto/thread_win.c +0 -2
- package/third_party/boringssl/src/crypto/trust_token/internal.h +14 -0
- package/third_party/boringssl/src/crypto/trust_token/pmbtoken.c +127 -30
- package/third_party/boringssl/src/crypto/trust_token/trust_token.c +40 -0
- package/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc +165 -0
- package/third_party/boringssl/src/crypto/trust_token/voprf.c +55 -6
- package/third_party/boringssl/src/crypto/x509/a_digest.c +23 -24
- package/third_party/boringssl/src/crypto/x509/a_sign.c +52 -55
- package/third_party/boringssl/src/crypto/x509/a_verify.c +33 -34
- package/third_party/boringssl/src/crypto/x509/algorithm.c +17 -18
- package/third_party/boringssl/src/crypto/x509/asn1_gen.c +618 -612
- package/third_party/boringssl/src/crypto/x509/by_dir.c +320 -337
- package/third_party/boringssl/src/crypto/x509/by_file.c +186 -186
- package/third_party/boringssl/src/crypto/x509/i2d_pr.c +11 -14
- package/third_party/boringssl/src/crypto/x509/internal.h +22 -22
- package/third_party/boringssl/src/crypto/x509/name_print.c +155 -150
- package/third_party/boringssl/src/crypto/x509/rsa_pss.c +27 -29
- package/third_party/boringssl/src/crypto/x509/t_crl.c +67 -70
- package/third_party/boringssl/src/crypto/x509/t_req.c +3 -5
- package/third_party/boringssl/src/crypto/x509/t_x509.c +280 -251
- package/third_party/boringssl/src/crypto/x509/t_x509a.c +52 -47
- package/third_party/boringssl/src/crypto/x509/x509.c +3 -4
- package/third_party/boringssl/src/crypto/x509/x509_att.c +234 -223
- package/third_party/boringssl/src/crypto/x509/x509_cmp.c +286 -296
- package/third_party/boringssl/src/crypto/x509/x509_d2.c +37 -32
- package/third_party/boringssl/src/crypto/x509/x509_def.c +14 -30
- package/third_party/boringssl/src/crypto/x509/x509_ext.c +55 -84
- package/third_party/boringssl/src/crypto/x509/x509_lu.c +545 -581
- package/third_party/boringssl/src/crypto/x509/x509_obj.c +131 -121
- package/third_party/boringssl/src/crypto/x509/x509_req.c +120 -139
- package/third_party/boringssl/src/crypto/x509/x509_set.c +128 -142
- package/third_party/boringssl/src/crypto/x509/x509_trs.c +185 -193
- package/third_party/boringssl/src/crypto/x509/x509_txt.c +70 -72
- package/third_party/boringssl/src/crypto/x509/x509_v3.c +172 -161
- package/third_party/boringssl/src/crypto/x509/x509_vfy.c +2041 -2053
- package/third_party/boringssl/src/crypto/x509/x509_vpm.c +441 -461
- package/third_party/boringssl/src/crypto/x509/x509cset.c +152 -170
- package/third_party/boringssl/src/crypto/x509/x509name.c +274 -260
- package/third_party/boringssl/src/crypto/x509/x509rset.c +43 -20
- package/third_party/boringssl/src/crypto/x509/x509spki.c +62 -63
- package/third_party/boringssl/src/crypto/x509/x_algor.c +64 -62
- package/third_party/boringssl/src/crypto/x509/x_all.c +103 -133
- package/third_party/boringssl/src/crypto/x509/x_attrib.c +23 -24
- package/third_party/boringssl/src/crypto/x509/x_crl.c +310 -321
- package/third_party/boringssl/src/crypto/x509/x_exten.c +6 -5
- package/third_party/boringssl/src/crypto/x509/x_info.c +31 -28
- package/third_party/boringssl/src/crypto/x509/x_name.c +361 -365
- package/third_party/boringssl/src/crypto/x509/x_pkey.c +38 -32
- package/third_party/boringssl/src/crypto/x509/x_pubkey.c +114 -117
- package/third_party/boringssl/src/crypto/x509/x_req.c +27 -29
- package/third_party/boringssl/src/crypto/x509/x_sig.c +2 -2
- package/third_party/boringssl/src/crypto/x509/x_spki.c +8 -10
- package/third_party/boringssl/src/crypto/x509/x_val.c +2 -2
- package/third_party/boringssl/src/crypto/x509/x_x509.c +212 -226
- package/third_party/boringssl/src/crypto/x509/x_x509a.c +112 -109
- package/third_party/boringssl/src/crypto/x509v3/ext_dat.h +10 -13
- package/third_party/boringssl/src/crypto/x509v3/internal.h +72 -87
- package/third_party/boringssl/src/crypto/x509v3/pcy_cache.c +184 -176
- package/third_party/boringssl/src/crypto/x509v3/pcy_data.c +58 -56
- package/third_party/boringssl/src/crypto/x509v3/pcy_lib.c +71 -70
- package/third_party/boringssl/src/crypto/x509v3/pcy_map.c +56 -58
- package/third_party/boringssl/src/crypto/x509v3/pcy_node.c +89 -91
- package/third_party/boringssl/src/crypto/x509v3/pcy_tree.c +585 -590
- package/third_party/boringssl/src/crypto/x509v3/v3_akey.c +118 -112
- package/third_party/boringssl/src/crypto/x509v3/v3_akeya.c +3 -3
- package/third_party/boringssl/src/crypto/x509v3/v3_alt.c +447 -451
- package/third_party/boringssl/src/crypto/x509v3/v3_bcons.c +44 -38
- package/third_party/boringssl/src/crypto/x509v3/v3_bitst.c +39 -43
- package/third_party/boringssl/src/crypto/x509v3/v3_conf.c +321 -320
- package/third_party/boringssl/src/crypto/x509v3/v3_cpols.c +352 -327
- package/third_party/boringssl/src/crypto/x509v3/v3_crld.c +437 -383
- package/third_party/boringssl/src/crypto/x509v3/v3_enum.c +23 -16
- package/third_party/boringssl/src/crypto/x509v3/v3_extku.c +62 -53
- package/third_party/boringssl/src/crypto/x509v3/v3_genn.c +118 -115
- package/third_party/boringssl/src/crypto/x509v3/v3_ia5.c +30 -31
- package/third_party/boringssl/src/crypto/x509v3/v3_info.c +112 -98
- package/third_party/boringssl/src/crypto/x509v3/v3_int.c +40 -15
- package/third_party/boringssl/src/crypto/x509v3/v3_lib.c +248 -252
- package/third_party/boringssl/src/crypto/x509v3/v3_ncons.c +390 -386
- package/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c +45 -32
- package/third_party/boringssl/src/crypto/x509v3/v3_pci.c +206 -209
- package/third_party/boringssl/src/crypto/x509v3/v3_pcia.c +6 -8
- package/third_party/boringssl/src/crypto/x509v3/v3_pcons.c +54 -50
- package/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c +66 -65
- package/third_party/boringssl/src/crypto/x509v3/v3_prn.c +144 -133
- package/third_party/boringssl/src/crypto/x509v3/v3_purp.c +695 -709
- package/third_party/boringssl/src/crypto/x509v3/v3_skey.c +75 -69
- package/third_party/boringssl/src/crypto/x509v3/v3_utl.c +1102 -1082
- package/third_party/boringssl/src/include/openssl/base.h +3 -1
- package/third_party/boringssl/src/include/openssl/bn.h +3 -0
- package/third_party/boringssl/src/include/openssl/bytestring.h +20 -0
- package/third_party/boringssl/src/include/openssl/evp.h +6 -5
- package/third_party/boringssl/src/include/openssl/kdf.h +91 -0
- package/third_party/boringssl/src/include/openssl/nid.h +4 -0
- package/third_party/boringssl/src/include/openssl/ssl.h +6 -1
- package/third_party/boringssl/src/include/openssl/stack.h +47 -32
- package/third_party/boringssl/src/include/openssl/trust_token.h +18 -3
- package/third_party/boringssl/src/include/openssl/x509.h +18 -0
- package/third_party/boringssl/src/ssl/ssl_file.cc +61 -99
- package/third_party/boringssl/src/ssl/ssl_test.cc +101 -0
- package/third_party/boringssl/src/util/doc.config +2 -1
- package/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go +8 -0
- package/third_party/googleurl/AUTHORS +16 -2
- package/third_party/googleurl/base/BUILD +1 -0
- package/third_party/googleurl/base/compiler_specific.h +16 -17
- package/third_party/googleurl/base/containers/contiguous_iterator.h +13 -9
- package/third_party/googleurl/base/containers/span.h +23 -8
- package/third_party/googleurl/base/memory/raw_ptr.h +17 -25
- package/third_party/googleurl/base/memory/raw_ptr_exclusion.h +21 -0
- package/third_party/googleurl/base/strings/escape.cc +14 -2
- package/third_party/googleurl/base/strings/safe_sprintf.h +1 -1
- package/third_party/googleurl/base/strings/string_number_conversions.cc +5 -3
- package/third_party/googleurl/base/strings/string_number_conversions_internal.h +5 -5
- package/third_party/googleurl/base/strings/string_piece.h +3 -3
- package/third_party/googleurl/base/strings/string_util.cc +4 -27
- package/third_party/googleurl/base/strings/string_util.h +43 -8
- package/third_party/googleurl/base/strings/string_util_internal.h +11 -12
- package/third_party/googleurl/base/strings/string_util_unittest.cc +33 -0
- package/third_party/googleurl/base/strings/string_util_win.cc +0 -5
- package/third_party/googleurl/base/strings/string_util_win.h +9 -1
- package/third_party/googleurl/base/strings/utf_offset_string_conversions.cc +1 -1
- package/third_party/googleurl/base/strings/utf_string_conversion_utils.cc +5 -8
- package/third_party/googleurl/base/strings/utf_string_conversion_utils.h +13 -10
- package/third_party/googleurl/base/strings/utf_string_conversions.cc +32 -25
- package/third_party/googleurl/base/template_util.h +23 -35
- package/third_party/googleurl/build/build_config.h +14 -3
- package/third_party/googleurl/copy.bara.sky +1 -1
- package/third_party/googleurl/url/gurl.cc +8 -4
- package/third_party/googleurl/url/gurl.h +1 -0
- package/third_party/googleurl/url/gurl_unittest.cc +1 -0
- package/third_party/googleurl/url/origin.h +36 -26
- package/third_party/googleurl/url/scheme_host_port.h +4 -1
- package/third_party/googleurl/url/url_canon.h +2 -1
- package/third_party/googleurl/url/url_canon_internal.cc +9 -7
- package/third_party/googleurl/url/url_canon_internal.h +16 -16
- package/third_party/googleurl/url/url_canon_stdstring.h +2 -1
- package/third_party/googleurl/url/url_util.cc +9 -8
- package/third_party/quiche/build/source_list.bzl +7 -0
- package/third_party/quiche/build/source_list.gni +7 -0
- package/third_party/quiche/build/source_list.json +7 -0
- package/third_party/quiche/quiche/common/platform/api/quiche_mem_slice.h +7 -3
- package/third_party/quiche/quiche/http2/adapter/nghttp2_adapter_test.cc +86 -2
- package/third_party/quiche/quiche/http2/adapter/oghttp2_adapter_test.cc +104 -2
- package/third_party/quiche/quiche/http2/adapter/oghttp2_session.cc +23 -0
- package/third_party/quiche/quiche/http2/adapter/oghttp2_session.h +6 -1
- package/third_party/quiche/quiche/quic/core/congestion_control/send_algorithm_test.cc +0 -16
- package/third_party/quiche/quiche/quic/core/crypto/crypto_protocol.h +1 -1
- package/third_party/quiche/quiche/quic/core/http/end_to_end_test.cc +56 -2
- package/third_party/quiche/quiche/quic/core/http/http_constants.cc +1 -0
- package/third_party/quiche/quiche/quic/core/http/http_constants.h +1 -0
- package/third_party/quiche/quiche/quic/core/http/http_encoder.cc +28 -17
- package/third_party/quiche/quiche/quic/core/http/http_encoder.h +5 -0
- package/third_party/quiche/quiche/quic/core/http/http_encoder_test.cc +26 -30
- package/third_party/quiche/quiche/quic/core/http/http_frames.h +1 -0
- package/third_party/quiche/quiche/quic/core/http/quic_server_session_base.cc +4 -4
- package/third_party/quiche/quiche/quic/core/http/quic_server_session_base_test.cc +1 -1
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_client_session.cc +5 -1
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.cc +6 -33
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.h +0 -17
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream_test.cc +5 -20
- package/third_party/quiche/quiche/quic/core/io/quic_event_loop.h +81 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.cc +265 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.h +152 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop_test.cc +341 -0
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.cc +3 -1
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.h +7 -7
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store_test.cc +4 -3
- package/third_party/quiche/quiche/quic/core/quic_connection.cc +69 -19
- package/third_party/quiche/quiche/quic/core/quic_connection.h +9 -3
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.cc +29 -10
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.h +5 -3
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager_test.cc +85 -22
- package/third_party/quiche/quiche/quic/core/quic_connection_test.cc +186 -30
- package/third_party/quiche/quiche/quic/core/quic_crypto_stream.cc +2 -1
- package/third_party/quiche/quiche/quic/core/quic_default_clock.cc +31 -0
- package/third_party/quiche/quiche/quic/core/quic_default_clock.h +34 -0
- package/third_party/quiche/quiche/quic/core/quic_default_connection_helper.h +49 -0
- package/third_party/quiche/quiche/quic/core/quic_dispatcher.cc +53 -37
- package/third_party/quiche/quiche/quic/core/quic_dispatcher.h +19 -11
- package/third_party/quiche/quiche/quic/core/quic_dispatcher_test.cc +15 -2
- package/third_party/quiche/quiche/quic/core/quic_flags_list.h +10 -4
- package/third_party/quiche/quiche/quic/core/quic_idle_network_detector.cc +2 -2
- package/third_party/quiche/quiche/quic/core/quic_idle_network_detector_test.cc +4 -4
- package/third_party/quiche/quiche/quic/core/quic_packet_creator.cc +14 -3
- package/third_party/quiche/quiche/quic/core/quic_packet_creator_test.cc +145 -2
- package/third_party/quiche/quiche/quic/core/quic_packets.cc +3 -1
- package/third_party/quiche/quiche/quic/core/quic_packets.h +4 -0
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.cc +13 -11
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.h +9 -0
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager_test.cc +6 -0
- package/third_party/quiche/quiche/quic/core/quic_session.cc +3 -2
- package/third_party/quiche/quiche/quic/core/quic_session.h +8 -3
- package/third_party/quiche/quiche/quic/core/quic_types.cc +18 -0
- package/third_party/quiche/quiche/quic/core/quic_types.h +3 -0
- package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.cc +3 -0
- package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.h +10 -0
- package/third_party/quiche/quiche/quic/test_tools/mock_quic_session_visitor.h +1 -1
- package/third_party/quiche/quiche/quic/test_tools/quic_test_utils.h +1 -1
- package/third_party/quiche/quiche/quic/test_tools/server_thread.cc +3 -2
- package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.cc +7 -1
- package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.h +3 -0
- package/third_party/quiche/quiche/quic/test_tools/simulator/quic_endpoint.h +4 -2
- package/certs/ca.cnf +0 -69
- package/certs/generate_certs.sh +0 -53
- package/certs/generate_certs_leaf.sh +0 -53
- package/certs/leaf.cnf +0 -24
- package/certs/readme.txt +0 -2
- 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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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 (
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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 +=
|
|
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
|
-
|
|
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
|
-
|
|
6401
|
+
bool QuicConnection::MaybeReserveConnectionId(
|
|
6377
6402
|
const QuicConnectionId& connection_id) {
|
|
6378
6403
|
if (perspective_ == Perspective::IS_SERVER) {
|
|
6379
|
-
visitor_->
|
|
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
|
-
|
|
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
|
-
|
|
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::
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
318
|
-
QuicNewConnectionIdFrame frame =
|
|
319
|
-
|
|
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 =
|
|
410
|
-
|
|
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
|
}
|