<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18389">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">iperf3: Support using configuring UDP protocol<br><br>Change-Id: I0b3545847b01ae3d029881f243fea276f0fa39de<br>---<br>M doc/examples/4g_srsLTE/suites/4g/iperf3_dl.py<br>M doc/examples/4g_srsLTE/suites/4g/iperf3_ul.py<br>M src/osmo_gsm_tester/obj/iperf3.py<br>A sysmocom/scenarios/cfg-iperf3-proto@.conf<br>M sysmocom/suites/4g/iperf3_dl.py<br>M sysmocom/suites/4g/iperf3_ul.py<br>M sysmocom/suites/gprs/lib/testlib.py<br>7 files changed, 82 insertions(+), 73 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/89/18389/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/examples/4g_srsLTE/suites/4g/iperf3_dl.py b/doc/examples/4g_srsLTE/suites/4g/iperf3_dl.py</span><br><span>index d4fa649..bcc569a 100755</span><br><span>--- a/doc/examples/4g_srsLTE/suites/4g/iperf3_dl.py</span><br><span>+++ b/doc/examples/4g_srsLTE/suites/4g/iperf3_dl.py</span><br><span>@@ -1,17 +1,6 @@</span><br><span> #!/usr/bin/env python3</span><br><span> from osmo_gsm_tester.testenv import *</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def print_result_node(result, node_str):</span><br><span style="color: hsl(0, 100%, 40%);">- sent = result['end']['sum_sent']</span><br><span style="color: hsl(0, 100%, 40%);">- recv = result['end']['sum_received']</span><br><span style="color: hsl(0, 100%, 40%);">- print("Result %s:" % node_str)</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tSEND: %d KB, %d kbps, %d seconds (%s retrans)" % (sent['bytes']/1000, sent['bits_per_second']/1000, sent['seconds'], str(sent.get('retransmits', 'unknown'))))</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tRECV: %d KB, %d kbps, %d seconds" % (recv['bytes']/1000, recv['bits_per_second']/1000, recv['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def print_results(cli_res, srv_res):</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(cli_res, 'client')</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(srv_res, 'server')</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> epc = tenv.epc()</span><br><span> enb = tenv.enb()</span><br><span> ue = tenv.modem()</span><br><span>@@ -41,7 +30,9 @@</span><br><span> print("Running iperf3 client to %s through %s" % (str(iperf3cli), ue.netns()))</span><br><span> proc.launch_sync()</span><br><span> iperf3srv.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-print_results(iperf3cli.get_results(), iperf3srv.get_results())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli.print_results()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.print_results(iperf3cli.proto() == iperf3cli.PROTO_UDP)</span><br><span> </span><br><span> max_rate = enb.ue_max_rate(downlink=True)</span><br><span> res_str = ue.verify_metric(max_rate * 0.8, operation='avg', metric='dl_brate', criterion='gt')</span><br><span>diff --git a/doc/examples/4g_srsLTE/suites/4g/iperf3_ul.py b/doc/examples/4g_srsLTE/suites/4g/iperf3_ul.py</span><br><span>index 64d476b..a92a658 100755</span><br><span>--- a/doc/examples/4g_srsLTE/suites/4g/iperf3_ul.py</span><br><span>+++ b/doc/examples/4g_srsLTE/suites/4g/iperf3_ul.py</span><br><span>@@ -1,17 +1,6 @@</span><br><span> #!/usr/bin/env python3</span><br><span> from osmo_gsm_tester.testenv import *</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def print_result_node(result, node_str):</span><br><span style="color: hsl(0, 100%, 40%);">- sent = result['end']['sum_sent']</span><br><span style="color: hsl(0, 100%, 40%);">- recv = result['end']['sum_received']</span><br><span style="color: hsl(0, 100%, 40%);">- print("Result %s:" % node_str)</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tSEND: %d KB, %d kbps, %d seconds (%s retrans)" % (sent['bytes']/1000, sent['bits_per_second']/1000, sent['seconds'], str(sent.get('retransmits', 'unknown'))))</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tRECV: %d KB, %d kbps, %d seconds" % (recv['bytes']/1000, recv['bits_per_second']/1000, recv['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def print_results(cli_res, srv_res):</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(cli_res, 'client')</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(srv_res, 'server')</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> epc = tenv.epc()</span><br><span> enb = tenv.enb()</span><br><span> ue = tenv.modem()</span><br><span>@@ -41,7 +30,9 @@</span><br><span> print("Running iperf3 client to %s through %s" % (str(iperf3cli), ue.netns()))</span><br><span> proc.launch_sync()</span><br><span> iperf3srv.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-print_results(iperf3cli.get_results(), iperf3srv.get_results())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli.print_results()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.print_results(iperf3cli.proto() == iperf3cli.PROTO_UDP)</span><br><span> </span><br><span> max_rate = enb.ue_max_rate(downlink=False)</span><br><span> res_str = ue.verify_metric(max_rate * 0.8, operation='avg', metric='ul_brate', criterion='gt')</span><br><span>diff --git a/src/osmo_gsm_tester/obj/iperf3.py b/src/osmo_gsm_tester/obj/iperf3.py</span><br><span>index 2901e79..b7694bf 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/iperf3.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/iperf3.py</span><br><span>@@ -25,8 +25,13 @@</span><br><span> from . import pcap_recorder, run_node</span><br><span> </span><br><span> def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+ schema_types = {</span><br><span style="color: hsl(120, 100%, 40%);">+ 'iperf3_protocol': IPerf3Client.validate_protocol,</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ schema.register_schema_types(schema_types)</span><br><span> config_schema = {</span><br><span> 'time': schema.DURATION,</span><br><span style="color: hsl(120, 100%, 40%);">+ 'protocol': 'iperf3_protocol',</span><br><span> }</span><br><span> schema.register_config_schema('iperf3cli', config_schema)</span><br><span> </span><br><span>@@ -45,6 +50,25 @@</span><br><span> log_obj.log('failed parsing iperf3 output: "%s"' % data)</span><br><span> raise e</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def print_result_node_udp(result, node_str):</span><br><span style="color: hsl(120, 100%, 40%);">+ try:</span><br><span style="color: hsl(120, 100%, 40%);">+ sum = result['end']['sum']</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Result %s:" % node_str)</span><br><span style="color: hsl(120, 100%, 40%);">+ print("\tSUM: %d KB, %d kbps, %d seconds %d/%d lost" % (sum['bytes']/1000, sum['bits_per_second']/1000, sum['seconds'], sum['lost_packets'], sum['packets']))</span><br><span style="color: hsl(120, 100%, 40%);">+ except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Exception while using iperf3 %s results: %r" % (node_str, repr(result)))</span><br><span style="color: hsl(120, 100%, 40%);">+ raise e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def print_result_node_tcp(result, node_str):</span><br><span style="color: hsl(120, 100%, 40%);">+ try:</span><br><span style="color: hsl(120, 100%, 40%);">+ sent = result['end']['sum_sent']</span><br><span style="color: hsl(120, 100%, 40%);">+ recv = result['end']['sum_received']</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Result %s:" % node_str)</span><br><span style="color: hsl(120, 100%, 40%);">+ print("\tSEND: %d KB, %d kbps, %d seconds (%s retrans)" % (sent['bytes']/1000, sent['bits_per_second']/1000, sent['seconds'], str(sent.get('retransmits', 'unknown'))))</span><br><span style="color: hsl(120, 100%, 40%);">+ print("\tRECV: %d KB, %d kbps, %d seconds" % (recv['bytes']/1000, recv['bits_per_second']/1000, recv['seconds']))</span><br><span style="color: hsl(120, 100%, 40%);">+ except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Exception while using iperf3 %s results: %r" % (node_str, repr(result)))</span><br><span style="color: hsl(120, 100%, 40%);">+ raise e</span><br><span> </span><br><span> class IPerf3Server(log.Origin):</span><br><span> </span><br><span>@@ -140,6 +164,12 @@</span><br><span> else:</span><br><span> return iperf3_result_to_json(self, self.process.get_stdout())</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ def print_results(self, client_was_udp):</span><br><span style="color: hsl(120, 100%, 40%);">+ if client_was_udp:</span><br><span style="color: hsl(120, 100%, 40%);">+ print_result_node_udp(self.get_results(), 'server')</span><br><span style="color: hsl(120, 100%, 40%);">+ else:</span><br><span style="color: hsl(120, 100%, 40%);">+ print_result_node_tcp(self.get_results(), 'server')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def addr(self):</span><br><span> return self.ip_address.get('addr')</span><br><span> </span><br><span>@@ -160,6 +190,13 @@</span><br><span> REMOTE_DIR = '/tmp'</span><br><span> LOGFILE = 'iperf3_cli.json'</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ PROTO_TCP = "tcp"</span><br><span style="color: hsl(120, 100%, 40%);">+ PROTO_UDP = "udp"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def validate_protocol(cls, val):</span><br><span style="color: hsl(120, 100%, 40%);">+ return val in (cls.PROTO_TCP, cls.PROTO_UDP)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def __init__(self, testenv, iperf3srv):</span><br><span> super().__init__(log.C_RUN, 'iperf3-cli_%s' % iperf3srv.addr())</span><br><span> self.run_dir = None</span><br><span>@@ -167,6 +204,7 @@</span><br><span> self._run_node = None</span><br><span> self.server = iperf3srv</span><br><span> self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+ self._proto = None</span><br><span> self.log_file = None</span><br><span> self.rem_host = None</span><br><span> self.remote_log_file = None</span><br><span>@@ -177,10 +215,10 @@</span><br><span> locally = not self._run_node or self._run_node.is_local()</span><br><span> return locally</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def prepare_test_proc(self, downlink=False, netns=None, time_sec=None):</span><br><span style="color: hsl(120, 100%, 40%);">+ def prepare_test_proc(self, downlink=False, netns=None, time_sec=None, proto=None):</span><br><span style="color: hsl(120, 100%, 40%);">+ values = config.get_defaults('iperf3cli')</span><br><span style="color: hsl(120, 100%, 40%);">+ config.overlay(values, self.testenv.suite().config().get('iperf3cli', {}))</span><br><span> if time_sec is None:</span><br><span style="color: hsl(0, 100%, 40%);">- values = config.get_defaults('iperf3cli')</span><br><span style="color: hsl(0, 100%, 40%);">- config.overlay(values, self.testenv.suite().config().get('iperf3cli', {}))</span><br><span> time_sec_str = values.get('time', time_sec)</span><br><span> </span><br><span> # Convert duration to seconds</span><br><span>@@ -190,19 +228,22 @@</span><br><span> time_sec = int(time_sec_str[:-1]) * 60</span><br><span> else:</span><br><span> time_sec = int(time_sec_str)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> assert(time_sec)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- self.log('Preparing iperf3-client connecting to %s:%d (time=%ds)' % (self.server.addr(), self.server.port(), time_sec))</span><br><span style="color: hsl(120, 100%, 40%);">+ if proto is None:</span><br><span style="color: hsl(120, 100%, 40%);">+ proto = values.get('protocol', IPerf3Client.PROTO_TCP)</span><br><span style="color: hsl(120, 100%, 40%);">+ self._proto = proto</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ self.log('Preparing iperf3-client connecting to %s:%d (proto=%s,time=%ds)' % (self.server.addr(), self.server.port(), self._proto, time_sec))</span><br><span> self.log_copied = False</span><br><span> self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))</span><br><span> self.log_file = self.run_dir.new_file(IPerf3Client.LOGFILE)</span><br><span> if self.runs_locally():</span><br><span style="color: hsl(0, 100%, 40%);">- return self.prepare_test_proc_locally(downlink, netns, time_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+ return self.prepare_test_proc_locally(downlink, netns, time_sec, proto == IPerf3Client.PROTO_UDP)</span><br><span> else:</span><br><span style="color: hsl(0, 100%, 40%);">- return self.prepare_test_proc_remotely(downlink, netns, time_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+ return self.prepare_test_proc_remotely(downlink, netns, time_sec, proto == IPerf3Client.PROTO_UDP)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def prepare_test_proc_remotely(self, downlink, netns, time_sec):</span><br><span style="color: hsl(120, 100%, 40%);">+ def prepare_test_proc_remotely(self, downlink, netns, time_sec, use_udp):</span><br><span> self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span> </span><br><span> remote_prefix_dir = util.Dir(IPerf3Client.REMOTE_DIR)</span><br><span>@@ -218,6 +259,8 @@</span><br><span> popen_args += ('--logfile', self.remote_log_file,)</span><br><span> if downlink:</span><br><span> popen_args += ('-R',)</span><br><span style="color: hsl(120, 100%, 40%);">+ if use_udp:</span><br><span style="color: hsl(120, 100%, 40%);">+ popen_args += ('-u',)</span><br><span> </span><br><span> if netns:</span><br><span> self.process = self.rem_host.RemoteNetNSProcess(self.name(), netns, popen_args, env={})</span><br><span>@@ -225,7 +268,7 @@</span><br><span> self.process = self.rem_host.RemoteProcess(self.name(), popen_args, env={})</span><br><span> return self.process</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def prepare_test_proc_locally(self, downlink, netns, time_sec):</span><br><span style="color: hsl(120, 100%, 40%);">+ def prepare_test_proc_locally(self, downlink, netns, time_sec, use_udp):</span><br><span> pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span> 'host %s and port not 22' % self.server.addr(), netns)</span><br><span> </span><br><span>@@ -236,6 +279,8 @@</span><br><span> popen_args += ('--logfile', os.path.abspath(self.log_file),)</span><br><span> if downlink:</span><br><span> popen_args += ('-R',)</span><br><span style="color: hsl(120, 100%, 40%);">+ if use_udp:</span><br><span style="color: hsl(120, 100%, 40%);">+ popen_args += ('-u',)</span><br><span> </span><br><span> if netns:</span><br><span> self.process = process.NetNSProcess(self.name(), self.run_dir, netns, popen_args, env={})</span><br><span>@@ -258,9 +303,18 @@</span><br><span> else:</span><br><span> return iperf3_result_to_json(self, self.process.get_stdout())</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ def print_results(self):</span><br><span style="color: hsl(120, 100%, 40%);">+ if self.proto() == self.PROTO_UDP:</span><br><span style="color: hsl(120, 100%, 40%);">+ print_result_node_udp(self.get_results(), 'client')</span><br><span style="color: hsl(120, 100%, 40%);">+ else:</span><br><span style="color: hsl(120, 100%, 40%);">+ print_result_node_tcp(self.get_results(), 'client')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def set_run_node(self, run_node):</span><br><span> self._run_node = run_node</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ def proto(self):</span><br><span style="color: hsl(120, 100%, 40%);">+ return self._proto</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def __str__(self):</span><br><span> # FIXME: somehow differentiate between several clients connected to same server?</span><br><span> return "%s:%u" %(self.server.addr(), self.server.port())</span><br><span>diff --git a/sysmocom/scenarios/cfg-iperf3-proto@.conf b/sysmocom/scenarios/cfg-iperf3-proto@.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..8e2c350</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/cfg-iperf3-proto@.conf</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config:</span><br><span style="color: hsl(120, 100%, 40%);">+ iperf3cli:</span><br><span style="color: hsl(120, 100%, 40%);">+ protocol: ${param1}</span><br><span>diff --git a/sysmocom/suites/4g/iperf3_dl.py b/sysmocom/suites/4g/iperf3_dl.py</span><br><span>index d4fa649..bcc569a 100755</span><br><span>--- a/sysmocom/suites/4g/iperf3_dl.py</span><br><span>+++ b/sysmocom/suites/4g/iperf3_dl.py</span><br><span>@@ -1,17 +1,6 @@</span><br><span> #!/usr/bin/env python3</span><br><span> from osmo_gsm_tester.testenv import *</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def print_result_node(result, node_str):</span><br><span style="color: hsl(0, 100%, 40%);">- sent = result['end']['sum_sent']</span><br><span style="color: hsl(0, 100%, 40%);">- recv = result['end']['sum_received']</span><br><span style="color: hsl(0, 100%, 40%);">- print("Result %s:" % node_str)</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tSEND: %d KB, %d kbps, %d seconds (%s retrans)" % (sent['bytes']/1000, sent['bits_per_second']/1000, sent['seconds'], str(sent.get('retransmits', 'unknown'))))</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tRECV: %d KB, %d kbps, %d seconds" % (recv['bytes']/1000, recv['bits_per_second']/1000, recv['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def print_results(cli_res, srv_res):</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(cli_res, 'client')</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(srv_res, 'server')</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> epc = tenv.epc()</span><br><span> enb = tenv.enb()</span><br><span> ue = tenv.modem()</span><br><span>@@ -41,7 +30,9 @@</span><br><span> print("Running iperf3 client to %s through %s" % (str(iperf3cli), ue.netns()))</span><br><span> proc.launch_sync()</span><br><span> iperf3srv.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-print_results(iperf3cli.get_results(), iperf3srv.get_results())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli.print_results()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.print_results(iperf3cli.proto() == iperf3cli.PROTO_UDP)</span><br><span> </span><br><span> max_rate = enb.ue_max_rate(downlink=True)</span><br><span> res_str = ue.verify_metric(max_rate * 0.8, operation='avg', metric='dl_brate', criterion='gt')</span><br><span>diff --git a/sysmocom/suites/4g/iperf3_ul.py b/sysmocom/suites/4g/iperf3_ul.py</span><br><span>index 64d476b..a92a658 100755</span><br><span>--- a/sysmocom/suites/4g/iperf3_ul.py</span><br><span>+++ b/sysmocom/suites/4g/iperf3_ul.py</span><br><span>@@ -1,17 +1,6 @@</span><br><span> #!/usr/bin/env python3</span><br><span> from osmo_gsm_tester.testenv import *</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def print_result_node(result, node_str):</span><br><span style="color: hsl(0, 100%, 40%);">- sent = result['end']['sum_sent']</span><br><span style="color: hsl(0, 100%, 40%);">- recv = result['end']['sum_received']</span><br><span style="color: hsl(0, 100%, 40%);">- print("Result %s:" % node_str)</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tSEND: %d KB, %d kbps, %d seconds (%s retrans)" % (sent['bytes']/1000, sent['bits_per_second']/1000, sent['seconds'], str(sent.get('retransmits', 'unknown'))))</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tRECV: %d KB, %d kbps, %d seconds" % (recv['bytes']/1000, recv['bits_per_second']/1000, recv['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def print_results(cli_res, srv_res):</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(cli_res, 'client')</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(srv_res, 'server')</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> epc = tenv.epc()</span><br><span> enb = tenv.enb()</span><br><span> ue = tenv.modem()</span><br><span>@@ -41,7 +30,9 @@</span><br><span> print("Running iperf3 client to %s through %s" % (str(iperf3cli), ue.netns()))</span><br><span> proc.launch_sync()</span><br><span> iperf3srv.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-print_results(iperf3cli.get_results(), iperf3srv.get_results())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli.print_results()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.print_results(iperf3cli.proto() == iperf3cli.PROTO_UDP)</span><br><span> </span><br><span> max_rate = enb.ue_max_rate(downlink=False)</span><br><span> res_str = ue.verify_metric(max_rate * 0.8, operation='avg', metric='ul_brate', criterion='gt')</span><br><span>diff --git a/sysmocom/suites/gprs/lib/testlib.py b/sysmocom/suites/gprs/lib/testlib.py</span><br><span>index 636ee2b..765f463 100644</span><br><span>--- a/sysmocom/suites/gprs/lib/testlib.py</span><br><span>+++ b/sysmocom/suites/gprs/lib/testlib.py</span><br><span>@@ -1,21 +1,9 @@</span><br><span> #!/usr/bin/env python3</span><br><span> from osmo_gsm_tester.testenv import *</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def print_result_node(result, node_str):</span><br><span style="color: hsl(0, 100%, 40%);">- try:</span><br><span style="color: hsl(0, 100%, 40%);">- sent = result['end']['sum_sent']</span><br><span style="color: hsl(0, 100%, 40%);">- recv = result['end']['sum_received']</span><br><span style="color: hsl(0, 100%, 40%);">- print("Result %s:" % node_str)</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tSEND: %d KB, %d kbps, %d seconds (%s retrans)" % (sent['bytes']/1000, sent['bits_per_second']/1000, sent['seconds'], str(sent.get('retransmits', 'unknown'))))</span><br><span style="color: hsl(0, 100%, 40%);">- print("\tRECV: %d KB, %d kbps, %d seconds" % (recv['bytes']/1000, recv['bits_per_second']/1000, recv['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">- except Exception as e:</span><br><span style="color: hsl(0, 100%, 40%);">- print("Exception while using iperf3 %s results: %r" % (node_str, repr(result)))</span><br><span style="color: hsl(0, 100%, 40%);">- raise e</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def print_results(cli_res, srv_res):</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(cli_res, 'client')</span><br><span style="color: hsl(0, 100%, 40%);">- print_result_node(srv_res, 'server')</span><br><span style="color: hsl(120, 100%, 40%);">+def print_results(cli, srv):</span><br><span style="color: hsl(120, 100%, 40%);">+ cli.print_results()</span><br><span style="color: hsl(120, 100%, 40%);">+ srv.print_results(cli.proto() == cli.PROTO_UDP)</span><br><span> </span><br><span> def run_iperf3_cli_parallel(iperf3clients, ms_li, ready_cb):</span><br><span> assert len(iperf3clients) == len(ms_li)</span><br><span>@@ -114,7 +102,7 @@</span><br><span> for i in range(num_ms):</span><br><span> servers[i].stop()</span><br><span> print("Results for %s through %r" % (str(servers[i]), repr(ms_li[i].tmp_ctx_id)))</span><br><span style="color: hsl(0, 100%, 40%);">- print_results(clients[i].get_results(), servers[i].get_results())</span><br><span style="color: hsl(120, 100%, 40%);">+ print_results(clients[i], servers[i])</span><br><span> </span><br><span> for ms in ms_li:</span><br><span> ms.deactivate_context(ms.tmp_ctx_id)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18389">change 18389</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18389"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0b3545847b01ae3d029881f243fea276f0fa39de </div>
<div style="display:none"> Gerrit-Change-Number: 18389 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>