selftest测试框架开发

来源:互联网 发布:数据与R pdf 编辑:程序博客网 时间:2024/04/29 20:57

一、需求分析

virtio-net是一个基于VirtIO的半虚拟化网卡设备类型,在Linux中的相应驱动为 drivers/net/virtio_net.c。
ethtool是Linux中的一个管理以太网设备的工具,根据网卡驱动支持的动作,它可以报告和设置网卡状态,或者执行某些操作。其中selftest是网卡驱动的自测试功能,已被e1000等真实设备的驱动支持(见drivers/net/ethernet/intel/e1000/e1000_ethtool.c:e1000_diag_test)。
在本项目中,需要为virtio-net编写ethtool支持,实现selftest,以测试virtio-net网卡的各项功能。
测试内容如:
基本功能:收发包, 功能协商, 重置
针对以往发现的CVE(包括qemu, vhost_net, tun, host kernel network core等其它)的回归测试例

二、基本原理

网卡的selftest主要借助ethtool的-t选项完成,ethtool通过socket与内核通信,selftest主要模式分为online、offline和external_lb。当在用户态键入ethtool -t eth0时,命令会下发至网卡对应的ethtool_ops中的self_test函数,执行self_test,将测试结果返回。

三、源码分析

现有linux源码drivers/net/virtio_net.c中已有struct ethtool_ops的一个实例virtnet_ethtool_ops,但其self_test函数并未实现。因此,需添加相应函数,通过跟踪整个ethtool -t eth0命令下发流程可知在执行self_test之前内核还会调用get_strings和get_sset_count以确定测试网卡的哪些功能,同样需要实现这两个函数。

在本项目中,网卡设备由QEMU模拟,QEMU通过control queue与guest进行命令交互,通过send queue和receive queue与guest进行数据交换。其中命令可自行定制。

四、实现方案

1.收发包。在virtio-net中可结合已有函数startxmit和receivebuf,但要实现loopback,需在QEMU端进行相应处理。

2.功能协商。功能协商即guest OS中的driver与QEMU模拟出来的device进行feature negotiation,首先driver将device所提供的功能读取出来,然后与driver本身应该具备的feature寻找交集,后将两者的共同feature记录,并写回device进行确认。

3.重置功能。在virtio_net中提供了执行device reset的接口vp_reset,调用此接口后做相应的处理确保重置后网卡仍能正常工作。


0 0