此驱动运行时可设置tun模式和tap模式,tun模式能取到IP数据包,无法获得ARP数据,而tap模式取到的是以太包,可以得到链路层以上的一切数据包。
由于项目需要使用tun驱动,而又不想不求甚解,从而阅读了驱动代码,想对此做一些记录,可以使自己理解的更为透彻,虽然代码并不多,但是涉及内核态编程,倘若追根溯源,恐怕需读完Linux协议栈代码了。
我阅读的代码取自Linux 2.6.34内核源码,路径 drivers\net\tun.c
驱动入口点,Linux驱动入口点不同Windows平台,入口函数都是DriverEntry,Linux平台需要通过module_init宏指定入口点(当然最终宏也会统一把函数转化成init_module作为入口点),当执行modprobe加载内核模块时由内核调用,module_exit宏指定清理函数,当执行rmmod时由内核调用。另外,通过 MODULE_* 一系列宏记录作者,驱动描述,以及协议信息。
module_init(tun_init);
module_exit(tun_cleanup);
MODULE_DESCRIPTION(DRV_DESCRIPTION);
MODULE_AUTHOR(DRV_COPYRIGHT);
MODULE_LICENSE("GPL");
MODULE_ALIAS_MISCDEV(TUN_MINOR);
这里指明了驱动程序的基本信息,MODULE_DESCRIPTION声明驱动描述,MODULE_AUTHOR声明作者,在程序开始已有定义。
#define DRV_DESCRIP