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"); } }
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; }