Release 3.0.0

This commit is contained in:
George Wang 2021-06-02 00:39:15 -04:00
parent 3d35ba155f
commit 084338b1a2
16 changed files with 55 additions and 89 deletions

View File

@ -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).

View File

@ -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 ---------------------------------------------------

View File

@ -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
{

View File

@ -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

View File

@ -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 : \

View File

@ -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)))
{

View File

@ -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;
}
}

View File

@ -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,

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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,

View File

@ -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))

View File

@ -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;
}
}

View File

@ -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",
};

View File

@ -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);