mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
Release 2.10.1
- [BUGFIX] Coalesced packets could get longer than normal packet size. - Add spin bit configuration option es_spin (-o spin=[01]). - Disable spin bit in 1/16 of connections. - Improve logging a bit.
This commit is contained in:
parent
9fc120419d
commit
4ab453a184
6 changed files with 91 additions and 12 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2020-01-29
|
||||||
|
- 2.10.1
|
||||||
|
- [BUGFIX] Coalesced packets could get longer than normal packet
|
||||||
|
size.
|
||||||
|
- Add spin bit configuration option es_spin (-o spin=[01]).
|
||||||
|
- Disable spin bit in 1/16 of connections.
|
||||||
|
- Improve logging a bit.
|
||||||
|
|
||||||
2020-01-28
|
2020-01-28
|
||||||
- 2.10.0
|
- 2.10.0
|
||||||
- [FEATURE] QUIC and HTTP/3 Internet Draft 25 support.
|
- [FEATURE] QUIC and HTTP/3 Internet Draft 25 support.
|
||||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
||||||
|
|
||||||
#define LSQUIC_MAJOR_VERSION 2
|
#define LSQUIC_MAJOR_VERSION 2
|
||||||
#define LSQUIC_MINOR_VERSION 10
|
#define LSQUIC_MINOR_VERSION 10
|
||||||
#define LSQUIC_PATCH_VERSION 0
|
#define LSQUIC_PATCH_VERSION 1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Engine flags:
|
* Engine flags:
|
||||||
|
@ -381,6 +381,9 @@ typedef struct ssl_ctx_st * (*lsquic_lookup_cert_f)(
|
||||||
/** Use QL loss bits by default */
|
/** Use QL loss bits by default */
|
||||||
#define LSQUIC_DF_QL_BITS 2
|
#define LSQUIC_DF_QL_BITS 2
|
||||||
|
|
||||||
|
/** Turn spin bit on by default */
|
||||||
|
#define LSQUIC_DF_SPIN 1
|
||||||
|
|
||||||
/* 1: Cubic; 2: BBR */
|
/* 1: Cubic; 2: BBR */
|
||||||
#define LSQUIC_DF_CC_ALGO 1
|
#define LSQUIC_DF_CC_ALGO 1
|
||||||
|
|
||||||
|
@ -759,6 +762,13 @@ struct lsquic_engine_settings {
|
||||||
* Default value is @ref LSQUIC_DF_QL_BITS
|
* Default value is @ref LSQUIC_DF_QL_BITS
|
||||||
*/
|
*/
|
||||||
int es_ql_bits;
|
int es_ql_bits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable spin bit. Allowed values are 0 and 1.
|
||||||
|
*
|
||||||
|
* Default value is @ref LSQUIC_DF_SPIN
|
||||||
|
*/
|
||||||
|
int es_spin;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Initialize `settings' to default values */
|
/* Initialize `settings' to default values */
|
||||||
|
|
|
@ -337,6 +337,7 @@ lsquic_engine_init_settings (struct lsquic_engine_settings *settings,
|
||||||
settings->es_qpack_enc_max_blocked = LSQUIC_DF_QPACK_ENC_MAX_BLOCKED;
|
settings->es_qpack_enc_max_blocked = LSQUIC_DF_QPACK_ENC_MAX_BLOCKED;
|
||||||
settings->es_allow_migration = LSQUIC_DF_ALLOW_MIGRATION;
|
settings->es_allow_migration = LSQUIC_DF_ALLOW_MIGRATION;
|
||||||
settings->es_ql_bits = LSQUIC_DF_QL_BITS;
|
settings->es_ql_bits = LSQUIC_DF_QL_BITS;
|
||||||
|
settings->es_spin = LSQUIC_DF_SPIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -412,6 +413,14 @@ lsquic_engine_check_settings (const struct lsquic_engine_settings *settings,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(settings->es_spin == 0 || settings->es_spin == 1))
|
||||||
|
{
|
||||||
|
if (err_buf)
|
||||||
|
snprintf(err_buf, err_buf_sz, "Invalid spin value %d",
|
||||||
|
settings->es_spin);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2048,13 +2057,13 @@ sockaddr2str (const struct sockaddr *addr, char *buf, size_t sz)
|
||||||
switch (addr->sa_family)
|
switch (addr->sa_family)
|
||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
port = ((struct sockaddr_in *) addr)->sin_port;
|
port = ntohs(((struct sockaddr_in *) addr)->sin_port);
|
||||||
if (!inet_ntop(AF_INET, &((struct sockaddr_in *) addr)->sin_addr,
|
if (!inet_ntop(AF_INET, &((struct sockaddr_in *) addr)->sin_addr,
|
||||||
buf, sz))
|
buf, sz))
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
break;
|
break;
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
port = ((struct sockaddr_in6 *) addr)->sin6_port;
|
port = ntohs(((struct sockaddr_in6 *) addr)->sin6_port);
|
||||||
if (!inet_ntop(AF_INET6, &((struct sockaddr_in6 *) addr)->sin6_addr,
|
if (!inet_ntop(AF_INET6, &((struct sockaddr_in6 *) addr)->sin6_addr,
|
||||||
buf, sz))
|
buf, sz))
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
|
@ -131,6 +131,7 @@ enum ifull_conn_flags
|
||||||
IFC_IGNORE_HSK = 1 << 25,
|
IFC_IGNORE_HSK = 1 << 25,
|
||||||
IFC_PROC_CRYPTO = 1 << 26,
|
IFC_PROC_CRYPTO = 1 << 26,
|
||||||
IFC_MIGRA = 1 << 27,
|
IFC_MIGRA = 1 << 27,
|
||||||
|
IFC_SPIN = 1 << 28, /* Spin bits are enabled */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -973,6 +974,43 @@ ietf_full_conn_add_scid (struct ietf_full_conn *conn,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* From [draft-ietf-quic-transport-25] Section 17.3.1:
|
||||||
|
* " endpoints MUST disable their use of the spin bit for a random selection
|
||||||
|
* " of at least one in every 16 network paths, or for one in every 16
|
||||||
|
* " connection IDs.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
maybe_enable_spin (struct ietf_full_conn *conn)
|
||||||
|
{
|
||||||
|
uint8_t nyb;
|
||||||
|
|
||||||
|
if (!conn->ifc_settings->es_spin)
|
||||||
|
{
|
||||||
|
conn->ifc_flags &= ~IFC_SPIN;
|
||||||
|
LSQ_DEBUG("spin bit disabled via settings");
|
||||||
|
}
|
||||||
|
else if (lsquic_crand_get_nybble(conn->ifc_enpub->enp_crand))
|
||||||
|
{
|
||||||
|
conn->ifc_flags |= IFC_SPIN;
|
||||||
|
conn->ifc_spin_bit = 0;
|
||||||
|
LSQ_DEBUG("spin bit enabled");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* " It is RECOMMENDED that endpoints set the spin bit to a random
|
||||||
|
* " value either chosen independently for each packet or chosen
|
||||||
|
* " independently for each connection ID.
|
||||||
|
* (ibid.)
|
||||||
|
*/
|
||||||
|
conn->ifc_flags &= ~IFC_SPIN;
|
||||||
|
nyb = lsquic_crand_get_nybble(conn->ifc_enpub->enp_crand);
|
||||||
|
conn->ifc_spin_bit = nyb & 1;
|
||||||
|
LSQ_DEBUG("spin bit randomly disabled; random spin bit value is %d",
|
||||||
|
conn->ifc_spin_bit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ietf_full_conn_init (struct ietf_full_conn *conn,
|
ietf_full_conn_init (struct ietf_full_conn *conn,
|
||||||
struct lsquic_engine_public *enpub, unsigned flags, int ecn)
|
struct lsquic_engine_public *enpub, unsigned flags, int ecn)
|
||||||
|
@ -1035,6 +1073,7 @@ ietf_full_conn_init (struct ietf_full_conn *conn,
|
||||||
#define valid_stream_id(v) ((v) <= VINT_MAX_VALUE)
|
#define valid_stream_id(v) ((v) <= VINT_MAX_VALUE)
|
||||||
conn->ifc_max_req_id = VINT_MAX_VALUE + 1;
|
conn->ifc_max_req_id = VINT_MAX_VALUE + 1;
|
||||||
conn->ifc_ping_unretx_thresh = 20;
|
conn->ifc_ping_unretx_thresh = 20;
|
||||||
|
maybe_enable_spin(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5678,7 +5717,10 @@ process_retry_packet (struct ietf_full_conn *conn,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != verify_retry_packet(conn, packet_in))
|
if (0 != verify_retry_packet(conn, packet_in))
|
||||||
|
{
|
||||||
|
LSQ_DEBUG("cannot verify retry packet: ignore it");
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (0 != lsquic_send_ctl_retry(&conn->ifc_send_ctl,
|
if (0 != lsquic_send_ctl_retry(&conn->ifc_send_ctl,
|
||||||
packet_in->pi_data + packet_in->pi_token,
|
packet_in->pi_data + packet_in->pi_token,
|
||||||
|
@ -5767,7 +5809,7 @@ on_dcid_change (struct ietf_full_conn *conn, const lsquic_cid_t *dcid_in)
|
||||||
LOG_SCIDS(conn);
|
LOG_SCIDS(conn);
|
||||||
|
|
||||||
/* Reset spin bit, see [draft-ietf-quic-transport-20] Section 17.3.1 */
|
/* Reset spin bit, see [draft-ietf-quic-transport-20] Section 17.3.1 */
|
||||||
conn->ifc_spin_bit = 0;
|
maybe_enable_spin(conn);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -5996,7 +6038,7 @@ process_regular_packet (struct ietf_full_conn *conn,
|
||||||
conn->ifc_incoming_ecn |=
|
conn->ifc_incoming_ecn |=
|
||||||
lsquic_packet_in_ecn(packet_in) != ECN_NOT_ECT;
|
lsquic_packet_in_ecn(packet_in) != ECN_NOT_ECT;
|
||||||
++conn->ifc_ecn_counts_in[pns][ lsquic_packet_in_ecn(packet_in) ];
|
++conn->ifc_ecn_counts_in[pns][ lsquic_packet_in_ecn(packet_in) ];
|
||||||
if (packno_increased && PNS_APP == pns)
|
if (packno_increased && PNS_APP == pns && (conn->ifc_flags & IFC_SPIN))
|
||||||
{
|
{
|
||||||
if (conn->ifc_flags & IFC_SERVER)
|
if (conn->ifc_flags & IFC_SERVER)
|
||||||
conn->ifc_spin_bit = lsquic_packet_in_spin_bit(packet_in);
|
conn->ifc_spin_bit = lsquic_packet_in_spin_bit(packet_in);
|
||||||
|
|
|
@ -1608,18 +1608,21 @@ send_ctl_maybe_zero_pad (struct lsquic_send_ctl *ctl,
|
||||||
|
|
||||||
cum_size = packet_out_total_sz(initial_packet);
|
cum_size = packet_out_total_sz(initial_packet);
|
||||||
if (cum_size >= limit)
|
if (cum_size >= limit)
|
||||||
|
{
|
||||||
|
LSQ_DEBUG("packet size %zu larger than %zu-byte limit: not "
|
||||||
|
"zero-padding", cum_size, limit);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next)
|
TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next)
|
||||||
{
|
{
|
||||||
size = packet_out_total_sz(packet_out);
|
size = packet_out_total_sz(packet_out);
|
||||||
if (cum_size + size > SC_PACK_SIZE(ctl))
|
if (cum_size + size > limit)
|
||||||
break;
|
break;
|
||||||
cum_size += size;
|
cum_size += size;
|
||||||
if (cum_size >= limit)
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LSQ_DEBUG("cum_size: %zu; limit: %zu", cum_size, limit);
|
||||||
assert(cum_size < limit);
|
assert(cum_size < limit);
|
||||||
size = limit - cum_size;
|
size = limit - cum_size;
|
||||||
if (size > lsquic_packet_out_avail(initial_packet))
|
if (size > lsquic_packet_out_avail(initial_packet))
|
||||||
|
@ -1676,8 +1679,9 @@ lsquic_send_ctl_next_packet_to_send (struct lsquic_send_ctl *ctl, size_t size)
|
||||||
{
|
{
|
||||||
if (packet_out_total_sz(packet_out) + size > SC_PACK_SIZE(ctl))
|
if (packet_out_total_sz(packet_out) + size > SC_PACK_SIZE(ctl))
|
||||||
return NULL;
|
return NULL;
|
||||||
LSQ_DEBUG("packet %"PRIu64" will be tacked on to previous packet "
|
LSQ_DEBUG("packet %"PRIu64" (%zu bytes) will be tacked on to "
|
||||||
"(coalescing)", packet_out->po_packno);
|
"previous packet(s) (%zu bytes) (coalescing)",
|
||||||
|
packet_out->po_packno, packet_out_total_sz(packet_out), size);
|
||||||
}
|
}
|
||||||
send_ctl_sched_remove(ctl, packet_out);
|
send_ctl_sched_remove(ctl, packet_out);
|
||||||
|
|
||||||
|
@ -1690,9 +1694,10 @@ lsquic_send_ctl_next_packet_to_send (struct lsquic_send_ctl *ctl, size_t size)
|
||||||
packet_out->po_flags &= ~PO_LIMITED;
|
packet_out->po_flags &= ~PO_LIMITED;
|
||||||
|
|
||||||
if (UNLIKELY(packet_out->po_header_type == HETY_INITIAL)
|
if (UNLIKELY(packet_out->po_header_type == HETY_INITIAL)
|
||||||
&& !(ctl->sc_conn_pub->lconn->cn_flags & LSCONN_SERVER))
|
&& !(ctl->sc_conn_pub->lconn->cn_flags & LSCONN_SERVER)
|
||||||
|
&& size < 1200)
|
||||||
{
|
{
|
||||||
send_ctl_maybe_zero_pad(ctl, packet_out, size ? size : 1200);
|
send_ctl_maybe_zero_pad(ctl, packet_out, 1200 - size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctl->sc_flags & SC_QL_BITS)
|
if (ctl->sc_flags & SC_QL_BITS)
|
||||||
|
|
|
@ -1729,6 +1729,11 @@ set_engine_option (struct lsquic_engine_settings *settings,
|
||||||
settings->es_sfcw = atoi(val);
|
settings->es_sfcw = atoi(val);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (0 == strncmp(name, "spin", 4))
|
||||||
|
{
|
||||||
|
settings->es_spin = atoi(val);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
if (0 == strncmp(name, "version", 7))
|
if (0 == strncmp(name, "version", 7))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue