brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · d9c1061 Raw
59 lines · python
1# SPDX-License-Identifier: GPL-2.02 3import time4 5from lib.py import ksft_pr, cmd, ip, rand_port, wait_port_listen6 7class GenerateTraffic:8    def __init__(self, env, port=None):9        env.require_cmd("iperf3", remote=True)10 11        self.env = env12 13        if port is None:14            port = rand_port()15        self._iperf_server = cmd(f"iperf3 -s -1 -p {port}", background=True)16        wait_port_listen(port)17        time.sleep(0.1)18        self._iperf_client = cmd(f"iperf3 -c {env.addr} -P 16 -p {port} -t 86400",19                                 background=True, host=env.remote)20 21        # Wait for traffic to ramp up22        if not self._wait_pkts(pps=1000):23            self.stop(verbose=True)24            raise Exception("iperf3 traffic did not ramp up")25 26    def _wait_pkts(self, pkt_cnt=None, pps=None):27        """28        Wait until we've seen pkt_cnt or until traffic ramps up to pps.29        Only one of pkt_cnt or pss can be specified.30        """31        pkt_start = ip("-s link show dev " + self.env.ifname, json=True)[0]["stats64"]["rx"]["packets"]32        for _ in range(50):33            time.sleep(0.1)34            pkt_now = ip("-s link show dev " + self.env.ifname, json=True)[0]["stats64"]["rx"]["packets"]35            if pps:36                if pkt_now - pkt_start > pps / 10:37                    return True38                pkt_start = pkt_now39            elif pkt_cnt:40                if pkt_now - pkt_start > pkt_cnt:41                    return True42        return False43 44    def wait_pkts_and_stop(self, pkt_cnt):45        failed = not self._wait_pkts(pkt_cnt=pkt_cnt)46        self.stop(verbose=failed)47 48    def stop(self, verbose=None):49        self._iperf_client.process(terminate=True)50        if verbose:51            ksft_pr(">> Client:")52            ksft_pr(self._iperf_client.stdout)53            ksft_pr(self._iperf_client.stderr)54        self._iperf_server.process(terminate=True)55        if verbose:56            ksft_pr(">> Server:")57            ksft_pr(self._iperf_server.stdout)58            ksft_pr(self._iperf_server.stderr)59