Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRadek Zikmund <32671551+rzikm@users.noreply.github.com>2022-09-30 15:19:03 +0300
committerGitHub <noreply@github.com>2022-09-30 15:19:03 +0300
commitb20eeb06e630a2516b972566175063d37c22ef63 (patch)
treef3a7f9cc7df650dfe1ecafd56e8adcf686ebbdc1 /src
parent5c8aade5384cbad2d086e7fae482ba0b692d3601 (diff)
Add QuicError.AlpnInUse member (#74754)
* Import new MsQuic interop * Detect the new QUIC status * Use correct values for ALPN_IN_USE in interop shim * Update alpine-3.14-helix-amd64 image to newer
Diffstat (limited to 'src')
-rw-r--r--src/libraries/System.Net.Quic/ref/System.Net.Quic.cs1
-rw-r--r--src/libraries/System.Net.Quic/src/Resources/Strings.resx3
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ThrowHelper.cs2
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic.cs1
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated.cs86
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_linux.cs3
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_macos.cs3
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_windows.cs3
-rw-r--r--src/libraries/System.Net.Quic/src/System/Net/Quic/QuicError.cs5
-rw-r--r--src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs11
-rw-r--r--src/libraries/System.Net.Quic/tests/FunctionalTests/QuicTestBase.cs1
11 files changed, 104 insertions, 15 deletions
diff --git a/src/libraries/System.Net.Quic/ref/System.Net.Quic.cs b/src/libraries/System.Net.Quic/ref/System.Net.Quic.cs
index fed27168ef8..dccd0daf4c8 100644
--- a/src/libraries/System.Net.Quic/ref/System.Net.Quic.cs
+++ b/src/libraries/System.Net.Quic/ref/System.Net.Quic.cs
@@ -59,6 +59,7 @@ namespace System.Net.Quic
ConnectionIdle = 10,
ProtocolError = 11,
OperationAborted = 12,
+ AlpnInUse = 13,
}
public sealed partial class QuicException : System.IO.IOException
{
diff --git a/src/libraries/System.Net.Quic/src/Resources/Strings.resx b/src/libraries/System.Net.Quic/src/Resources/Strings.resx
index b55b399c2cd..09e0e5dc47f 100644
--- a/src/libraries/System.Net.Quic/src/Resources/Strings.resx
+++ b/src/libraries/System.Net.Quic/src/Resources/Strings.resx
@@ -204,6 +204,9 @@
<data name="net_quic_protocol_error" xml:space="preserve">
<value>A QUIC protocol error was encountered</value>
</data>
+ <data name="net_quic_alpn_in_use" xml:space="preserve">
+ <value>Another QUIC listener is already listening on one of the requested application protocols on the same port.</value>
+ </data>
<data name="net_quic_ver_neg_error" xml:space="preserve">
<value>A version negotiation error was encountered.</value>
</data>
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ThrowHelper.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ThrowHelper.cs
index 428dcf00814..65db16ea406 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ThrowHelper.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ThrowHelper.cs
@@ -73,6 +73,7 @@ internal static class ThrowHelper
if (status == QUIC_STATUS_INVALID_ADDRESS) return new QuicException(QuicError.InvalidAddress, null, SR.net_quic_invalid_address);
if (status == QUIC_STATUS_CONNECTION_IDLE) return new QuicException(QuicError.ConnectionIdle, null, SR.net_quic_connection_idle);
if (status == QUIC_STATUS_PROTOCOL_ERROR) return new QuicException(QuicError.ProtocolError, null, SR.net_quic_protocol_error);
+ if (status == QUIC_STATUS_ALPN_IN_USE) return new QuicException(QuicError.AlpnInUse, null, SR.net_quic_protocol_error);
if (status == QUIC_STATUS_TLS_ERROR ||
status == QUIC_STATUS_CERT_EXPIRED ||
@@ -155,6 +156,7 @@ internal static class ThrowHelper
else if (status == QUIC_STATUS_USER_CANCELED) return "QUIC_STATUS_USER_CANCELED";
else if (status == QUIC_STATUS_ALPN_NEG_FAILURE) return "QUIC_STATUS_ALPN_NEG_FAILURE";
else if (status == QUIC_STATUS_STREAM_LIMIT_REACHED) return "QUIC_STATUS_STREAM_LIMIT_REACHED";
+ else if (status == QUIC_STATUS_ALPN_IN_USE) return "QUIC_STATUS_ALPN_IN_USE";
else if (status == QUIC_STATUS_CLOSE_NOTIFY) return "QUIC_STATUS_CLOSE_NOTIFY";
else if (status == QUIC_STATUS_BAD_CERTIFICATE) return "QUIC_STATUS_BAD_CERTIFICATE";
else if (status == QUIC_STATUS_UNSUPPORTED_CERTIFICATE) return "QUIC_STATUS_UNSUPPORTED_CERTIFICATE";
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic.cs
index 81f62f081a6..db4d69c539f 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic.cs
@@ -73,6 +73,7 @@ namespace Microsoft.Quic
public static int QUIC_STATUS_USER_CANCELED => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_USER_CANCELED : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_USER_CANCELED : MsQuic_Linux.QUIC_STATUS_USER_CANCELED;
public static int QUIC_STATUS_ALPN_NEG_FAILURE => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_ALPN_NEG_FAILURE : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_ALPN_NEG_FAILURE : MsQuic_Linux.QUIC_STATUS_ALPN_NEG_FAILURE;
public static int QUIC_STATUS_STREAM_LIMIT_REACHED => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_STREAM_LIMIT_REACHED : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_STREAM_LIMIT_REACHED : MsQuic_Linux.QUIC_STATUS_STREAM_LIMIT_REACHED;
+ public static int QUIC_STATUS_ALPN_IN_USE => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_ALPN_IN_USE : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_ALPN_IN_USE : MsQuic_Linux.QUIC_STATUS_ALPN_IN_USE;
public static int QUIC_STATUS_CLOSE_NOTIFY => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_CLOSE_NOTIFY : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_CLOSE_NOTIFY : MsQuic_Linux.QUIC_STATUS_CLOSE_NOTIFY;
public static int QUIC_STATUS_BAD_CERTIFICATE => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_BAD_CERTIFICATE : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_BAD_CERTIFICATE : MsQuic_Linux.QUIC_STATUS_BAD_CERTIFICATE;
public static int QUIC_STATUS_UNSUPPORTED_CERTIFICATE => OperatingSystem.IsWindows() ? MsQuic_Windows.QUIC_STATUS_UNSUPPORTED_CERTIFICATE : (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid()) ? MsQuic_Linux.QUIC_STATUS_UNSUPPORTED_CERTIFICATE : MsQuic_Linux.QUIC_STATUS_UNSUPPORTED_CERTIFICATE;
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated.cs
index 738c2365f60..54b392cc54a 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated.cs
@@ -689,6 +689,34 @@ namespace Microsoft.Quic
}
}
+ [NativeTypeName("uint32_t : 1")]
+ internal uint GreaseBitNegotiated
+ {
+ get
+ {
+ return (_bitfield >> 4) & 0x1u;
+ }
+
+ set
+ {
+ _bitfield = (_bitfield & ~(0x1u << 4)) | ((value & 0x1u) << 4);
+ }
+ }
+
+ [NativeTypeName("uint32_t : 27")]
+ internal uint RESERVED
+ {
+ get
+ {
+ return (_bitfield >> 5) & 0x7FFFFFFu;
+ }
+
+ set
+ {
+ _bitfield = (_bitfield & ~(0x7FFFFFFu << 5)) | ((value & 0x7FFFFFFu) << 5);
+ }
+ }
+
[NativeTypeName("uint32_t")]
internal uint Rtt;
@@ -772,6 +800,9 @@ namespace Microsoft.Quic
[NativeTypeName("uint32_t")]
internal uint SendCongestionWindow;
+
+ [NativeTypeName("uint32_t")]
+ internal uint DestCidUpdateCount;
}
internal partial struct QUIC_LISTENER_STATISTICS
@@ -1079,17 +1110,31 @@ namespace Microsoft.Quic
}
}
- [NativeTypeName("uint8_t : 2")]
+ [NativeTypeName("uint8_t : 1")]
+ internal byte GreaseQuicBitEnabled
+ {
+ get
+ {
+ return (byte)((_bitfield >> 6) & 0x1u);
+ }
+
+ set
+ {
+ _bitfield = (byte)((_bitfield & ~(0x1u << 6)) | ((value & 0x1u) << 6));
+ }
+ }
+
+ [NativeTypeName("uint8_t : 1")]
internal byte RESERVED
{
get
{
- return (byte)((_bitfield >> 6) & 0x3u);
+ return (byte)((_bitfield >> 7) & 0x1u);
}
set
{
- _bitfield = (byte)((_bitfield & ~(0x3u << 6)) | ((value & 0x3u) << 6));
+ _bitfield = (byte)((_bitfield & ~(0x1u << 7)) | ((value & 0x1u) << 7));
}
}
@@ -1099,6 +1144,9 @@ namespace Microsoft.Quic
[NativeTypeName("uint8_t")]
internal byte MtuDiscoveryMissingProbeCount;
+ [NativeTypeName("uint32_t")]
+ internal uint DestCidUpdateIdleTimeoutMs;
+
internal ref ulong IsSetFlags
{
get
@@ -1564,8 +1612,8 @@ namespace Microsoft.Quic
}
}
- [NativeTypeName("uint64_t : 33")]
- internal ulong RESERVED
+ [NativeTypeName("uint64_t : 1")]
+ internal ulong DestCidUpdateIdleTimeoutMs
{
get
{
@@ -1577,6 +1625,34 @@ namespace Microsoft.Quic
_bitfield = (_bitfield & ~(0x1UL << 31)) | ((value & 0x1UL) << 31);
}
}
+
+ [NativeTypeName("uint64_t : 1")]
+ internal ulong GreaseQuicBitEnabled
+ {
+ get
+ {
+ return (_bitfield >> 32) & 0x1UL;
+ }
+
+ set
+ {
+ _bitfield = (_bitfield & ~(0x1UL << 32)) | ((value & 0x1UL) << 32);
+ }
+ }
+
+ [NativeTypeName("uint64_t : 31")]
+ internal ulong RESERVED
+ {
+ get
+ {
+ return (_bitfield >> 33) & 0x7FFFFFFFUL;
+ }
+
+ set
+ {
+ _bitfield = (_bitfield & ~(0x7FFFFFFFUL << 33)) | ((value & 0x7FFFFFFFUL) << 33);
+ }
+ }
}
}
}
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_linux.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_linux.cs
index 880ed49b887..f8c8e91ab34 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_linux.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_linux.cs
@@ -81,6 +81,9 @@ namespace Microsoft.Quic
[NativeTypeName("#define QUIC_STATUS_STREAM_LIMIT_REACHED ((QUIC_STATUS)ESTRPIPE)")]
public const int QUIC_STATUS_STREAM_LIMIT_REACHED = ((int)(86));
+ [NativeTypeName("#define QUIC_STATUS_ALPN_IN_USE ((QUIC_STATUS)EPROTOTYPE)")]
+ public const int QUIC_STATUS_ALPN_IN_USE = unchecked((int)(91));
+
[NativeTypeName("#define QUIC_STATUS_CLOSE_NOTIFY QUIC_STATUS_TLS_ALERT(0)")]
public const int QUIC_STATUS_CLOSE_NOTIFY = ((int)(0xff & 0) + 256 + 200000000);
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_macos.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_macos.cs
index f3fa6b0de89..26b32f65542 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_macos.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_macos.cs
@@ -81,6 +81,9 @@ namespace Microsoft.Quic
[NativeTypeName("#define QUIC_STATUS_STREAM_LIMIT_REACHED ((QUIC_STATUS)ESTRPIPE)")]
public const int QUIC_STATUS_STREAM_LIMIT_REACHED = ((int)(86));
+ [NativeTypeName("#define QUIC_STATUS_ALPN_IN_USE ((QUIC_STATUS)EPROTOTYPE)")]
+ public const int QUIC_STATUS_ALPN_IN_USE = unchecked((int)(41));
+
[NativeTypeName("#define QUIC_STATUS_CLOSE_NOTIFY QUIC_STATUS_TLS_ALERT(0)")]
public const int QUIC_STATUS_CLOSE_NOTIFY = ((int)(0xff & 0) + 256 + 200000000);
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_windows.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_windows.cs
index ea4f755da5d..c9ceebc638a 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_windows.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Interop/msquic_generated_windows.cs
@@ -81,6 +81,9 @@ namespace Microsoft.Quic
[NativeTypeName("#define QUIC_STATUS_STREAM_LIMIT_REACHED ERROR_QUIC_STREAM_LIMIT_REACHED")]
public const int QUIC_STATUS_STREAM_LIMIT_REACHED = unchecked((int)(0x80410008));
+ [NativeTypeName("#define QUIC_STATUS_ALPN_IN_USE ERROR_QUIC_ALPN_IN_USE")]
+ public const int QUIC_STATUS_ALPN_IN_USE = unchecked((int)(0x80410009L));
+
[NativeTypeName("#define QUIC_STATUS_CLOSE_NOTIFY QUIC_STATUS_TLS_ALERT(0)")]
public const int QUIC_STATUS_CLOSE_NOTIFY = unchecked(((int)(0x80410100)) | (0xff & 0));
diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicError.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicError.cs
index 7207ebbaa33..e70e86f7d45 100644
--- a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicError.cs
+++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicError.cs
@@ -72,5 +72,10 @@ namespace System.Net.Quic
/// The operation has been aborted.
/// </summary>
OperationAborted,
+
+ /// <summary>
+ /// Another QUIC listener is already listening on one of the requested application protocols on the same port.
+ /// </summary>
+ AlpnInUse,
}
}
diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs
index af05db6f809..d577a33f80f 100644
--- a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs
+++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs
@@ -133,16 +133,7 @@ namespace System.Net.Quic.Tests
public async Task TwoListenersOnSamePort_SameAlpn_Throws()
{
await using QuicListener listener = await CreateQuicListener();
-
- //
- // TODO: MsQuic returns QUIC_STATUS_INVALID_STATE in this case, returning
- // ADDRESS_IN_USE could be confusing because you can actually bind two listeners
- // to the same port (see TwoListenersOnSamePort_DisjointAlpn_Success). It may be better
- // to add a new error code to identify this case
- //
- // [ActiveIssue("https://github.com/dotnet/runtime/issues/73045")]
- //
- await AssertThrowsQuicExceptionAsync(QuicError.InternalError, async () => await CreateQuicListener(listener.LocalEndPoint));
+ await AssertThrowsQuicExceptionAsync(QuicError.AlpnInUse, async () => await CreateQuicListener(listener.LocalEndPoint));
}
[Fact]
diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicTestBase.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicTestBase.cs
index 35fa6ab5474..8d013427b62 100644
--- a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicTestBase.cs
+++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicTestBase.cs
@@ -60,6 +60,7 @@ namespace System.Net.Quic.Tests
public async Task<QuicException> AssertThrowsQuicExceptionAsync(QuicError expectedError, Func<Task> testCode)
{
QuicException ex = await Assert.ThrowsAsync<QuicException>(testCode);
+ _output.WriteLine(ex.ToString());
Assert.Equal(expectedError, ex.QuicError);
return ex;
}