Ejemplo n.º 1
0
        public PacketCapture(ILogger <PacketCapture> logger, NetworkInterface networkInterface, int captureGroup, int thread)
        {
            _logger           = logger;
            _networkInterface = networkInterface;
            _captureGroup     = captureGroup;
            _thread           = thread;

            short protocol = 0x0800; // IP

            _socket = new Socket(AddressFamily.Packet, SocketType.Raw, (System.Net.Sockets.ProtocolType)IPAddress.HostToNetworkOrder(protocol));
            _socket.Bind(new LLEndPoint(networkInterface));

            if (_socket.SetPacketVersion(SocketExtensions.PacketVersions.TPACKET_V3) != 0)
            {
                _logger.LogError("Unable to set packet version");
            }

            if (_socket.SetFilter() != 0)
            {
                _logger.LogError("Unable to set filter");
            }

            var tp3 = new SocketExtensions.tpacket_req3
            {
                tp_block_size = 4096,
                tp_frame_size = 2048,
                tp_block_nr   = 16,
                tp_frame_nr   = 32
            };

            if (_socket.SetRxRing(tp3) != 0)
            {
                _logger.LogError("Unable to set RX ring");
            }
            else
            {
                var bufferAddress = MMap.Create(
                    IntPtr.Zero,
                    tp3.tp_block_size * tp3.tp_block_nr, //4096,//4096 * 4,
                    MMap.MemoryMappedProtections.PROT_READ | MMap.MemoryMappedProtections.PROT_WRITE,
                    MMap.MemoryMappedFlags.MAP_SHARED,   // | MMap.MemoryMappedFlags.MAP_LOCKED | MMap.MemoryMappedFlags.MAP_NORESERVE,
                    _socket.Handle,
                    0);

                if (!bufferAddress.HasValue)
                {
                    _logger.LogError("Unable to mmap RX ring");
                }
                else
                {
                    _ring = new Ring(bufferAddress.Value, tp3);
                }
            }

            if (_socket.SetFanout(_captureGroup) != 0)
            {
                _logger.LogError("Unable to set fanout");
            }
        }
Ejemplo n.º 2
0
        public Ring(IntPtr bufferAddress, SocketExtensions.tpacket_req3 tpacket_req3)
        {
            BufferAddress = bufferAddress;

            for (var i = 0; i < tpacket_req3.tp_block_nr; i++)
            {
                Blocks.Add(new Block(bufferAddress, i, tpacket_req3.tp_block_size));
            }

            TPacketReq3 = tpacket_req3;
        }