<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18389">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><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;"><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..9c05d44 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', '-b', '0')</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', '-b', '0')</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: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: srs_andre <andre@softwareradiosystems.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>