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;
}
}
QUIC_STREAM *qs,
uint64_t aec)
{
+ uint64_t final_size;
+
switch (qs->send_state) {
default:
case QUIC_SSTREAM_STATE_NONE:
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;
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;
}
}
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;
f.stream_id = stream->id;
f.app_error_code = stream->reset_stream_aec;
- /* XXX fix this - use how much we've actually sent */
- f.final_size = ossl_quic_sstream_get_cur_size(stream->sstream);
+ if (!ossl_quic_stream_send_get_final_size(stream, &f.final_size))
+ return 0; /* should not be possible */
+
if (!ossl_quic_wire_encode_frame_reset_stream(wpkt, &f)) {
tx_helper_rollback(h); /* can't fit */
txp_enlink_tmp(tmp_head, stream);