server ? quic_tune.fe.stream_max_concurrent : quic_tune.be.stream_max_concurrent;
/* TODO value used to conform with HTTP/3, should be derived from app_ops */
const int max_streams_uni = 3;
+ uint64_t max_stream_data_bidi;
/* Set RFC default values for unspecified parameters. */
quic_dflt_transport_params_cpy(p);
p->initial_max_data = stream_rxbuf ?
stream_rxbuf : max_streams_bidi * stream_rx_bufsz;
- /* Set remote streams flow-control data limit. This is calculated as a
- * ratio from max-data, then rounded up to bufsize.
+ /* Calculate the limit for the Rx capability of bidirectional streams.
+ * This is a ratio from max-data rounded up to bufsize.
*/
- p->initial_max_stream_data_bidi_remote = server ?
+ max_stream_data_bidi = server ?
p->initial_max_data * quic_tune.fe.stream_data_ratio / 100 :
p->initial_max_data * quic_tune.be.stream_data_ratio / 100;
- p->initial_max_stream_data_bidi_remote =
- stream_rx_bufsz * ((p->initial_max_stream_data_bidi_remote + (stream_rx_bufsz - 1)) / stream_rx_bufsz);
+ max_stream_data_bidi =
+ stream_rx_bufsz * ((max_stream_data_bidi + (stream_rx_bufsz - 1)) / stream_rx_bufsz);
- /* Set remaining flow-control data limit. Local bidi streams are unused
- * on server side. Uni streams are only used for control exchange, so
- * only a single buffer for in flight data should be enough.
+ /* Apply bidirectional streams Rx cap. This depends on the connection
+ * side. On FE side, exchange will occur on remote streams; on BE side,
+ * exchange will occur on local streams.
*/
- p->initial_max_stream_data_bidi_local = stream_rx_bufsz;
- p->initial_max_stream_data_uni = stream_rx_bufsz;
+ if (server) {
+ p->initial_max_stream_data_bidi_remote = max_stream_data_bidi;
+ p->initial_max_stream_data_bidi_local = stream_rx_bufsz;
+ }
+ else {
+ p->initial_max_stream_data_bidi_remote = stream_rx_bufsz;
+ p->initial_max_stream_data_bidi_local = max_stream_data_bidi;
+ }
+
+ /* Unidirectional streams exchange should be minimal. */
+ p->initial_max_stream_data_uni = stream_rx_bufsz;
if (server) {
p->with_stateless_reset_token = 1;