diff --git a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c index 283063f738e2af..0409a4e50cae7a 100644 --- a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c @@ -39,6 +39,7 @@ #include #include +#include "ngtcp2_macro.h" #include "shared.h" typedef enum ngtcp2_crypto_boringssl_cipher_type { @@ -419,7 +420,7 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, #else /* !defined(WORDS_BIGENDIAN) */ memcpy(&counter, sample, sizeof(counter)); #endif /* !defined(WORDS_BIGENDIAN) */ - CRYPTO_chacha_20(dest, PLAINTEXT, sizeof(PLAINTEXT) - 1, ctx->key, + CRYPTO_chacha_20(dest, PLAINTEXT, ngtcp2_strlen_lit(PLAINTEXT), ctx->key, sample + sizeof(counter), counter); return 0; default: diff --git a/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c b/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c index 4b4733a2c36c20..81cadc6424b3e7 100644 --- a/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c +++ b/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c @@ -845,8 +845,9 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, (void)hp; if (!EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) || - !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT) - 1) || - !EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len)) { + !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, + ngtcp2_strlen_lit(PLAINTEXT)) || + !EVP_EncryptFinal_ex(actx, dest + ngtcp2_strlen_lit(PLAINTEXT), &len)) { return -1; } diff --git a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c index 98ebf9e876c053..d9a388e3699ce1 100644 --- a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c +++ b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c @@ -35,6 +35,7 @@ #include #include +#include "ngtcp2_macro.h" #include "shared.h" ngtcp2_crypto_aead *ngtcp2_crypto_aead_aes_128_gcm(ngtcp2_crypto_aead *aead) { @@ -357,7 +358,7 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, (void)hp; ptls_cipher_init(actx, sample); - ptls_cipher_encrypt(actx, dest, PLAINTEXT, sizeof(PLAINTEXT) - 1); + ptls_cipher_encrypt(actx, dest, PLAINTEXT, ngtcp2_strlen_lit(PLAINTEXT)); return 0; } diff --git a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c index 592e5a86535356..742321ec857690 100644 --- a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c +++ b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c @@ -40,6 +40,7 @@ # include #endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L */ +#include "ngtcp2_macro.h" #include "shared.h" #if OPENSSL_VERSION_NUMBER >= 0x30000000L @@ -785,8 +786,9 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, (void)hp; if (!EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) || - !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT) - 1) || - !EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len)) { + !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, + ngtcp2_strlen_lit(PLAINTEXT)) || + !EVP_EncryptFinal_ex(actx, dest + ngtcp2_strlen_lit(PLAINTEXT), &len)) { return -1; } diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.c b/deps/ngtcp2/ngtcp2/crypto/shared.c index 062efb45e950cc..1d8d1d68f78fd7 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.c +++ b/deps/ngtcp2/ngtcp2/crypto/shared.c @@ -53,9 +53,9 @@ int ngtcp2_crypto_hkdf_expand_label(uint8_t *dest, size_t destlen, *p++ = (uint8_t)(destlen / 256); *p++ = (uint8_t)(destlen % 256); - *p++ = (uint8_t)(sizeof(LABEL) - 1 + labellen); - memcpy(p, LABEL, sizeof(LABEL) - 1); - p += sizeof(LABEL) - 1; + *p++ = (uint8_t)(ngtcp2_strlen_lit(LABEL) + labellen); + memcpy(p, LABEL, ngtcp2_strlen_lit(LABEL)); + p += ngtcp2_strlen_lit(LABEL); memcpy(p, label, labellen); p += labellen; *p++ = 0; @@ -88,11 +88,11 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, case NGTCP2_PROTO_VER_V1: default: salt = (const uint8_t *)NGTCP2_INITIAL_SALT_V1; - saltlen = sizeof(NGTCP2_INITIAL_SALT_V1) - 1; + saltlen = ngtcp2_strlen_lit(NGTCP2_INITIAL_SALT_V1); break; case NGTCP2_PROTO_VER_V2: salt = (const uint8_t *)NGTCP2_INITIAL_SALT_V2; - saltlen = sizeof(NGTCP2_INITIAL_SALT_V2) - 1; + saltlen = ngtcp2_strlen_lit(NGTCP2_INITIAL_SALT_V2); break; } @@ -111,10 +111,12 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, if (ngtcp2_crypto_hkdf_expand_label( client_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, sizeof(CLABEL) - 1) != 0 || + NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, + ngtcp2_strlen_lit(CLABEL)) != 0 || ngtcp2_crypto_hkdf_expand_label( server_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, sizeof(SLABEL) - 1) != 0) { + NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, + ngtcp2_strlen_lit(SLABEL)) != 0) { return -1; } @@ -148,19 +150,19 @@ int ngtcp2_crypto_derive_packet_protection_key( switch (version) { case NGTCP2_PROTO_VER_V2: key_label = KEY_LABEL_V2; - key_labellen = sizeof(KEY_LABEL_V2) - 1; + key_labellen = ngtcp2_strlen_lit(KEY_LABEL_V2); iv_label = IV_LABEL_V2; - iv_labellen = sizeof(IV_LABEL_V2) - 1; + iv_labellen = ngtcp2_strlen_lit(IV_LABEL_V2); hp_key_label = HP_KEY_LABEL_V2; - hp_key_labellen = sizeof(HP_KEY_LABEL_V2) - 1; + hp_key_labellen = ngtcp2_strlen_lit(HP_KEY_LABEL_V2); break; default: key_label = KEY_LABEL_V1; - key_labellen = sizeof(KEY_LABEL_V1) - 1; + key_labellen = ngtcp2_strlen_lit(KEY_LABEL_V1); iv_label = IV_LABEL_V1; - iv_labellen = sizeof(IV_LABEL_V1) - 1; + iv_labellen = ngtcp2_strlen_lit(IV_LABEL_V1); hp_key_label = HP_KEY_LABEL_V1; - hp_key_labellen = sizeof(HP_KEY_LABEL_V1) - 1; + hp_key_labellen = ngtcp2_strlen_lit(HP_KEY_LABEL_V1); } if (ngtcp2_crypto_hkdf_expand_label(key, keylen, md, secret, secretlen, @@ -194,11 +196,11 @@ int ngtcp2_crypto_update_traffic_secret(uint8_t *dest, uint32_t version, switch (version) { case NGTCP2_PROTO_VER_V2: label = LABEL_V2; - labellen = sizeof(LABEL_V2) - 1; + labellen = ngtcp2_strlen_lit(LABEL_V2); break; default: label = LABEL; - labellen = sizeof(LABEL) - 1; + labellen = ngtcp2_strlen_lit(LABEL); } if (ngtcp2_crypto_hkdf_expand_label(dest, secretlen, md, secret, secretlen, @@ -592,11 +594,11 @@ int ngtcp2_crypto_derive_and_install_initial_key( case NGTCP2_PROTO_VER_V1: default: retry_key = (const uint8_t *)NGTCP2_RETRY_KEY_V1; - retry_noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + retry_noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: retry_key = (const uint8_t *)NGTCP2_RETRY_KEY_V2; - retry_noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + retry_noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } @@ -845,7 +847,7 @@ int ngtcp2_crypto_generate_stateless_reset_token(uint8_t *token, if (ngtcp2_crypto_hkdf(token, NGTCP2_STATELESS_RESET_TOKENLEN, ngtcp2_crypto_md_sha256(&md), secret, secretlen, cid->data, cid->datalen, info, - sizeof(info) - 1) != 0) { + ngtcp2_strlen_lit(info)) != 0) { return -1; } @@ -865,8 +867,8 @@ static int crypto_derive_token_key(uint8_t *key, size_t keylen, uint8_t *iv, uint8_t *p; assert(ngtcp2_crypto_md_hashlen(md) == sizeof(intsecret)); - assert(info_prefixlen + sizeof(key_info_suffix) - 1 <= sizeof(info)); - assert(info_prefixlen + sizeof(iv_info_suffix) - 1 <= sizeof(info)); + assert(info_prefixlen + ngtcp2_strlen_lit(key_info_suffix) <= sizeof(info)); + assert(info_prefixlen + ngtcp2_strlen_lit(iv_info_suffix) <= sizeof(info)); if (ngtcp2_crypto_hkdf_extract(intsecret, md, secret, secretlen, salt, saltlen) != 0) { @@ -876,8 +878,8 @@ static int crypto_derive_token_key(uint8_t *key, size_t keylen, uint8_t *iv, memcpy(info, info_prefix, info_prefixlen); p = info + info_prefixlen; - memcpy(p, key_info_suffix, sizeof(key_info_suffix) - 1); - p += sizeof(key_info_suffix) - 1; + memcpy(p, key_info_suffix, ngtcp2_strlen_lit(key_info_suffix)); + p += ngtcp2_strlen_lit(key_info_suffix); if (ngtcp2_crypto_hkdf_expand(key, keylen, md, intsecret, sizeof(intsecret), info, (size_t)(p - info)) != 0) { @@ -886,8 +888,8 @@ static int crypto_derive_token_key(uint8_t *key, size_t keylen, uint8_t *iv, p = info + info_prefixlen; - memcpy(p, iv_info_suffix, sizeof(iv_info_suffix) - 1); - p += sizeof(iv_info_suffix) - 1; + memcpy(p, iv_info_suffix, ngtcp2_strlen_lit(iv_info_suffix)); + p += ngtcp2_strlen_lit(iv_info_suffix); if (ngtcp2_crypto_hkdf_expand(iv, ivlen, md, intsecret, sizeof(intsecret), info, (size_t)(p - info)) != 0) { @@ -963,10 +965,10 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, sizeof(rand_data), - retry_token_info_prefix, - sizeof(retry_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + sizeof(rand_data), retry_token_info_prefix, + ngtcp2_strlen_lit(retry_token_info_prefix)) != 0) { return -1; } @@ -1040,10 +1042,10 @@ int ngtcp2_crypto_verify_retry_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, - retry_token_info_prefix, - sizeof(retry_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, retry_token_info_prefix, + ngtcp2_strlen_lit(retry_token_info_prefix)) != 0) { return -1; } @@ -1143,10 +1145,10 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, sizeof(rand_data), - retry_token_info_prefix2, - sizeof(retry_token_info_prefix2) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + sizeof(rand_data), retry_token_info_prefix2, + ngtcp2_strlen_lit(retry_token_info_prefix2)) != 0) { return -1; } @@ -1221,10 +1223,10 @@ int ngtcp2_crypto_verify_retry_token2( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, - retry_token_info_prefix2, - sizeof(retry_token_info_prefix2) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, retry_token_info_prefix2, + ngtcp2_strlen_lit(retry_token_info_prefix2)) != 0) { return NGTCP2_CRYPTO_ERR_INTERNAL; } @@ -1366,10 +1368,10 @@ static ngtcp2_ssize crypto_generate_regular_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, sizeof(rand_data), - regular_token_info_prefix, - sizeof(regular_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + sizeof(rand_data), regular_token_info_prefix, + ngtcp2_strlen_lit(regular_token_info_prefix)) != 0) { return -1; } @@ -1442,10 +1444,10 @@ static ngtcp2_ssize crypto_verify_regular_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, - regular_token_info_prefix, - sizeof(regular_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, regular_token_info_prefix, + ngtcp2_strlen_lit(regular_token_info_prefix)) != 0) { return NGTCP2_CRYPTO_ERR_INTERNAL; } @@ -1601,11 +1603,11 @@ ngtcp2_ssize ngtcp2_crypto_write_retry(uint8_t *dest, size_t destlen, case NGTCP2_PROTO_VER_V1: default: key = (const uint8_t *)NGTCP2_RETRY_KEY_V1; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: key = (const uint8_t *)NGTCP2_RETRY_KEY_V2; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } diff --git a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c index bc9d9d84a862c5..168d32ce109a8d 100644 --- a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c @@ -34,6 +34,7 @@ #include #include +#include "ngtcp2_macro.h" #include "shared.h" #define PRINTF_DEBUG 0 @@ -297,9 +298,10 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, if (wolfSSL_EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) != WOLFSSL_SUCCESS || wolfSSL_EVP_CipherUpdate(actx, dest, &len, PLAINTEXT, - sizeof(PLAINTEXT) - 1) != WOLFSSL_SUCCESS || - wolfSSL_EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len) != - WOLFSSL_SUCCESS) { + ngtcp2_strlen_lit(PLAINTEXT)) != + WOLFSSL_SUCCESS || + wolfSSL_EVP_EncryptFinal_ex(actx, dest + ngtcp2_strlen_lit(PLAINTEXT), + &len) != WOLFSSL_SUCCESS) { DEBUG_MSG("WOLFSSL: hp_mask FAILED\n"); return -1; } diff --git a/deps/ngtcp2/ngtcp2/examples/client.cc b/deps/ngtcp2/ngtcp2/examples/client.cc index 56b757b2d91ed1..c25242962ca44d 100644 --- a/deps/ngtcp2/ngtcp2/examples/client.cc +++ b/deps/ngtcp2/ngtcp2/examples/client.cc @@ -1049,7 +1049,7 @@ ngtcp2_ssize write_pkt(ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_ssize Client::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts) { - std::array vec; + std::array vec; for (;;) { int64_t stream_id = -1; @@ -1057,8 +1057,9 @@ ngtcp2_ssize Client::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, nghttp3_ssize sveccnt = 0; if (httpconn_ && ngtcp2_conn_get_max_data_left(conn_)) { - sveccnt = nghttp3_conn_writev_stream(httpconn_, &stream_id, &fin, - vec.data(), vec.size()); + sveccnt = nghttp3_conn_writev_stream( + httpconn_, &stream_id, &fin, + reinterpret_cast(vec.data()), vec.size()); if (sveccnt < 0) { std::cerr << "nghttp3_conn_writev_stream: " << nghttp3_strerror(static_cast(sveccnt)) << std::endl; @@ -1071,7 +1072,6 @@ ngtcp2_ssize Client::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, } ngtcp2_ssize ndatalen; - auto v = vec.data(); auto vcnt = static_cast(sveccnt); uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_MORE; @@ -1081,7 +1081,7 @@ ngtcp2_ssize Client::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, auto nwrite = ngtcp2_conn_writev_stream( conn_, path, pi, dest, destlen, &ndatalen, flags, stream_id, - reinterpret_cast(v), vcnt, ts); + reinterpret_cast(vec.data()), vcnt, ts); if (nwrite < 0) { switch (nwrite) { case NGTCP2_ERR_STREAM_DATA_BLOCKED: diff --git a/deps/ngtcp2/ngtcp2/examples/server.cc b/deps/ngtcp2/ngtcp2/examples/server.cc index f9463eacd9cc7d..4f081eab920069 100644 --- a/deps/ngtcp2/ngtcp2/examples/server.cc +++ b/deps/ngtcp2/ngtcp2/examples/server.cc @@ -1652,7 +1652,7 @@ ngtcp2_ssize write_pkt(ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_ssize Handler::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts) { - std::array vec; + std::array vec; for (;;) { int64_t stream_id = -1; @@ -1660,8 +1660,9 @@ ngtcp2_ssize Handler::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, nghttp3_ssize sveccnt = 0; if (httpconn_ && ngtcp2_conn_get_max_data_left(conn_)) { - sveccnt = nghttp3_conn_writev_stream(httpconn_, &stream_id, &fin, - vec.data(), vec.size()); + sveccnt = nghttp3_conn_writev_stream( + httpconn_, &stream_id, &fin, + reinterpret_cast(vec.data()), vec.size()); if (sveccnt < 0) { std::cerr << "nghttp3_conn_writev_stream: " << nghttp3_strerror(static_cast(sveccnt)) << std::endl; @@ -1674,7 +1675,6 @@ ngtcp2_ssize Handler::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, } ngtcp2_ssize ndatalen; - auto v = vec.data(); auto vcnt = static_cast(sveccnt); uint32_t flags = @@ -1685,7 +1685,7 @@ ngtcp2_ssize Handler::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, auto nwrite = ngtcp2_conn_writev_stream( conn_, path, pi, dest, destlen, &ndatalen, flags, stream_id, - reinterpret_cast(v), vcnt, ts); + reinterpret_cast(vec.data()), vcnt, ts); if (nwrite < 0) { switch (nwrite) { case NGTCP2_ERR_STREAM_DATA_BLOCKED: diff --git a/deps/ngtcp2/ngtcp2/examples/shared.h b/deps/ngtcp2/ngtcp2/examples/shared.h index 26e678816e8f98..5455a529a6ee0f 100644 --- a/deps/ngtcp2/ngtcp2/examples/shared.h +++ b/deps/ngtcp2/ngtcp2/examples/shared.h @@ -34,6 +34,7 @@ #include #include +#include #include "network.h" @@ -63,6 +64,11 @@ inline constexpr uint32_t TLS_ALERT_ECH_REQUIRED = 121; inline constexpr size_t MAX_RECV_PKTS = 64; +union SharedVec { + ngtcp2_vec v2; + nghttp3_vec v3; +}; + // msghdr_get_ecn gets ECN bits from |msg|. |family| is the address // family from which packet is received. uint8_t msghdr_get_ecn(msghdr *msg, int family); diff --git a/deps/ngtcp2/ngtcp2/examples/sim.cc b/deps/ngtcp2/ngtcp2/examples/sim.cc index d4dc423eebe189..b1e778f165dbbc 100644 --- a/deps/ngtcp2/ngtcp2/examples/sim.cc +++ b/deps/ngtcp2/ngtcp2/examples/sim.cc @@ -95,7 +95,7 @@ uint64_t LinkConfig::compute_expected_goodput(Timestamp::duration rtt) const { return g; } - constexpr double margin = 0.95; + constexpr double margin = 0.9; return std::min(g, static_cast(MAX_UDP_PAYLOAD_SIZE * NGTCP2_SECONDS / @@ -657,6 +657,12 @@ Event Channel::get_next_event() { }; } +void Channel::run_eventcb(Timestamp ts) { + if (link_config_.eventcb) { + link_config_.eventcb(ts, link_config_); + } +} + Simulator::Simulator(Endpoint client, Endpoint server) : client_{std::move(client)}, server_{std::move(server)} {} @@ -727,6 +733,9 @@ int Simulator::run() { client_chan.pop_tx_queue(); server_chan.pop_tx_queue(); + client_chan.run_eventcb(ts); + server_chan.run_eventcb(ts); + switch (event.type) { case EVENT_TYPE_TIMEOUT: { auto ctx = Context{ diff --git a/deps/ngtcp2/ngtcp2/examples/sim.h b/deps/ngtcp2/ngtcp2/examples/sim.h index d4f31233581110..a70388686ae9da 100644 --- a/deps/ngtcp2/ngtcp2/examples/sim.h +++ b/deps/ngtcp2/ngtcp2/examples/sim.h @@ -91,6 +91,10 @@ struct LinkConfig { double loss{}; // seed is a seed value for the random number generator. std::mt19937::result_type seed{}; + // eventcb is an optional callback that is invoked before processing + // each event. In this callback, LinkConfig can be dynamically + // adjusted to simulate dynamic network conditions. + std::function eventcb; }; struct EndpointConfig { @@ -174,6 +178,7 @@ class Channel { Timestamp get_next_timestamp() const; Event get_next_event(); void pop_tx_queue(); + void run_eventcb(Timestamp ts); private: bool decide_pkt_lost(); diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h index a89e9d8184d513..a09ceea382bab1 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h @@ -5919,9 +5919,9 @@ NGTCP2_EXTERN void ngtcp2_path_storage_zero(ngtcp2_path_storage *ps); * * :member:`handshake_timeout ` = * ``UINT64_MAX`` * * :member:`glitch_ratelim_burst - * ` = 4000 + * ` = 10000 * * :member:`glitch_ratelim_rate - * ` = 132 + * ` = 330 */ NGTCP2_EXTERN void ngtcp2_settings_default_versioned(int settings_version, ngtcp2_settings *settings); diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h index 62904c53ab5df1..6a1ca013450d24 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h @@ -36,7 +36,7 @@ * * Version number of the ngtcp2 library release. */ -#define NGTCP2_VERSION "1.19.0" +#define NGTCP2_VERSION "1.20.0" /** * @macro @@ -46,6 +46,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGTCP2_VERSION_NUM 0x011300 +#define NGTCP2_VERSION_NUM 0x011400 #endif /* !defined(NGTCP2_VERSION_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h index 6505a1759484e9..1a591c5ead84ea 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h @@ -120,8 +120,6 @@ typedef struct ngtcp2_acktr { packet number. */ ngtcp2_ksl ents; ngtcp2_log *log; - /* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */ - uint16_t flags; /* first_unacked_ts is timestamp when ngtcp2_acktr_entry is added first time after the last outgoing ACK frame. */ ngtcp2_tstamp first_unacked_ts; @@ -148,6 +146,9 @@ typedef struct ngtcp2_acktr { uint64_t ce; } ack; } ecn; + + /* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */ + uint16_t flags; } ngtcp2_acktr; /* diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h index 5a74921c195007..98b23122ff9908 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h @@ -75,8 +75,8 @@ typedef struct ngtcp2_cc_bbr { ngtcp2_tstamp min_rtt_stamp; ngtcp2_tstamp probe_rtt_done_stamp; int probe_rtt_round_done; - uint64_t prior_cwnd; int idle_restart; + uint64_t prior_cwnd; ngtcp2_tstamp extra_acked_interval_start; uint64_t extra_acked_delivered; @@ -91,8 +91,8 @@ typedef struct ngtcp2_cc_bbr { /* Round counting */ uint64_t next_round_delivered; - int round_start; uint64_t round_count; + int round_start; /* Full pipe */ uint64_t full_bw; @@ -111,7 +111,6 @@ typedef struct ngtcp2_cc_bbr { uint64_t undo_inflight_shortterm; uint64_t undo_inflight_longterm; - int loss_round_start; uint64_t loss_round_delivered; uint64_t rounds_since_bw_probe; uint64_t max_bw; @@ -125,17 +124,18 @@ typedef struct ngtcp2_cc_bbr { ngtcp2_tstamp cycle_stamp; ngtcp2_bbr_ack_phase ack_phase; ngtcp2_duration bw_probe_wait; - int bw_probe_samples; size_t bw_probe_up_rounds; uint64_t bw_probe_up_acks; uint64_t inflight_longterm; - int probe_rtt_expired; ngtcp2_duration probe_rtt_min_delay; ngtcp2_tstamp probe_rtt_min_stamp; - int in_loss_recovery; uint64_t round_count_at_recovery; uint64_t max_inflight; uint64_t bdp; + int loss_round_start; + int bw_probe_samples; + int probe_rtt_expired; + int in_loss_recovery; } ngtcp2_cc_bbr; void ngtcp2_cc_bbr_init(ngtcp2_cc_bbr *bbr, ngtcp2_log *log, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c index fdf9516c3e9345..84a41943a801d5 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c @@ -2174,18 +2174,14 @@ static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { } /* - * conn_cut_crypto_frame splits (*pfrc)->fr.stream by removing - * |removed_data| from (*pfrc)->fr.stream.data[0]. - * (*pfrc)->fr.stream.data[0] must contain |removed_data|, and - * (*pfrc)->fr.stream.datacnt >= 1. New ngtcp2_frame_chain object - * that contains |removed_data| is created, and pushed to - * |crypto_strm| via ngtcp2_strm_streamfrq_push. Because - * (*pfrc)->fr.stream.datacnt cannot be changed, if it is not 1, new - * ngtcp2_frame_chain object is created to contain the data before - * |removed_data|. Then *pfrc is deleted, and the newly created - * object is assigned to *pfrc instead. If there are data following - * the removed part of data, new ngtcp2_frame_chain object is created - * for it, and (*pfrc)->next points to the object. + * conn_cut_crypto_frame splits frc->fr.stream by removing + * |removed_data| from frc->fr.stream.data[0]. frc->fr.stream.data[0] + * must contain |removed_data|, and frc->fr.stream.datacnt >= 1. New + * ngtcp2_frame_chain object that contains |removed_data| is created, + * and pushed to |crypto_strm| via ngtcp2_strm_streamfrq_push. If + * there are data following the removed part of data, new + * ngtcp2_frame_chain object is created for it, and frc->next points + * to the object. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -2193,13 +2189,13 @@ static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { * NGTCP2_ERR_NOMEM * Out of memory */ -static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, +static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain *frc, ngtcp2_strm *crypto_strm, const ngtcp2_vec *removed_data) { - ngtcp2_vec *data = (*pfrc)->fr.stream.data; - size_t datacnt = (*pfrc)->fr.stream.datacnt; + ngtcp2_vec *data = frc->fr.stream.data; + size_t datacnt = frc->fr.stream.datacnt; size_t ndatacnt; - ngtcp2_frame_chain *left_frc, *right_frc = NULL, *removed_frc; + ngtcp2_frame_chain *right_frc = NULL, *removed_frc; size_t offset; int rv; @@ -2220,7 +2216,7 @@ static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, removed_frc->fr.stream.flags = 0; removed_frc->fr.stream.fin = 0; removed_frc->fr.stream.stream_id = 0; - removed_frc->fr.stream.offset = (*pfrc)->fr.stream.offset + offset; + removed_frc->fr.stream.offset = frc->fr.stream.offset + offset; removed_frc->fr.stream.datacnt = 1; removed_frc->fr.stream.data[0] = (ngtcp2_vec){ .base = data->base + offset, @@ -2259,35 +2255,9 @@ static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, assert(1 == datacnt); } - /* We cannot change (*pfrc)->fr.stream.datacnt. If it changes, - create new ngtcp2_frame_chain. */ - if ((*pfrc)->fr.stream.datacnt == 1) { - (*pfrc)->fr.stream.data[0].len = offset; - (*pfrc)->next = right_frc; - return 0; - } - - rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &left_frc, 1, &conn->frc_objalloc, conn->mem); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(right_frc, &conn->frc_objalloc, conn->mem); - return rv; - } - - left_frc->fr.stream.type = NGTCP2_FRAME_CRYPTO; - left_frc->fr.stream.flags = 0; - left_frc->fr.stream.fin = 0; - left_frc->fr.stream.stream_id = 0; - left_frc->fr.stream.offset = (*pfrc)->fr.stream.offset; - left_frc->fr.stream.datacnt = 1; - left_frc->fr.stream.data[0] = (ngtcp2_vec){ - .base = data[0].base, - .len = offset, - }; - left_frc->next = right_frc; - - ngtcp2_frame_chain_objalloc_del(*pfrc, &conn->frc_objalloc, conn->mem); - *pfrc = left_frc; + frc->fr.stream.datacnt = 1; + frc->fr.stream.data[0].len = offset; + frc->next = right_frc; return 0; } @@ -2371,7 +2341,7 @@ conn_crumble_initial_crypto(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, datacnt = ngtcp2_pkt_remove_vec_partial( &removed_data, data, datacnt, offsets, &conn->pcg, &server_name); - rv = conn_cut_crypto_frame(conn, pfrc, crypto_strm, &removed_data); + rv = conn_cut_crypto_frame(conn, *pfrc, crypto_strm, &removed_data); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(*pfrc, &conn->frc_objalloc, conn->mem); return rv; @@ -2635,7 +2605,9 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, if (!(rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) && pktns->rtb.num_retransmittable && pktns->rtb.probe_pkt_left) { - num_reclaimed = ngtcp2_rtb_reclaim_on_pto(&pktns->rtb, conn, pktns, 1); + num_reclaimed = ngtcp2_rtb_reclaim_on_pto( + &pktns->rtb, conn, pktns, + !conn->server && type == NGTCP2_PKT_INITIAL ? 2 : 1); if (num_reclaimed < 0) { ngtcp2_frame_chain_list_objalloc_del(frq, &conn->frc_objalloc, conn->mem); @@ -5566,14 +5538,10 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, num_acked = ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns, pkt_ts, ts); - if (num_acked < 0) { + if (num_acked <= 0) { return (int)num_acked; } - if (num_acked == 0) { - return 0; - } - pktns->rtb.probe_pkt_left = 0; if (cstat->pto_count && @@ -11744,21 +11712,18 @@ int ngtcp2_conn_set_0rtt_remote_transport_params( /* These parameters are treated specially. If server accepts early data, it must not set values for these parameters that are smaller than these remembered values. */ - conn->early.transport_params.initial_max_streams_bidi = - params->initial_max_streams_bidi; - conn->early.transport_params.initial_max_streams_uni = - params->initial_max_streams_uni; - conn->early.transport_params.initial_max_stream_data_bidi_local = - params->initial_max_stream_data_bidi_local; - conn->early.transport_params.initial_max_stream_data_bidi_remote = - params->initial_max_stream_data_bidi_remote; - conn->early.transport_params.initial_max_stream_data_uni = - params->initial_max_stream_data_uni; - conn->early.transport_params.initial_max_data = params->initial_max_data; - conn->early.transport_params.active_connection_id_limit = - params->active_connection_id_limit; - conn->early.transport_params.max_datagram_frame_size = - params->max_datagram_frame_size; + conn->early.transport_params = (ngtcp2_early_transport_params){ + .initial_max_streams_bidi = params->initial_max_streams_bidi, + .initial_max_streams_uni = params->initial_max_streams_uni, + .initial_max_stream_data_bidi_local = + params->initial_max_stream_data_bidi_local, + .initial_max_stream_data_bidi_remote = + params->initial_max_stream_data_bidi_remote, + .initial_max_stream_data_uni = params->initial_max_stream_data_uni, + .initial_max_data = params->initial_max_data, + .active_connection_id_limit = params->active_connection_id_limit, + .max_datagram_frame_size = params->max_datagram_frame_size, + }; conn_sync_stream_id_limit(conn); @@ -12003,12 +11968,17 @@ ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( return NGTCP2_ERR_INVALID_ARGUMENT; } - vmsg.type = NGTCP2_VMSG_TYPE_STREAM; - vmsg.stream.strm = strm; - vmsg.stream.flags = flags; - vmsg.stream.data = datav; - vmsg.stream.datacnt = datavcnt; - vmsg.stream.pdatalen = pdatalen; + vmsg = (ngtcp2_vmsg){ + .type = NGTCP2_VMSG_TYPE_STREAM, + .stream = + { + .strm = strm, + .data = datav, + .datacnt = datavcnt, + .pdatalen = pdatalen, + .flags = flags, + }, + }; pvmsg = &vmsg; } @@ -12081,12 +12051,17 @@ ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( return NGTCP2_ERR_INVALID_ARGUMENT; } - vmsg.type = NGTCP2_VMSG_TYPE_DATAGRAM; - vmsg.datagram.dgram_id = dgram_id; - vmsg.datagram.flags = flags; - vmsg.datagram.data = datav; - vmsg.datagram.datacnt = datavcnt; - vmsg.datagram.paccepted = paccepted; + vmsg = (ngtcp2_vmsg){ + .type = NGTCP2_VMSG_TYPE_DATAGRAM, + .datagram = + { + .data = datav, + .datacnt = datavcnt, + .dgram_id = dgram_id, + .paccepted = paccepted, + .flags = flags, + }, + }; if (flags & NGTCP2_WRITE_DATAGRAM_FLAG_PADDING) { wflags = NGTCP2_WRITE_PKT_FLAG_PADDING_IF_NOT_EMPTY; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h index 6c11e324173327..a6f7616ee0c7d6 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h @@ -114,7 +114,7 @@ typedef enum { typedef struct ngtcp2_path_challenge_entry { ngtcp2_path_storage ps; - uint8_t data[8]; + uint8_t data[NGTCP2_PATH_CHALLENGE_DATALEN]; } ngtcp2_path_challenge_entry; void ngtcp2_path_challenge_entry_init(ngtcp2_path_challenge_entry *pcent, @@ -387,14 +387,14 @@ struct ngtcp2_conn { ngtcp2_tstamp last_max_data_ts; struct { - /* state is the state of ECN validation */ - ngtcp2_ecn_state state; /* validation_start_ts is the timestamp when ECN validation is started. It is UINT64_MAX if it has not started yet. */ ngtcp2_tstamp validation_start_ts; /* dgram_sent is the number of UDP datagram sent during ECN validation period. */ size_t dgram_sent; + /* state is the state of ECN validation */ + ngtcp2_ecn_state state; } ecn; struct { @@ -545,13 +545,13 @@ struct ngtcp2_conn { /* retry_aead_ctx is AEAD cipher context to verify Retry packet integrity. It is used by client only. */ ngtcp2_crypto_aead_ctx retry_aead_ctx; + /* decryption_failure_count is the number of received packets that + fail authentication. */ + uint64_t decryption_failure_count; /* tls_error is TLS related error. */ int tls_error; /* tls_alert is TLS alert generated by the local endpoint. */ uint8_t tls_alert; - /* decryption_failure_count is the number of received packets that - fail authentication. */ - uint64_t decryption_failure_count; } crypto; /* pkt contains the packet intermediate construction data to support @@ -561,13 +561,13 @@ struct ngtcp2_conn { ngtcp2_pkt_hd hd; ngtcp2_ppe ppe; ngtcp2_frame_chain **pfrc; + ngtcp2_ssize hs_spktlen; int pkt_empty; int hd_logged; + int require_padding; /* flags is bitwise OR of zero or more of NGTCP2_RTB_ENTRY_FLAG_*. */ uint16_t rtb_entry_flags; - ngtcp2_ssize hs_spktlen; - int require_padding; } pkt; struct { @@ -623,7 +623,6 @@ struct ngtcp2_conn { ngtcp2_log log; ngtcp2_qlog qlog; ngtcp2_rst rst; - ngtcp2_cc_algo cc_algo; union { ngtcp2_cc cc; ngtcp2_cc_reno reno; @@ -650,6 +649,7 @@ struct ngtcp2_conn { uint32_t negotiated_version; /* flags is bitwise OR of zero or more of NGTCP2_CONN_FLAG_*. */ uint32_t flags; + ngtcp2_cc_algo cc_algo; int server; }; @@ -661,9 +661,6 @@ typedef enum ngtcp2_vmsg_type { typedef struct ngtcp2_vmsg_stream { /* strm is a stream that data is sent to. */ ngtcp2_strm *strm; - /* flags is bitwise OR of zero or more of - NGTCP2_WRITE_STREAM_FLAG_*. */ - uint32_t flags; /* data is the pointer to ngtcp2_vec array which contains the stream data to send. */ const ngtcp2_vec *data; @@ -672,6 +669,9 @@ typedef struct ngtcp2_vmsg_stream { /* pdatalen is the pointer to the variable which the number of bytes written is assigned to if pdatalen is not NULL. */ ngtcp2_ssize *pdatalen; + /* flags is bitwise OR of zero or more of + NGTCP2_WRITE_STREAM_FLAG_*. */ + uint32_t flags; } ngtcp2_vmsg_stream; typedef struct ngtcp2_vmsg_datagram { @@ -682,12 +682,12 @@ typedef struct ngtcp2_vmsg_datagram { size_t datacnt; /* dgram_id is an opaque identifier chosen by an application. */ uint64_t dgram_id; - /* flags is bitwise OR of zero or more of - NGTCP2_WRITE_DATAGRAM_FLAG_*. */ - uint32_t flags; /* paccepted is the pointer to the variable which, if it is not NULL, is assigned nonzero if data is written to a packet. */ int *paccepted; + /* flags is bitwise OR of zero or more of + NGTCP2_WRITE_DATAGRAM_FLAG_*. */ + uint32_t flags; } ngtcp2_vmsg_datagram; typedef struct ngtcp2_vmsg { diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c index dc17d576b8044b..ec0839b7a4d126 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c @@ -36,7 +36,7 @@ int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc, return NGTCP2_ERR_NOMEM; } - ngtcp2_frame_chain_init(*pfrc); + ngtcp2_frame_chain_init(*pfrc, NGTCP2_FRAME_CHAIN_FLAG_NONE); return 0; } @@ -48,7 +48,7 @@ int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, return NGTCP2_ERR_NOMEM; } - ngtcp2_frame_chain_init(*pfrc); + ngtcp2_frame_chain_init(*pfrc, NGTCP2_FRAME_CHAIN_FLAG_MALLOC); return 0; } @@ -110,21 +110,6 @@ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, return 0; } -void ngtcp2_frame_chain_del(ngtcp2_frame_chain *frc, const ngtcp2_mem *mem) { - ngtcp2_frame_chain_binder *binder; - - if (frc == NULL) { - return; - } - - binder = frc->binder; - if (binder && --binder->refcount == 0) { - ngtcp2_mem_free(mem, binder); - } - - ngtcp2_mem_free(mem, frc); -} - void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem) { @@ -134,39 +119,23 @@ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, return; } - switch (frc->fr.hd.type) { - case NGTCP2_FRAME_CRYPTO: - case NGTCP2_FRAME_STREAM: - if (frc->fr.stream.datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { - ngtcp2_frame_chain_del(frc, mem); - - return; - } - - break; - case NGTCP2_FRAME_NEW_TOKEN: - if (frc->fr.new_token.tokenlen > NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES) { - ngtcp2_frame_chain_del(frc, mem); - - return; - } - - break; - } - binder = frc->binder; if (binder && --binder->refcount == 0) { ngtcp2_mem_free(mem, binder); } - frc->binder = NULL; + if (frc->flags & NGTCP2_FRAME_CHAIN_FLAG_MALLOC) { + ngtcp2_mem_free(mem, frc); + return; + } ngtcp2_objalloc_frame_chain_release(objalloc, frc); } -void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc) { +void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc, uint32_t flags) { frc->next = NULL; frc->binder = NULL; + frc->flags = flags; } void ngtcp2_frame_chain_list_objalloc_del(ngtcp2_frame_chain *frc, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h index aa8ce4958386c9..5342b9fa7b1692 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h @@ -70,6 +70,12 @@ int ngtcp2_frame_chain_binder_new(ngtcp2_frame_chain_binder **pbinder, #define NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES \ (NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES * sizeof(ngtcp2_vec)) +/* NGTCP2_FRAME_CHAIN_FLAG_NONE indicates no flag is set. */ +#define NGTCP2_FRAME_CHAIN_FLAG_NONE 0x0 +/* NGTCP2_FRAME_CHAIN_FLAG_MALLOC indicates that ngtcp2_frame_chain is + allocated by ngtcp2_mem_malloc. */ +#define NGTCP2_FRAME_CHAIN_FLAG_MALLOC 0x1 + typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; /* @@ -80,6 +86,7 @@ struct ngtcp2_frame_chain { struct { ngtcp2_frame_chain *next; ngtcp2_frame_chain_binder *binder; + uint32_t flags; ngtcp2_frame fr; uint8_t buf[sizeof(ngtcp2_vec) * NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES]; }; @@ -125,8 +132,6 @@ int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, * words, |datacnt| <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES, * ngtcp2_frame_chain_objalloc_new is called internally. Otherwise, * ngtcp2_frame_chain_extralen_new is used and objalloc is not used. - * Therefore, it is important to call ngtcp2_frame_chain_objalloc_del - * without changing datacnt field. */ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, @@ -147,24 +152,19 @@ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, const ngtcp2_mem *mem); /* - * ngtcp2_frame_chain_del deallocates |frc|. It also deallocates the - * memory pointed by |frc|. - */ -void ngtcp2_frame_chain_del(ngtcp2_frame_chain *frc, const ngtcp2_mem *mem); - -/* - * ngtcp2_frame_chain_objalloc_del adds |frc| to |objalloc| for reuse. - * It might just delete |frc| depending on the frame type and the size - * of |frc|. + * ngtcp2_frame_chain_objalloc_del adds |frc| to |objalloc| for reuse + * if NGTCP2_FRAME_CHAIN_FLAG_MALLOC is not set in |frc|->flags. + * Otherwise, it deletes |frc|. */ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem); /* - * ngtcp2_frame_chain_init initializes |frc|. + * ngtcp2_frame_chain_init initializes |frc|. |flags| is bitwise-OR + * of zero or more of NGTCP2_FRAME_CHAIN_FLAG_*. */ -void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc); +void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc, uint32_t flags); /* * ngtcp2_frame_chain_list_objalloc_del adds all ngtcp2_frame_chain diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c index 03a95b9319a45d..0c1c0a36c5bcf9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c @@ -58,11 +58,13 @@ void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, aligned_keylen = (keylen + 0x7u) & ~0x7u; + assert(aligned_keylen <= UINT16_MAX); + ngtcp2_objalloc_init(&ksl->blkalloc, (ksl_blklen(aligned_keylen) + 0xfu) & ~(uintptr_t)0xfu, mem); - ksl->head = NULL; + ksl->root = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; ksl->search = search; @@ -80,6 +82,7 @@ static ngtcp2_ksl_blk *ksl_blk_objalloc_new(ngtcp2_ksl *ksl) { } blk->keys = (uint8_t *)blk + sizeof(*blk); + blk->aligned_keylen = (uint16_t)ksl->aligned_keylen; return blk; } @@ -88,19 +91,19 @@ static void ksl_blk_objalloc_del(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { ngtcp2_objalloc_ksl_blk_release(&ksl->blkalloc, blk); } -static int ksl_head_init(ngtcp2_ksl *ksl) { - ngtcp2_ksl_blk *head = ksl_blk_objalloc_new(ksl); +static int ksl_root_init(ngtcp2_ksl *ksl) { + ngtcp2_ksl_blk *root = ksl_blk_objalloc_new(ksl); - if (!head) { + if (!root) { return NGTCP2_ERR_NOMEM; } - head->next = head->prev = NULL; - head->n = 0; - head->leaf = 1; + root->next = root->prev = NULL; + root->n = 0; + root->leaf = 1; - ksl->head = head; - ksl->front = ksl->back = head; + ksl->root = root; + ksl->front = ksl->back = root; return 0; } @@ -123,12 +126,12 @@ static void ksl_free_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { #endif /* defined(NOMEMPOOL) */ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) { - if (!ksl || !ksl->head) { + if (!ksl || !ksl->root) { return; } #ifdef NOMEMPOOL - ksl_free_blk(ksl, ksl->head); + ksl_free_blk(ksl, ksl->root); #endif /* defined(NOMEMPOOL) */ ngtcp2_objalloc_free(&ksl->blkalloc); @@ -198,22 +201,21 @@ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { memmove(blk->nodes + (i + 2), blk->nodes + (i + 1), (blk->n - (i + 1)) * sizeof(ngtcp2_ksl_node)); - memmove(blk->keys + (i + 2) * ksl->aligned_keylen, - blk->keys + (i + 1) * ksl->aligned_keylen, - (blk->n - (i + 1)) * ksl->aligned_keylen); + memmove(blk->keys + (i + 1) * ksl->aligned_keylen, + blk->keys + i * ksl->aligned_keylen, + (blk->n - i) * ksl->aligned_keylen); blk->nodes[i + 1].blk = rblk; ++blk->n; - ksl_set_nth_key(ksl, blk, i + 1, ngtcp2_ksl_nth_key(ksl, rblk, rblk->n - 1)); - ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); return 0; } /* - * ksl_split_head splits a head (root) block. It increases the height - * of skip list by 1. + * ksl_split_root splits a root block. It increases the height of + * skip list by 1. * * It returns 0 if it succeeds, or one of the following negative error * codes: @@ -221,34 +223,34 @@ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * NGTCP2_ERR_NOMEM * Out of memory. */ -static int ksl_split_head(ngtcp2_ksl *ksl) { - ngtcp2_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; +static int ksl_split_root(ngtcp2_ksl *ksl) { + ngtcp2_ksl_blk *rblk = NULL, *lblk, *nroot = NULL; - rblk = ksl_split_blk(ksl, ksl->head); + rblk = ksl_split_blk(ksl, ksl->root); if (rblk == NULL) { return NGTCP2_ERR_NOMEM; } - lblk = ksl->head; + lblk = ksl->root; - nhead = ksl_blk_objalloc_new(ksl); + nroot = ksl_blk_objalloc_new(ksl); - if (nhead == NULL) { + if (nroot == NULL) { ksl_blk_objalloc_del(ksl, rblk); return NGTCP2_ERR_NOMEM; } - nhead->next = nhead->prev = NULL; - nhead->n = 2; - nhead->leaf = 0; + nroot->next = nroot->prev = NULL; + nroot->n = 2; + nroot->leaf = 0; - ksl_set_nth_key(ksl, nhead, 0, ngtcp2_ksl_nth_key(ksl, lblk, lblk->n - 1)); - nhead->nodes[0].blk = lblk; + ksl_set_nth_key(ksl, nroot, 0, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); + nroot->nodes[0].blk = lblk; - ksl_set_nth_key(ksl, nhead, 1, ngtcp2_ksl_nth_key(ksl, rblk, rblk->n - 1)); - nhead->nodes[1].blk = rblk; + ksl_set_nth_key(ksl, nroot, 1, ngtcp2_ksl_blk_nth_key(rblk, rblk->n - 1)); + nroot->nodes[1].blk = rblk; - ksl->head = nhead; + ksl->root = nroot; return 0; } @@ -283,27 +285,27 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, size_t i; int rv; - if (!ksl->head) { - rv = ksl_head_init(ksl); + if (!ksl->root) { + rv = ksl_root_init(ksl); if (rv != 0) { return rv; } } - if (ksl->head->n == NGTCP2_KSL_MAX_NBLK) { - rv = ksl_split_head(ksl); + if (ksl->root->n == NGTCP2_KSL_MAX_NBLK) { + rv = ksl_split_root(ksl); if (rv != 0) { return rv; } } - blk = ksl->head; + blk = ksl->root; for (;;) { i = ksl->search(ksl, blk, key); if (blk->leaf) { - if (i < blk->n && !ksl->compar(key, ngtcp2_ksl_nth_key(ksl, blk, i))) { + if (i < blk->n && !ksl->compar(key, ngtcp2_ksl_blk_nth_key(blk, i))) { if (it) { *it = ngtcp2_ksl_end(ksl); } @@ -315,7 +317,7 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ++ksl->n; if (it) { - ngtcp2_ksl_it_init(it, ksl, blk, i); + ngtcp2_ksl_it_init(it, blk, i); } return 0; @@ -342,7 +344,7 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ++ksl->n; if (it) { - ngtcp2_ksl_it_init(it, ksl, blk, blk->n - 1); + ngtcp2_ksl_it_init(it, blk, blk->n - 1); } return 0; @@ -356,12 +358,8 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, return rv; } - if (ksl->compar(ngtcp2_ksl_nth_key(ksl, blk, i), key)) { + if (ksl->compar(ngtcp2_ksl_blk_nth_key(blk, i), key)) { node = &blk->nodes[i + 1]; - - if (ksl->compar(ngtcp2_ksl_nth_key(ksl, blk, i + 1), key)) { - ksl_set_nth_key(ksl, blk, i + 1, key); - } } } @@ -388,9 +386,9 @@ static void ksl_remove_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the head (root) block and it contains just 2 nodes - * before merging nodes, the merged block becomes head block, which - * decreases the height of |ksl| by 1. + * If |blk| is the root block and it contains just 2 nodes before + * merging nodes, the merged block becomes root block, which decreases + * the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ @@ -406,7 +404,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, lblk = lnode->blk; rblk = blk->nodes[i + 1].blk; - assert(lblk->n + rblk->n < NGTCP2_KSL_MAX_NBLK); + assert(lblk->n + rblk->n <= NGTCP2_KSL_MAX_NBLK); memcpy(lblk->nodes + lblk->n, rblk->nodes, rblk->n * sizeof(ngtcp2_ksl_node)); @@ -424,12 +422,12 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, ksl_blk_objalloc_del(ksl, rblk); - if (ksl->head == blk && blk->n == 2) { - ksl_blk_objalloc_del(ksl, ksl->head); - ksl->head = lblk; + if (ksl->root == blk && blk->n == 2) { + ksl_blk_objalloc_del(ksl, ksl->root); + ksl->root = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); } return lblk; @@ -470,7 +468,7 @@ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { lblk->n += (uint32_t)n; rblk->n -= (uint32_t)n; - ksl_set_nth_key(ksl, blk, i - 1, ngtcp2_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i - 1, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); memmove(rblk->nodes, rblk->nodes + n, rblk->n * sizeof(ngtcp2_ksl_node)); @@ -518,7 +516,7 @@ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { memcpy(rblk->keys, lblk->keys + lblk->n * ksl->aligned_keylen, n * ksl->aligned_keylen); - ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); } /* @@ -535,9 +533,9 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key) { ngtcp2_ksl_blk *blk = hint->blk; - assert(ksl->head); + assert(ksl->root); - if (blk->n <= NGTCP2_KSL_MIN_NBLK) { + if (blk != ksl->root && blk->n == NGTCP2_KSL_MIN_NBLK) { return ngtcp2_ksl_remove(ksl, it, key); } @@ -547,9 +545,9 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { if (hint->i == blk->n && blk->next) { - ngtcp2_ksl_it_init(it, ksl, blk->next, 0); + ngtcp2_ksl_it_init(it, blk->next, 0); } else { - ngtcp2_ksl_it_init(it, ksl, blk, hint->i); + ngtcp2_ksl_it_init(it, blk, hint->i); } } @@ -558,7 +556,7 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key) { - ngtcp2_ksl_blk *blk = ksl->head; + ngtcp2_ksl_blk *blk = ksl->root; ngtcp2_ksl_node *node; size_t i; @@ -584,7 +582,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } if (blk->leaf) { - if (ksl->compar(key, ngtcp2_ksl_nth_key(ksl, blk, i))) { + if (ksl->compar(key, ngtcp2_ksl_blk_nth_key(blk, i))) { if (it) { *it = ngtcp2_ksl_end(ksl); } @@ -597,9 +595,9 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { if (blk->n == i && blk->next) { - ngtcp2_ksl_it_init(it, ksl, blk->next, 0); + ngtcp2_ksl_it_init(it, blk->next, 0); } else { - ngtcp2_ksl_it_init(it, ksl, blk, i); + ngtcp2_ksl_it_init(it, blk, i); } } @@ -648,12 +646,12 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound(const ngtcp2_ksl *ksl, ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key, ngtcp2_ksl_search search) { - ngtcp2_ksl_blk *blk = ksl->head; + ngtcp2_ksl_blk *blk = ksl->root; ngtcp2_ksl_it it; size_t i; if (!blk) { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); + ngtcp2_ksl_it_init(&it, &null_blk, 0); return it; } @@ -666,7 +664,7 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, i = 0; } - ngtcp2_ksl_it_init(&it, ksl, blk, i); + ngtcp2_ksl_it_init(&it, blk, i); return it; } @@ -684,7 +682,7 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, i = blk->n; } - ngtcp2_ksl_it_init(&it, ksl, blk, i); + ngtcp2_ksl_it_init(&it, blk, i); return it; } @@ -695,19 +693,19 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, const ngtcp2_ksl_key *new_key) { - ngtcp2_ksl_blk *blk = ksl->head; + ngtcp2_ksl_blk *blk = ksl->root; ngtcp2_ksl_node *node; const ngtcp2_ksl_key *node_key; size_t i; - assert(ksl->head); + assert(ksl->root); for (;;) { i = ksl->search(ksl, blk, old_key); assert(i < blk->n); node = &blk->nodes[i]; - node_key = ngtcp2_ksl_nth_key(ksl, blk, i); + node_key = ngtcp2_ksl_blk_nth_key(blk, i); if (blk->leaf) { assert(key_equal(ksl->compar, node_key, old_key)); @@ -728,15 +726,15 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl) { return ksl->n; } void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { - if (!ksl->head) { + if (!ksl->root) { return; } #ifdef NOMEMPOOL - ksl_free_blk(ksl, ksl->head); + ksl_free_blk(ksl, ksl->root); #endif /* defined(NOMEMPOOL) */ - ksl->front = ksl->back = ksl->head = NULL; + ksl->front = ksl->back = ksl->root = NULL; ksl->n = 0; ngtcp2_objalloc_clear(&ksl->blkalloc); @@ -751,7 +749,7 @@ static void ksl_print(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, if (blk->leaf) { for (i = 0; i < blk->n; ++i) { - fprintf(stderr, " %" PRId64, *(int64_t *)ngtcp2_ksl_nth_key(ksl, blk, i)); + fprintf(stderr, " %" PRId64, *(int64_t *)ngtcp2_ksl_blk_nth_key(blk, i)); } fprintf(stderr, "\n"); @@ -765,21 +763,21 @@ static void ksl_print(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, } void ngtcp2_ksl_print(const ngtcp2_ksl *ksl) { - if (!ksl->head) { + if (!ksl->root) { return; } - ksl_print(ksl, ksl->head, 0); + ksl_print(ksl, ksl->root, 0); } #endif /* !defined(WIN32) */ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it it; - if (ksl->head) { - ngtcp2_ksl_it_init(&it, ksl, ksl->front, 0); + if (ksl->root) { + ngtcp2_ksl_it_init(&it, ksl->front, 0); } else { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); + ngtcp2_ksl_it_init(&it, &null_blk, 0); } return it; @@ -788,18 +786,16 @@ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it ngtcp2_ksl_end(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it it; - if (ksl->head) { - ngtcp2_ksl_it_init(&it, ksl, ksl->back, ksl->back->n); + if (ksl->root) { + ngtcp2_ksl_it_init(&it, ksl->back, ksl->back->n); } else { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); + ngtcp2_ksl_it_init(&it, &null_blk, 0); } return it; } -void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, - ngtcp2_ksl_blk *blk, size_t i) { - it->ksl = ksl; +void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, ngtcp2_ksl_blk *blk, size_t i) { it->blk = blk; it->i = i; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h index d35c83deab025d..cb972f94dca2e2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h @@ -38,10 +38,10 @@ #define NGTCP2_KSL_DEGR 16 /* NGTCP2_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ -#define NGTCP2_KSL_MAX_NBLK (2 * NGTCP2_KSL_DEGR - 1) +#define NGTCP2_KSL_MAX_NBLK (2 * NGTCP2_KSL_DEGR) /* NGTCP2_KSL_MIN_NBLK is the minimum number of nodes which a single block other than root must contain. */ -#define NGTCP2_KSL_MIN_NBLK (NGTCP2_KSL_DEGR - 1) +#define NGTCP2_KSL_MIN_NBLK NGTCP2_KSL_DEGR /* * ngtcp2_ksl_key represents key in ngtcp2_ksl. @@ -75,16 +75,19 @@ struct ngtcp2_ksl_blk { /* prev points to the previous block if leaf field is nonzero. */ ngtcp2_ksl_blk *prev; - /* n is the number of nodes this object contains in nodes. */ - uint32_t n; - /* leaf is nonzero if this block contains leaf nodes. */ - uint32_t leaf; ngtcp2_ksl_node nodes[NGTCP2_KSL_MAX_NBLK]; /* keys is a pointer to the buffer to include NGTCP2_KSL_MAX_NBLK keys. Because the length of key is unknown until ngtcp2_ksl_init is called, the actual buffer - will be allocated after this field. */ + will be allocated after this object. */ uint8_t *keys; + /* n is the number of nodes this object contains in nodes. */ + uint32_t n; + /* aligned_keylen is the length of the single key including + alignment. */ + uint16_t aligned_keylen; + /* leaf is nonzero if this block contains leaf nodes. */ + uint8_t leaf; }; ngtcp2_opl_entry oplent; @@ -134,7 +137,6 @@ typedef struct ngtcp2_ksl_it ngtcp2_ksl_it; * ngtcp2_ksl_it is a bidirectional iterator to iterate nodes. */ struct ngtcp2_ksl_it { - const ngtcp2_ksl *ksl; ngtcp2_ksl_blk *blk; size_t i; }; @@ -144,8 +146,8 @@ struct ngtcp2_ksl_it { */ struct ngtcp2_ksl { ngtcp2_objalloc blkalloc; - /* head points to the root block. */ - ngtcp2_ksl_blk *head; + /* root points to the root block. */ + ngtcp2_ksl_blk *root; /* front points to the first leaf block. */ ngtcp2_ksl_blk *front; /* back points to the last leaf block. */ @@ -275,11 +277,11 @@ size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl); void ngtcp2_ksl_clear(ngtcp2_ksl *ksl); /* - * ngtcp2_ksl_nth_key returns the |n|th key under |blk|. + * ngtcp2_ksl_blk_nth_key returns the |n|th key under |blk|. */ static inline const ngtcp2_ksl_key * -ngtcp2_ksl_nth_key(const ngtcp2_ksl *ksl, const ngtcp2_ksl_blk *blk, size_t n) { - return blk->keys + n * ksl->aligned_keylen; +ngtcp2_ksl_blk_nth_key(const ngtcp2_ksl_blk *blk, size_t n) { + return blk->keys + n * blk->aligned_keylen; } #ifndef WIN32 @@ -294,8 +296,7 @@ void ngtcp2_ksl_print(const ngtcp2_ksl *ksl); /* * ngtcp2_ksl_it_init initializes |it|. */ -void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, - ngtcp2_ksl_blk *blk, size_t i); +void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, ngtcp2_ksl_blk *blk, size_t i); /* * ngtcp2_ksl_it_get returns the data associated to the node which @@ -346,7 +347,7 @@ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it); * returns nonzero. */ static inline const ngtcp2_ksl_key *ngtcp2_ksl_it_key(const ngtcp2_ksl_it *it) { - return ngtcp2_ksl_nth_key(it->ksl, it->blk, it->i); + return ngtcp2_ksl_blk_nth_key(it->blk, it->i); } /* diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h index dfe5e0aed220f8..12cba12719ac7b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h @@ -52,6 +52,13 @@ */ #define ngtcp2_arraylen(A) (sizeof(A) / sizeof(A[0])) +/* + * ngtcp2_strlen_lit returns the length of string literal |S|. This + * macro assumes |S| is NULL-terminated string literal. It must not + * be used with pointers. + */ +#define ngtcp2_strlen_lit(S) (sizeof(S) - 1) + #define ngtcp2_max_def(SUFFIX, T) \ static inline T ngtcp2_max_##SUFFIX(T a, T b) { return a < b ? b : a; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c index 9c0e2636bcc051..0179dbcde96445 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c @@ -2308,11 +2308,11 @@ ngtcp2_ssize ngtcp2_pkt_write_retry( case NGTCP2_PROTO_VER_V1: default: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V1; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V2; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } @@ -2398,11 +2398,11 @@ int ngtcp2_pkt_verify_retry_tag(uint32_t version, const ngtcp2_pkt_retry *retry, case NGTCP2_PROTO_VER_V1: default: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V1; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V2; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h index 2d07e41648db2e..b62ab204b216a5 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h @@ -57,7 +57,7 @@ typedef struct ngtcp2_pv_entry { /* flags is zero or more of NGTCP2_PV_ENTRY_FLAG_*. */ uint8_t flags; /* data is a byte string included in PATH_CHALLENGE. */ - uint8_t data[8]; + uint8_t data[NGTCP2_PATH_CHALLENGE_DATALEN]; } ngtcp2_pv_entry; void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, const uint8_t *data, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c index f0c67acdd51b37..7c1142d14d3c6a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c @@ -40,7 +40,7 @@ void ngtcp2_qlog_init(ngtcp2_qlog *qlog, ngtcp2_qlog_write write, qlog->user_data = user_data; } -#define write_verbatim(DEST, S) ngtcp2_cpymem((DEST), (S), sizeof(S) - 1) +#define write_verbatim(DEST, S) ngtcp2_cpymem((DEST), (S), ngtcp2_strlen_lit(S)) static uint8_t *write_string_impl(uint8_t *p, const uint8_t *data, size_t datalen) { @@ -53,7 +53,7 @@ static uint8_t *write_string_impl(uint8_t *p, const uint8_t *data, } #define write_string(DEST, S) \ - write_string_impl((DEST), (const uint8_t *)(S), sizeof(S) - 1) + write_string_impl((DEST), (const uint8_t *)(S), ngtcp2_strlen_lit(S)) static uint8_t *write_hex(uint8_t *p, const uint8_t *data, size_t datalen) { *p++ = '"'; @@ -76,9 +76,9 @@ static uint8_t *write_duration(uint8_t *p, ngtcp2_duration duration) { static uint8_t *write_bool(uint8_t *p, int b) { if (b) { - return ngtcp2_cpymem(p, "true", sizeof("true") - 1); + return ngtcp2_cpymem(p, "true", ngtcp2_strlen_lit("true")); } - return ngtcp2_cpymem(p, "false", sizeof("false") - 1); + return ngtcp2_cpymem(p, "false", ngtcp2_strlen_lit("false")); } static uint8_t *write_pair_impl(uint8_t *p, const uint8_t *name, size_t namelen, @@ -89,7 +89,8 @@ static uint8_t *write_pair_impl(uint8_t *p, const uint8_t *name, size_t namelen, } #define write_pair(DEST, NAME, VALUE) \ - write_pair_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, (VALUE)) + write_pair_impl((DEST), (const uint8_t *)(NAME), ngtcp2_strlen_lit(NAME), \ + (VALUE)) static uint8_t *write_pair_hex_impl(uint8_t *p, const uint8_t *name, size_t namelen, const uint8_t *value, @@ -100,8 +101,8 @@ static uint8_t *write_pair_hex_impl(uint8_t *p, const uint8_t *name, } #define write_pair_hex(DEST, NAME, VALUE, VALUELEN) \ - write_pair_hex_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE), (VALUELEN)) + write_pair_hex_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE), (VALUELEN)) static uint8_t *write_pair_number_impl(uint8_t *p, const uint8_t *name, size_t namelen, uint64_t value) { @@ -111,8 +112,8 @@ static uint8_t *write_pair_number_impl(uint8_t *p, const uint8_t *name, } #define write_pair_number(DEST, NAME, VALUE) \ - write_pair_number_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_number_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_duration_impl(uint8_t *p, const uint8_t *name, size_t namelen, @@ -123,8 +124,8 @@ static uint8_t *write_pair_duration_impl(uint8_t *p, const uint8_t *name, } #define write_pair_duration(DEST, NAME, VALUE) \ - write_pair_duration_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_duration_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_tstamp_impl(uint8_t *p, const uint8_t *name, size_t namelen, ngtcp2_tstamp ts) { @@ -134,8 +135,8 @@ static uint8_t *write_pair_tstamp_impl(uint8_t *p, const uint8_t *name, } #define write_pair_tstamp(DEST, NAME, VALUE) \ - write_pair_tstamp_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_tstamp_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_bool_impl(uint8_t *p, const uint8_t *name, size_t namelen, int b) { @@ -145,8 +146,8 @@ static uint8_t *write_pair_bool_impl(uint8_t *p, const uint8_t *name, } #define write_pair_bool(DEST, NAME, VALUE) \ - write_pair_bool_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_bool_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_cid_impl(uint8_t *p, const uint8_t *name, size_t namelen, const ngtcp2_cid *cid) { @@ -156,10 +157,10 @@ static uint8_t *write_pair_cid_impl(uint8_t *p, const uint8_t *name, } #define write_pair_cid(DEST, NAME, VALUE) \ - write_pair_cid_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_cid_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) -#define ngtcp2_make_vec_lit(S) {(uint8_t *)(S), sizeof((S)) - 1} +#define ngtcp2_make_vec_lit(S) {(uint8_t *)(S), ngtcp2_strlen_lit((S))} static uint8_t *write_common_fields(uint8_t *p, const ngtcp2_cid *odcid) { p = write_verbatim( @@ -1173,8 +1174,8 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, buf.last = write_verbatim(buf.last, ",\"supported_versions\":["); if (nsv) { - if (ngtcp2_buf_left(&buf) < - (sizeof("\"xxxxxxxx\",") - 1) * nsv - 1 + sizeof("]}}\n") - 1) { + if (ngtcp2_buf_left(&buf) < ngtcp2_strlen_lit("\"xxxxxxxx\",") * nsv - 1 + + ngtcp2_strlen_lit("]}}\n")) { return; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h index 28b91d8d36ff72..b40b6c4a89525b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h @@ -33,10 +33,10 @@ /* NGTCP2_DEFAULT_GLITCH_RATELIM_BURST is the maximum number of tokens in glitch rate limiter. It is also the initial value. */ -#define NGTCP2_DEFAULT_GLITCH_RATELIM_BURST 4000 +#define NGTCP2_DEFAULT_GLITCH_RATELIM_BURST 10000 /* NGTCP2_DEFAULT_GLITCH_RATELIM_RATE is the rate of tokens generated per second for glitch rate limiter. */ -#define NGTCP2_DEFAULT_GLITCH_RATELIM_RATE 132 +#define NGTCP2_DEFAULT_GLITCH_RATELIM_RATE 330 /* * ngtcp2_settings_convert_to_latest converts |src| of version diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c index 99d02da1b8855f..70aa8933a3b83f 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c @@ -199,7 +199,7 @@ int ngtcp2_strm_streamfrq_push(ngtcp2_strm *strm, ngtcp2_frame_chain *frc) { if (rv != 0) { return rv; } - } else if (ngtcp2_ksl_len(strm->tx.streamfrq) >= 1000) { + } else if (ngtcp2_ksl_len(strm->tx.streamfrq) >= 8000) { return NGTCP2_ERR_INTERNAL; } @@ -372,13 +372,12 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, size_t left) { ngtcp2_stream *fr, *nfr; - ngtcp2_frame_chain *frc, *nfrc, *sfrc; + ngtcp2_frame_chain *frc, *nfrc; int rv; size_t nmerged; uint64_t datalen; - ngtcp2_vec a[NGTCP2_MAX_STREAM_DATACNT]; - ngtcp2_vec b[NGTCP2_MAX_STREAM_DATACNT]; - size_t acnt, bcnt; + ngtcp2_vec data[NGTCP2_MAX_STREAM_DATACNT]; + size_t datacnt; uint64_t unacked_offset; if (strm->tx.streamfrq == NULL || ngtcp2_ksl_len(strm->tx.streamfrq) == 0) { @@ -418,17 +417,15 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, } if (datalen > left) { - ngtcp2_vec_copy(a, fr->data, fr->datacnt); - acnt = fr->datacnt; - - bcnt = 0; - ngtcp2_vec_split(b, &bcnt, a, &acnt, left, NGTCP2_MAX_STREAM_DATACNT); + datacnt = 0; + ngtcp2_vec_split(data, &datacnt, fr->data, &fr->datacnt, left, + NGTCP2_MAX_STREAM_DATACNT); - assert(acnt > 0); - assert(bcnt > 0); + assert(fr->datacnt > 0); + assert(datacnt > 0); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, bcnt, strm->frc_objalloc, strm->mem); + &nfrc, datacnt, strm->frc_objalloc, strm->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -441,8 +438,8 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, nfr->fin = fr->fin; nfr->stream_id = fr->stream_id; nfr->offset = fr->offset + left; - nfr->datacnt = bcnt; - ngtcp2_vec_copy(nfr->data, b, bcnt); + nfr->datacnt = datacnt; + ngtcp2_vec_copy(nfr->data, data, datacnt); rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); if (rv != 0) { @@ -453,34 +450,17 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, return rv; } - rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); - if (rv != 0) { - assert(ngtcp2_err_is_fatal(rv)); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } - - nfr = &nfrc->fr.stream; - nfr->type = fr->type; - nfr->flags = fr->flags; - nfr->fin = 0; - nfr->stream_id = fr->stream_id; - nfr->offset = fr->offset; - nfr->datacnt = acnt; - ngtcp2_vec_copy(nfr->data, a, acnt); - - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + fr->fin = 0; - *pfrc = nfrc; + *pfrc = frc; return 0; } left -= (size_t)datalen; - ngtcp2_vec_copy(a, fr->data, fr->datacnt); - acnt = fr->datacnt; + ngtcp2_vec_copy(data, fr->data, fr->datacnt); + datacnt = fr->datacnt; for (; left && ngtcp2_ksl_len(strm->tx.streamfrq);) { unacked_offset = ngtcp2_strm_streamfrq_unacked_offset(strm); @@ -507,9 +487,7 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, break; } - bcnt = nfr->datacnt; - - nmerged = ngtcp2_vec_merge(a, &acnt, nfr->data, &bcnt, left, + nmerged = ngtcp2_vec_merge(data, &datacnt, nfr->data, &nfr->datacnt, left, NGTCP2_MAX_STREAM_DATACNT); if (nmerged == 0) { rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); @@ -527,54 +505,27 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, datalen += nmerged; left -= nmerged; - if (bcnt == 0) { + if (nfr->datacnt == 0) { fr->fin = nfr->fin; ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); continue; } - if (nfr->datacnt <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES || - bcnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { - nfr->offset += nmerged; - nfr->datacnt = bcnt; - - rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } - } else { - rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &sfrc, bcnt, strm->frc_objalloc, strm->mem); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } - - sfrc->fr.stream = nfrc->fr.stream; - sfrc->fr.stream.offset += nmerged; - sfrc->fr.stream.datacnt = bcnt; - ngtcp2_vec_copy(sfrc->fr.stream.data, nfrc->fr.stream.data, bcnt); + nfr->offset += nmerged; + rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); + if (rv != 0) { ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - - rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &sfrc->fr.stream.offset, - sfrc); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(sfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } break; } - if (acnt == fr->datacnt) { - if (acnt > 0) { - fr->data[acnt - 1] = a[acnt - 1]; + if (datacnt == fr->datacnt) { + if (datacnt > 0) { + fr->data[datacnt - 1] = data[datacnt - 1]; } *pfrc = frc; @@ -582,10 +533,10 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, return 0; } - assert(acnt > fr->datacnt); + assert(datacnt > fr->datacnt); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); + &nfrc, datacnt, strm->frc_objalloc, strm->mem); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; @@ -597,8 +548,8 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, nfr->fin = fr->fin; nfr->stream_id = fr->stream_id; nfr->offset = fr->offset; - nfr->datacnt = acnt; - ngtcp2_vec_copy(nfr->data, a, acnt); + nfr->datacnt = datacnt; + ngtcp2_vec_copy(nfr->data, data, datacnt); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h index 1a1e8fd3b7d5c4..fb86bd1c23d6e5 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h @@ -171,14 +171,14 @@ struct ngtcp2_strm { const ngtcp2_mem *mem; int64_t stream_id; void *stream_user_data; - /* flags is bit-wise OR of zero or more of NGTCP2_STRM_FLAG_*. */ - uint32_t flags; /* app_error_code is an error code the local endpoint sent in RESET_STREAM or STOP_SENDING, or received from a remote endpoint in RESET_STREAM or STOP_SENDING. First application error code is chosen and when set, NGTCP2_STRM_FLAG_APP_ERROR_CODE_SET flag is set in flags field. */ uint64_t app_error_code; + /* flags is bit-wise OR of zero or more of NGTCP2_STRM_FLAG_*. */ + uint32_t flags; }; ngtcp2_opl_entry oplent;