diff options
author | Hugo Landau <hlandau@openssl.org> | 2023-06-06 17:25:10 +0200 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2023-07-17 00:17:57 +0200 |
commit | 28d0e35cd675c67355d91caf65aa180df49f9db4 (patch) | |
tree | b3f0f39da555c4d034900b8dc160467907f5c133 /ssl/quic/quic_stream_map.c | |
parent | QUIC QSM: Model final sizes and handle STOP_SENDING correctly (diff) | |
download | openssl-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.c | 34 |
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; |