Path: blob/master/tools/testing/selftests/drivers/net/lib/py/load.py
26305 views
# SPDX-License-Identifier: GPL-2.012import re3import time45from lib.py import ksft_pr, cmd, ip, rand_port, wait_port_listen67class GenerateTraffic:8def __init__(self, env, port=None):9env.require_cmd("iperf3", local=True, remote=True)1011self.env = env1213self.port = rand_port() if port is None else port14self._iperf_server = cmd(f"iperf3 -s -1 -p {self.port}", background=True)15wait_port_listen(self.port)16time.sleep(0.1)17self._iperf_client = cmd(f"iperf3 -c {env.addr} -P 16 -p {self.port} -t 86400",18background=True, host=env.remote)1920# Wait for traffic to ramp up21if not self._wait_pkts(pps=1000):22self.stop(verbose=True)23raise Exception("iperf3 traffic did not ramp up")2425def _wait_pkts(self, pkt_cnt=None, pps=None):26"""27Wait until we've seen pkt_cnt or until traffic ramps up to pps.28Only one of pkt_cnt or pss can be specified.29"""30pkt_start = ip("-s link show dev " + self.env.ifname, json=True)[0]["stats64"]["rx"]["packets"]31for _ in range(50):32time.sleep(0.1)33pkt_now = ip("-s link show dev " + self.env.ifname, json=True)[0]["stats64"]["rx"]["packets"]34if pps:35if pkt_now - pkt_start > pps / 10:36return True37pkt_start = pkt_now38elif pkt_cnt:39if pkt_now - pkt_start > pkt_cnt:40return True41return False4243def wait_pkts_and_stop(self, pkt_cnt):44failed = not self._wait_pkts(pkt_cnt=pkt_cnt)45self.stop(verbose=failed)4647def stop(self, verbose=None):48self._iperf_client.process(terminate=True)49if verbose:50ksft_pr(">> Client:")51ksft_pr(self._iperf_client.stdout)52ksft_pr(self._iperf_client.stderr)53self._iperf_server.process(terminate=True)54if verbose:55ksft_pr(">> Server:")56ksft_pr(self._iperf_server.stdout)57ksft_pr(self._iperf_server.stderr)58self._wait_client_stopped()5960def _wait_client_stopped(self, sleep=0.005, timeout=5):61end = time.monotonic() + timeout6263live_port_pattern = re.compile(fr":{self.port:04X} 0[^6] ")6465while time.monotonic() < end:66data = cmd("cat /proc/net/tcp*", host=self.env.remote).stdout67if not live_port_pattern.search(data):68return69time.sleep(sleep)70raise Exception(f"Waiting for client to stop timed out after {timeout}s")717273