12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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)
|