Skip to content

Commit d33bc56

Browse files
authored
Support setting flow control limits for individual stream types (#3948)
1 parent cacaa20 commit d33bc56

File tree

13 files changed

+512
-33
lines changed

13 files changed

+512
-33
lines changed

docs/Settings.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ The following settings are available via registry as well as via [QUIC_SETTINGS]
3131
| Idle Timeout | uint64_t | IdleTimeoutMs | 30,000 | How long a connection can go idle before it is silently shut down. 0 to disable timeout |
3232
| Max TLS Send Buffer (Client) | uint32_t | TlsClientMaxSendBuffer | 4,096 | How much client TLS data to buffer. |
3333
| Max TLS Send Buffer (Server) | uint32_t | TlsServerMaxSendBuffer | 8,192 | How much server TLS data to buffer. |
34-
| Stream Receive Window | uint32_t | StreamRecvWindowDefault | 32,768 | Initial stream receive window size. |
34+
| Stream Receive Window | uint32_t | StreamRecvWindowDefault | 65,536 | Initial stream receive window size for all stream types. |
35+
| Stream Receive Window (Bidirectional, locally created) | uint32_t | StreamRecvWindowBidiLocalDefault | - | If set, overrides stream receive window size for locally initiated bidirectional streams. |
36+
| Stream Receive Window (Bidirectional, remotely created) | uint32_t | StreamRecvWindowBidiRemoteDefault | - | If set, overrides stream receive window size for remote initiated bidirectional streams. |
37+
| Stream Receive Window (Unidirectional) | uint32_t | StreamRecvWindowUnidiDefault | - | If set, overrides stream receive window size for remote initiated unidirectional streams. |
3538
| Stream Receive Buffer | uint32_t | StreamRecvBufferDefault | 4,096 | Stream initial buffer size. |
3639
| Flow Control Window | uint32_t | ConnFlowControlWindow | 16,777,216 | Connection-wide flow control window. |
3740
| Max Stateless Operations | uint32_t | MaxStatelessOperations | 16 | The maximum number of stateless operations that may be queued on a worker at any one time. |

docs/api/QUIC_SETTINGS.md

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,18 @@ typedef struct QUIC_SETTINGS {
4545
uint64_t DestCidUpdateIdleTimeoutMs : 1;
4646
uint64_t GreaseQuicBitEnabled : 1;
4747
uint64_t EcnEnabled : 1;
48-
uint64_t RESERVED : 30;
48+
uint64_t HyStartEnabled : 1;
49+
uint64_t StreamRecvWindowBidiLocalDefault : 1;
50+
uint64_t StreamRecvWindowBidiRemoteDefault : 1;
51+
uint64_t StreamRecvWindowUnidiDefault : 1;
52+
#ifdef QUIC_API_ENABLE_PREVIEW_FEATURES
53+
uint64_t EncryptionOffloadAllowed : 1;
54+
uint64_t ReliableResetEnabled : 1;
55+
uint64_t OneWayDelayEnabled : 1;
56+
uint64_t RESERVED : 23;
57+
#else
58+
uint64_t RESERVED : 26;
59+
#endif
4960
} IsSet;
5061
};
5162

