public void TestUdpTunnel() { var nic = TunnelDevice.GetTunnelInterfaces().First(); using var tapDevice = GetTunnelDevice(nic); // Open TAP device first to ensure the virutal device is connected tapDevice.Open(DeviceModes.Promiscuous); var tapIp = IpHelper.GetIPAddress(nic); using var tester = new UdpTester(tapIp); tapDevice.Filter = "udp port " + UdpTester.Port; // Send from OS, and receive in tunnel var seq1 = new byte[] { 1, 2, 3 }; tester.Broadcast(seq1); var retval = tapDevice.GetNextPacket(out var p1); Assert.AreEqual(GetPacketStatus.PacketRead, retval); tester.AssertMatches(p1.GetPacket().GetPacket(), seq1); // Send from tunnel, and receive in OS var seq2 = new byte[] { 4, 5, 6 }; var packet = tester.GetReceivablePacket(seq2); tapDevice.SendPacket(packet); retval = tapDevice.GetNextPacket(out var p2); // TAP don't receive its own traffic Assert.AreEqual(GetPacketStatus.ReadTimeout, retval); CollectionAssert.AreEqual(seq2, tester.LastReceivedData); }
public void TestArpTunnel() { var nic = TunnelDevice.GetTunnelInterfaces().First(); using var tapDevice = GetTunnelDevice(nic); // Open TAP device first to ensure the virutal device is connected tapDevice.Open(DeviceModes.Promiscuous); var tapIp = IpHelper.GetIPAddress(nic); // we need to provide our own IP and MAC, otherwise OS will ignore its own requests var ipBytes = tapIp.GetAddressBytes(); ipBytes[3]++; var testIp = new IPAddress(ipBytes); var testMac = PhysicalAddress.Parse("001122334455"); PhysicalAddress mac = null; for (int i = 0; i < 5; i++) { mac = ARP.Resolve(tapDevice, tapIp, testIp, testMac, TimeSpan.FromSeconds(1)); if (mac != null) { break; } // Wait for interface to finish Gratuitous ARP } Assert.AreEqual(tapDevice.MacAddress, mac); }
public void TestPcapTapExchange() { var nic = TunnelDevice.GetTunnelInterfaces().First(); using var tapDevice = GetTunnelDevice(nic); // Open TAP device first to ensure the virutal device is connected tapDevice.Open(); // Wait for interface to be fully up Thread.Sleep(1000); var pcapInterface = PcapInterface.GetAllPcapInterfaces() .First(pIf => pIf.FriendlyName == nic.Name); using var pcapDevice = new LibPcapLiveDevice(pcapInterface); PcapDeviceTest.CheckExchange(tapDevice, pcapDevice); }
public void Properties() { var nic = TunnelDevice.GetTunnelInterfaces().First(); using var device = new TunnelDevice(nic); device.Open(); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { Assert.GreaterOrEqual(device.Version.Major, 9); } Assert.IsNotNull(device.Name); Assert.IsNotNull(device.FriendlyName); Assert.IsNotNull(device.Description); Assert.IsNull(device.LastError); Assert.IsNull(device.Filter); Assert.AreEqual(LinkLayers.Ethernet, device.LinkType); Assert.IsNotNull(device.MacAddress); Assert.AreEqual(TimestampResolution.Microsecond, device.TimestampResolution); Assert.IsNull(device.Statistics); }