struct quic_rx_packet *pkt)
{
return pkt->type != QUIC_PACKET_TYPE_INITIAL ? &qel->tls_ctx :
- pkt->version == qc->negotiated_version ? &qc->negotiated_ictx : &qel->tls_ctx;
+ pkt->version == qc->negotiated_version ? qc->nictx : &qel->tls_ctx;
}
/* Decrypt <pkt> packet using encryption level <qel> for <qc> connection.
if (qc->flags & QUIC_FL_CONN_FINALIZED)
goto finalized;
- if (qc->negotiated_version &&
- !qc_new_isecs(qc, &qc->negotiated_ictx, qc->negotiated_version,
- qc->odcid.data, qc->odcid.len, server))
- goto out;
+ if (qc->negotiated_version) {
+ qc->nictx = pool_alloc(pool_head_quic_tls_ctx);
+ if (!qc->nictx)
+ goto out;
+
+ quic_tls_ctx_reset(qc->nictx);
+ if (!qc_new_isecs(qc, qc->nictx, qc->negotiated_version,
+ qc->odcid.data, qc->odcid.len, server))
+ goto out;
+ }
/* This connection is functional (ready to send/receive) */
qc->flags |= QUIC_FL_CONN_FINALIZED;
if (qc->negotiated_version) {
ver = qc->negotiated_version;
if (qel == qc->iel)
- tls_ctx = &qc->negotiated_ictx;
+ tls_ctx = qc->nictx;
else
tls_ctx = &qel->tls_ctx;
}
}
/* Initialize in priority qc members required for a safe dealloc. */
-
+ qc->nictx = NULL;
/* Prevents these CID to be dumped by TRACE() calls */
qc->scid.len = qc->odcid.len = qc->dcid.len = 0;
/* required to use MTLIST_IN_LIST */
qc->ipktns = qc->hpktns = qc->apktns = NULL;
LIST_INIT(&qc->pktns_list);
- quic_tls_ctx_reset(&qc->negotiated_ictx);
-
/* Required to safely call quic_conn_prx_cntrs_update() from quic_conn_release(). */
qc->prx_counters = NULL;
qc_enc_level_free(qc, &qc->hel);
qc_enc_level_free(qc, &qc->ael);
- quic_tls_ctx_secs_free(&qc->negotiated_ictx);
+ quic_tls_ctx_secs_free(qc->nictx);
+ pool_free(pool_head_quic_tls_ctx, qc->nictx);
+ qc->nictx = NULL;
quic_pktns_release(qc, &qc->ipktns);
quic_pktns_release(qc, &qc->hpktns);
DECLARE_POOL(pool_head_quic_enc_level, "quic_enc_level", sizeof(struct quic_enc_level));
DECLARE_POOL(pool_head_quic_pktns, "quic_pktns", sizeof(struct quic_pktns));
+DECLARE_POOL(pool_head_quic_tls_ctx, "quic_tls_ctx", sizeof(struct quic_tls_ctx));
DECLARE_POOL(pool_head_quic_tls_secret, "quic_tls_secret", QUIC_TLS_SECRET_LEN);
DECLARE_POOL(pool_head_quic_tls_iv, "quic_tls_iv", QUIC_TLS_IV_LEN);
DECLARE_POOL(pool_head_quic_tls_key, "quic_tls_key", QUIC_TLS_KEY_LEN);