mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
GSO-Friendly Packet Memory (#175)
This commit is contained in:
parent
2f4629f27d
commit
fecdd10417
11 changed files with 19 additions and 60 deletions
|
@ -2043,7 +2043,7 @@ pba_init (struct packout_buf_allocator *pba, unsigned max)
|
||||||
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
pba_allocate (void *packout_buf_allocator, void *peer_ctx, unsigned short size,
|
pba_allocate (void *packout_buf_allocator, void *peer_ctx, void *conn_ctx, unsigned short size,
|
||||||
char is_ipv6)
|
char is_ipv6)
|
||||||
{
|
{
|
||||||
struct packout_buf_allocator *const pba = packout_buf_allocator;
|
struct packout_buf_allocator *const pba = packout_buf_allocator;
|
||||||
|
|
|
@ -115,7 +115,7 @@ void
|
||||||
pba_init (struct packout_buf_allocator *, unsigned max);
|
pba_init (struct packout_buf_allocator *, unsigned max);
|
||||||
|
|
||||||
void *
|
void *
|
||||||
pba_allocate (void *packout_buf_allocator, void*, unsigned short, char);
|
pba_allocate (void *packout_buf_allocator, void*, void *conn_ctx, unsigned short, char);
|
||||||
|
|
||||||
void
|
void
|
||||||
pba_release (void *packout_buf_allocator, void *, void *obj, char);
|
pba_release (void *packout_buf_allocator, void *, void *obj, char);
|
||||||
|
|
|
@ -2016,7 +2016,7 @@ Miscellaneous Types
|
||||||
|
|
||||||
If not specified, malloc() and free() are used.
|
If not specified, malloc() and free() are used.
|
||||||
|
|
||||||
.. member:: void * (*pmi_allocate) (void *pmi_ctx, void *peer_ctx, unsigned short sz, char is_ipv6)
|
.. member:: void * (*pmi_allocate) (void *pmi_ctx, void *peer_ctx, lsquic_conn_get_ctx *conn_ctx, unsigned short sz, char is_ipv6)
|
||||||
|
|
||||||
Allocate buffer for sending.
|
Allocate buffer for sending.
|
||||||
|
|
||||||
|
|
|
@ -974,6 +974,7 @@ struct lsquic_out_spec
|
||||||
const struct sockaddr *local_sa;
|
const struct sockaddr *local_sa;
|
||||||
const struct sockaddr *dest_sa;
|
const struct sockaddr *dest_sa;
|
||||||
void *peer_ctx;
|
void *peer_ctx;
|
||||||
|
lsquic_conn_ctx_t *conn_ctx; /* will be NULL when sending out the first batch of handshake packets */
|
||||||
int ecn; /* Valid values are 0 - 3. See RFC 3168 */
|
int ecn; /* Valid values are 0 - 3. See RFC 3168 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1043,7 +1044,7 @@ struct lsquic_packout_mem_if
|
||||||
/**
|
/**
|
||||||
* Allocate buffer for sending.
|
* Allocate buffer for sending.
|
||||||
*/
|
*/
|
||||||
void * (*pmi_allocate) (void *pmi_ctx, void *peer_ctx, unsigned short sz,
|
void * (*pmi_allocate) (void *pmi_ctx, void *peer_ctx, lsquic_conn_ctx_t *, unsigned short sz,
|
||||||
char is_ipv6);
|
char is_ipv6);
|
||||||
/**
|
/**
|
||||||
* This function is used to release the allocated buffer after it is
|
* This function is used to release the allocated buffer after it is
|
||||||
|
|
|
@ -205,14 +205,14 @@ lsquic_conn_push_stream (struct lsquic_conn *lconn, void *hset,
|
||||||
lsquic_conn_ctx_t *
|
lsquic_conn_ctx_t *
|
||||||
lsquic_conn_get_ctx (const struct lsquic_conn *lconn)
|
lsquic_conn_get_ctx (const struct lsquic_conn *lconn)
|
||||||
{
|
{
|
||||||
return lconn->cn_if->ci_get_ctx(lconn);
|
return lconn->conn_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
lsquic_conn_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx)
|
lsquic_conn_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
lconn->cn_if->ci_set_ctx(lconn, ctx);
|
lconn->conn_ctx = ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -178,12 +178,6 @@ struct conn_iface
|
||||||
struct lsquic_engine *
|
struct lsquic_engine *
|
||||||
(*ci_get_engine) (struct lsquic_conn *);
|
(*ci_get_engine) (struct lsquic_conn *);
|
||||||
|
|
||||||
struct lsquic_conn_ctx *
|
|
||||||
(*ci_get_ctx) (const struct lsquic_conn *);
|
|
||||||
|
|
||||||
void
|
|
||||||
(*ci_set_ctx) (struct lsquic_conn *, struct lsquic_conn_ctx *);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
(*ci_make_stream) (struct lsquic_conn *);
|
(*ci_make_stream) (struct lsquic_conn *);
|
||||||
|
|
||||||
|
@ -318,6 +312,7 @@ struct conn_cid_elem
|
||||||
struct lsquic_conn
|
struct lsquic_conn
|
||||||
{
|
{
|
||||||
void *cn_enc_session;
|
void *cn_enc_session;
|
||||||
|
lsquic_conn_ctx_t *conn_ctx;
|
||||||
const struct enc_session_funcs_common
|
const struct enc_session_funcs_common
|
||||||
*cn_esf_c;
|
*cn_esf_c;
|
||||||
union {
|
union {
|
||||||
|
|
|
@ -1976,7 +1976,7 @@ iquic_esf_encrypt_packet (enc_session_t *enc_session_p,
|
||||||
dst_sz = lconn->cn_pf->pf_packout_size(lconn, packet_out);
|
dst_sz = lconn->cn_pf->pf_packout_size(lconn, packet_out);
|
||||||
ipv6 = NP_IS_IPv6(packet_out->po_path);
|
ipv6 = NP_IS_IPv6(packet_out->po_path);
|
||||||
dst = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx,
|
dst = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx,
|
||||||
packet_out->po_path->np_peer_ctx, dst_sz, ipv6);
|
packet_out->po_path->np_peer_ctx, lconn->conn_ctx, dst_sz, ipv6);
|
||||||
if (!dst)
|
if (!dst)
|
||||||
{
|
{
|
||||||
LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd",
|
LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd",
|
||||||
|
|
|
@ -467,7 +467,7 @@ free_packet (void *ctx, void *conn_ctx, void *packet_data, char is_ipv6)
|
||||||
|
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
malloc_buf (void *ctx, void *conn_ctx, unsigned short size, char is_ipv6)
|
malloc_buf (void *ctx, void *peer_ctx, lsquic_conn_ctx_t *conn_ctx, unsigned short size, char is_ipv6)
|
||||||
{
|
{
|
||||||
return malloc(size);
|
return malloc(size);
|
||||||
}
|
}
|
||||||
|
@ -1969,7 +1969,7 @@ copy_packet (struct lsquic_engine *engine, struct lsquic_conn *conn,
|
||||||
}
|
}
|
||||||
|
|
||||||
packet_out->po_enc_data = engine->pub.enp_pmi->pmi_allocate(
|
packet_out->po_enc_data = engine->pub.enp_pmi->pmi_allocate(
|
||||||
engine->pub.enp_pmi_ctx, packet_out->po_path->np_peer_ctx,
|
engine->pub.enp_pmi_ctx, packet_out->po_path->np_peer_ctx, conn->conn_ctx,
|
||||||
packet_out->po_data_sz, ipv6);
|
packet_out->po_data_sz, ipv6);
|
||||||
if (!packet_out->po_enc_data)
|
if (!packet_out->po_enc_data)
|
||||||
{
|
{
|
||||||
|
@ -2477,6 +2477,7 @@ send_packets_out (struct lsquic_engine *engine,
|
||||||
batch->outs [n].peer_ctx = packet_out->po_path->np_peer_ctx;
|
batch->outs [n].peer_ctx = packet_out->po_path->np_peer_ctx;
|
||||||
batch->outs [n].local_sa = NP_LOCAL_SA(packet_out->po_path);
|
batch->outs [n].local_sa = NP_LOCAL_SA(packet_out->po_path);
|
||||||
batch->outs [n].dest_sa = NP_PEER_SA(packet_out->po_path);
|
batch->outs [n].dest_sa = NP_PEER_SA(packet_out->po_path);
|
||||||
|
batch->outs [n].conn_ctx = conn->conn_ctx;
|
||||||
batch->conns [n] = conn;
|
batch->conns [n] = conn;
|
||||||
}
|
}
|
||||||
*packet = packet_out;
|
*packet = packet_out;
|
||||||
|
|
|
@ -172,7 +172,6 @@ struct full_conn
|
||||||
const struct lsquic_stream_if *stream_if;
|
const struct lsquic_stream_if *stream_if;
|
||||||
void *stream_if_ctx;
|
void *stream_if_ctx;
|
||||||
} fc_stream_ifs[N_STREAM_IFS];
|
} fc_stream_ifs[N_STREAM_IFS];
|
||||||
lsquic_conn_ctx_t *fc_conn_ctx;
|
|
||||||
struct lsquic_send_ctl fc_send_ctl;
|
struct lsquic_send_ctl fc_send_ctl;
|
||||||
struct lsquic_conn_public fc_pub;
|
struct lsquic_conn_public fc_pub;
|
||||||
lsquic_alarmset_t fc_alset;
|
lsquic_alarmset_t fc_alset;
|
||||||
|
@ -798,7 +797,7 @@ full_conn_ci_client_call_on_new (struct lsquic_conn *lconn)
|
||||||
{
|
{
|
||||||
struct full_conn *const conn = (struct full_conn *) lconn;
|
struct full_conn *const conn = (struct full_conn *) lconn;
|
||||||
assert(conn->fc_flags & FC_CREATED_OK);
|
assert(conn->fc_flags & FC_CREATED_OK);
|
||||||
conn->fc_conn_ctx = conn->fc_stream_ifs[STREAM_IF_STD].stream_if
|
lconn->conn_ctx = conn->fc_stream_ifs[STREAM_IF_STD].stream_if
|
||||||
->on_new_conn(conn->fc_stream_ifs[STREAM_IF_STD].stream_if_ctx, lconn);
|
->on_new_conn(conn->fc_stream_ifs[STREAM_IF_STD].stream_if_ctx, lconn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -972,7 +971,7 @@ lsquic_gquic_full_conn_server_new (struct lsquic_engine_public *enpub,
|
||||||
lsquic_send_ctl_turn_nstp_on(&conn->fc_send_ctl);
|
lsquic_send_ctl_turn_nstp_on(&conn->fc_send_ctl);
|
||||||
}
|
}
|
||||||
LSQ_DEBUG("Calling on_new_conn callback");
|
LSQ_DEBUG("Calling on_new_conn callback");
|
||||||
conn->fc_conn_ctx = enpub->enp_stream_if->on_new_conn(
|
lconn_full->conn_ctx = enpub->enp_stream_if->on_new_conn(
|
||||||
enpub->enp_stream_if_ctx, &conn->fc_conn);
|
enpub->enp_stream_if_ctx, &conn->fc_conn);
|
||||||
/* Now that user code knows about this connection, process incoming
|
/* Now that user code knows about this connection, process incoming
|
||||||
* packets, if any.
|
* packets, if any.
|
||||||
|
@ -4176,22 +4175,6 @@ full_conn_ci_tls_alert (struct lsquic_conn *lconn, uint8_t alert)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct lsquic_conn_ctx *
|
|
||||||
full_conn_ci_get_ctx (const struct lsquic_conn *lconn)
|
|
||||||
{
|
|
||||||
struct full_conn *const conn = (struct full_conn *) lconn;
|
|
||||||
return conn->fc_conn_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
full_conn_ci_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx)
|
|
||||||
{
|
|
||||||
struct full_conn *const conn = (struct full_conn *) lconn;
|
|
||||||
conn->fc_conn_ctx = ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static enum LSQUIC_CONN_STATUS
|
static enum LSQUIC_CONN_STATUS
|
||||||
full_conn_ci_status (struct lsquic_conn *lconn, char *errbuf, size_t bufsz)
|
full_conn_ci_status (struct lsquic_conn *lconn, char *errbuf, size_t bufsz)
|
||||||
{
|
{
|
||||||
|
@ -4477,7 +4460,6 @@ static const struct conn_iface full_conn_iface = {
|
||||||
.ci_client_call_on_new = full_conn_ci_client_call_on_new,
|
.ci_client_call_on_new = full_conn_ci_client_call_on_new,
|
||||||
.ci_close = full_conn_ci_close,
|
.ci_close = full_conn_ci_close,
|
||||||
.ci_destroy = full_conn_ci_destroy,
|
.ci_destroy = full_conn_ci_destroy,
|
||||||
.ci_get_ctx = full_conn_ci_get_ctx,
|
|
||||||
.ci_get_stream_by_id = full_conn_ci_get_stream_by_id,
|
.ci_get_stream_by_id = full_conn_ci_get_stream_by_id,
|
||||||
.ci_get_engine = full_conn_ci_get_engine,
|
.ci_get_engine = full_conn_ci_get_engine,
|
||||||
.ci_get_path = full_conn_ci_get_path,
|
.ci_get_path = full_conn_ci_get_path,
|
||||||
|
@ -4503,7 +4485,6 @@ static const struct conn_iface full_conn_iface = {
|
||||||
* caller when packets come in.
|
* caller when packets come in.
|
||||||
*/
|
*/
|
||||||
.ci_report_live = NULL,
|
.ci_report_live = NULL,
|
||||||
.ci_set_ctx = full_conn_ci_set_ctx,
|
|
||||||
.ci_status = full_conn_ci_status,
|
.ci_status = full_conn_ci_status,
|
||||||
.ci_tick = full_conn_ci_tick,
|
.ci_tick = full_conn_ci_tick,
|
||||||
.ci_write_ack = full_conn_ci_write_ack,
|
.ci_write_ack = full_conn_ci_write_ack,
|
||||||
|
|
|
@ -376,7 +376,6 @@ struct ietf_full_conn
|
||||||
*ifc_enpub;
|
*ifc_enpub;
|
||||||
const struct lsquic_engine_settings
|
const struct lsquic_engine_settings
|
||||||
*ifc_settings;
|
*ifc_settings;
|
||||||
lsquic_conn_ctx_t *ifc_conn_ctx;
|
|
||||||
STAILQ_HEAD(, stream_id_to_ss)
|
STAILQ_HEAD(, stream_id_to_ss)
|
||||||
ifc_stream_ids_to_ss;
|
ifc_stream_ids_to_ss;
|
||||||
lsquic_time_t ifc_created;
|
lsquic_time_t ifc_created;
|
||||||
|
@ -1552,7 +1551,7 @@ lsquic_ietf_full_conn_server_new (struct lsquic_engine_public *enpub,
|
||||||
conn->ifc_last_live_update = now;
|
conn->ifc_last_live_update = now;
|
||||||
|
|
||||||
LSQ_DEBUG("Calling on_new_conn callback");
|
LSQ_DEBUG("Calling on_new_conn callback");
|
||||||
conn->ifc_conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn(
|
conn->ifc_conn.conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn(
|
||||||
conn->ifc_enpub->enp_stream_if_ctx, &conn->ifc_conn);
|
conn->ifc_enpub->enp_stream_if_ctx, &conn->ifc_conn);
|
||||||
|
|
||||||
if (0 != handshake_ok(&conn->ifc_conn))
|
if (0 != handshake_ok(&conn->ifc_conn))
|
||||||
|
@ -2761,7 +2760,7 @@ ietf_full_conn_ci_client_call_on_new (struct lsquic_conn *lconn)
|
||||||
{
|
{
|
||||||
struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn;
|
struct ietf_full_conn *conn = (struct ietf_full_conn *) lconn;
|
||||||
assert(conn->ifc_flags & IFC_CREATED_OK);
|
assert(conn->ifc_flags & IFC_CREATED_OK);
|
||||||
conn->ifc_conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn(
|
lconn->conn_ctx = conn->ifc_enpub->enp_stream_if->on_new_conn(
|
||||||
conn->ifc_enpub->enp_stream_if_ctx, lconn);
|
conn->ifc_enpub->enp_stream_if_ctx, lconn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7908,14 +7907,6 @@ ietf_full_conn_ci_stateless_reset (struct lsquic_conn *lconn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct lsquic_conn_ctx *
|
|
||||||
ietf_full_conn_ci_get_ctx (const struct lsquic_conn *lconn)
|
|
||||||
{
|
|
||||||
struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn;
|
|
||||||
return conn->ifc_conn_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static struct lsquic_engine *
|
static struct lsquic_engine *
|
||||||
ietf_full_conn_ci_get_engine (struct lsquic_conn *lconn)
|
ietf_full_conn_ci_get_engine (struct lsquic_conn *lconn)
|
||||||
{
|
{
|
||||||
|
@ -7924,14 +7915,6 @@ ietf_full_conn_ci_get_engine (struct lsquic_conn *lconn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
ietf_full_conn_ci_set_ctx (struct lsquic_conn *lconn, lsquic_conn_ctx_t *ctx)
|
|
||||||
{
|
|
||||||
struct ietf_full_conn *const conn = (struct ietf_full_conn *) lconn;
|
|
||||||
conn->ifc_conn_ctx = ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
ietf_full_conn_ci_n_pending_streams (const struct lsquic_conn *lconn)
|
ietf_full_conn_ci_n_pending_streams (const struct lsquic_conn *lconn)
|
||||||
{
|
{
|
||||||
|
@ -8194,7 +8177,6 @@ ietf_full_conn_ci_count_garbage (struct lsquic_conn *lconn, size_t garbage_sz)
|
||||||
.ci_destroy = ietf_full_conn_ci_destroy, \
|
.ci_destroy = ietf_full_conn_ci_destroy, \
|
||||||
.ci_drain_time = ietf_full_conn_ci_drain_time, \
|
.ci_drain_time = ietf_full_conn_ci_drain_time, \
|
||||||
.ci_drop_crypto_streams = ietf_full_conn_ci_drop_crypto_streams, \
|
.ci_drop_crypto_streams = ietf_full_conn_ci_drop_crypto_streams, \
|
||||||
.ci_get_ctx = ietf_full_conn_ci_get_ctx, \
|
|
||||||
.ci_get_engine = ietf_full_conn_ci_get_engine, \
|
.ci_get_engine = ietf_full_conn_ci_get_engine, \
|
||||||
.ci_get_log_cid = ietf_full_conn_ci_get_log_cid, \
|
.ci_get_log_cid = ietf_full_conn_ci_get_log_cid, \
|
||||||
.ci_get_min_datagram_size= ietf_full_conn_ci_get_min_datagram_size, \
|
.ci_get_min_datagram_size= ietf_full_conn_ci_get_min_datagram_size, \
|
||||||
|
@ -8214,7 +8196,6 @@ ietf_full_conn_ci_count_garbage (struct lsquic_conn *lconn, size_t garbage_sz)
|
||||||
.ci_record_addrs = ietf_full_conn_ci_record_addrs, \
|
.ci_record_addrs = ietf_full_conn_ci_record_addrs, \
|
||||||
.ci_report_live = ietf_full_conn_ci_report_live, \
|
.ci_report_live = ietf_full_conn_ci_report_live, \
|
||||||
.ci_retx_timeout = ietf_full_conn_ci_retx_timeout, \
|
.ci_retx_timeout = ietf_full_conn_ci_retx_timeout, \
|
||||||
.ci_set_ctx = ietf_full_conn_ci_set_ctx, \
|
|
||||||
.ci_set_min_datagram_size= ietf_full_conn_ci_set_min_datagram_size, \
|
.ci_set_min_datagram_size= ietf_full_conn_ci_set_min_datagram_size, \
|
||||||
.ci_status = ietf_full_conn_ci_status, \
|
.ci_status = ietf_full_conn_ci_status, \
|
||||||
.ci_stateless_reset = ietf_full_conn_ci_stateless_reset, \
|
.ci_stateless_reset = ietf_full_conn_ci_stateless_reset, \
|
||||||
|
|
|
@ -3738,7 +3738,7 @@ gquic_encrypt_packet (enc_session_t *enc_session_p,
|
||||||
return ENCPA_BADCRYPT; /* To cause connection to close */
|
return ENCPA_BADCRYPT; /* To cause connection to close */
|
||||||
ipv6 = NP_IS_IPv6(packet_out->po_path);
|
ipv6 = NP_IS_IPv6(packet_out->po_path);
|
||||||
buf = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx,
|
buf = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx,
|
||||||
packet_out->po_path->np_peer_ctx, bufsz, ipv6);
|
packet_out->po_path->np_peer_ctx, lconn->conn_ctx, bufsz, ipv6);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
{
|
{
|
||||||
LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd",
|
LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd",
|
||||||
|
@ -3936,7 +3936,7 @@ gquic2_esf_encrypt_packet (enc_session_t *enc_session_p,
|
||||||
dst_sz = lconn->cn_pf->pf_packout_size(lconn, packet_out);
|
dst_sz = lconn->cn_pf->pf_packout_size(lconn, packet_out);
|
||||||
ipv6 = NP_IS_IPv6(packet_out->po_path);
|
ipv6 = NP_IS_IPv6(packet_out->po_path);
|
||||||
dst = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx,
|
dst = enpub->enp_pmi->pmi_allocate(enpub->enp_pmi_ctx,
|
||||||
packet_out->po_path->np_peer_ctx, dst_sz, ipv6);
|
packet_out->po_path->np_peer_ctx, lconn->conn_ctx, dst_sz, ipv6);
|
||||||
if (!dst)
|
if (!dst)
|
||||||
{
|
{
|
||||||
LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd",
|
LSQ_DEBUG("could not allocate memory for outgoing packet of size %zd",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue