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