&& !s->ready_for_gc
&& ((ossl_quic_stream_has_recv(s)
&& !ossl_quic_stream_recv_is_reset(s)
- && (s->want_max_stream_data
- || ossl_quic_rxfc_has_cwm_changed(&s->rxfc, 0)))
+ && (s->recv_state == QUIC_RSTREAM_STATE_RECV
+ && (s->want_max_stream_data
+ || ossl_quic_rxfc_has_cwm_changed(&s->rxfc, 0))))
|| s->want_stop_sending
|| s->want_reset_stream
|| (!s->peer_stop_sending && stream_has_data_to_send(s)));
= f.final_size - ossl_quic_txfc_get_swm(&stream->txfc);
}
- /* Stream Flow Control Frames (MAX_STREAM_DATA) */
- if (ossl_quic_stream_has_recv_buffer(stream)
+ /*
+ * Stream Flow Control Frames (MAX_STREAM_DATA)
+ *
+ * RFC 9000 s. 13.3: "An endpoint SHOULD stop sending MAX_STREAM_DATA
+ * frames when the receiving part of the stream enters a "Size Known" or
+ * "Reset Recvd" state." -- In practice, RECV is the only state
+ * in which it makes sense to generate more MAX_STREAM_DATA frames.
+ */
+ if (stream->recv_state == QUIC_RSTREAM_STATE_RECV
&& (stream->want_max_stream_data
|| ossl_quic_rxfc_has_cwm_changed(&stream->rxfc, 0))) {