Skip to content

Commit 563664e

Browse files
authored
Additional QuicConnectionOptions (dotnet#94211)
* [API Proposal]: Additional QuicConnectionOptions * Comment change * Reflect latest API review * Use HandshakeTimeout * Use Connect timeout on client as well * Code review feedback * Cancel ServerOptionsCallback when client closes connection * Code review feedback
1 parent c089092 commit 563664e

File tree

11 files changed

+548
-56
lines changed

11 files changed

+548
-56
lines changed

src/libraries/System.Net.Quic/ref/System.Net.Quic.cs

+12-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ public abstract partial class QuicConnectionOptions
4141
internal QuicConnectionOptions() { }
4242
public long DefaultCloseErrorCode { get { throw null; } set { } }
4343
public long DefaultStreamErrorCode { get { throw null; } set { } }
44+
public System.TimeSpan HandshakeTimeout { get { throw null; } set { } }
4445
public System.TimeSpan IdleTimeout { get { throw null; } set { } }
46+
public System.Net.Quic.QuicReceiveWindowSizes InitialReceiveWindowSizes { get { throw null; } set { } }
47+
public System.TimeSpan KeepAliveInterval { get { throw null; } set { } }
4548
public int MaxInboundBidirectionalStreams { get { throw null; } set { } }
4649
public int MaxInboundUnidirectionalStreams { get { throw null; } set { } }
4750
}
@@ -64,8 +67,8 @@ public sealed partial class QuicException : System.IO.IOException
6467
{
6568
public QuicException(System.Net.Quic.QuicError error, long? applicationErrorCode, string message) { }
6669
public long? ApplicationErrorCode { get { throw null; } }
67-
public long? TransportErrorCode { get { throw null; } }
6870
public System.Net.Quic.QuicError QuicError { get { throw null; } }
71+
public long? TransportErrorCode { get { throw null; } }
6972
}
7073
public sealed partial class QuicListener : System.IAsyncDisposable
7174
{
@@ -85,6 +88,14 @@ public QuicListenerOptions() { }
8588
public int ListenBacklog { get { throw null; } set { } }
8689
public System.Net.IPEndPoint ListenEndPoint { get { throw null; } set { } }
8790
}
91+
public sealed partial class QuicReceiveWindowSizes
92+
{
93+
public QuicReceiveWindowSizes() { }
94+
public int Connection { get { throw null; } set { } }
95+
public int LocallyInitiatedBidirectionalStream { get { throw null; } set { } }
96+
public int RemotelyInitiatedBidirectionalStream { get { throw null; } set { } }
97+
public int UnidirectionalStream { get { throw null; } set { } }
98+
}
8899
public sealed partial class QuicServerConnectionOptions : System.Net.Quic.QuicConnectionOptions
89100
{
90101
public QuicServerConnectionOptions() { }

src/libraries/System.Net.Quic/src/ExcludeApiList.PNSE.txt

+1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ P:System.Net.Quic.QuicConnection.IsSupported
22
P:System.Net.Quic.QuicListener.IsSupported
33
C:System.Net.Quic.QuicListenerOptions
44
C:System.Net.Quic.QuicConnectionOptions
5+
C:System.Net.Quic.QuicReceiveWindowSizes
56
C:System.Net.Quic.QuicClientConnectionOptions
67
C:System.Net.Quic.QuicServerConnectionOptions

src/libraries/System.Net.Quic/src/Resources/Strings.resx

+4-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@
142142
<value>Writing is not allowed on stream.</value>
143143
</data>
144144
<data name="net_quic_in_range" xml:space="preserve">
145-
<value>'{0}'' should be within [0, {1}) range.</value>
145+
<value>'{0}' should be within [0, {1}) range.</value>
146+
</data>
147+
<data name="net_quic_power_of_2" xml:space="preserve">
148+
<value>'{0}' must be a power of 2.</value>
146149
</data>
147150
<data name="net_quic_not_null_listener" xml:space="preserve">
148151
<value>'{0}' must be specified to start the listener.</value>

src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/MsQuicApi.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ static MsQuicApi()
154154

155155
if (version < s_minMsQuicVersion)
156156
{
157-
NotSupportedReason = $"Incompatible MsQuic library version '{version}', expecting higher than '{s_minMsQuicVersion}'.";
157+
NotSupportedReason = $"Incompatible MsQuic library version '{version}', expecting higher than '{s_minMsQuicVersion}'.";
158158
if (NetEventSource.Log.IsEnabled())
159159
{
160160
NetEventSource.Info(null, NotSupportedReason);
@@ -178,7 +178,7 @@ static MsQuicApi()
178178
// Implies windows platform, check TLS1.3 availability
179179
if (!IsWindowsVersionSupported())
180180
{
181-
NotSupportedReason = $"Current Windows version ({Environment.OSVersion}) is not supported by QUIC. Minimal supported version is {s_minWindowsVersion}.";
181+
NotSupportedReason = $"Current Windows version ({Environment.OSVersion}) is not supported by QUIC. Minimal supported version is {s_minWindowsVersion}.";
182182
if (NetEventSource.Log.IsEnabled())
183183
{
184184
NetEventSource.Info(null, NotSupportedReason);

src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/MsQuicConfiguration.cs

+34-1
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,47 @@ private static unsafe MsQuicSafeHandle Create(QuicConnectionOptions options, QUI
117117
#pragma warning restore SYSLIB0040
118118

119119
QUIC_SETTINGS settings = default(QUIC_SETTINGS);
120+
120121
settings.IsSet.PeerUnidiStreamCount = 1;
121122
settings.PeerUnidiStreamCount = (ushort)options.MaxInboundUnidirectionalStreams;
123+
122124
settings.IsSet.PeerBidiStreamCount = 1;
123125
settings.PeerBidiStreamCount = (ushort)options.MaxInboundBidirectionalStreams;
126+
124127
if (options.IdleTimeout != TimeSpan.Zero)
125128
{
126129
settings.IsSet.IdleTimeoutMs = 1;
127-
settings.IdleTimeoutMs = options.IdleTimeout != Timeout.InfiniteTimeSpan ? (ulong)options.IdleTimeout.TotalMilliseconds : 0;
130+
settings.IdleTimeoutMs = options.IdleTimeout != Timeout.InfiniteTimeSpan
131+
? (ulong)options.IdleTimeout.TotalMilliseconds
132+
: 0; // 0 disables the timeout
133+
}
134+
135+
if (options.KeepAliveInterval != TimeSpan.Zero)
136+
{
137+
settings.IsSet.KeepAliveIntervalMs = 1;
138+
settings.KeepAliveIntervalMs = options.KeepAliveInterval != Timeout.InfiniteTimeSpan
139+
? (uint)options.KeepAliveInterval.TotalMilliseconds
140+
: 0; // 0 disables the keepalive
141+
}
142+
143+
settings.IsSet.ConnFlowControlWindow = 1;
144+
settings.ConnFlowControlWindow = (uint)(options._initialRecieveWindowSizes?.Connection ?? QuicDefaults.DefaultConnectionMaxData);
145+
146+
settings.IsSet.StreamRecvWindowBidiLocalDefault = 1;
147+
settings.StreamRecvWindowBidiLocalDefault = (uint)(options._initialRecieveWindowSizes?.LocallyInitiatedBidirectionalStream ?? QuicDefaults.DefaultStreamMaxData);
148+
149+
settings.IsSet.StreamRecvWindowBidiRemoteDefault = 1;
150+
settings.StreamRecvWindowBidiRemoteDefault = (uint)(options._initialRecieveWindowSizes?.RemotelyInitiatedBidirectionalStream ?? QuicDefaults.DefaultStreamMaxData);
151+
152+
settings.IsSet.StreamRecvWindowUnidiDefault = 1;
153+
settings.StreamRecvWindowUnidiDefault = (uint)(options._initialRecieveWindowSizes?.UnidirectionalStream ?? QuicDefaults.DefaultStreamMaxData);
154+
155+
if (options.HandshakeTimeout != TimeSpan.Zero)
156+
{
157+
settings.IsSet.HandshakeIdleTimeoutMs = 1;
158+
settings.HandshakeIdleTimeoutMs = options.HandshakeTimeout != Timeout.InfiniteTimeSpan
159+
? (ulong)options.HandshakeTimeout.TotalMilliseconds
160+
: 0; // 0 disables the timeout
128161
}
129162

130163
QUIC_HANDLE* handle;

0 commit comments

Comments
 (0)