mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
Release 3.0.0
This commit is contained in:
parent
3d35ba155f
commit
084338b1a2
16 changed files with 55 additions and 89 deletions
|
@ -1,3 +1,11 @@
|
|||
2021-06-02
|
||||
- 3.0.0
|
||||
- Enable HTTP/3 v1 by default, drop draft 34.
|
||||
- Prevent connection timeout when client does not send PING frame.
|
||||
- Close connection ASAP after recieve CONNECTION_CLOSE (issue #284)
|
||||
- Do not assert() when decode a trailer.
|
||||
- Properly handle GOAWAY frame, do not close the last acknowledged stream.
|
||||
|
||||
2021-04-20
|
||||
- 2.30.2
|
||||
- Update ls-hpack to 2.3.0 to address dynamic table size limit (issue #260).
|
||||
|
|
|
@ -24,9 +24,9 @@ copyright = u'2021, LiteSpeed Technologies'
|
|||
author = u'LiteSpeed Technologies'
|
||||
|
||||
# The short X.Y version
|
||||
version = u'2.30'
|
||||
version = u'3.0'
|
||||
# The full version, including alpha/beta/rc tags
|
||||
release = u'2.30.2'
|
||||
release = u'3.0.0'
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
|
|
@ -23,9 +23,9 @@ struct sockaddr;
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define LSQUIC_MAJOR_VERSION 2
|
||||
#define LSQUIC_MINOR_VERSION 30
|
||||
#define LSQUIC_PATCH_VERSION 2
|
||||
#define LSQUIC_MAJOR_VERSION 3
|
||||
#define LSQUIC_MINOR_VERSION 0
|
||||
#define LSQUIC_PATCH_VERSION 0
|
||||
|
||||
/**
|
||||
* Engine flags:
|
||||
|
@ -64,18 +64,6 @@ enum lsquic_version
|
|||
*/
|
||||
LSQVER_050,
|
||||
|
||||
#if LSQUIC_USE_Q098
|
||||
/**
|
||||
* Q098. This is a made-up, experimental version used to test version
|
||||
* negotiation. The choice of 98 is similar to Google's choice of 99
|
||||
* as the "IETF" version.
|
||||
*/
|
||||
LSQVER_098,
|
||||
#define LSQUIC_EXPERIMENTAL_Q098 (1 << LSQVER_098)
|
||||
#else
|
||||
#define LSQUIC_EXPERIMENTAL_Q098 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* IETF QUIC Draft-27
|
||||
*/
|
||||
|
@ -87,13 +75,7 @@ enum lsquic_version
|
|||
LSQVER_ID29,
|
||||
|
||||
/**
|
||||
* IETF QUIC Draft-34
|
||||
*/
|
||||
LSQVER_ID34,
|
||||
|
||||
/**
|
||||
* IETF QUIC v1. Functionally the same as Draft-34, but marked
|
||||
* experimental for now.
|
||||
* IETF QUIC v1.
|
||||
*/
|
||||
LSQVER_I001,
|
||||
|
||||
|
@ -119,8 +101,7 @@ enum lsquic_version
|
|||
#define LSQUIC_FORCED_TCID0_VERSIONS ((1 << LSQVER_046)|(1 << LSQVER_050))
|
||||
|
||||
#define LSQUIC_EXPERIMENTAL_VERSIONS ( \
|
||||
(1 << LSQVER_I001) | \
|
||||
(1 << LSQVER_VERNEG) | LSQUIC_EXPERIMENTAL_Q098)
|
||||
(1 << LSQVER_VERNEG))
|
||||
|
||||
#define LSQUIC_DEPRECATED_VERSIONS ((1 << LSQVER_ID27))
|
||||
|
||||
|
@ -128,12 +109,11 @@ enum lsquic_version
|
|||
|
||||
#define LSQUIC_IETF_VERSIONS ((1 << LSQVER_ID27) \
|
||||
| (1 << LSQVER_ID29) \
|
||||
| (1 << LSQVER_ID34) \
|
||||
| (1 << LSQVER_I001) | (1 << LSQVER_VERNEG))
|
||||
|
||||
#define LSQUIC_IETF_DRAFT_VERSIONS ((1 << LSQVER_ID27) \
|
||||
| (1 << LSQVER_ID29) \
|
||||
| (1 << LSQVER_ID34) | (1 << LSQVER_VERNEG))
|
||||
| (1 << LSQVER_VERNEG))
|
||||
|
||||
enum lsquic_hsk_status
|
||||
{
|
||||
|
|
|
@ -67,6 +67,7 @@ struct lsquic_conn_public {
|
|||
/* Used for no-progress timeout */
|
||||
lsquic_time_t last_tick, last_prog;
|
||||
unsigned max_peer_ack_usec;
|
||||
uint8_t n_special_streams;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -340,7 +340,6 @@ extern const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1;
|
|||
#define select_esf_common_by_ver(ver) ( \
|
||||
ver == LSQVER_ID27 ? &lsquic_enc_session_common_ietf_v1 : \
|
||||
ver == LSQVER_ID29 ? &lsquic_enc_session_common_ietf_v1 : \
|
||||
ver == LSQVER_ID34 ? &lsquic_enc_session_common_ietf_v1 : \
|
||||
ver == LSQVER_I001 ? &lsquic_enc_session_common_ietf_v1 : \
|
||||
ver == LSQVER_VERNEG ? &lsquic_enc_session_common_ietf_v1 : \
|
||||
ver == LSQVER_050 ? &lsquic_enc_session_common_gquic_2 : \
|
||||
|
|
|
@ -73,7 +73,6 @@ static const struct alpn_map {
|
|||
} s_h3_alpns[] = {
|
||||
{ LSQVER_ID27, (unsigned char *) "\x05h3-27", },
|
||||
{ LSQVER_ID29, (unsigned char *) "\x05h3-29", },
|
||||
{ LSQVER_ID34, (unsigned char *) "\x05h3-34", },
|
||||
{ LSQVER_I001, (unsigned char *) "\x02h3", },
|
||||
{ LSQVER_VERNEG, (unsigned char *) "\x05h3-34", },
|
||||
};
|
||||
|
@ -928,7 +927,7 @@ iquic_esfi_create_client (const char *hostname,
|
|||
}
|
||||
#if BORINGSSL_API_VERSION >= 13
|
||||
SSL_set_quic_use_legacy_codepoint(enc_sess->esi_ssl,
|
||||
enc_sess->esi_ver_neg->vn_ver < LSQVER_ID34);
|
||||
enc_sess->esi_ver_neg->vn_ver < LSQVER_I001);
|
||||
#endif
|
||||
|
||||
transpa_len = gen_trans_params(enc_sess, trans_params,
|
||||
|
@ -1138,7 +1137,7 @@ setup_handshake_keys (struct enc_sess_iquic *enc_sess, const lsquic_cid_t *cid)
|
|||
|
||||
if (enc_sess->esi_conn->cn_version < LSQVER_ID29)
|
||||
salt = HSK_SALT_PRE29;
|
||||
else if (enc_sess->esi_conn->cn_version < LSQVER_ID34)
|
||||
else if (enc_sess->esi_conn->cn_version < LSQVER_I001)
|
||||
salt = HSK_SALT_PRE33;
|
||||
else
|
||||
salt = HSK_SALT;
|
||||
|
@ -1394,7 +1393,7 @@ iquic_esfi_init_server (enc_session_t *enc_session_p)
|
|||
}
|
||||
#if BORINGSSL_API_VERSION >= 13
|
||||
SSL_set_quic_use_legacy_codepoint(enc_sess->esi_ssl,
|
||||
enc_sess->esi_conn->cn_version < LSQVER_ID34);
|
||||
enc_sess->esi_conn->cn_version < LSQVER_I001);
|
||||
#endif
|
||||
if (!(SSL_set_quic_method(enc_sess->esi_ssl, &cry_quic_method)))
|
||||
{
|
||||
|
|
|
@ -3007,11 +3007,7 @@ lsquic_engine_packet_in (lsquic_engine_t *engine,
|
|||
parse_packet_in_begin = lsquic_Q050_parse_packet_in_begin;
|
||||
else
|
||||
{
|
||||
#if LSQUIC_USE_Q098
|
||||
assert(conn->cn_version == LSQVER_046 || conn->cn_version == LSQVER_098);
|
||||
#else
|
||||
assert(conn->cn_version == LSQVER_046);
|
||||
#endif
|
||||
parse_packet_in_begin = lsquic_Q046_parse_packet_in_begin;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3499,7 +3499,10 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now)
|
|||
* more than 1 packet over CWND.
|
||||
*/
|
||||
tick |= TICK_SEND;
|
||||
goto end_write;
|
||||
if (conn->fc_flags & FC_CLOSING)
|
||||
goto end_write;
|
||||
else
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Try to fit any of the following three frames -- STOP_WAITING,
|
||||
|
|
|
@ -1041,6 +1041,8 @@ create_uni_stream_out (struct ietf_full_conn *conn, int priority,
|
|||
}
|
||||
if (priority >= 0)
|
||||
lsquic_stream_set_priority_internal(stream, priority);
|
||||
else
|
||||
++conn->ifc_pub.n_special_streams;
|
||||
lsquic_stream_call_on_new(stream);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1682,12 +1684,12 @@ lsquic_ietf_full_conn_server_new (struct lsquic_engine_public *enpub,
|
|||
LSQ_DEBUG("Calling on_new_conn callback");
|
||||
conn->ifc_conn.cn_conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn(
|
||||
conn->ifc_enpub->enp_stream_if_ctx, &conn->ifc_conn);
|
||||
conn->ifc_idle_to = conn->ifc_settings->es_idle_timeout * 1000000;
|
||||
|
||||
if (0 != handshake_ok(&conn->ifc_conn))
|
||||
goto err3;
|
||||
|
||||
conn->ifc_created = imc->imc_created;
|
||||
conn->ifc_idle_to = conn->ifc_settings->es_idle_timeout * 1000000;
|
||||
if (conn->ifc_idle_to)
|
||||
lsquic_alarmset_set(&conn->ifc_alset, AL_IDLE,
|
||||
imc->imc_created + conn->ifc_idle_to);
|
||||
|
@ -5262,6 +5264,7 @@ struct buffered_priority_update
|
|||
};
|
||||
|
||||
|
||||
#define MAX_CRITICAL_STREAM_ID 12
|
||||
/* This function is called to create incoming streams */
|
||||
static struct lsquic_stream *
|
||||
new_stream (struct ietf_full_conn *conn, lsquic_stream_id_t stream_id,
|
||||
|
@ -5287,7 +5290,11 @@ new_stream (struct ietf_full_conn *conn, lsquic_stream_id_t stream_id,
|
|||
* to address this is to reclassify them later?
|
||||
*/
|
||||
#endif
|
||||
flags |= SCF_CRITICAL;
|
||||
if (stream_id < MAX_CRITICAL_STREAM_ID)
|
||||
{
|
||||
flags |= SCF_CRITICAL;
|
||||
++conn->ifc_pub.n_special_streams;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -8248,7 +8255,10 @@ ietf_full_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now)
|
|||
* than 1 packet over CWND.
|
||||
*/
|
||||
tick |= TICK_SEND;
|
||||
goto end_write;
|
||||
if (conn->ifc_flags & IFC_CLOSING)
|
||||
goto end_write;
|
||||
else
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Try to fit MAX_DATA before checking if we have run out of room.
|
||||
|
@ -8409,7 +8419,8 @@ ietf_full_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now)
|
|||
* packets and poor performance.
|
||||
*/
|
||||
if (conn->ifc_ping_period
|
||||
&& lsquic_hash_count(conn->ifc_pub.all_streams) > 0)
|
||||
&& lsquic_hash_count(conn->ifc_pub.all_streams) >
|
||||
conn->ifc_pub.n_special_streams)
|
||||
lsquic_alarmset_set(&conn->ifc_alset, AL_PING,
|
||||
now + conn->ifc_ping_period);
|
||||
|
||||
|
@ -9100,7 +9111,7 @@ on_goaway_client_27 (void *ctx, uint64_t stream_id)
|
|||
el = lsquic_hash_next(conn->ifc_pub.all_streams))
|
||||
{
|
||||
stream = lsquic_hashelem_getdata(el);
|
||||
if (stream->id >= stream_id
|
||||
if (stream->id > stream_id
|
||||
&& (stream->id & SIT_MASK) == SIT_BIDI_CLIENT)
|
||||
{
|
||||
lsquic_stream_received_goaway(stream);
|
||||
|
@ -9155,7 +9166,7 @@ on_goaway_client (void *ctx, uint64_t stream_id)
|
|||
el = lsquic_hash_next(conn->ifc_pub.all_streams))
|
||||
{
|
||||
stream = lsquic_hashelem_getdata(el);
|
||||
if (stream->id >= stream_id
|
||||
if (stream->id > stream_id
|
||||
&& (stream->id & SIT_MASK) == SIT_BIDI_CLIENT)
|
||||
{
|
||||
lsquic_stream_received_goaway(stream);
|
||||
|
@ -9177,7 +9188,7 @@ on_goaway_server (void *ctx, uint64_t max_push_id)
|
|||
el = lsquic_hash_next(conn->ifc_pub.u.ietf.promises))
|
||||
{
|
||||
promise = lsquic_hashelem_getdata(el);
|
||||
if (promise->pp_id >= max_push_id)
|
||||
if (promise->pp_id > max_push_id)
|
||||
cancel_push_promise(conn, promise);
|
||||
}
|
||||
}
|
||||
|
@ -9427,7 +9438,6 @@ hcsi_on_new (void *stream_if_ctx, struct lsquic_stream *stream)
|
|||
callbacks = &hcsi_callbacks_server_27;
|
||||
break;
|
||||
case (0 << 8) | LSQVER_ID29:
|
||||
case (0 << 8) | LSQVER_ID34:
|
||||
case (0 << 8) | LSQVER_I001:
|
||||
callbacks = &hcsi_callbacks_client_29;
|
||||
break;
|
||||
|
@ -9435,7 +9445,6 @@ hcsi_on_new (void *stream_if_ctx, struct lsquic_stream *stream)
|
|||
assert(0);
|
||||
/* fallthru */
|
||||
case (1 << 8) | LSQVER_ID29:
|
||||
case (1 << 8) | LSQVER_ID34:
|
||||
case (1 << 8) | LSQVER_I001:
|
||||
callbacks = &hcsi_callbacks_server_29;
|
||||
break;
|
||||
|
|
|
@ -38,7 +38,7 @@ extern const unsigned char *const lsquic_retry_key_buf[N_IETF_RETRY_VERSIONS];
|
|||
extern const unsigned char *const lsquic_retry_nonce_buf[N_IETF_RETRY_VERSIONS];
|
||||
#define lsquic_version_2_retryver(ver_) ( \
|
||||
(ver_) <= LSQVER_ID27 ? 0 : \
|
||||
(ver_) <= LSQVER_ID34 ? 1 : \
|
||||
(ver_) <= LSQVER_I001 ? 1 : \
|
||||
2)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -345,7 +345,7 @@ extern const struct parse_funcs lsquic_parse_funcs_ietf_v1;
|
|||
&lsquic_parse_funcs_gquic_Q043 : \
|
||||
(1 << (ver)) & (1 << LSQVER_046) ? \
|
||||
&lsquic_parse_funcs_gquic_Q046 : \
|
||||
(1 << (ver)) & ((1 << LSQVER_050)|LSQUIC_EXPERIMENTAL_Q098) ? \
|
||||
(1 << (ver)) & (1 << LSQVER_050) ? \
|
||||
&lsquic_parse_funcs_gquic_Q050 : \
|
||||
&lsquic_parse_funcs_ietf_v1)
|
||||
|
||||
|
|
|
@ -366,36 +366,6 @@ const enum quic_ft_bit lsquic_legal_frames_by_level[N_LSQVER][N_ENC_LEVS] =
|
|||
| QUIC_FTBIT_DATAGRAM
|
||||
,
|
||||
},
|
||||
[LSQVER_ID34] = {
|
||||
[ENC_LEV_CLEAR] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING
|
||||
| QUIC_FTBIT_ACK | QUIC_FTBIT_CONNECTION_CLOSE,
|
||||
[ENC_LEV_EARLY] = QUIC_FTBIT_PADDING | QUIC_FTBIT_PING
|
||||
| QUIC_FTBIT_STREAM | QUIC_FTBIT_RST_STREAM
|
||||
| QUIC_FTBIT_BLOCKED | QUIC_FTBIT_CONNECTION_CLOSE
|
||||
| QUIC_FTBIT_MAX_DATA | QUIC_FTBIT_MAX_STREAM_DATA
|
||||
| QUIC_FTBIT_MAX_STREAMS | QUIC_FTBIT_STREAM_BLOCKED
|
||||
| QUIC_FTBIT_STREAMS_BLOCKED
|
||||
| QUIC_FTBIT_NEW_CONNECTION_ID | QUIC_FTBIT_STOP_SENDING
|
||||
| QUIC_FTBIT_PATH_CHALLENGE
|
||||
| QUIC_FTBIT_DATAGRAM
|
||||
| QUIC_FTBIT_RETIRE_CONNECTION_ID,
|
||||
[ENC_LEV_INIT] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING
|
||||
| QUIC_FTBIT_ACK| QUIC_FTBIT_CONNECTION_CLOSE,
|
||||
[ENC_LEV_FORW] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING
|
||||
| QUIC_FTBIT_ACK | QUIC_FTBIT_CONNECTION_CLOSE
|
||||
| QUIC_FTBIT_STREAM | QUIC_FTBIT_RST_STREAM
|
||||
| QUIC_FTBIT_BLOCKED
|
||||
| QUIC_FTBIT_MAX_DATA | QUIC_FTBIT_MAX_STREAM_DATA
|
||||
| QUIC_FTBIT_MAX_STREAMS | QUIC_FTBIT_STREAM_BLOCKED
|
||||
| QUIC_FTBIT_STREAMS_BLOCKED
|
||||
| QUIC_FTBIT_NEW_CONNECTION_ID | QUIC_FTBIT_STOP_SENDING
|
||||
| QUIC_FTBIT_PATH_CHALLENGE | QUIC_FTBIT_PATH_RESPONSE
|
||||
| QUIC_FTBIT_HANDSHAKE_DONE | QUIC_FTBIT_ACK_FREQUENCY
|
||||
| QUIC_FTBIT_RETIRE_CONNECTION_ID | QUIC_FTBIT_NEW_TOKEN
|
||||
| QUIC_FTBIT_TIMESTAMP
|
||||
| QUIC_FTBIT_DATAGRAM
|
||||
,
|
||||
},
|
||||
[LSQVER_ID29] = {
|
||||
[ENC_LEV_CLEAR] = QUIC_FTBIT_CRYPTO | QUIC_FTBIT_PADDING | QUIC_FTBIT_PING
|
||||
| QUIC_FTBIT_ACK | QUIC_FTBIT_CONNECTION_CLOSE,
|
||||
|
|
|
@ -1240,6 +1240,13 @@ lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl,
|
|||
ctl->sc_flags &= ~SC_WAS_QUIET;
|
||||
LSQ_DEBUG("ACK comes after a period of quiescence");
|
||||
ctl->sc_ci->cci_was_quiet(CGP(ctl), now, ctl->sc_bytes_unacked_all);
|
||||
if (packet_out && (packet_out->po_frame_types & QUIC_FTBIT_PING)
|
||||
&& ctl->sc_conn_pub->last_prog)
|
||||
{
|
||||
LSQ_DEBUG("ACK to PING frame, update last progress to %"PRIu64,
|
||||
ctl->sc_conn_pub->last_tick);
|
||||
ctl->sc_conn_pub->last_prog = ctl->sc_conn_pub->last_tick;
|
||||
}
|
||||
}
|
||||
|
||||
if (UNLIKELY(!packet_out))
|
||||
|
|
|
@ -5067,7 +5067,9 @@ hq_filter_df (struct lsquic_stream *stream, struct data_frame *data_frame)
|
|||
(unsigned) data_frame->df_size - data_frame->df_read_off);
|
||||
else
|
||||
{
|
||||
assert(data_frame->df_read_off == data_frame->df_size);
|
||||
if (!(filter->hqfi_type == HQFT_HEADERS
|
||||
&& (filter->hqfi_flags & HQFI_FLAG_BLOCKED)))
|
||||
assert(data_frame->df_read_off == data_frame->df_size);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,12 +15,8 @@ static const unsigned char version_tags[N_LSQVER][4] =
|
|||
[LSQVER_043] = { 'Q', '0', '4', '3', },
|
||||
[LSQVER_046] = { 'Q', '0', '4', '6', },
|
||||
[LSQVER_050] = { 'Q', '0', '5', '0', },
|
||||
#if LSQUIC_USE_Q098
|
||||
[LSQVER_098] = { 'Q', '0', '9', '8', },
|
||||
#endif
|
||||
[LSQVER_ID27] = { 0xFF, 0, 0, 27, },
|
||||
[LSQVER_ID29] = { 0xFF, 0, 0, 29, },
|
||||
[LSQVER_ID34] = { 0xFF, 0, 0, 34, },
|
||||
[LSQVER_I001] = { 0, 0, 0, 1, },
|
||||
[LSQVER_VERNEG] = { 0xFA, 0xFA, 0xFA, 0xFA, },
|
||||
};
|
||||
|
@ -55,12 +51,8 @@ const char *const lsquic_ver2str[N_LSQVER] = {
|
|||
[LSQVER_043] = "Q043",
|
||||
[LSQVER_046] = "Q046",
|
||||
[LSQVER_050] = "Q050",
|
||||
#if LSQUIC_USE_Q098
|
||||
[LSQVER_098] = "Q098",
|
||||
#endif
|
||||
[LSQVER_ID27] = "FF00001B",
|
||||
[LSQVER_ID29] = "FF00001D",
|
||||
[LSQVER_ID34] = "FF000022",
|
||||
[LSQVER_I001] = "00000001",
|
||||
[LSQVER_VERNEG] = "FAFAFAFA",
|
||||
};
|
||||
|
|
|
@ -1143,7 +1143,7 @@ fuzz_guided_pwritev_testing (const char *input)
|
|||
case 3: version = LSQVER_ID27; break;
|
||||
case 4: version = LSQVER_ID29; break;
|
||||
default:
|
||||
case 5: version = LSQVER_ID34; break;
|
||||
case 5: version = LSQVER_I001; break;
|
||||
}
|
||||
|
||||
sched_immed = !!(buf[8] & 0x08);
|
||||
|
|
Loading…
Reference in a new issue