diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
index ac8f2d2200..0e16bd61e8 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
@@ -275,6 +275,69 @@
Microsoft\Data\SqlClient\LocalAppContextSwitches.cs
+
+ Microsoft\Data\SqlClient\ManagedSni\ConcurrentQueueSemaphore.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniAsyncCallback.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniError.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniCommon.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniHandle.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniLoadHandle.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniMarsConnection.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniMarsHandle.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniNetworkStream.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniNpHandle.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniPacket.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniPhysicalHandle.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniProviders.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniProxy.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniSmuxFlags.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniSmuxHeader.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniSslStream.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SniTcpHandle.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SslOverTdsStream.netcore.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SslOverTdsStream.NetCoreApp.cs
+
+
+ Microsoft\Data\SqlClient\ManagedSni\SsrpClient.netcore.cs
+
Microsoft\Data\SqlClient\NoneAttestationEnclaveProvider.cs
@@ -731,25 +794,8 @@
System\Diagnostics\CodeAnalysis.cs
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -882,6 +928,9 @@
Microsoft\Data\SqlClient\LocalDb\LocalDbApi.Windows.cs
+
+ Microsoft\Data\SqlClient\ManagedSni\LocalDB.netcore.Windows.cs
+
Microsoft\Data\SqlClient\PacketHandle.Windows.cs
@@ -910,7 +959,6 @@
Microsoft\Data\SqlTypes\SqlFileStream.Windows.cs
-
@@ -929,6 +977,9 @@
Microsoft\Data\SqlClient\LocalDb\LocalDbApi.Unix.cs
+
+ Microsoft\Data\SqlClient\ManagedSni\LocalDB.netcore.Unix.cs
+
Microsoft\Data\SqlClient\PacketHandle.netcore.Unix.cs
@@ -951,7 +1002,6 @@
Microsoft\Data\SqlTypes\SqlFileStream.netcore.Unix.cs
-
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.ValueTask.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.ValueTask.cs
deleted file mode 100644
index f5f38f0efe..0000000000
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.ValueTask.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Threading;
-using System.Threading.Tasks;
-using System;
-
-namespace Microsoft.Data.SqlClient.SNI
-{
- internal sealed partial class SNISslStream
- {
- public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- return ReadAsync(new Memory(buffer, offset, count), cancellationToken).AsTask();
- }
-
- public override async ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken = default)
- {
- await _readAsyncSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
- try
- {
- return await base.ReadAsync(buffer, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception e)
- {
- SqlClientEventSource.Log.TrySNITraceEvent(nameof(SNISslStream), EventType.ERR, "Internal Exception occurred while reading data: {0}", args0: e?.Message);
- throw;
- }
- finally
- {
- _readAsyncSemaphore.Release();
- }
- }
-
- public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- return WriteAsync(new Memory(buffer, offset, count), cancellationToken).AsTask();
- }
-
- public override async ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken = default)
- {
- await _writeAsyncSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
- try
- {
- await base.WriteAsync(buffer, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception e)
- {
- SqlClientEventSource.Log.TrySNITraceEvent(nameof(SNISslStream), EventType.ERR, "Internal Exception occurred while reading data: {0}", args0: e?.Message);
- throw;
- }
- finally
- {
- _writeAsyncSemaphore.Release();
- }
- }
- }
-
- internal sealed partial class SNINetworkStream
- {
- public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- return ReadAsync(new Memory(buffer, offset, count), cancellationToken).AsTask();
- }
-
- public override async ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken = default)
- {
- await _readAsyncSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
- try
- {
- return await base.ReadAsync(buffer, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception e)
- {
- SqlClientEventSource.Log.TrySNITraceEvent(nameof(SNISslStream), EventType.ERR, "Internal Exception occurred while reading data: {0}", args0: e?.Message);
- throw;
- }
- finally
- {
- _readAsyncSemaphore.Release();
- }
- }
-
- // Prevent the WriteAsync collisions by running the task in a Semaphore Slim
- public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- return WriteAsync(new Memory(buffer, offset, count), cancellationToken).AsTask();
- }
-
- public override async ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken = default)
- {
- await _writeAsyncSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
- try
- {
- await base.WriteAsync(buffer, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception e)
- {
- SqlClientEventSource.Log.TrySNITraceEvent(nameof(SNISslStream), EventType.ERR, "Internal Exception occurred while reading data: {0}", args0: e?.Message);
- throw;
- }
- finally
- {
- _writeAsyncSemaphore.Release();
- }
- }
- }
-}
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.cs
deleted file mode 100644
index 389f25eeae..0000000000
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Net.Security;
-using System.IO;
-using System.Net.Sockets;
-
-namespace Microsoft.Data.SqlClient.SNI
-{
- ///
- /// This class extends SslStream to customize stream behavior for Managed SNI implementation.
- ///
- internal sealed partial class SNISslStream : SslStream
- {
- private readonly ConcurrentQueueSemaphore _writeAsyncSemaphore;
- private readonly ConcurrentQueueSemaphore _readAsyncSemaphore;
-
- public SNISslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback)
- : base(innerStream, leaveInnerStreamOpen, userCertificateValidationCallback)
- {
- _writeAsyncSemaphore = new ConcurrentQueueSemaphore(1);
- _readAsyncSemaphore = new ConcurrentQueueSemaphore(1);
- }
- }
-
- ///
- /// This class extends NetworkStream to customize stream behavior for Managed SNI implementation.
- ///
- internal sealed partial class SNINetworkStream : NetworkStream
- {
- private readonly ConcurrentQueueSemaphore _writeAsyncSemaphore;
- private readonly ConcurrentQueueSemaphore _readAsyncSemaphore;
-
- public SNINetworkStream(Socket socket, bool ownsSocket) : base(socket, ownsSocket)
- {
- _writeAsyncSemaphore = new ConcurrentQueueSemaphore(1);
- _readAsyncSemaphore = new ConcurrentQueueSemaphore(1);
- }
- }
-}
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Unix.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Unix.cs
index 2f242a083f..d71332a25a 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Unix.cs
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Unix.cs
@@ -2,7 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using Microsoft.Data.SqlClient.SNI;
+using Microsoft.Data.SqlClient.ManagedSni;
namespace Microsoft.Data.SqlClient
{
@@ -26,7 +26,7 @@ private void WaitForSSLHandShakeToComplete(ref uint error, ref int protocolVersi
private SNIErrorDetails GetSniErrorDetails()
{
SNIErrorDetails details;
- SNIError sniError = SNIProxy.Instance.GetLastError();
+ SniError sniError = SniProxy.Instance.GetLastError();
details.sniErrorNumber = sniError.sniError;
details.errorMessage = sniError.errorMessage;
details.nativeError = sniError.nativeError;
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Windows.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Windows.cs
index de4bcb1338..25bc6f87c5 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Windows.cs
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.Windows.cs
@@ -5,7 +5,8 @@
using System;
using System.Diagnostics;
using Interop.Windows.Sni;
-using Microsoft.Data.SqlClient.SNI;
+using Microsoft.Data.SqlClient.ManagedSni;
+using SniError = Microsoft.Data.SqlClient.ManagedSni.SniError;
namespace Microsoft.Data.SqlClient
{
@@ -68,7 +69,7 @@ private SNIErrorDetails GetSniErrorDetails()
if (TdsParserStateObjectFactory.UseManagedSNI)
{
- SNIError sniError = SNIProxy.Instance.GetLastError();
+ SniError sniError = SniProxy.Instance.GetLastError();
details.sniErrorNumber = sniError.sniError;
details.errorMessage = sniError.errorMessage;
details.nativeError = sniError.nativeError;
@@ -79,7 +80,7 @@ private SNIErrorDetails GetSniErrorDetails()
}
else
{
- SniNativeWrapper.SniGetLastError(out SniError sniError);
+ SniNativeWrapper.SniGetLastError(out Interop.Windows.Sni.SniError sniError);
details.sniErrorNumber = sniError.sniError;
details.errorMessage = sniError.errorMessage;
details.nativeError = sniError.nativeError;
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObjectManaged.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObjectManaged.cs
index e6dddc79f9..a403f8b556 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObjectManaged.cs
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObjectManaged.cs
@@ -7,20 +7,19 @@
using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
-using System.Net.Security;
using System.Runtime.CompilerServices;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Data.Common;
using Microsoft.Data.ProviderBase;
-namespace Microsoft.Data.SqlClient.SNI
+// @TODO: If this is in the manages SNI namespace, it should be in the managed SNI folder
+namespace Microsoft.Data.SqlClient.ManagedSni
{
internal sealed class TdsParserStateObjectManaged : TdsParserStateObject
{
- private SNIMarsConnection? _marsConnection;
- private SNIHandle? _sessionHandle;
+ private SniMarsConnection? _marsConnection;
+ private SniHandle? _sessionHandle;
public TdsParserStateObjectManaged(TdsParser parser) : base(parser) { }
@@ -34,7 +33,7 @@ internal TdsParserStateObjectManaged(TdsParser parser, TdsParserStateObject phys
protected override bool CheckPacket(PacketHandle packet, TaskCompletionSource