diff options
author | Radek Zikmund <32671551+rzikm@users.noreply.github.com> | 2022-09-30 15:19:03 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-30 15:19:03 +0300 |
commit | b20eeb06e630a2516b972566175063d37c22ef63 (patch) | |
tree | f3a7f9cc7df650dfe1ecafd56e8adcf686ebbdc1 /src | |
parent | 5c8aade5384cbad2d086e7fae482ba0b692d3601 (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')
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; } |