项目需求
ethtool是Linux中的一个管理以太网设备的工具,根据网卡驱动支持的动作,它可以报告和设置网卡状态,或者执行某些操作。其中selftest是网卡驱动的自测试功能,已被e1000等真实设备的驱动支持(见drivers/net/ethernet/intel/e1000/e1000_ethtool.c:e1000_diag_test)。
在本项目中,需要为virtio-net编写ethtool支持,实现selftest,以测试virtio-net网卡的各项功能。
测试内容如:基本功能:收发包,功能协商,重置
代码改动
项目代码改动主要集中在drivers/net/virtio_net.c文件.
1. 整体框架上,在现有的内核与ethtool接口的virtnet_ethtool_ops函数表中添加self_test、get_strings和get_sset_count的接口实现。
2. 自测试基本功能收发包,功能协商和重置集中在self_test函数中实现。
3. 收发包采取loopback模式进行测试,这一点涉及到host OS中qemu代码的改动,在qemu端添加相应命令以供guest端配置当前virtnetdevice的工作状态。由virtnet驱动发送出去的包在qemu端直接环回至接收中断,故可以通过构造特定格式的数据包发送后检验接收数据包与发送数据包的一致性来测试网卡的收发包功能。
4. 功能协商主要在于实现virtio-net驱动与virtnet device之间的功能协商,虚拟网卡设备自身支持的功能记录在QEMU中的host_features中,virtio-net驱动调用vp_get_features读取host_feature。驱动自身所支持的功能记录在feature_table中,将feature_table与所读取的host_features对照,取两者共同具备的功能写入驱动的dev->features中。调用vp_finalize_features将共同具备的功能写回guest_features。
5. 重置即对虚拟网卡设备进行reset,包括相关的驱动层面所做的内存清理和virtnetdevice状态的对应更新。
源码下载与使用
git clone git://code.csdn.net/xhjcehust/qemu.git
然后进入virtnet-loopback分支gitcheckout remotes/origin/virtnet-loopback
将下载好的代码qemu.git编译安装,请大致流程可参见
http://smilejay.com/2012/06/qemu-kvm_compilation_installation/
在guest OS中重新编译内核,内核源码下载方法:
git clone git://code.csdn.net/xhjcehust/virtio_net_driver.git
然后进入virtio-net-selftest分支gitcheckout remotes/origin/virtio-net-selftest
virtio相关模块默认是built-in于内核的,若要使其以模块的形式存在,需要配置CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_VIRTIO_RING=m
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_BALLOON=m
之后就是编译内核重启了,主要命令为:
make bzImage
make modules
sudo make modules_install
sudo make install
sudo update-grub
使用说明
本项目所实现的主要是offline selftest,需结合ethtool工具完成测试。测试命令为ethtool-t|--test DEVNAME [ online | offline | external_lb ]整个项目按照计划执行,在开发完毕发送patch到Linux内核列表过程中,通过一步步的优化,我逐步体会到代码可读性,可维护性好的重要性。在实现功能的基础上,应努力写出优秀的代码。
在接触这个项目之前,本人对于虚拟机工作原理丝毫不知,QEMU更是没听说过,感谢Fam Zheng为我提供了相关的学习资料,引领我从事虚拟化的学习与探索。在这个过程中,我也熟悉了给内核打补丁的基本流程,为日后的开源工作奠定了基础。