import os import infra.basetest class TestKmod(infra.basetest.BRTest): # This test uses the "virtio_net" driver compiled as a module. We # need to recompile a Kernel for that. kernel_fragment = \ infra.filepath("tests/package/test_kmod/linux-virtio-net.fragment") config = \ f""" BR2_aarch64=y BR2_TOOLCHAIN_EXTERNAL=y BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_VERSION=y BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.6.35" BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/aarch64-virt/linux.config" BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="{kernel_fragment}" BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_KMOD=y BR2_PACKAGE_KMOD_TOOLS=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y # BR2_TARGET_ROOTFS_TAR is not set """ def test_run(self): drive = os.path.join(self.builddir, "images", "rootfs.ext4") kern = os.path.join(self.builddir, "images", "Image") self.emulator.boot(arch="aarch64", kernel=kern, kernel_cmdline=["root=/dev/vda console=ttyAMA0"], options=["-M", "virt", "-cpu", "cortex-a57", "-m", "256M", "-drive", f"file={drive},if=virtio,format=raw"]) self.emulator.login() # We check the kmod program can run. Busybox does not have a # kmod applet, so there is no possible confusion. self.assertRunOk("kmod --version") # We check the "modprobe" is the one from kmod, rather than # the Busybox applet version. out, ret = self.emulator.run("modprobe --version") self.assertEqual(ret, 0) self.assertTrue(out[0].startswith("kmod version")) # List modules with "kmod list", the virtio-net module should # NOT be loaded yet. out, ret = self.emulator.run("kmod list") self.assertEqual(ret, 0) self.assertNotIn("virtio_net", "\n".join(out)) # Get module info with modinfo. out, ret = self.emulator.run("modinfo virtio-net") self.assertEqual(ret, 0) lsmod_out = "\n".join(out) self.assertRegex(lsmod_out, r'name: *virtio_net') self.assertRegex(lsmod_out, r'description: *Virtio network driver') # With this test configuration, we are not supposed to have an # eth0 Ethernet interface yet. Attempting to show info on this # interface is expected to fail . _, ret = self.emulator.run("ip link show dev eth0") self.assertNotEqual(ret, 0) # We try to load the module. self.assertRunOk("modprobe virtio-net") # We should now see the module in the list. This time, we use # the "lsmod" command. out, ret = self.emulator.run("lsmod") self.assertEqual(ret, 0) self.assertIn("virtio_net", "\n".join(out)) # The eth0 interface is supposed to be available, after the # module loading. We configure the emulator user network to # test the driver networking functionality. See: # https://wiki.qemu.org/Documentation/Networking self.assertRunOk("ip addr add dev eth0 10.0.2.15/24") self.assertRunOk("ip link set dev eth0 up") # We check we can ping the emulator. ping_cmd = "ping -i 0.3 -c 2 10.0.2.2" self.assertRunOk(ping_cmd) # We check we can unload the driver. self.assertRunOk("modprobe -r virtio-net") # Now the driver is unloaded, we should no longer be able to # ping the emulator. _, ret = self.emulator.run(ping_cmd) self.assertNotEqual(ret, 0)