@@ -83,6 +94,23 @@ typedef struct QUIC_SETTINGS {
8394
uint8_t MaxOperationsPerDrain;
8495
uint8_t MtuDiscoveryMissingProbeCount;
8596
uint32_t DestCidUpdateIdleTimeoutMs;
97+
union {
98+
uint64_t Flags;
99+
struct {
100+
uint64_t HyStartEnabled : 1;
101+
#ifdef QUIC_API_ENABLE_PREVIEW_FEATURES
102+
uint64_t EncryptionOffloadAllowed : 1;
103+
uint64_t ReliableResetEnabled : 1;
104+
uint64_t OneWayDelayEnabled : 1;
105+
uint64_t ReservedFlags : 60;
106+
#else
107+
uint64_t ReservedFlags : 63;
108+
#endif
109+
};
110+
};
111+
uint32_t StreamRecvWindowBidiLocalDefault;
112+
uint32_t StreamRecvWindowBidiRemoteDefault;
113+
uint32_t StreamRecvWindowUnidiDefault;
86114

87115
} QUIC_SETTINGS;
88116
```
@@ -125,9 +153,9 @@ How much server TLS data to buffer. If the application expects very large serve
125153

126154
`StreamRecvWindowDefault`
127155

128-
Initial stream receive window size.
156+
Initial stream receive flow control window size. This applies to all stream types. Limits for specific stream types can be set using `StreamRecvWindowBidirLocalDefault`, `StreamRecvWindowBidirRemoteDefault` and `StreamRecvWindowUnidirDefault`. The value must be a power of 2.
129157

130-
**Default value:** 32,768
158+
**Default value:** 65,536
131159

132160
`StreamRecvBufferDefault`
133161

@@ -303,6 +331,24 @@ Enable sender-side ECN support. The connection will validate and react to ECN fe
303331

304332
**Default value:** 0 (`FALSE`)
305333

334+
`StreamRecvWindowBidirLocalDefault`
335+
336+
Initial stream receive flow control window size for locally initiated bidirectional streams. If set, this value overwrites the `StreamRecvWindowDefault`.
337+
338+
**Default value:** 0 (no overwrite)
339+
340+
`StreamRecvWindowBidirRemoteDefault`
341+
342+
Initial stream receive flow control window size for remotely initiated bidirectional streams. If set, this value overwrites the `StreamRecvWindowDefault`.
343+
344+
**Default value:** 0 (no overwrite)
345+
346+
`StreamRecvWindowUnidiDefault`
347+
348+
Initial stream receive flow control window size for remotely initiated unidirectional streams. If set, this value overwrites the `StreamRecvWindowDefault`.
349+
350+
**Default value:** 0 (no overwrite)
351+
306352
# Remarks
307353

308354
When setting new values for the settings, the app must set the corresponding `.IsSet.*` parameter for each actual parameter that is being set or updated. For example:

src/core/connection.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,9 +2198,9 @@ QuicConnRecvResumptionTicket(
21982198
//
21992199
if (ResumedTP.ActiveConnectionIdLimit > QUIC_ACTIVE_CONNECTION_ID_LIMIT ||
22002200
ResumedTP.InitialMaxData > Connection->Send.MaxData ||
2201-
ResumedTP.InitialMaxStreamDataBidiLocal > Connection->Settings.StreamRecvWindowDefault ||
2202-
ResumedTP.InitialMaxStreamDataBidiRemote > Connection->Settings.StreamRecvWindowDefault ||
2203-
ResumedTP.InitialMaxStreamDataUni > Connection->Settings.StreamRecvWindowDefault ||
2201+
ResumedTP.InitialMaxStreamDataBidiLocal > Connection->Settings.StreamRecvWindowBidiLocalDefault ||
2202+
ResumedTP.InitialMaxStreamDataBidiRemote > Connection->Settings.StreamRecvWindowBidiRemoteDefault ||
2203+
ResumedTP.InitialMaxStreamDataUni > Connection->Settings.StreamRecvWindowUnidiDefault ||
22042204
ResumedTP.InitialMaxUniStreams > Connection->Streams.Types[STREAM_ID_FLAG_IS_CLIENT | STREAM_ID_FLAG_IS_UNI_DIR].MaxTotalStreamCount ||
22052205
ResumedTP.InitialMaxBidiStreams > Connection->Streams.Types[STREAM_ID_FLAG_IS_CLIENT | STREAM_ID_FLAG_IS_BI_DIR].MaxTotalStreamCount) {
22062206
//
@@ -2344,9 +2344,9 @@ QuicConnGenerateLocalTransportParameters(
23442344
Link);
23452345

23462346
LocalTP->InitialMaxData = Connection->Send.MaxData;
2347-
LocalTP->InitialMaxStreamDataBidiLocal = Connection->Settings.StreamRecvWindowDefault;
2348-
LocalTP->InitialMaxStreamDataBidiRemote = Connection->Settings.StreamRecvWindowDefault;
2349-
LocalTP->InitialMaxStreamDataUni = Connection->Settings.StreamRecvWindowDefault;
2347+
LocalTP->InitialMaxStreamDataBidiLocal = Connection->Settings.StreamRecvWindowBidiLocalDefault;
2348+
LocalTP->InitialMaxStreamDataBidiRemote = Connection->Settings.StreamRecvWindowBidiRemoteDefault;
2349+
LocalTP->InitialMaxStreamDataUni = Connection->Settings.StreamRecvWindowUnidiDefault;
23502350
LocalTP->MaxUdpPayloadSize =
23512351
MaxUdpPayloadSizeFromMTU(
23522352
CxPlatSocketGetLocalMtu(

src/core/quicdef.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,9 @@ CXPLAT_STATIC_ASSERT(
652652
#define QUIC_SETTING_MAX_TLS_CLIENT_SEND_BUFFER "TlsClientMaxSendBuffer"
653653
#define QUIC_SETTING_MAX_TLS_SERVER_SEND_BUFFER "TlsServerMaxSendBuffer"
654654
#define QUIC_SETTING_STREAM_FC_WINDOW_SIZE "StreamRecvWindowDefault"
655+
#define QUIC_SETTING_STREAM_FC_BIDI_LOCAL_WINDOW_SIZE "StreamRecvWindowBidiLocalDefault"
656+
#define QUIC_SETTING_STREAM_FC_BIDI_REMOTE_WINDOW_SIZE "StreamRecvWindowBidiRemoteDefault"
657+
#define QUIC_SETTING_STREAM_FC_UNIDI_WINDOW_SIZE "StreamRecvWindowUnidiDefault"
655658
#define QUIC_SETTING_STREAM_RECV_BUFFER_SIZE "StreamRecvBufferDefault"
656659
#define QUIC_SETTING_CONN_FLOW_CONTROL_WINDOW "ConnFlowControlWindow"
657660

src/core/settings.c

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ QuicSettingsSetDefault(
9696
if (!Settings->IsSet.StreamRecvWindowDefault) {
9797
Settings->StreamRecvWindowDefault = QUIC_DEFAULT_STREAM_FC_WINDOW_SIZE;
9898
}
99+
if (!Settings->IsSet.StreamRecvWindowBidiLocalDefault) {
100+
Settings->StreamRecvWindowBidiLocalDefault = QUIC_DEFAULT_STREAM_FC_WINDOW_SIZE;
101+
}
102+
if (!Settings->IsSet.StreamRecvWindowBidiRemoteDefault) {
103+
Settings->StreamRecvWindowBidiRemoteDefault = QUIC_DEFAULT_STREAM_FC_WINDOW_SIZE;
104+
}
105+
if (!Settings->IsSet.StreamRecvWindowUnidiDefault) {
106+
Settings->StreamRecvWindowUnidiDefault = QUIC_DEFAULT_STREAM_FC_WINDOW_SIZE;
107+
}
99108
if (!Settings->IsSet.StreamRecvBufferDefault) {
100109
Settings->StreamRecvBufferDefault = QUIC_DEFAULT_STREAM_RECV_BUFFER_SIZE;
101110
}
@@ -231,6 +240,15 @@ QuicSettingsCopy(
231240
if (!Destination->IsSet.StreamRecvWindowDefault) {
232241
Destination->StreamRecvWindowDefault = Source->StreamRecvWindowDefault;
233242
}
243+
if (!Destination->IsSet.StreamRecvWindowBidiLocalDefault) {
244+
Destination->StreamRecvWindowBidiLocalDefault = Source->StreamRecvWindowBidiLocalDefault;
245+
}
246+
if (!Destination->IsSet.StreamRecvWindowBidiRemoteDefault) {
247+
Destination->StreamRecvWindowBidiRemoteDefault = Source->StreamRecvWindowBidiRemoteDefault;
248+
}
249+
if (!Destination->IsSet.StreamRecvWindowUnidiDefault) {
250+
Destination->StreamRecvWindowUnidiDefault = Source->StreamRecvWindowUnidiDefault;
251+
}
234252
if (!Destination->IsSet.StreamRecvBufferDefault) {
235253
Destination->StreamRecvBufferDefault = Source->StreamRecvBufferDefault;
236254
}
@@ -496,6 +514,40 @@ QuicSettingApply(
496514
}
497515
Destination->StreamRecvWindowDefault = Source->StreamRecvWindowDefault;
498516
Destination->IsSet.StreamRecvWindowDefault = TRUE;
517+
518+
//
519+
// Also set window size for individual stream types, they will be overwritten by a more specific settings if set
520+
//
521+
if (!Destination->IsSet.StreamRecvWindowBidiLocalDefault || OverWrite) {
522+
Destination->StreamRecvWindowBidiLocalDefault = Source->StreamRecvWindowDefault;
523+
}
524+
if (!Destination->IsSet.StreamRecvWindowBidiRemoteDefault || OverWrite) {
525+
Destination->StreamRecvWindowBidiRemoteDefault = Source->StreamRecvWindowDefault;
526+
}
527+
if (!Destination->IsSet.StreamRecvWindowUnidiDefault || OverWrite) {
528+
Destination->StreamRecvWindowUnidiDefault = Source->StreamRecvWindowDefault;
529+
}
530+
}
531+
if (Source->IsSet.StreamRecvWindowBidiLocalDefault && (!Destination->IsSet.StreamRecvWindowBidiLocalDefault || OverWrite)) {
532+
if (Source->StreamRecvWindowBidiLocalDefault == 0 || (Source->StreamRecvWindowBidiLocalDefault & (Source->StreamRecvWindowBidiLocalDefault - 1)) != 0) {
533+
return FALSE; // Must be power of 2
534+
}
535+
Destination->StreamRecvWindowBidiLocalDefault = Source->StreamRecvWindowBidiLocalDefault;
536+
Destination->IsSet.StreamRecvWindowBidiLocalDefault = TRUE;
537+
}
538+
if (Source->IsSet.StreamRecvWindowBidiRemoteDefault && (!Destination->IsSet.StreamRecvWindowBidiRemoteDefault || OverWrite)) {
539+
if (Source->StreamRecvWindowBidiRemoteDefault == 0 || (Source->StreamRecvWindowBidiRemoteDefault & (Source->StreamRecvWindowBidiRemoteDefault - 1)) != 0) {
540+
return FALSE; // Must be power of 2
541+
}
542+
Destination->StreamRecvWindowBidiRemoteDefault = Source->StreamRecvWindowBidiRemoteDefault;
543+
Destination->IsSet.StreamRecvWindowBidiRemoteDefault = TRUE;
544+
}
545+
if (Source->IsSet.StreamRecvWindowUnidiDefault && (!Destination->IsSet.StreamRecvWindowUnidiDefault || OverWrite)) {
546+
if (Source->StreamRecvWindowUnidiDefault == 0 || (Source->StreamRecvWindowUnidiDefault & (Source->StreamRecvWindowUnidiDefault - 1)) != 0) {
547+
return FALSE; // Must be power of 2
548+
}
549+
Destination->StreamRecvWindowUnidiDefault = Source->StreamRecvWindowUnidiDefault;
550+
Destination->IsSet.StreamRecvWindowUnidiDefault = TRUE;
499551
}
500552
if (Source->IsSet.StreamRecvBufferDefault && (!Destination->IsSet.StreamRecvBufferDefault || OverWrite)) {
501553
if (Source->StreamRecvBufferDefault < QUIC_DEFAULT_STREAM_RECV_BUFFER_SIZE) {
@@ -911,6 +963,33 @@ QuicSettingsLoad(
911963
&ValueLen);
912964
}
913965

966+
if (!Settings->IsSet.StreamRecvWindowBidiLocalDefault) {
967+
ValueLen = sizeof(Settings->StreamRecvWindowBidiLocalDefault);
968+
CxPlatStorageReadValue(
969+
Storage,
970+
QUIC_SETTING_STREAM_FC_BIDI_LOCAL_WINDOW_SIZE,
971+
(uint8_t*)&Settings->StreamRecvWindowBidiLocalDefault,
972+
&ValueLen);
973+
}
974+
975+
if (!Settings->IsSet.StreamRecvWindowBidiRemoteDefault) {
976+
ValueLen = sizeof(Settings->StreamRecvWindowBidiRemoteDefault);
977+
CxPlatStorageReadValue(
978+
Storage,
979+
QUIC_SETTING_STREAM_FC_BIDI_REMOTE_WINDOW_SIZE,
980+
(uint8_t*)&Settings->StreamRecvWindowBidiRemoteDefault,
981+
&ValueLen);
982+
}
983+
984+
if (!Settings->IsSet.StreamRecvWindowUnidiDefault) {
985+
ValueLen = sizeof(Settings->StreamRecvWindowUnidiDefault);
986+
CxPlatStorageReadValue(
987+
Storage,
988+
QUIC_SETTING_STREAM_FC_UNIDI_WINDOW_SIZE,
989+
(uint8_t*)&Settings->StreamRecvWindowUnidiDefault,
990+
&ValueLen);
991+
}
992+
914993
if (!Settings->IsSet.StreamRecvBufferDefault) {
915994
ValueLen = sizeof(Settings->StreamRecvBufferDefault);
916995
CxPlatStorageReadValue(
@@ -1291,7 +1370,9 @@ QuicSettingsDump(
12911370
QuicTraceLogVerbose(SettingDumpTlsClientMaxSendBuffer, "[sett] TlsClientMaxSendBuffer = %u", Settings->TlsClientMaxSendBuffer);
12921371
QuicTraceLogVerbose(SettingDumpTlsServerMaxSendBuffer, "[sett] TlsServerMaxSendBuffer = %u", Settings->TlsServerMaxSendBuffer);
12931372
QuicTraceLogVerbose(SettingDumpStreamRecvWindowDefault, "[sett] StreamRecvWindowDefault= %u", Settings->StreamRecvWindowDefault);
1294-
QuicTraceLogVerbose(SettingDumpStreamRecvBufferDefault, "[sett] StreamRecvBufferDefault= %u", Settings->StreamRecvBufferDefault);
1373+
QuicTraceLogVerbose(SettingDumpStreamRecvWindowBidiLocalDefault, "[sett] StreamRecvWindowBidiLocalDefault = %u", Settings->StreamRecvWindowBidiLocalDefault);
1374+
QuicTraceLogVerbose(SettingDumpStreamRecvWindowBidiRemoteDefault, "[sett] StreamRecvWindowBidiRemoteDefault = %u", Settings->StreamRecvWindowBidiRemoteDefault);
1375+
QuicTraceLogVerbose(SettingDumpStreamRecvWindowUnidiDefault, "[sett] StreamRecvWindowUnidiDefault = %u", Settings->StreamRecvWindowUnidiDefault);
12951376
QuicTraceLogVerbose(SettingDumpConnFlowControlWindow, "[sett] ConnFlowControlWindow = %u", Settings->ConnFlowControlWindow);
12961377
QuicTraceLogVerbose(SettingDumpMaxBytesPerKey, "[sett] MaxBytesPerKey = %llu", Settings->MaxBytesPerKey);
12971378
QuicTraceLogVerbose(SettingDumpServerResumptionLevel, "[sett] ServerResumptionLevel = %hhu", Settings->ServerResumptionLevel);
@@ -1402,6 +1483,15 @@ QuicSettingsDumpNew(
14021483
if (Settings->IsSet.StreamRecvWindowDefault) {
14031484
QuicTraceLogVerbose(SettingDumpStreamRecvWindowDefault, "[sett] StreamRecvWindowDefault= %u", Settings->StreamRecvWindowDefault);
14041485
}
1486+
if (Settings->IsSet.StreamRecvWindowBidiLocalDefault) {
1487+
QuicTraceLogVerbose(SettingDumpStreamRecvWindowBidiLocalDefault, "[sett] StreamRecvWindowBidiLocalDefault = %u", Settings->StreamRecvWindowBidiLocalDefault);
1488+
}
1489+
if (Settings->IsSet.StreamRecvWindowBidiRemoteDefault) {
1490+
QuicTraceLogVerbose(SettingDumpStreamRecvWindowBidiRemoteDefault, "[sett] StreamRecvWindowBidiRemoteDefault = %u", Settings->StreamRecvWindowBidiRemoteDefault);
1491+
}
1492+
if (Settings->IsSet.StreamRecvWindowUnidiDefault) {
1493+
QuicTraceLogVerbose(SettingDumpStreamRecvWindowUnidiDefault, "[sett] StreamRecvWindowUnidiDefault = %u", Settings->StreamRecvWindowUnidiDefault);
1494+
}
14051495
if (Settings->IsSet.StreamRecvBufferDefault) {
14061496
QuicTraceLogVerbose(SettingDumpStreamRecvBufferDefault, "[sett] StreamRecvBufferDefault= %u", Settings->StreamRecvBufferDefault);
14071497
}
@@ -1700,6 +1790,27 @@ QuicSettingsSettingsToInternal(
17001790
SettingsSize,
17011791
InternalSettings);
17021792

1793+
SETTING_COPY_TO_INTERNAL_SIZED(
1794+
StreamRecvWindowBidiLocalDefault,
1795+
QUIC_SETTINGS,
1796+
Settings,
1797+
SettingsSize,
1798+
InternalSettings);
1799+
1800+
SETTING_COPY_TO_INTERNAL_SIZED(
1801+
StreamRecvWindowBidiRemoteDefault,
1802+
QUIC_SETTINGS,
1803+
Settings,
1804+
SettingsSize,
1805+
InternalSettings);
1806+
1807+
SETTING_COPY_TO_INTERNAL_SIZED(
1808+
StreamRecvWindowUnidiDefault,
1809+
QUIC_SETTINGS,
1810+
Settings,
1811+
SettingsSize,
1812+
InternalSettings);
1813+
17031814
return QUIC_STATUS_SUCCESS;
17041815
}
17051816

@@ -1832,6 +1943,26 @@ QuicSettingsGetSettings(
18321943
*SettingsLength,
18331944
InternalSettings);
18341945

1946+
SETTING_COPY_FROM_INTERNAL_SIZED(
1947+
StreamRecvWindowBidiLocalDefault,
1948+
QUIC_SETTINGS,
1949+
Settings,
1950+
*SettingsLength,
1951+
InternalSettings);
1952+
1953+
SETTING_COPY_FROM_INTERNAL_SIZED(
1954+
StreamRecvWindowBidiRemoteDefault,
1955+
QUIC_SETTINGS,
1956+
Settings,
1957+
*SettingsLength,
1958+
InternalSettings);
1959+
1960+
SETTING_COPY_FROM_INTERNAL_SIZED(StreamRecvWindowUnidiDefault,
1961+
QUIC_SETTINGS,
1962+
Settings,
1963+
*SettingsLength,
1964+
InternalSettings);
1965+
18351966
*SettingsLength = CXPLAT_MIN(*SettingsLength, sizeof(QUIC_SETTINGS));
18361967

18371968
return QUIC_STATUS_SUCCESS;

src/core/settings.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ typedef struct QUIC_SETTINGS_INTERNAL {
2020
uint64_t TlsClientMaxSendBuffer : 1;
2121
uint64_t TlsServerMaxSendBuffer : 1;
2222
uint64_t StreamRecvWindowDefault : 1;
23+
uint64_t StreamRecvWindowBidiLocalDefault : 1;
24+
uint64_t StreamRecvWindowBidiRemoteDefault : 1;
25+
uint64_t StreamRecvWindowUnidiDefault : 1;
2326
uint64_t StreamRecvBufferDefault : 1;
2427
uint64_t ConnFlowControlWindow : 1;
2528
uint64_t MaxWorkerQueueDelayUs : 1;
@@ -57,7 +60,7 @@ typedef struct QUIC_SETTINGS_INTERNAL {
5760
uint64_t EncryptionOffloadAllowed : 1;
5861
uint64_t ReliableResetEnabled : 1;
5962
uint64_t OneWayDelayEnabled : 1;
60-
uint64_t RESERVED : 21;
63+
uint64_t RESERVED : 18;
6164
} IsSet;
6265
};
6366

@@ -69,6 +72,9 @@ typedef struct QUIC_SETTINGS_INTERNAL {
6972
uint32_t TlsClientMaxSendBuffer;
7073
uint32_t TlsServerMaxSendBuffer;
7174
uint32_t StreamRecvWindowDefault;
75+
uint32_t StreamRecvWindowBidiLocalDefault;
76+
uint32_t StreamRecvWindowBidiRemoteDefault;
77+
uint32_t StreamRecvWindowUnidiDefault;
7278
uint32_t StreamRecvBufferDefault;
7379
uint32_t ConnFlowControlWindow;
7480
uint32_t MaxWorkerQueueDelayUs;

src/core/stream.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,17 @@ QuicStreamInitialize(
114114
}
115115
}
116116

117+
const uint32_t FlowControlWindowSize = Stream->Flags.Unidirectional
118+
? Connection->Settings.StreamRecvWindowUnidiDefault
119+
: OpenedRemotely
120+
? Connection->Settings.StreamRecvWindowBidiRemoteDefault
121+
: Connection->Settings.StreamRecvWindowBidiLocalDefault;
122+
117123
Status =
118124
QuicRecvBufferInitialize(
119125
&Stream->RecvBuffer,
120126
InitialRecvBufferLength,
121-
Connection->Settings.StreamRecvWindowDefault,
127+
FlowControlWindowSize,
122128
FALSE,
123129
PreallocatedRecvBuffer);
124130
if (QUIC_FAILED(Status)) {

0 commit comments

Comments
 (0)