enb/ue: Assign zmq binding ports dynamically at runtime

ports are assigned increasingly in blocks in the range 2000-2200.

Change-Id: If2abddeb2ad6819de4f3ce64daaf00d2f527f9d2
This commit is contained in:
Pau Espin 2020-10-05 17:25:16 +02:00 committed by pespin
parent 6628a50e4e
commit 92a29d6b7e
4 changed files with 51 additions and 20 deletions

View File

@ -184,6 +184,15 @@ class ResourcesPool(log.Origin):
# BVCI=0 and =1 are reserved, avoid them.
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)
def next_zmq_port_range(self, origin, num_ports):
# Allocate continuous num_ports port between 2000 and 2200. returns base port.
# Assumption: base port is always an odd number.
num_ports = num_ports if num_ports % 2 == 0 else num_ports + 1
base_port = self.next_persistent_value('bvci', '2000', schema.uint16,
lambda x: str(int(x)+num_ports) if int(x) < 2200 - num_ports else '2000', origin)
return int(base_port)
class NoResourceExn(log.Error):
pass

View File

@ -85,6 +85,7 @@ class eNodeB(log.Origin, metaclass=ABCMeta):
self._num_prb = 0
self._num_cells = None
self._epc = None
self._zmq_base_bind_port = None
def configure(self, config_specifics_li):
values = dict(enb=config.get_defaults('enb'))
@ -149,6 +150,9 @@ class eNodeB(log.Origin, metaclass=ABCMeta):
def num_prb(self):
return self._num_prb
def zmq_base_bind_port(self):
return self._zmq_base_bind_port
#reference: srsLTE.git srslte_symbol_sz()
def num_prb2symbol_sz(self, num_prb):
if num_prb == 6:
@ -166,16 +170,19 @@ class eNodeB(log.Origin, metaclass=ABCMeta):
def get_zmq_rf_dev_args(self):
base_srate = self.num_prb2base_srate(self.num_prb())
if self._zmq_base_bind_port is None:
self._zmq_base_bind_port = self.testenv.suite().resource_pool().next_zmq_port_range(self, 4)
ue_base_port = self.ue.zmq_base_bind_port()
# Define all 8 possible RF ports (2x CA with 2x2 MIMO)
rf_dev_args = 'fail_on_disconnect=true' \
+ ',tx_port0=tcp://' + self.addr() + ':2000' \
+ ',tx_port1=tcp://' + self.addr() + ':2002' \
+ ',tx_port2=tcp://' + self.addr() + ':2004' \
+ ',tx_port3=tcp://' + self.addr() + ':2006' \
+ ',rx_port0=tcp://' + self.ue.addr() + ':2001' \
+ ',rx_port1=tcp://' + self.ue.addr() + ':2003' \
+ ',rx_port2=tcp://' + self.ue.addr() + ':2005' \
+ ',rx_port3=tcp://' + self.ue.addr() + ':2007'
+ ',tx_port0=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 0) \
+ ',tx_port1=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 1) \
+ ',tx_port2=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 2) \
+ ',tx_port3=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 3) \
+ ',rx_port0=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 0) \
+ ',rx_port1=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 1) \
+ ',rx_port2=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 2) \
+ ',rx_port3=tcp://' + self.ue.addr() + ':' + str(ue_base_port + 3)
rf_dev_args += ',id=enb,base_srate=' + str(base_srate)

View File

@ -101,6 +101,9 @@ class AmarisoftUE(MS):
self.testenv = testenv
if not rf_type_valid(conf.get('rf_dev_type', None)):
raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))
if conf.get('rf_dev_type') == 'zmq':
# Define all 4 possible local RF ports (2x CA with 2x2 MIMO)
self._zmq_base_bind_port = self.testenv.suite().resource_pool().next_zmq_port_range(self, 4)
def bin_prefix(self):
if self._bin_prefix is None:
@ -123,6 +126,9 @@ class AmarisoftUE(MS):
def netns(self):
return "amarisoftue1"
def zmq_base_bind_port(self):
return self._zmq_base_bind_port
def stop(self):
self.testenv.stop_process(self.process)
@ -242,10 +248,11 @@ class AmarisoftUE(MS):
# We need to set some specific variables programatically here to match IP addresses:
if self._conf.get('rf_dev_type') == 'zmq':
base_srate = num_prb2base_srate(self.enb.num_prb())
rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':2001' \
+ ',tx_port1=tcp://' + self.addr() + ':2003' \
+ ',rx_port0=tcp://' + self.enb.addr() + ':2000' \
+ ',rx_port1=tcp://' + self.enb.addr() + ':2002' \
enb_base_port = self.enb.zmq_base_bind_port()
rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 0) \
+ ',tx_port1=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 1) \
+ ',rx_port0=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 0) \
+ ',rx_port1=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 1) \
+ ',tx_freq=2510e6,rx_freq=2630e6,tx_freq2=2530e6,rx_freq2=2650e6' \
+ ',id=ue,base_srate='+ str(base_srate)
config.overlay(values, dict(ue=dict(sample_rate = base_srate / (1000*1000),

View File

@ -100,6 +100,10 @@ class srsUE(MS, srslte_common):
self._additional_args = []
if not rf_type_valid(conf.get('rf_dev_type', None)):
raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))
self._zmq_base_bind_port = None
if conf.get('rf_dev_type') == 'zmq':
# Define all 4 possible local RF ports (2x CA with 2x2 MIMO)
self._zmq_base_bind_port = self.testenv.suite().resource_pool().next_zmq_port_range(self, 4)
def cleanup(self):
if self.process is None:
@ -151,6 +155,9 @@ class srsUE(MS, srslte_common):
def netns(self):
return "srsue1"
def zmq_base_bind_port(self):
return self._zmq_base_bind_port
def connect(self, enb):
self.log('Starting srsue')
self.enb = enb
@ -264,14 +271,15 @@ class srsUE(MS, srslte_common):
if self._conf.get('rf_dev_type') == 'zmq':
base_srate = num_prb2base_srate(self.enb.num_prb())
# Define all 8 possible RF ports (2x CA with 2x2 MIMO)
rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':2001' \
+ ',tx_port1=tcp://' + self.addr() + ':2003' \
+ ',tx_port2=tcp://' + self.addr() + ':2005' \
+ ',tx_port3=tcp://' + self.addr() + ':2007' \
+ ',rx_port0=tcp://' + self.enb.addr() + ':2000' \
+ ',rx_port1=tcp://' + self.enb.addr() + ':2002' \
+ ',rx_port2=tcp://' + self.enb.addr() + ':2004' \
+ ',rx_port3=tcp://' + self.enb.addr() + ':2006'
enb_base_port = self.enb.zmq_base_bind_port()
rf_dev_args = 'tx_port0=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 0) \
+ ',tx_port1=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 1) \
+ ',tx_port2=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 2) \
+ ',tx_port3=tcp://' + self.addr() + ':' + str(self._zmq_base_bind_port + 3) \
+ ',rx_port0=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 0) \
+ ',rx_port1=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 1) \
+ ',rx_port2=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 2) \
+ ',rx_port3=tcp://' + self.enb.addr() + ':' + str(enb_base_port + 3)
if self.num_carriers == 1:
# Single carrier