<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17237">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;">srsLTE: Support configuring different RF backends<br><br>Before this patch, only virtual RF through ZeroMQ was supported.<br>This patch allows configuring srsUE and srsENB to use a real SDR with<br>UHD/SoapySDR backend connected through a physical RF network, while<br>still keeping compatibility to run on virtual RF ZeroMQ network, based<br>on the resources used (controlled by scenarios). For instance, one can<br>first run a suite through the phyisical RF (using 2 UHD-controlled SDRs)<br>and afterwards with ZeroMQ using the following default-suites.conf:<br><br>- 4g:srsenb-rftype-uhd+srsue-rftype-uhd<br>- 4g:srsenb-rftype-zmq+srsue-rftype-zmq<br><br>Change-Id: I7dbbe328f4c0225fe74e878bb2da13fe39ccf049<br>---<br>M example/default-suites.conf<br>M example/resources.conf.prod<br>A example/scenarios/srsenb-rftype-uhd.conf<br>A example/scenarios/srsenb-rftype-zmq.conf<br>A example/scenarios/srsue-rftype-soapy.conf<br>A example/scenarios/srsue-rftype-uhd.conf<br>A example/scenarios/srsue-rftype-zmq.conf<br>M src/osmo_gsm_tester/resource.py<br>M src/osmo_gsm_tester/srs_enb.py<br>M src/osmo_gsm_tester/srs_ue.py<br>M src/osmo_gsm_tester/templates/srsenb.conf.tmpl<br>M src/osmo_gsm_tester/templates/srsue.conf.tmpl<br>12 files changed, 73 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/example/default-suites.conf b/example/default-suites.conf</span><br><span>index cfac1ca..4910dbc 100644</span><br><span>--- a/example/default-suites.conf</span><br><span>+++ b/example/default-suites.conf</span><br><span>@@ -162,4 +162,4 @@</span><br><span> - smpp</span><br><span> - encryption</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-- 4g</span><br><span style="color: hsl(120, 100%, 40%);">+- 4g:srsenb-rftype-zmq+srsue-rftype-zmq</span><br><span>diff --git a/example/resources.conf.prod b/example/resources.conf.prod</span><br><span>index 943160b..cbcaafd 100644</span><br><span>--- a/example/resources.conf.prod</span><br><span>+++ b/example/resources.conf.prod</span><br><span>@@ -157,6 +157,15 @@</span><br><span> enb:</span><br><span> - label: srsENB-zmq</span><br><span>   type: srsenb</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_type: zmq</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_args: auto</span><br><span style="color: hsl(120, 100%, 40%);">+  remote_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+  addr: 10.42.42.117</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- label: srsENB-B200</span><br><span style="color: hsl(120, 100%, 40%);">+  type: srsenb</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_type: UHD</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_args: "type=b200,serial=306BD11,recv_frame_size=9232,send_frame_size=9232"</span><br><span>   remote_user: jenkins</span><br><span>   addr: 10.42.42.117</span><br><span> </span><br><span>@@ -241,12 +250,23 @@</span><br><span> </span><br><span> - label: srsUE-zmq_1</span><br><span>   type: srsue</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_type: zmq</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_args: auto</span><br><span>   remote_user: jenkins</span><br><span>   addr: 10.42.42.116</span><br><span>   imsi: '001010123456789'</span><br><span>   ki: '00112233445566778899aabbccddeeff'</span><br><span>   auth_algo: 'xor'</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+- label: srsUE-soapy-lms_1</span><br><span style="color: hsl(120, 100%, 40%);">+  type: srsue</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_type: soapy</span><br><span style="color: hsl(120, 100%, 40%);">+  rf_dev_args: driver=lime,serial=00090706024F0A22,rxant=LNAW,txant=BAND1</span><br><span style="color: hsl(120, 100%, 40%);">+  remote_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+  addr: 10.42.42.116</span><br><span style="color: hsl(120, 100%, 40%);">+  imsi: '001010123456789'</span><br><span style="color: hsl(120, 100%, 40%);">+  ki: '00112233445566778899aabbccddeeff'</span><br><span style="color: hsl(120, 100%, 40%);">+  auth_algo: 'xor'</span><br><span> </span><br><span> osmocon_phone:</span><br><span>   - serial_device: '/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_00897B41-if00-port0'</span><br><span>diff --git a/example/scenarios/srsenb-rftype-uhd.conf b/example/scenarios/srsenb-rftype-uhd.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..293c109</span><br><span>--- /dev/null</span><br><span>+++ b/example/scenarios/srsenb-rftype-uhd.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: srsenb</span><br><span style="color: hsl(120, 100%, 40%);">+    rf_dev_type: UHD</span><br><span>diff --git a/example/scenarios/srsenb-rftype-zmq.conf b/example/scenarios/srsenb-rftype-zmq.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..e0f9c9d</span><br><span>--- /dev/null</span><br><span>+++ b/example/scenarios/srsenb-rftype-zmq.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: srsenb</span><br><span style="color: hsl(120, 100%, 40%);">+    rf_dev_type: zmq</span><br><span>diff --git a/example/scenarios/srsue-rftype-soapy.conf b/example/scenarios/srsue-rftype-soapy.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..5f034af</span><br><span>--- /dev/null</span><br><span>+++ b/example/scenarios/srsue-rftype-soapy.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: srsue</span><br><span style="color: hsl(120, 100%, 40%);">+    rf_dev_type: soapy</span><br><span>diff --git a/example/scenarios/srsue-rftype-uhd.conf b/example/scenarios/srsue-rftype-uhd.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..fef8696</span><br><span>--- /dev/null</span><br><span>+++ b/example/scenarios/srsue-rftype-uhd.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: srsue</span><br><span style="color: hsl(120, 100%, 40%);">+    rf_dev_type: UHD</span><br><span>diff --git a/example/scenarios/srsue-rftype-zmq.conf b/example/scenarios/srsue-rftype-zmq.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..d30a84b</span><br><span>--- /dev/null</span><br><span>+++ b/example/scenarios/srsue-rftype-zmq.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: srsue</span><br><span style="color: hsl(120, 100%, 40%);">+    rf_dev_type: zmq</span><br><span>diff --git a/src/osmo_gsm_tester/resource.py b/src/osmo_gsm_tester/resource.py</span><br><span>index 0804591..e8ca859 100644</span><br><span>--- a/src/osmo_gsm_tester/resource.py</span><br><span>+++ b/src/osmo_gsm_tester/resource.py</span><br><span>@@ -89,7 +89,8 @@</span><br><span>         'enb[].type': schema.STR,</span><br><span>         'enb[].remote_user': schema.STR,</span><br><span>         'enb[].addr': schema.IPV4,</span><br><span style="color: hsl(0, 100%, 40%);">-        'enb[].band': schema.BAND,</span><br><span style="color: hsl(120, 100%, 40%);">+        'enb[].rf_dev_type': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+        'enb[].rf_dev_args': schema.STR,</span><br><span>         'arfcn[].arfcn': schema.INT,</span><br><span>         'arfcn[].band': schema.BAND,</span><br><span>         'modem[].type': schema.STR,</span><br><span>@@ -102,6 +103,8 @@</span><br><span>         'modem[].addr': schema.IPV4,</span><br><span>         'modem[].ciphers[]': schema.CIPHER,</span><br><span>         'modem[].features[]': schema.MODEM_FEATURE,</span><br><span style="color: hsl(120, 100%, 40%);">+        'modem[].rf_dev_type': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+        'modem[].rf_dev_args': schema.STR,</span><br><span>         'osmocon_phone[].serial_device': schema.STR,</span><br><span>     }</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/srs_enb.py b/src/osmo_gsm_tester/srs_enb.py</span><br><span>index 2b65a5b..6fb186f 100644</span><br><span>--- a/src/osmo_gsm_tester/srs_enb.py</span><br><span>+++ b/src/osmo_gsm_tester/srs_enb.py</span><br><span>@@ -22,6 +22,9 @@</span><br><span> </span><br><span> from . import log, util, config, template, process, remote</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def rf_type_valid(rf_type_str):</span><br><span style="color: hsl(120, 100%, 40%);">+    return rf_type_str in ('zmq', 'UHD', 'soapy', 'bladeRF')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class srsENB(log.Origin):</span><br><span> </span><br><span>     REMOTE_DIR = '/osmo-gsm-tester-srsenb'</span><br><span>@@ -34,6 +37,7 @@</span><br><span> </span><br><span>     def __init__(self, suite_run, conf):</span><br><span>         super().__init__(log.C_RUN, 'srsenb')</span><br><span style="color: hsl(120, 100%, 40%);">+        self._conf = conf</span><br><span>         self._addr = conf.get('addr', None)</span><br><span>         if self._addr is None:</span><br><span>             raise log.Error('addr not set')</span><br><span>@@ -59,6 +63,8 @@</span><br><span>         else:</span><br><span>           self.base_srate=23.04e6</span><br><span>         self.remote_user = conf.get('remote_user', None)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>         if self.process is None:</span><br><span>@@ -117,8 +123,6 @@</span><br><span>                 '--enb_files.sib_config=' + self.remote_config_sib_file,</span><br><span>                 '--enb_files.rr_config=' + self.remote_config_rr_file,</span><br><span>                 '--enb_files.drb_config=' + self.remote_config_drb_file,</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_name=zmq',</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_args="fail_on_disconnect=true,tx_port=tcp://'+ self.addr() +':2000,rx_port=tcp://'+ self.ue.addr() +':2001,id=enb,base_srate='+ str(self.base_srate) + '"',</span><br><span>                 '--expert.nof_phy_threads=1',</span><br><span>                 '--expert.rrc_inactivity_timer=1500',</span><br><span>                 '--enb.n_prb=' + str(self.nof_prb),</span><br><span>@@ -145,8 +149,6 @@</span><br><span>                 '--enb_files.sib_config=' + os.path.abspath(self.config_sib_file),</span><br><span>                 '--enb_files.rr_config=' + os.path.abspath(self.config_rr_file),</span><br><span>                 '--enb_files.drb_config=' + os.path.abspath(self.config_drb_file),</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_name=zmq',</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_args="fail_on_disconnect=true,tx_port=tcp://'+ self.addr() +':2000,rx_port=tcp://'+ self.ue.addr() +':2001,id=enb,base_srate='+ str(self.base_srate) + '"',</span><br><span>                 '--expert.nof_phy_threads=1',</span><br><span>                 '--expert.rrc_inactivity_timer=1500',</span><br><span>                 '--enb.n_prb=' + str(self.nof_prb),</span><br><span>@@ -161,8 +163,12 @@</span><br><span> </span><br><span>         values = dict(enb=config.get_defaults('srsenb'))</span><br><span>         config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb={ 'run_addr': self.addr(),</span><br><span style="color: hsl(0, 100%, 40%);">-                                          'mme_addr': self.epc.addr()}))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb=self._conf))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() }))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # We need to set some specific variables programatically here to match IP addresses:</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._conf.get('rf_dev_type') == 'zmq':</span><br><span style="color: hsl(120, 100%, 40%);">+            config.overlay(values, dict(enb=dict(rf_dev_args='fail_on_disconnect=true,tx_port=tcp://'+ self.addr() +':2000,rx_port=tcp://'+ self.ue.addr() +':2001,id=enb,base_srate='+ str(self.base_srate))))</span><br><span> </span><br><span>         self.dbg('srsENB ' + filename + ':\n' + pprint.pformat(values))</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/srs_ue.py b/src/osmo_gsm_tester/srs_ue.py</span><br><span>index c68c726..4a99ad9 100644</span><br><span>--- a/src/osmo_gsm_tester/srs_ue.py</span><br><span>+++ b/src/osmo_gsm_tester/srs_ue.py</span><br><span>@@ -24,6 +24,9 @@</span><br><span> from .run_node import RunNode</span><br><span> from .ms import MS</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def rf_type_valid(rf_type_str):</span><br><span style="color: hsl(120, 100%, 40%);">+    return rf_type_str in ('zmq', 'UHD', 'soapy', 'bladeRF')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class srsUE(MS):</span><br><span> </span><br><span>     REMOTE_DIR = '/osmo-gsm-tester-srsue'</span><br><span>@@ -54,6 +57,8 @@</span><br><span>         else:</span><br><span>           self.base_srate=23.04e6</span><br><span>         self.remote_user = conf.get('remote_user', None)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>         if self.process is None:</span><br><span>@@ -122,8 +127,6 @@</span><br><span> </span><br><span>         #'strace', '-ff',</span><br><span>         args = (remote_binary, self.remote_config_file,</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_name=zmq',</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_args="tx_port=tcp://'+ self.addr() +':2001,rx_port=tcp://'+ self.enb.addr() +':2000,id=ue,base_srate='+ str(self.base_srate) + '"',</span><br><span>                 '--phy.nof_phy_threads=1',</span><br><span>                 '--gw.netns=' + self.netns(),</span><br><span>                 '--log.filename=' + 'stdout', #self.remote_log_file,</span><br><span>@@ -157,8 +160,6 @@</span><br><span>         util.setcap_netsys_admin(binary, self.run_dir.new_dir('setcap_netsys_admin'))</span><br><span> </span><br><span>         args = (binary, os.path.abspath(self.config_file),</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_name=zmq',</span><br><span style="color: hsl(0, 100%, 40%);">-                '--rf.device_args="tx_port=tcp://'+ self.addr() +':2001,rx_port=tcp://'+ self.enb.addr() +':2000,id=ue,base_srate='+ str(self.base_srate) + '"',</span><br><span>                 '--phy.nof_phy_threads=1',</span><br><span>                 '--gw.netns=' + self.netns(),</span><br><span>                 '--log.filename=' + self.log_file,</span><br><span>@@ -180,6 +181,10 @@</span><br><span>         config.overlay(values, self.suite_run.config())</span><br><span>         config.overlay(values, dict(ue=self._conf))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        # We need to set some specific variables programatically here to match IP addresses:</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._conf.get('rf_dev_type') == 'zmq':</span><br><span style="color: hsl(120, 100%, 40%);">+            config.overlay(values, dict(ue=dict(rf_dev_args='tx_port=tcp://'+ self.addr() +':2001,rx_port=tcp://'+ self.enb.addr() +':2000,id=ue,base_srate='+ str(self.base_srate))))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         self.dbg('SRSUE CONFIG:\n' + pprint.pformat(values))</span><br><span> </span><br><span>         with open(self.config_file, 'w') as f:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/srsenb.conf.tmpl b/src/osmo_gsm_tester/templates/srsenb.conf.tmpl</span><br><span>index 0eba35b..2006832 100644</span><br><span>--- a/src/osmo_gsm_tester/templates/srsenb.conf.tmpl</span><br><span>+++ b/src/osmo_gsm_tester/templates/srsenb.conf.tmpl</span><br><span>@@ -26,8 +26,8 @@</span><br><span> mcc = ${enb.mcc}</span><br><span> mnc = ${enb.mnc}</span><br><span> mme_addr = ${enb.mme_addr}</span><br><span style="color: hsl(0, 100%, 40%);">-gtp_bind_addr = ${enb.run_addr}</span><br><span style="color: hsl(0, 100%, 40%);">-s1c_bind_addr = ${enb.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+gtp_bind_addr = ${enb.addr}</span><br><span style="color: hsl(120, 100%, 40%);">+s1c_bind_addr = ${enb.addr}</span><br><span> n_prb = 50</span><br><span> #tm = 4</span><br><span> #nof_ports = 2</span><br><span>@@ -70,7 +70,7 @@</span><br><span> tx_gain = 80</span><br><span> rx_gain = 40</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#device_name = auto</span><br><span style="color: hsl(120, 100%, 40%);">+device_name = ${enb.rf_dev_type}</span><br><span> </span><br><span> # For best performance in 2x2 MIMO and >= 15 MHz use the following device_args settings:</span><br><span> #     USRP B210: num_recv_frames=64,num_send_frames=64</span><br><span>@@ -78,7 +78,7 @@</span><br><span> # For best performance when BW<5 MHz (25 PRB), use the following device_args settings:</span><br><span> #     USRP B210: send_frame_size=512,recv_frame_size=512</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#device_args = auto</span><br><span style="color: hsl(120, 100%, 40%);">+device_args = ${enb.rf_dev_args}</span><br><span> #time_adv_nsamples = auto</span><br><span> #burst_preamble_us = auto</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/templates/srsue.conf.tmpl b/src/osmo_gsm_tester/templates/srsue.conf.tmpl</span><br><span>index 5e5676d..eef5a7e 100644</span><br><span>--- a/src/osmo_gsm_tester/templates/srsue.conf.tmpl</span><br><span>+++ b/src/osmo_gsm_tester/templates/srsue.conf.tmpl</span><br><span>@@ -39,13 +39,15 @@</span><br><span> #nof_radios = 1</span><br><span> #nof_rx_ant = 1</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+device_name = ${ue.rf_dev_type}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # For best performance in 2x2 MIMO and >= 15 MHz use the following device_args settings:</span><br><span> #     USRP B210: num_recv_frames=64,num_send_frames=64</span><br><span> </span><br><span> # For best performance when BW<5 MHz (25 PRB), use the following device_args settings:</span><br><span> #     USRP B210: send_frame_size=512,recv_frame_size=512</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#device_args = auto</span><br><span style="color: hsl(120, 100%, 40%);">+device_args = ${ue.rf_dev_args}</span><br><span> #time_adv_nsamples = auto</span><br><span> #burst_preamble_us = auto</span><br><span> #continuous_tx     = auto</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17237">change 17237</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/+/17237"/><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: I7dbbe328f4c0225fe74e878bb2da13fe39ccf049 </div>
<div style="display:none"> Gerrit-Change-Number: 17237 </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-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>