<p>Pau Espin Pedrol <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11773">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">tests: iperf3: Support testing parallel iperf3 clients in test<br><br>Since tests running a single MS and several of them are really similar,<br>generic code handling the test for N concurrent iperf3 sessions is<br>writen an moved to testlib, and existing and new test use that code.<br><br>Change-Id: I57799fde49e6845379cca332eec0a1f70aaecd2b<br>---<br>M src/osmo_gsm_tester/iperf3.py<br>M suites/gprs/iperf3.py<br>A suites/gprs/iperf3m4.py<br>A suites/gprs/lib/testlib.py<br>M suites/gprs/suite.conf<br>5 files changed, 128 insertions(+), 72 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/iperf3.py b/src/osmo_gsm_tester/iperf3.py</span><br><span>index 8f0cddb..55cb546 100644</span><br><span>--- a/src/osmo_gsm_tester/iperf3.py</span><br><span>+++ b/src/osmo_gsm_tester/iperf3.py</span><br><span>@@ -95,7 +95,7 @@</span><br><span>         self.server = iperf3srv</span><br><span>         self.suite_run = suite_run</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def run_test(self, netns=None):</span><br><span style="color: hsl(120, 100%, 40%);">+    def prepare_test_proc(self, netns=None):</span><br><span>         self.log('Starting iperf3-client connecting to %s:%d' % (self.server.addr(), self.server.port()))</span><br><span>         self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span> </span><br><span>@@ -110,6 +110,10 @@</span><br><span>             self.process = process.NetNSProcess(self.name(), self.run_dir, netns, popen_args, env={})</span><br><span>         else:</span><br><span>             self.process = process.Process(self.name(), self.run_dir, popen_args, env={})</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.process</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def run_test_sync(self, netns=None):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.prepare_test_proc(netns)</span><br><span>         self.process.launch_sync()</span><br><span>         return self.get_results()</span><br><span> </span><br><span>diff --git a/suites/gprs/iperf3.py b/suites/gprs/iperf3.py</span><br><span>index a1dd62c..e25519a 100755</span><br><span>--- a/suites/gprs/iperf3.py</span><br><span>+++ b/suites/gprs/iperf3.py</span><br><span>@@ -1,74 +1,8 @@</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_results(cli_res, srv_res):</span><br><span style="color: hsl(0, 100%, 40%);">-    cli_sent = cli_res['end']['sum_sent']</span><br><span style="color: hsl(0, 100%, 40%);">-    cli_recv = cli_res['end']['sum_received']</span><br><span style="color: hsl(0, 100%, 40%);">-    print("RESULT client:")</span><br><span style="color: hsl(0, 100%, 40%);">-    print("\tSEND: %d KB, %d kbps, %d seconds (%d retrans)" % (cli_sent['bytes']/1000, cli_sent['bits_per_second']/1000,  cli_sent['seconds'], cli_sent['retransmits']))</span><br><span style="color: hsl(0, 100%, 40%);">-    print("\tRECV: %d KB, %d kbps, %d seconds" % (cli_recv['bytes']/1000, cli_recv['bits_per_second']/1000, cli_recv['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">-    print("RESULT server:")</span><br><span style="color: hsl(0, 100%, 40%);">-    print("\tSEND: %d KB, %d kbps, %d seconds" % (cli_sent['bytes']/1000, cli_sent['bits_per_second']/1000, cli_sent['seconds']))</span><br><span style="color: hsl(0, 100%, 40%);">-    print("\tRECV: %d KB, %d kbps, %d seconds" % (cli_recv['bytes']/1000, cli_recv['bits_per_second']/1000, cli_recv['seconds']))</span><br><span style="color: hsl(120, 100%, 40%);">+import testlib</span><br><span style="color: hsl(120, 100%, 40%);">+suite.test_import_modules_register_for_cleanup(testlib)</span><br><span style="color: hsl(120, 100%, 40%);">+from testlib import setup_run_iperf3_test_parallel</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-hlr = suite.hlr()</span><br><span style="color: hsl(0, 100%, 40%);">-bts = suite.bts()</span><br><span style="color: hsl(0, 100%, 40%);">-pcu = bts.pcu()</span><br><span style="color: hsl(0, 100%, 40%);">-mgw_msc = suite.mgw()</span><br><span style="color: hsl(0, 100%, 40%);">-mgw_bsc = suite.mgw()</span><br><span style="color: hsl(0, 100%, 40%);">-stp = suite.stp()</span><br><span style="color: hsl(0, 100%, 40%);">-ggsn = suite.ggsn()</span><br><span style="color: hsl(0, 100%, 40%);">-sgsn = suite.sgsn(hlr, ggsn)</span><br><span style="color: hsl(0, 100%, 40%);">-msc = suite.msc(hlr, mgw_msc, stp)</span><br><span style="color: hsl(0, 100%, 40%);">-bsc = suite.bsc(msc, mgw_bsc, stp)</span><br><span style="color: hsl(0, 100%, 40%);">-ms = suite.modem()</span><br><span style="color: hsl(0, 100%, 40%);">-iperf3srv = suite.iperf3srv()</span><br><span style="color: hsl(0, 100%, 40%);">-iperf3cli = iperf3srv.create_client()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-bsc.bts_add(bts)</span><br><span style="color: hsl(0, 100%, 40%);">-sgsn.bts_add(bts)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-print('start iperfv3 server...')</span><br><span style="color: hsl(0, 100%, 40%);">-iperf3srv.start()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-print('start network...')</span><br><span style="color: hsl(0, 100%, 40%);">-hlr.start()</span><br><span style="color: hsl(0, 100%, 40%);">-stp.start()</span><br><span style="color: hsl(0, 100%, 40%);">-ggsn.start()</span><br><span style="color: hsl(0, 100%, 40%);">-sgsn.start()</span><br><span style="color: hsl(0, 100%, 40%);">-msc.start()</span><br><span style="color: hsl(0, 100%, 40%);">-mgw_msc.start()</span><br><span style="color: hsl(0, 100%, 40%);">-mgw_bsc.start()</span><br><span style="color: hsl(0, 100%, 40%);">-bsc.start()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-bts.start()</span><br><span style="color: hsl(0, 100%, 40%);">-wait(bsc.bts_is_connected, bts)</span><br><span style="color: hsl(0, 100%, 40%);">-print('Waiting for bts to be ready...')</span><br><span style="color: hsl(0, 100%, 40%);">-wait(bts.ready_for_pcu)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu.start()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-hlr.subscriber_add(ms)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-ms.connect(msc.mcc_mnc())</span><br><span style="color: hsl(0, 100%, 40%);">-ms.attach()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-ms.log_info()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-print('waiting for modems to attach...')</span><br><span style="color: hsl(0, 100%, 40%);">-wait(ms.is_connected, msc.mcc_mnc())</span><br><span style="color: hsl(0, 100%, 40%);">-wait(msc.subscriber_attached, ms)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-print('waiting for modems to attach to data services...')</span><br><span style="color: hsl(0, 100%, 40%);">-wait(ms.is_attached)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-# We need to use inet46 since ofono qmi only uses ipv4v6 eua (OS#2713)</span><br><span style="color: hsl(0, 100%, 40%);">-ctx_id_v4 = ms.activate_context(apn='inet46', protocol=ms.CTX_PROT_IPv4)</span><br><span style="color: hsl(0, 100%, 40%);">-print("Setting up data plan for %r" % repr(ctx_id_v4))</span><br><span style="color: hsl(0, 100%, 40%);">-ms.setup_context_data_plane(ctx_id_v4)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-print("Running iperf3 client to %s through %r" % (iperf3srv.addr(),repr(ctx_id_v4)))</span><br><span style="color: hsl(0, 100%, 40%);">-res = iperf3cli.run_test(ms.netns())</span><br><span style="color: hsl(0, 100%, 40%);">-iperf3srv.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-print_results(res, iperf3srv.get_results())</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-ms.deactivate_context(ctx_id_v4)</span><br><span style="color: hsl(120, 100%, 40%);">+setup_run_iperf3_test_parallel(1)</span><br><span>diff --git a/suites/gprs/iperf3m4.py b/suites/gprs/iperf3m4.py</span><br><span>new file mode 100755</span><br><span>index 0000000..1cc27ed</span><br><span>--- /dev/null</span><br><span>+++ b/suites/gprs/iperf3m4.py</span><br><span>@@ -0,0 +1,8 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+from osmo_gsm_tester.testenv import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import testlib</span><br><span style="color: hsl(120, 100%, 40%);">+suite.test_import_modules_register_for_cleanup(testlib)</span><br><span style="color: hsl(120, 100%, 40%);">+from testlib import setup_run_iperf3_test_parallel</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+setup_run_iperf3_test_parallel(4)</span><br><span>diff --git a/suites/gprs/lib/testlib.py b/suites/gprs/lib/testlib.py</span><br><span>new file mode 100644</span><br><span>index 0000000..13a6671</span><br><span>--- /dev/null</span><br><span>+++ b/suites/gprs/lib/testlib.py</span><br><span>@@ -0,0 +1,110 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+from osmo_gsm_tester.testenv import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def print_results(cli_res, srv_res):</span><br><span style="color: hsl(120, 100%, 40%);">+    cli_sent = cli_res['end']['sum_sent']</span><br><span style="color: hsl(120, 100%, 40%);">+    cli_recv = cli_res['end']['sum_received']</span><br><span style="color: hsl(120, 100%, 40%);">+    print("RESULT client:")</span><br><span style="color: hsl(120, 100%, 40%);">+    print("\tSEND: %d KB, %d kbps, %d seconds (%d retrans)" % (cli_sent['bytes']/1000, cli_sent['bits_per_second']/1000,  cli_sent['seconds'], cli_sent['retransmits']))</span><br><span style="color: hsl(120, 100%, 40%);">+    print("\tRECV: %d KB, %d kbps, %d seconds" % (cli_recv['bytes']/1000, cli_recv['bits_per_second']/1000, cli_recv['seconds']))</span><br><span style="color: hsl(120, 100%, 40%);">+    print("RESULT server:")</span><br><span style="color: hsl(120, 100%, 40%);">+    print("\tSEND: %d KB, %d kbps, %d seconds" % (cli_sent['bytes']/1000, cli_sent['bits_per_second']/1000, cli_sent['seconds']))</span><br><span style="color: hsl(120, 100%, 40%);">+    print("\tRECV: %d KB, %d kbps, %d seconds" % (cli_recv['bytes']/1000, cli_recv['bits_per_second']/1000, cli_recv['seconds']))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def run_iperf3_cli_parallel(iperf3clients, ms_li):</span><br><span style="color: hsl(120, 100%, 40%);">+    assert len(iperf3clients) == len(ms_li)</span><br><span style="color: hsl(120, 100%, 40%);">+    procs = []</span><br><span style="color: hsl(120, 100%, 40%);">+    for i in range(len(iperf3clients)):</span><br><span style="color: hsl(120, 100%, 40%);">+        print("Running iperf3 client to %s through %r" % (str(iperf3clients[i]), repr(ms_li[i].tmp_ctx_id)))</span><br><span style="color: hsl(120, 100%, 40%);">+        procs.append(iperf3clients[i].prepare_test_proc(ms_li[i].netns()))</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        for proc in procs:</span><br><span style="color: hsl(120, 100%, 40%);">+            proc.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+        for proc in procs:</span><br><span style="color: hsl(120, 100%, 40%);">+            proc.wait()</span><br><span style="color: hsl(120, 100%, 40%);">+    except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+        for proc in procs:</span><br><span style="color: hsl(120, 100%, 40%);">+            proc.terminate()</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def setup_run_iperf3_test_parallel(num_ms):</span><br><span style="color: hsl(120, 100%, 40%);">+    hlr = suite.hlr()</span><br><span style="color: hsl(120, 100%, 40%);">+    bts = suite.bts()</span><br><span style="color: hsl(120, 100%, 40%);">+    pcu = bts.pcu()</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_msc = suite.mgw()</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_bsc = suite.mgw()</span><br><span style="color: hsl(120, 100%, 40%);">+    stp = suite.stp()</span><br><span style="color: hsl(120, 100%, 40%);">+    ggsn = suite.ggsn()</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn = suite.sgsn(hlr, ggsn)</span><br><span style="color: hsl(120, 100%, 40%);">+    msc = suite.msc(hlr, mgw_msc, stp)</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc = suite.bsc(msc, mgw_bsc, stp)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    iperf3srv_addr = suite.ip_address()</span><br><span style="color: hsl(120, 100%, 40%);">+    servers = []</span><br><span style="color: hsl(120, 100%, 40%);">+    clients = []</span><br><span style="color: hsl(120, 100%, 40%);">+    ms_li = []</span><br><span style="color: hsl(120, 100%, 40%);">+    for i in range(num_ms):</span><br><span style="color: hsl(120, 100%, 40%);">+        iperf3srv = suite.iperf3srv(iperf3srv_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+        iperf3srv.set_port(iperf3srv.DEFAULT_SRV_PORT + i)</span><br><span style="color: hsl(120, 100%, 40%);">+        servers.append(iperf3srv)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        iperf3cli = iperf3srv.create_client()</span><br><span style="color: hsl(120, 100%, 40%);">+        clients.append(iperf3cli)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ms = suite.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+        ms_li.append(ms)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc.bts_add(bts)</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn.bts_add(bts)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for iperf3srv in servers:</span><br><span style="color: hsl(120, 100%, 40%);">+        print('start iperfv3 server %s...' % str(iperf3srv) )</span><br><span style="color: hsl(120, 100%, 40%);">+        iperf3srv.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    print('start network...')</span><br><span style="color: hsl(120, 100%, 40%);">+    hlr.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    stp.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    ggsn.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_bsc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bts.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(bsc.bts_is_connected, bts)</span><br><span style="color: hsl(120, 100%, 40%);">+    print('Waiting for bts to be ready...')</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(bts.ready_for_pcu)</span><br><span style="color: hsl(120, 100%, 40%);">+    pcu.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for ms in ms_li:</span><br><span style="color: hsl(120, 100%, 40%);">+        hlr.subscriber_add(ms)</span><br><span style="color: hsl(120, 100%, 40%);">+        ms.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+        ms.attach()</span><br><span style="color: hsl(120, 100%, 40%);">+        ms.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    print('waiting for modems to attach...')</span><br><span style="color: hsl(120, 100%, 40%);">+    for ms in ms_li:</span><br><span style="color: hsl(120, 100%, 40%);">+        wait(ms.is_connected, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(msc.subscriber_attached, *ms_li)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    print('waiting for modems to attach to data services...')</span><br><span style="color: hsl(120, 100%, 40%);">+    for ms in ms_li:</span><br><span style="color: hsl(120, 100%, 40%);">+        wait(ms.is_attached)</span><br><span style="color: hsl(120, 100%, 40%);">+        # We need to use inet46 since ofono qmi only uses ipv4v6 eua (OS#2713)</span><br><span style="color: hsl(120, 100%, 40%);">+        ctx_id_v4 = ms.activate_context(apn='inet46', protocol=ms.CTX_PROT_IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+        print("Setting up data plan for %r" % repr(ctx_id_v4))</span><br><span style="color: hsl(120, 100%, 40%);">+        ms.setup_context_data_plane(ctx_id_v4)</span><br><span style="color: hsl(120, 100%, 40%);">+        setattr(ms, 'tmp_ctx_id', ctx_id_v4)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    run_iperf3_cli_parallel(clients, ms_li)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for i in range(num_ms):</span><br><span style="color: hsl(120, 100%, 40%);">+        servers[i].stop()</span><br><span style="color: hsl(120, 100%, 40%);">+        print("Results for %s through %r" % (str(servers[i]), repr(ms_li[i].tmp_ctx_id)))</span><br><span style="color: hsl(120, 100%, 40%);">+        print_results(clients[i].get_results(), servers[i].get_results())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for ms in ms_li:</span><br><span style="color: hsl(120, 100%, 40%);">+        ms.deactivate_context(ms.tmp_ctx_id)</span><br><span style="color: hsl(120, 100%, 40%);">+        delattr(ms, 'tmp_ctx_id')</span><br><span>diff --git a/suites/gprs/suite.conf b/suites/gprs/suite.conf</span><br><span>index a24bc5d..3d4fe48 100644</span><br><span>--- a/suites/gprs/suite.conf</span><br><span>+++ b/suites/gprs/suite.conf</span><br><span>@@ -4,6 +4,6 @@</span><br><span>   bts:</span><br><span>   - times: 1</span><br><span>   modem:</span><br><span style="color: hsl(0, 100%, 40%);">-  - times: 1</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 4</span><br><span>     features:</span><br><span>     - gprs</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11773">change 11773</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/11773"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I57799fde49e6845379cca332eec0a1f70aaecd2b </div>
<div style="display:none"> Gerrit-Change-Number: 11773 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>