<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20520">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">enb/ue: Assign zmq binding ports dynamically at runtime<br><br>ports are assigned increasingly in blocks in the range 2000-2200.<br><br>Change-Id: If2abddeb2ad6819de4f3ce64daaf00d2f527f9d2<br>---<br>M src/osmo_gsm_tester/core/resource.py<br>M src/osmo_gsm_tester/obj/enb.py<br>M src/osmo_gsm_tester/obj/ms_amarisoft.py<br>M src/osmo_gsm_tester/obj/ms_srs.py<br>4 files changed, 51 insertions(+), 20 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/20/20520/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/core/resource.py b/src/osmo_gsm_tester/core/resource.py</span><br><span>index 62bba07..61a73aa 100644</span><br><span>--- a/src/osmo_gsm_tester/core/resource.py</span><br><span>+++ b/src/osmo_gsm_tester/core/resource.py</span><br><span>@@ -184,6 +184,15 @@</span><br><span>         # BVCI=0 and =1 are reserved, avoid them.</span><br><span>         return self.next_persistent_value('bvci', '2', schema.uint16, lambda x: str(int(x)+1) if int(x) < pow(2,16) - 1 else '2', origin)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def next_zmq_port_range(self, origin, num_ports):</span><br><span style="color: hsl(120, 100%, 40%);">+        # Allocate continuous num_ports port between 2000 and 2200. returns base port.</span><br><span style="color: hsl(120, 100%, 40%);">+        # Assumption: base port is always an odd number.</span><br><span style="color: hsl(120, 100%, 40%);">+        num_ports = num_ports if num_ports % 2 == 0 else num_ports + 1</span><br><span style="color: hsl(120, 100%, 40%);">+        base_port = self.next_persistent_value('bvci', '2000', schema.uint16,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               lambda x: str(int(x)+num_ports) if int(x) < 2200 - num_ports else '2000', origin)</span><br><span style="color: hsl(120, 100%, 40%);">+        return int(base_port)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class NoResourceExn(log.Error):</span><br><span>     pass</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/obj/enb.py b/src/osmo_gsm_tester/obj/enb.py</span><br><span>index 6384f15..ab50de8 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb.py</span><br><span>@@ -84,6 +84,7 @@</span><br><span>         self._num_prb = 0</span><br><span>         self._num_cells = None</span><br><span>         self._epc = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self._zmq_base_bind_port = None</span><br><span> </span><br><span>     def configure(self, config_specifics_li):</span><br><span>         values = dict(enb=config.get_defaults('enb'))</span><br><span>@@ -148,6 +149,9 @@</span><br><span>     def num_prb(self):</span><br><span>         return self._num_prb</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def zmq_base_bind_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._zmq_base_bind_port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     #reference: srsLTE.git srslte_symbol_sz()</span><br><span>     def num_prb2symbol_sz(self, num_prb):</span><br><span>         if num_prb == 6:</span><br><span>@@ -165,16 +169,19 @@</span><br><span> </span><br><span>     def get_zmq_rf_dev_args(self):</span><br><span>         base_srate = self.num_prb2base_srate(self.num_prb())</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._zmq_base_bind_port is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            self._zmq_base_bind_port = self.testenv.suite().resource_pool().next_zmq_port_range(self, 4)</span><br><span style="color: hsl(120, 100%, 40%);">+        ue_base_port = self.ue.zmq_base_bind_port()</span><br><span>         # Define all 8 possible RF ports (2x CA with 2x2 MIMO)</span><br><span>         rf_dev_args = 'fail_on_disconnect=true' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',tx_port0=tcp://' + self.addr() + ':2000' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',tx_port1=tcp://' + self.addr() + ':2002' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',tx_port2=tcp://' + self.addr() + ':2004' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',tx_port3=tcp://' + self.addr() + ':2006' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',rx_port0=tcp://' + self.ue.addr() + ':2001' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',rx_port1=tcp://' + self.ue.addr() + ':2003' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',rx_port2=tcp://' + self.ue.addr() + ':2005' \</span><br><span style="color: hsl(0, 100%, 40%);">-                    + ',rx_port3=tcp://' + self.ue.addr() + ':2007'</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',tx_port0=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',tx_port1=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 1) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',tx_port2=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 2) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',tx_port3=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 3) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',rx_port0=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',rx_port1=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 1) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',rx_port2=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 2) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    + ',rx_port3=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 3)</span><br><span> </span><br><span>         rf_dev_args += ',id=enb,base_srate=' + str(base_srate)</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_amarisoft.py b/src/osmo_gsm_tester/obj/ms_amarisoft.py</span><br><span>index 7af6283..f151850 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_amarisoft.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_amarisoft.py</span><br><span>@@ -101,6 +101,9 @@</span><br><span>         self.testenv = testenv</span><br><span>         if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span>             raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span style="color: hsl(120, 100%, 40%);">+        if conf.get('rf_dev_type') == 'zmq':</span><br><span style="color: hsl(120, 100%, 40%);">+            # Define all 4 possible local RF ports (2x CA with 2x2 MIMO)</span><br><span style="color: hsl(120, 100%, 40%);">+            self._zmq_base_bind_port = self.testenv.suite().resource_pool().next_zmq_port_range(self, 4)</span><br><span> </span><br><span>     def bin_prefix(self):</span><br><span>         if self._bin_prefix is None:</span><br><span>@@ -123,6 +126,9 @@</span><br><span>     def netns(self):</span><br><span>         return "amarisoftue1"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def zmq_base_bind_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._zmq_base_bind_port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def stop(self):</span><br><span>         self.testenv.stop_process(self.process)</span><br><span> </span><br><span>@@ -242,10 +248,11 @@</span><br><span>         # We need to set some specific variables programatically here to match IP addresses:</span><br><span>         if self._conf.get('rf_dev_type') == 'zmq':</span><br><span>             base_srate = num_prb2base_srate(self.enb.num_prb())</span><br><span style="color: hsl(0, 100%, 40%);">-            rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':2001' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',tx_port1=tcp://' + self.addr() + ':2003' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',rx_port0=tcp://' + self.enb.addr() + ':2000' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',rx_port1=tcp://' + self.enb.addr() + ':2002' \</span><br><span style="color: hsl(120, 100%, 40%);">+            enb_base_port = self.enb.zmq_base_bind_port()</span><br><span style="color: hsl(120, 100%, 40%);">+            rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',tx_port1=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 1) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',rx_port0=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',rx_port1=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 1) \</span><br><span>                         + ',tx_freq=2510e6,rx_freq=2630e6,tx_freq2=2530e6,rx_freq2=2650e6' \</span><br><span>                         + ',id=ue,base_srate='+ str(base_srate)</span><br><span>             config.overlay(values, dict(ue=dict(sample_rate = base_srate / (1000*1000),</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>index 1c0f728..41df429 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>@@ -99,6 +99,10 @@</span><br><span>         self._additional_args = []</span><br><span>         if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span>             raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span style="color: hsl(120, 100%, 40%);">+        self._zmq_base_bind_port = None</span><br><span style="color: hsl(120, 100%, 40%);">+        if conf.get('rf_dev_type') == 'zmq':</span><br><span style="color: hsl(120, 100%, 40%);">+            # Define all 4 possible local RF ports (2x CA with 2x2 MIMO)</span><br><span style="color: hsl(120, 100%, 40%);">+            self._zmq_base_bind_port = self.testenv.suite().resource_pool().next_zmq_port_range(self, 4)</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>         if self.process is None:</span><br><span>@@ -150,6 +154,9 @@</span><br><span>     def netns(self):</span><br><span>         return "srsue1"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def zmq_base_bind_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._zmq_base_bind_port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def sleep_after_stop(self):</span><br><span>         # Only sleep once</span><br><span>         if self.stop_sleep_time > 0:</span><br><span>@@ -270,14 +277,15 @@</span><br><span>         if self._conf.get('rf_dev_type') == 'zmq':</span><br><span>             base_srate = num_prb2base_srate(self.enb.num_prb())</span><br><span>             # Define all 8 possible RF ports (2x CA with 2x2 MIMO)</span><br><span style="color: hsl(0, 100%, 40%);">-            rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':2001' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',tx_port1=tcp://' + self.addr() + ':2003' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',tx_port2=tcp://' + self.addr() + ':2005' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',tx_port3=tcp://' + self.addr() + ':2007' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',rx_port0=tcp://' + self.enb.addr() + ':2000' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',rx_port1=tcp://' + self.enb.addr() + ':2002' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',rx_port2=tcp://' + self.enb.addr() + ':2004' \</span><br><span style="color: hsl(0, 100%, 40%);">-                        + ',rx_port3=tcp://' + self.enb.addr() + ':2006'</span><br><span style="color: hsl(120, 100%, 40%);">+            enb_base_port = self.enb.zmq_base_bind_port()</span><br><span style="color: hsl(120, 100%, 40%);">+            rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',tx_port1=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 1) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',tx_port2=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 2) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',tx_port3=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 3) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',rx_port0=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',rx_port1=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 1) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',rx_port2=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 2) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        + ',rx_port3=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 3)</span><br><span> </span><br><span>             if self.num_carriers == 1:</span><br><span>                 # Single carrier</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20520">change 20520</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/+/20520"/><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: If2abddeb2ad6819de4f3ce64daaf00d2f527f9d2 </div>
<div style="display:none"> Gerrit-Change-Number: 20520 </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>