From: Tang Longjun <[email protected]>

create a misc type driver for transferring log information between
user space and kernel space by /dev/virtnet_mon

Signed-off-by: Tang Longjun <[email protected]>
---
 tools/virtio/virtnet_mon/Makefile      |  10 +++
 tools/virtio/virtnet_mon/virtnet_mon.c | 110 +++++++++++++++++++++++++
 2 files changed, 120 insertions(+)
 create mode 100644 tools/virtio/virtnet_mon/Makefile
 create mode 100644 tools/virtio/virtnet_mon/virtnet_mon.c

diff --git a/tools/virtio/virtnet_mon/Makefile 
b/tools/virtio/virtnet_mon/Makefile
new file mode 100644
index 000000000000..a443f62dbde4
--- /dev/null
+++ b/tools/virtio/virtnet_mon/Makefile
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-m += virtnet_mon.o
+
+KDIR := `pwd`/../../..
+
+all:
+       make -C $(KDIR) M=$(PWD) modules
+
+clean:
+       make -C $(KDIR) M=$(PWD) clean
diff --git a/tools/virtio/virtnet_mon/virtnet_mon.c 
b/tools/virtio/virtnet_mon/virtnet_mon.c
new file mode 100644
index 000000000000..6e768ea5e28d
--- /dev/null
+++ b/tools/virtio/virtnet_mon/virtnet_mon.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/kfifo.h>
+#include <linux/fs.h>
+#include <linux/uaccess.h>
+#include <linux/miscdevice.h>
+#include <linux/poll.h>
+#include <linux/string.h>
+#include <linux/if_ether.h>
+
+
+#define DEVICE_NAME "virtnet_mon"
+
+static struct miscdevice virtnet_mon_misc_device;
+
+static char buf[1024];
+static int buf_len;
+
+// open device
+static int virtnet_mon_open(struct inode *inode, struct file *file)
+{
+       return 0;
+}
+
+// close device
+static int virtnet_mon_release(struct inode *inode, struct file *file)
+{
+    //pr_debug(KERN_INFO "virtnet_mon: Device closed\n");
+
+       return 0;
+}
+
+// read device
+static ssize_t virtnet_mon_read(struct file *file, char __user *buffer, size_t 
len, loff_t *offset)
+{
+       len = buf_len;
+       if (copy_to_user(buffer, buf, buf_len))
+               return -EFAULT;
+
+       buf_len = 0;
+       memset(buf, 0, sizeof(buf));
+       return len;
+}
+
+// write device
+static ssize_t virtnet_mon_write(struct file *file, const char __user *buffer,
+                                                       size_t len, loff_t 
*offset)
+{
+       memset(buf, 0, sizeof(buf));
+       if (copy_from_user(buf, buffer, len))
+               return -EFAULT;
+
+       buf_len = len;
+       pr_info("virtnet_mon: Written: %s\n", buf);
+
+       return len;
+}
+
+// poll method
+static unsigned int virtnet_mon_poll(struct file *file, poll_table *wait)
+{
+       return 0;
+}
+
+// file operations structure
+static const struct file_operations virtnet_mon_misc_fops = {
+       .owner = THIS_MODULE,
+       .open = virtnet_mon_open,
+       .release = virtnet_mon_release,
+       .read = virtnet_mon_read,
+       .write = virtnet_mon_write,
+       .poll = virtnet_mon_poll,
+};
+
+// module load
+static int __init virtnet_mon_init(void)
+{
+       int ret;
+
+       // register misc device
+       virtnet_mon_misc_device.minor = MISC_DYNAMIC_MINOR;
+       virtnet_mon_misc_device.name = DEVICE_NAME;
+       virtnet_mon_misc_device.fops = &virtnet_mon_misc_fops;
+
+       ret = misc_register(&virtnet_mon_misc_device);
+       if (ret) {
+               pr_info("virtnet_mon: Failed to register misc device\n");
+
+               return ret;
+       }
+       pr_info("virtnet_mon registered with minor number %d\n", 
virtnet_mon_misc_device.minor);
+
+       return 0;
+}
+
+// module unload
+static void __exit virtnet_mon_exit(void)
+{
+       misc_deregister(&virtnet_mon_misc_device);
+       pr_info("virtnet_mon unregistered\n");
+}
+
+module_init(virtnet_mon_init);
+module_exit(virtnet_mon_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Tang Longjun");
+MODULE_DESCRIPTION("Monitor virtio_net driver packet transmission and 
reception");
+MODULE_VERSION("0.1");
-- 
2.43.0


Reply via email to