public unsafe static FileDescriptor OpenNetMap(string interfaceName, int ringId, NetMapRequestFlags flags, out NetMapRequest returnedRequest) { var fd = Open("/dev/netmap", OpenFlags.O_RDWR); if (!fd.IsValid) { ExceptionHelper.ThrowInvalidOperation($"Unable to open the /dev/netmap device {fd}"); } var request = new NetMapRequest { nr_cmd = 0, nr_ringid = (ushort)ringId, nr_version = NETMAP_API, nr_flags = flags, }; var textbytes = Encoding.ASCII.GetBytes(interfaceName + "\0"); fixed(void *txtPtr = textbytes) { Buffer.MemoryCopy(txtPtr, request.nr_name, textbytes.Length, textbytes.Length); } if (IOCtl(fd, IOControlCommand.NIOCREGIF, ref request) != 0) { ExceptionHelper.ThrowInvalidOperation("Failed to open an FD for a single ring"); } returnedRequest = request; return(fd); }
internal static extern int IOCtl(FileDescriptor descriptor, IOControlCommand request, ref NetMapRequest data);