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
