| # 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-late |
| |
| from avocado import skip |
| from avocado_qemu import QemuSystemTest |
| from avocado_qemu import exec_command, exec_command_and_wait_for_pattern |
| from avocado_qemu import wait_for_console_pattern |
| |
| class NetDevEthtool(QemuSystemTest): |
| """ |
| :avocado: tags=arch:x86_64 |
| :avocado: tags=machine:q35 |
| """ |
| |
| # 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. |
| def get_asset(self, name, sha1): |
| base_url = ('https://fileserver.linaro.org/s/' |
| 'kE4nCFLdQcoBF9t/download?' |
| 'path=%2Fnetdev-ethtool&files=' ) |
| url = base_url + name |
| # use explicit name rather than failing to neatly parse the |
| # URL into a unique one |
| return self.fetch_asset(name=name, locations=(url), asset_hash=sha1) |
| |
| def common_test_code(self, netdev, extra_args=None, kvm=False): |
| |
| # This custom kernel has drivers for all the supported network |
| # devices we can emulate in QEMU |
| kernel = self.get_asset("bzImage", |
| "33469d7802732d5815226166581442395cb289e2") |
| |
| rootfs = self.get_asset("rootfs.squashfs", |
| "9793cea7021414ae844bda51f558bd6565b50cdc") |
| |
| 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) |
| |
| if kvm: |
| self.vm.add_args('-accel', 'kvm') |
| |
| 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() |
| |
| # Skip testing for MSI for now. Allegedly it was fixed by: |
| # 28e96556ba (igb: Allocate MSI-X vector when testing) |
| # but I'm seeing oops in the kernel |
| @skip("Kernel bug with MSI enabled") |
| def test_igb(self): |
| """ |
| :avocado: tags=device:igb |
| """ |
| self.common_test_code("igb") |
| |
| def test_igb_nomsi(self): |
| """ |
| :avocado: tags=device:igb |
| """ |
| self.common_test_code("igb", "pci=nomsi") |
| |
| def test_igb_nomsi_kvm(self): |
| """ |
| :avocado: tags=device:igb |
| """ |
| self.require_accelerator('kvm') |
| self.common_test_code("igb", "pci=nomsi", True) |
| |
| # 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): |
| """ |
| :avocado: tags=device:e1000 |
| """ |
| self.common_test_code("e1000") |
| |
| @skip("Incomplete reg 0x00178 support") |
| def test_i82550(self): |
| """ |
| :avocado: tags=device:i82550 |
| """ |
| self.common_test_code("i82550") |