| #!/usr/bin/env python3 |
| # |
| # ethtool tests for emulated network devices |
| # |
| # This test leverages ethtool's --test sequence to validate network |
| # device behaviour. |
| # |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| |
| from unittest import skip |
| from qemu_test import QemuSystemTest, Asset |
| from qemu_test import wait_for_console_pattern |
| |
| class NetDevEthtool(QemuSystemTest): |
| |
| # Runs in about 17s under KVM, 19s under TCG, 25s under GCOV |
| timeout = 45 |
| |
| # Fetch assets from the netdev-ethtool subdir of my shared test |
| # images directory on fileserver.linaro.org. |
| ASSET_BASEURL = ('https://fileserver.linaro.org/s/kE4nCFLdQcoBF9t/' |
| 'download?path=%2Fnetdev-ethtool&files=') |
| ASSET_BZIMAGE = Asset( |
| ASSET_BASEURL + "bzImage", |
| "ed62ee06ea620b1035747f3f66a5e9fc5d3096b29f75562ada888b04cd1c4baf") |
| ASSET_ROOTFS = Asset( |
| ASSET_BASEURL + "rootfs.squashfs", |
| "8f0207e3c4d40832ae73c1a927e42ca30ccb1e71f047acb6ddb161ba422934e6") |
| |
| def common_test_code(self, netdev, extra_args=None): |
| self.set_machine('q35') |
| |
| # This custom kernel has drivers for all the supported network |
| # devices we can emulate in QEMU |
| kernel = self.ASSET_BZIMAGE.fetch() |
| rootfs = self.ASSET_ROOTFS.fetch() |
| |
| append = 'printk.time=0 console=ttyS0 ' |
| append += 'root=/dev/sr0 rootfstype=squashfs ' |
| |
| # any additional kernel tweaks for the test |
| if extra_args: |
| append += extra_args |
| |
| # finally invoke ethtool directly |
| append += ' init=/usr/sbin/ethtool -- -t eth1 offline' |
| |
| # add the rootfs via a readonly cdrom image |
| drive = f"file={rootfs},if=ide,index=0,media=cdrom" |
| |
| self.vm.add_args('-kernel', kernel, |
| '-append', append, |
| '-drive', drive, |
| '-device', netdev) |
| |
| self.vm.set_console(console_index=0) |
| self.vm.launch() |
| |
| wait_for_console_pattern(self, |
| "The test result is PASS", |
| "The test result is FAIL", |
| vm=None) |
| # no need to gracefully shutdown, just finish |
| self.vm.kill() |
| |
| def test_igb(self): |
| self.common_test_code("igb") |
| |
| def test_igb_nomsi(self): |
| self.common_test_code("igb", "pci=nomsi") |
| |
| # It seems the other popular cards we model in QEMU currently fail |
| # the pattern test with: |
| # |
| # pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A |
| # |
| # So for now we skip them. |
| |
| @skip("Incomplete reg 0x00178 support") |
| def test_e1000(self): |
| self.common_test_code("e1000") |
| |
| @skip("Incomplete reg 0x00178 support") |
| def test_i82550(self): |
| self.common_test_code("i82550") |
| |
| if __name__ == '__main__': |
| QemuSystemTest.main() |