Ejemplo n.º 1
0
        public unsafe Forwarder(string pci1, string pci2)
        {
            GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
            if (String.IsNullOrEmpty(pci1) || String.IsNullOrEmpty(pci2))
            {
                Log.Error("Please provide two pci addresses");
                Environment.Exit(1);
            }

            var dev1 = new IxgbeDevice(pci1, 1, 1);
            var dev2 = new IxgbeDevice(pci2, 1, 1);

            // TODO: switch to C# 7.3 and replace with Span<PacketBuffer> buffers = stackalloc PacketBuffer[BatchSize];
            var buffersArray = stackalloc PacketBuffer[BatchSize];
            var buffers      = new Span <PacketBuffer>(buffersArray, BatchSize);

            ulong counter   = 0;
            var   stopWatch = new Stopwatch();
            var   stats1    = new DeviceStats(dev1);
            var   stats1Old = new DeviceStats(dev1);
            var   stats2    = new DeviceStats(dev2);
            var   stats2Old = new DeviceStats(dev2);

            stopWatch.Start();
            while (true)
            {
                Forward(dev1, 0, dev2, 0, buffers);
                Forward(dev2, 0, dev1, 0, buffers);
                stats1.Reset();
                stats1Old.Reset();
                stats2.Reset();
                stats2Old.Reset();

                //Periodically measure time
                if (((counter++ % 500000) == 0) && stopWatch.ElapsedMilliseconds > 1000)
                {
                    stopWatch.Stop();
                    var nanos = stopWatch.ElapsedTicks;
                    dev1.ReadStats(ref stats1);
                    stats1.PrintStatsDiff(ref stats1Old, (ulong)nanos);
                    stats1Old = stats1;
                    if (dev1 != dev2)
                    {
                        dev2.ReadStats(ref stats2);
                        stats2.PrintStatsDiff(ref stats2Old, (ulong)nanos);
                        stats2Old = stats2;
                    }
                    counter = 0;
                    stopWatch.Restart();
                }
            }
        }
Ejemplo n.º 2
0
        public unsafe PacketGenerator(string pciAddr)
        {
            InitMempool();

            var dev = new IxgbeDevice(pciAddr, 1, 1);

            // TODO: switch to C# 7.3 and replace with Span<PacketBuffer> buffers = stackalloc PacketBuffer[BatchSize];
            var buffersArray = stackalloc PacketBuffer[BatchSize];
            var buffers      = new Span <PacketBuffer>(buffersArray, BatchSize);

            var   statsOld  = new DeviceStats(dev);
            var   statsNew  = new DeviceStats(dev);
            ulong counter   = 0;
            var   stopWatch = new Stopwatch();

            stopWatch.Start();

            int seqNum = 0;

            while (true)
            {
                var batchCount = _mempool.GetPacketBuffers(buffers);
                var batch      = buffers.Slice(0, batchCount);
                foreach (var buf in batch)
                {
                    buf.WriteData(PacketSize - 4, seqNum++);
                }
                dev.TxBatchBusyWait(0, batch);

                if ((counter++ & 0xFFF) == 0 && stopWatch.ElapsedMilliseconds > 100)
                {
                    stopWatch.Stop();
                    var nanos = stopWatch.ElapsedTicks;
                    dev.ReadStats(ref statsNew);
                    statsNew.PrintStatsDiff(ref statsOld, (ulong)nanos);
                    statsOld = statsNew;
                    counter  = 0;
                    stopWatch.Restart();
                }
            }
        }