GSO-Friendly Packet Memory (#175)

This commit is contained in:
Victor Stewart 2020-10-03 06:48:01 +01:00 committed by GitHub
parent 2f4629f27d
commit fecdd10417
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 19 additions and 60 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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