diff --git a/WindivertDotnet.Test/WindivertDotnet.Test.csproj b/WindivertDotnet.Test/WindivertDotnet.Test.csproj index 74f7b9e..18c84b2 100644 --- a/WindivertDotnet.Test/WindivertDotnet.Test.csproj +++ b/WindivertDotnet.Test/WindivertDotnet.Test.csproj @@ -1,27 +1,27 @@ - + - - net6.0 - enable + + net6.0 + enable + True + false + - false - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - + + + diff --git a/WindivertDotnet.Test/WindivertRouterTest.cs b/WindivertDotnet.Test/WindivertRouterTest.cs new file mode 100644 index 0000000..1a358ef --- /dev/null +++ b/WindivertDotnet.Test/WindivertRouterTest.cs @@ -0,0 +1,67 @@ +using System.Net; +using Xunit; + +namespace WindivertDotnet.Test +{ + public class WindivertRouterTest + { + [Fact] + public void IPv4LoopbackTest() + { + var router = new WinDivertRouter(IPAddress.Loopback); + Assert.Equal(IPAddress.Loopback, router.SrcAddress); + Assert.Equal(IPAddress.Loopback, router.DstAddress); + Assert.True(router.IsOutbound); + Assert.True(router.IsLoopback); + } + + [Fact] + public unsafe void IPv4LoopbackAddrTest() + { + var router = new WinDivertRouter(IPAddress.Loopback); + using var addr = router.CreateAddress(); + + Assert.Equal(addr.Network->IfIdx, router.InterfaceIndex); + Assert.True(addr.Flags.HasFlag(WinDivertAddressFlag.Outbound)); + Assert.True(addr.Flags.HasFlag(WinDivertAddressFlag.Loopback)); + } + + [Fact] + public void IPv6LoopbackTest() + { + var router = new WinDivertRouter(IPAddress.IPv6Loopback); + Assert.Equal(IPAddress.IPv6Loopback, router.SrcAddress); + Assert.Equal(IPAddress.IPv6Loopback, router.DstAddress); + Assert.True(router.IsOutbound); + Assert.True(router.IsLoopback); + } + + [Fact] + public void IPv41111Test() + { + var dstAddrr = IPAddress.Parse("1.1.1.1"); + var router = new WinDivertRouter(dstAddrr); + Assert.NotEqual(IPAddress.Any, router.SrcAddress); + Assert.Equal(dstAddrr, router.DstAddress); + Assert.True(router.IsOutbound); + Assert.False(router.IsLoopback); + } + + [Fact] + public unsafe void IPv41111AddrTest() + { + var dstAddrr = IPAddress.Parse("1.1.1.1"); + var router = new WinDivertRouter(dstAddrr); + + using var addr = new WinDivertAddress + { + Flags = WinDivertAddressFlag.Loopback + }; + router.ApplyToAddress(addr); + + Assert.Equal(addr.Network->IfIdx, router.InterfaceIndex); + Assert.True(addr.Flags.HasFlag(WinDivertAddressFlag.Outbound)); + Assert.False(addr.Flags.HasFlag(WinDivertAddressFlag.Loopback)); + } + } +} diff --git a/WindivertDotnet/WinDivertRouter.cs b/WindivertDotnet/WinDivertRouter.cs index 7d8365d..795dda1 100644 --- a/WindivertDotnet/WinDivertRouter.cs +++ b/WindivertDotnet/WinDivertRouter.cs @@ -34,6 +34,11 @@ public class WinDivertRouter /// public bool IsOutbound { get; } + /// + /// 获取是否为回环 + /// + public bool IsLoopback { get; } + /// /// WinDivert路由 /// @@ -138,27 +143,9 @@ private unsafe WinDivertRouter(IPAddress dstAddr, IPAddress? srcAddr, int? inter this.DstAddress = dstAddr; this.InterfaceIndex = interfaceIndex.Value; this.IsOutbound = errorCode == 0; + this.IsLoopback = IPAddress.IsLoopback(dstAddr) && dstAddr.Equals(this.SrcAddress); } - /// - /// 获取网络接口索引 - /// - /// 目标地址 - /// - /// - /// - public static int GetInterfaceIndex(IPAddress dstAddr) - { - if (IsIPAddressAny(dstAddr)) - { - throw new ArgumentException($"值不能为{dstAddr}", nameof(dstAddr)); - } - - var dstSockAddr = new SockAddress { IPAddress = dstAddr }; - return GetInterfaceIndex(ref dstSockAddr); - } - - /// /// 是否为any的ip /// @@ -181,26 +168,61 @@ private static int GetInterfaceIndex(ref SockAddress dstSockAddr) return errorCode == 0 ? ifIdx : throw new NetworkInformationException(errorCode); } + /// + /// 获取网络接口索引 + /// + /// 目标地址 + /// + /// + /// + public static int GetInterfaceIndex(IPAddress dstAddr) + { + if (IsIPAddressAny(dstAddr)) + { + throw new ArgumentException($"值不能为{dstAddr}", nameof(dstAddr)); + } + + var dstSockAddr = new SockAddress { IPAddress = dstAddr }; + return GetInterfaceIndex(ref dstSockAddr); + } + /// /// 使用路由信息创建WinDivertAddress对象 /// /// - public unsafe WinDivertAddress CreateAddress() + public WinDivertAddress CreateAddress() { var addr = new WinDivertAddress(); + this.ApplyToAddress(addr); + return addr; + } + + /// + /// 应用路由信息到指定的WinDivertAddress + /// 将更改Network->IfIdx、Flags.Outbound和Flags.Loopback + /// + /// + public unsafe void ApplyToAddress(WinDivertAddress addr) + { addr.Network->IfIdx = this.InterfaceIndex; - if (this.IsOutbound == true) + if (this.IsOutbound) { addr.Flags |= WinDivertAddressFlag.Outbound; } + else + { + addr.Flags &= ~WinDivertAddressFlag.Outbound; + } - if (IPAddress.IsLoopback(this.SrcAddress) && this.SrcAddress.Equals(this.DstAddress)) + if (this.IsLoopback) { addr.Flags |= WinDivertAddressFlag.Loopback; } - - return addr; + else + { + addr.Flags &= ~WinDivertAddressFlag.Loopback; + } } } } diff --git a/WindivertDotnet/WindivertDotnet.csproj b/WindivertDotnet/WindivertDotnet.csproj index bf2f993..6a1d58b 100644 --- a/WindivertDotnet/WindivertDotnet.csproj +++ b/WindivertDotnet/WindivertDotnet.csproj @@ -1,7 +1,7 @@  - 1.0.6 + 1.0.7 netcoreapp3.1;net6.0 enable IDE0079