| Index: client/tests/kvm/tests/jumbo.py
|
| diff --git a/client/tests/kvm/tests/jumbo.py b/client/tests/kvm/tests/jumbo.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2c91c839071b9d65d6338c7141f66d8d5d48c06b
|
| --- /dev/null
|
| +++ b/client/tests/kvm/tests/jumbo.py
|
| @@ -0,0 +1,130 @@
|
| +import logging, commands, random
|
| +from autotest_lib.client.common_lib import error
|
| +from autotest_lib.client.bin import utils
|
| +import kvm_test_utils, kvm_utils
|
| +
|
| +def run_jumbo(test, params, env):
|
| + """
|
| + Test the RX jumbo frame function of vnics:
|
| +
|
| + 1) Boot the VM.
|
| + 2) Change the MTU of guest nics and host taps depending on the NIC model.
|
| + 3) Add the static ARP entry for guest NIC.
|
| + 4) Wait for the MTU ok.
|
| + 5) Verify the path MTU using ping.
|
| + 6) Ping the guest with large frames.
|
| + 7) Increment size ping.
|
| + 8) Flood ping the guest with large frames.
|
| + 9) Verify the path MTU.
|
| + 10) Recover the MTU.
|
| +
|
| + @param test: KVM test object.
|
| + @param params: Dictionary with the test parameters.
|
| + @param env: Dictionary with test environment.
|
| + """
|
| +
|
| + vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
|
| + session = kvm_test_utils.wait_for_login(vm)
|
| + mtu = params.get("mtu", "1500")
|
| + flood_time = params.get("flood_time", "300")
|
| + max_icmp_pkt_size = int(mtu) - 28
|
| +
|
| + ifname = vm.get_ifname(0)
|
| + ip = vm.get_address(0)
|
| + if ip is None:
|
| + raise error.TestError("Could not get the IP address")
|
| +
|
| + try:
|
| + # Environment preparation
|
| + ethname = kvm_test_utils.get_linux_ifname(session, vm.get_mac_address(0))
|
| +
|
| + logging.info("Changing the MTU of guest ...")
|
| + guest_mtu_cmd = "ifconfig %s mtu %s" % (ethname , mtu)
|
| + s, o = session.get_command_status_output(guest_mtu_cmd)
|
| + if s != 0:
|
| + logging.error(o)
|
| + raise error.TestError("Fail to set the MTU of guest NIC: %s" %
|
| + ethname)
|
| +
|
| + logging.info("Chaning the MTU of host tap ...")
|
| + host_mtu_cmd = "ifconfig %s mtu %s" % (ifname, mtu)
|
| + utils.run(host_mtu_cmd)
|
| +
|
| + logging.info("Add a temporary static ARP entry ...")
|
| + arp_add_cmd = "arp -s %s %s -i %s" % (ip, vm.get_mac_address(0), ifname)
|
| + utils.run(arp_add_cmd)
|
| +
|
| + def is_mtu_ok():
|
| + s, o = kvm_test_utils.ping(ip, 1, interface=ifname,
|
| + packetsize=max_icmp_pkt_size,
|
| + hint="do", timeout=2)
|
| + return s == 0
|
| +
|
| + def verify_mtu():
|
| + logging.info("Verify the path MTU")
|
| + s, o = kvm_test_utils.ping(ip, 10, interface=ifname,
|
| + packetsize=max_icmp_pkt_size,
|
| + hint="do", timeout=15)
|
| + if s != 0 :
|
| + logging.error(o)
|
| + raise error.TestFail("Path MTU is not as expected")
|
| + if kvm_test_utils.get_loss_ratio(o) != 0:
|
| + logging.error(o)
|
| + raise error.TestFail("Packet loss ratio during MTU "
|
| + "verification is not zero")
|
| +
|
| + def flood_ping():
|
| + logging.info("Flood with large frames")
|
| + kvm_test_utils.ping(ip, interface=ifname,
|
| + packetsize=max_icmp_pkt_size,
|
| + flood=True, timeout=float(flood_time))
|
| +
|
| + def large_frame_ping(count=100):
|
| + logging.info("Large frame ping")
|
| + s, o = kvm_test_utils.ping(ip, count, interface=ifname,
|
| + packetsize=max_icmp_pkt_size,
|
| + timeout=float(count) * 2)
|
| + ratio = kvm_test_utils.get_loss_ratio(o)
|
| + if ratio != 0:
|
| + raise error.TestFail("Loss ratio of large frame ping is %s" %
|
| + ratio)
|
| +
|
| + def size_increase_ping(step=random.randrange(90, 110)):
|
| + logging.info("Size increase ping")
|
| + for size in range(0, max_icmp_pkt_size + 1, step):
|
| + logging.info("Ping %s with size %s" % (ip, size))
|
| + s, o = kvm_test_utils.ping(ip, 1, interface=ifname,
|
| + packetsize=size,
|
| + hint="do", timeout=1)
|
| + if s != 0:
|
| + s, o = kvm_test_utils.ping(ip, 10, interface=ifname,
|
| + packetsize=size,
|
| + adaptive=True, hint="do",
|
| + timeout=20)
|
| +
|
| + if kvm_test_utils.get_loss_ratio(o) > int(params.get(
|
| + "fail_ratio", 50)):
|
| + raise error.TestFail("Ping loss ratio is greater "
|
| + "than 50% for size %s" % size)
|
| +
|
| + logging.info("Waiting for the MTU to be OK")
|
| + wait_mtu_ok = 10
|
| + if not kvm_utils.wait_for(is_mtu_ok, wait_mtu_ok, 0, 1):
|
| + logging.debug(commands.getoutput("ifconfig -a"))
|
| + raise error.TestError("MTU is not as expected even after %s "
|
| + "seconds" % wait_mtu_ok)
|
| +
|
| + # Functional Test
|
| + verify_mtu()
|
| + large_frame_ping()
|
| + size_increase_ping()
|
| +
|
| + # Stress test
|
| + flood_ping()
|
| + verify_mtu()
|
| +
|
| + finally:
|
| + # Environment clean
|
| + session.close()
|
| + logging.info("Removing the temporary ARP entry")
|
| + utils.run("arp -d %s -i %s" % (ip, ifname))
|
|
|