diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Windows.cs b/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Windows.cs index 1296e4afa3..e0427b1717 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Windows.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Windows.cs @@ -162,6 +162,20 @@ private unsafe struct SNI_CLIENT_CONSUMER_INFO public TransparentNetworkResolutionMode transparentNetworkResolution; public int totalTimeout; public bool isAzureSqlServerEndpoint; + public SNI_DNSCache_Info DNSCacheInfo; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + internal struct SNI_DNSCache_Info + { + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedFQDN; + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedTcpIPv4; + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedTcpIPv6; + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedTcpPort; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] @@ -248,7 +262,8 @@ private static extern uint SNIOpenWrapper( [MarshalAs(UnmanagedType.LPWStr)] string szConnect, [In] SNIHandle pConn, out IntPtr ppConn, - [MarshalAs(UnmanagedType.Bool)] bool fSync); + [MarshalAs(UnmanagedType.Bool)] bool fSync, + [In] ref SNI_DNSCache_Info pDNSCachedInfo); [DllImport(SNI, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr SNIPacketAllocateWrapper([In] SafeHandle pConn, IOType IOType); @@ -295,7 +310,13 @@ internal static unsafe uint SNIOpenMarsSession(ConsumerInfo consumerInfo, SNIHan Sni_Consumer_Info native_consumerInfo = new Sni_Consumer_Info(); MarshalConsumerInfo(consumerInfo, ref native_consumerInfo); - return SNIOpenWrapper(ref native_consumerInfo, "session:", parent, out pConn, fSync); + SNI_DNSCache_Info native_cachedDNSInfo = new SNI_DNSCache_Info(); + native_cachedDNSInfo.wszCachedFQDN = null; + native_cachedDNSInfo.wszCachedTcpIPv4 = null; + native_cachedDNSInfo.wszCachedTcpIPv6 = null; + native_cachedDNSInfo.wszCachedTcpPort = null; + + return SNIOpenWrapper(ref native_consumerInfo, "session:", parent, out pConn, fSync, ref native_cachedDNSInfo); } internal static unsafe uint SNIOpenSyncEx(ConsumerInfo consumerInfo, string constring, ref IntPtr pConn, byte[] spnBuffer, byte[] instanceName, bool fOverrideCache, bool fSync, int timeout, bool fParallel) @@ -321,6 +342,11 @@ internal static unsafe uint SNIOpenSyncEx(ConsumerInfo consumerInfo, string cons clientConsumerInfo.totalTimeout = SniOpenTimeOut; clientConsumerInfo.isAzureSqlServerEndpoint = ADP.IsAzureSqlServerEndpoint(constring); + clientConsumerInfo.DNSCacheInfo.wszCachedFQDN = null; + clientConsumerInfo.DNSCacheInfo.wszCachedTcpIPv4 = null; + clientConsumerInfo.DNSCacheInfo.wszCachedTcpIPv6 = null; + clientConsumerInfo.DNSCacheInfo.wszCachedTcpPort = null; + if (spnBuffer != null) { fixed (byte* pin_spnBuffer = &spnBuffer[0]) diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX64.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX64.cs index dd585ededa..e57dd41e64 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX64.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX64.cs @@ -90,7 +90,8 @@ internal static extern uint SNIOpenWrapper( [MarshalAs(UnmanagedType.LPWStr)] string szConnect, [In] SNIHandle pConn, out IntPtr ppConn, - [MarshalAs(UnmanagedType.Bool)] bool fSync); + [MarshalAs(UnmanagedType.Bool)] bool fSync, + [In] ref SNI_DNSCache_Info pDNSCachedInfo); [DllImport(SNI, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr SNIPacketAllocateWrapper([In] SafeHandle pConn, IOType IOType); diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX86.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX86.cs index 339760c1a2..c52ab82e0c 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX86.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeManagedWrapperX86.cs @@ -90,7 +90,8 @@ internal static extern uint SNIOpenWrapper( [MarshalAs(UnmanagedType.LPWStr)] string szConnect, [In] SNIHandle pConn, out IntPtr ppConn, - [MarshalAs(UnmanagedType.Bool)] bool fSync); + [MarshalAs(UnmanagedType.Bool)] bool fSync, + [In] ref SNI_DNSCache_Info pDNSCachedInfo); [DllImport(SNI, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr SNIPacketAllocateWrapper([In] SafeHandle pConn, IOType IOType); diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeMethodWrapper.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeMethodWrapper.cs index 499b29b4d3..e4a0af9fed 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeMethodWrapper.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Interop/SNINativeMethodWrapper.cs @@ -352,6 +352,20 @@ internal unsafe struct SNI_CLIENT_CONSUMER_INFO public TransparentNetworkResolutionMode transparentNetworkResolution; public int totalTimeout; public bool isAzureSqlServerEndpoint; + public SNI_DNSCache_Info DNSCacheInfo; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + internal struct SNI_DNSCache_Info + { + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedFQDN; + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedTcpIPv4; + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedTcpIPv6; + [MarshalAs(UnmanagedType.LPWStr)] + public string wszCachedTcpPort; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] @@ -566,11 +580,12 @@ private static uint SNIOpenWrapper( [MarshalAs(UnmanagedType.LPWStr)] string szConnect, [In] SNIHandle pConn, out IntPtr ppConn, - [MarshalAs(UnmanagedType.Bool)] bool fSync) + [MarshalAs(UnmanagedType.Bool)] bool fSync, + [In] ref SNI_DNSCache_Info pDNSCachedInfo) { return s_is64bitProcess ? - SNINativeManagedWrapperX64.SNIOpenWrapper(ref pConsumerInfo, szConnect, pConn, out ppConn, fSync) : - SNINativeManagedWrapperX86.SNIOpenWrapper(ref pConsumerInfo, szConnect, pConn, out ppConn, fSync); + SNINativeManagedWrapperX64.SNIOpenWrapper(ref pConsumerInfo, szConnect, pConn, out ppConn, fSync, ref pDNSCachedInfo) : + SNINativeManagedWrapperX86.SNIOpenWrapper(ref pConsumerInfo, szConnect, pConn, out ppConn, fSync, ref pDNSCachedInfo); } private static IntPtr SNIPacketAllocateWrapper([In] SafeHandle pConn, IOType IOType) @@ -699,7 +714,13 @@ internal static unsafe uint SNIOpenMarsSession(ConsumerInfo consumerInfo, SNIHan Sni_Consumer_Info native_consumerInfo = new Sni_Consumer_Info(); MarshalConsumerInfo(consumerInfo, ref native_consumerInfo); - return SNIOpenWrapper(ref native_consumerInfo, "session:", parent, out pConn, fSync); + SNI_DNSCache_Info native_cachedDNSInfo = new SNI_DNSCache_Info(); + native_cachedDNSInfo.wszCachedFQDN = null; + native_cachedDNSInfo.wszCachedTcpIPv4 = null; + native_cachedDNSInfo.wszCachedTcpIPv6 = null; + native_cachedDNSInfo.wszCachedTcpPort = null; + + return SNIOpenWrapper(ref native_consumerInfo, "session:", parent, out pConn, fSync, ref native_cachedDNSInfo); } internal static unsafe uint SNIOpenSyncEx(ConsumerInfo consumerInfo, string constring, ref IntPtr pConn, byte[] spnBuffer, byte[] instanceName, bool fOverrideCache, bool fSync, int timeout, bool fParallel, Int32 transparentNetworkResolutionStateNo, Int32 totalTimeout, Boolean isAzureSqlServerEndpoint) @@ -737,6 +758,11 @@ internal static unsafe uint SNIOpenSyncEx(ConsumerInfo consumerInfo, string cons }; clientConsumerInfo.totalTimeout = totalTimeout; + clientConsumerInfo.DNSCacheInfo.wszCachedFQDN = null; + clientConsumerInfo.DNSCacheInfo.wszCachedTcpIPv4 = null; + clientConsumerInfo.DNSCacheInfo.wszCachedTcpIPv6 = null; + clientConsumerInfo.DNSCacheInfo.wszCachedTcpPort = null; + if (spnBuffer != null) { fixed (byte* pin_spnBuffer = &spnBuffer[0])