示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }