summaryrefslogtreecommitdiffstats
path: root/ssl/quic/quic_stream_map.c
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2023-06-06 17:25:10 +0200
committerPauli <pauli@openssl.org>2023-07-17 00:17:57 +0200
commit28d0e35cd675c67355d91caf65aa180df49f9db4 (patch)
treeb3f0f39da555c4d034900b8dc160467907f5c133 /ssl/quic/quic_stream_map.c
parentQUIC QSM: Model final sizes and handle STOP_SENDING correctly (diff)
downloadopenssl-28d0e35cd675c67355d91caf65aa180df49f9db4.tar.xz
openssl-28d0e35cd675c67355d91caf65aa180df49f9db4.zip
QUIC QSM: Free unneeded stream buffers, calculate RESET_STREAM final size correctly
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21135)
Diffstat (limited to 'ssl/quic/quic_stream_map.c')
-rw-r--r--ssl/quic/quic_stream_map.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/ssl/quic/quic_stream_map.c b/ssl/quic/quic_stream_map.c
index a6fe8ab9bd..007bef521c 100644
--- a/ssl/quic/quic_stream_map.c
+++ b/ssl/quic/quic_stream_map.c
@@ -406,8 +406,8 @@ int ossl_quic_stream_map_notify_totally_acked(QUIC_STREAM_MAP *qsm,
case QUIC_SSTREAM_STATE_DATA_SENT:
qs->send_state = QUIC_SSTREAM_STATE_DATA_RECVD;
/* We no longer need a QUIC_SSTREAM in this state. */
- //ossl_quic_sstream_free(qs->sstream);
- //qs->sstream = NULL;
+ ossl_quic_sstream_free(qs->sstream);
+ qs->sstream = NULL;
return 1;
}
}
@@ -416,6 +416,8 @@ int ossl_quic_stream_map_reset_stream_send_part(QUIC_STREAM_MAP *qsm,
QUIC_STREAM *qs,
uint64_t aec)
{
+ uint64_t final_size;
+
switch (qs->send_state) {
default:
case QUIC_SSTREAM_STATE_NONE:
@@ -434,11 +436,27 @@ int ossl_quic_stream_map_reset_stream_send_part(QUIC_STREAM_MAP *qsm,
case QUIC_SSTREAM_STATE_READY:
case QUIC_SSTREAM_STATE_SEND:
case QUIC_SSTREAM_STATE_DATA_SENT:
+ /*
+ * If we already have a final size (e.g. because we are coming from
+ * DATA_SENT), we have to be consistent with that, so don't change it.
+ * If we don't already have a final size, determine a final size value.
+ * This is the value which we will end up using for a RESET_STREAM frame
+ * for flow control purposes. We could send the stream size (total
+ * number of bytes appended to QUIC_SSTREAM by the application), but it
+ * is in our interest to exclude any bytes we have not actually
+ * transmitted yet, to avoid unnecessarily consuming flow control
+ * credit. We can get this from the TXFC.
+ */
+ if (!ossl_quic_stream_send_get_final_size(qs, &final_size))
+ qs->send_final_size = ossl_quic_txfc_get_swm(&qs->txfc);
+
qs->reset_stream_aec = aec;
- qs->send_state = QUIC_SSTREAM_STATE_RESET_SENT;
qs->want_reset_stream = 1;
+ qs->send_state = QUIC_SSTREAM_STATE_RESET_SENT;
+
+ ossl_quic_sstream_free(qs->sstream);
+ qs->sstream = NULL;
- /* TODO free */
ossl_quic_stream_map_update_state(qsm, qs);
return 1;
@@ -536,8 +554,8 @@ int ossl_quic_stream_map_notify_totally_read(QUIC_STREAM_MAP *qsm,
qs->recv_state = QUIC_RSTREAM_STATE_DATA_READ;
/* QUIC_RSTREAM is no longer needed */
- //ossl_quic_rstream_free(qs->rstream);
- //qs->rstream = NULL;
+ ossl_quic_rstream_free(qs->rstream);
+ qs->rstream = NULL;
return 1;
}
}
@@ -562,8 +580,8 @@ int ossl_quic_stream_map_notify_reset_recv_part(QUIC_STREAM_MAP *qsm,
qs->want_stop_sending = 0;
/* QUIC_RSTREAM is no longer needed */
- //ossl_quic_rstream_free(qs->rstream);
- //qs->rstream = NULL;
+ ossl_quic_rstream_free(qs->rstream);
+ qs->rstream = NULL;
ossl_quic_stream_map_update_state(qsm, qs);
return 1;