From e44e76a78765da2913540a7ff34da34a0c1d2679 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 31 Mar 2020 12:35:19 +0200 Subject: [PATCH] {srs,amarisoft}enb:Move shared code to parent generic class eNodeB Change-Id: Ica0f1d4179a905d6dfc77d3e8eb08ac6cd5c3d2e --- src/osmo_gsm_tester/amarisoft_enb.py | 52 ++------------------------- src/osmo_gsm_tester/enb.py | 53 +++++++++++++++++++++++++++- src/osmo_gsm_tester/srs_enb.py | 52 ++------------------------- 3 files changed, 57 insertions(+), 100 deletions(-) diff --git a/src/osmo_gsm_tester/amarisoft_enb.py b/src/osmo_gsm_tester/amarisoft_enb.py index e16fe7f4..99b0ace5 100644 --- a/src/osmo_gsm_tester/amarisoft_enb.py +++ b/src/osmo_gsm_tester/amarisoft_enb.py @@ -59,7 +59,6 @@ class AmarisoftENB(enb.eNodeB): def __init__(self, suite_run, conf): super().__init__(suite_run, conf, 'amarisoftenb') self.ue = None - self.epc = None self.run_dir = None self._bin_prefix = None self.config_file = None @@ -76,8 +75,6 @@ class AmarisoftENB(enb.eNodeB): self.remote_config_rf_file = None self.remote_config_drb_file = None self.remote_log_file = None - self._num_prb = 0 - self._txmode = 0 self.suite_run = suite_run self.remote_user = conf.get('remote_user', None) if not rf_type_valid(conf.get('rf_dev_type', None)): @@ -105,7 +102,7 @@ class AmarisoftENB(enb.eNodeB): def start(self, epc): self.log('Starting AmarisoftENB') - self.epc = epc + self._epc = epc self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name())) self.configure() self._start() @@ -138,7 +135,6 @@ class AmarisoftENB(enb.eNodeB): f.write(r) def configure(self): - self.inst = util.Dir(os.path.abspath(self.bin_prefix())) lib = self.inst.child('lib') if not self.inst.isfile('', AmarisoftENB.BINFILE): @@ -164,19 +160,9 @@ class AmarisoftENB(enb.eNodeB): self.remote_config_drb_file = remote_run_dir.child(AmarisoftENB.CFGFILE_DRB) self.remote_log_file = remote_run_dir.child(AmarisoftENB.LOGFILE) - values = dict(enb=config.get_defaults('enb')) - config.overlay(values, dict(enb=config.get_defaults('amarisoftenb'))) - config.overlay(values, dict(enb=self.suite_run.config().get('enb', {}))) - config.overlay(values, dict(enb=self._conf)) - config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() })) - - self._num_prb = int(values['enb'].get('num_prb', None)) - assert self._num_prb - self._txmode = int(values['enb'].get('transmission_mode', None)) - assert self._txmode + values = super().configure('amarisoftenb') self._num_cells = int(values['enb'].get('num_cells', None)) assert self._num_cells - config.overlay(values, dict(enb={ 'num_ports': self.num_ports() })) logfile = self.log_file if self.setup_runs_locally() else self.remote_log_file config.overlay(values, dict(enb=dict(log_filename=logfile))) @@ -205,38 +191,4 @@ class AmarisoftENB(enb.eNodeB): def running(self): return not self.process.terminated() - def num_prb(self): - return self._num_prb - - def num_ports(self): - if self._txmode == 1: - return 1 - return 2 - - def ue_max_rate(self, downlink=True): - # The max rate for a single UE per PRB configuration in TM1 - max_phy_rate_tm1_dl = { 6 : 3.5e6, - 15 : 11e6, - 25 : 18e6, - 50 : 36e6, - 75 : 55e6, - 100 : 75e6 } - max_phy_rate_tm1_ul = { 6 : 0.9e6, - 15 : 4.7e6, - 25 : 10e6, - 50 : 23e6, - 75 : 34e6, - 100 : 51e6 } - if downlink: - max_rate = max_phy_rate_tm1_dl[self.num_prb()] - else: - max_rate = max_phy_rate_tm1_ul[self.num_prb()] - #TODO: calculate for non-standard prb numbers. - if self._txmode > 2: - max_rate *= 2 - # We use 3 control symbols for 6, 15 and 25 PRBs which results in lower max rate - if self.num_prb() < 50: - max_rate *= 0.9 - return max_rate - # vim: expandtab tabstop=4 shiftwidth=4 diff --git a/src/osmo_gsm_tester/enb.py b/src/osmo_gsm_tester/enb.py index f6b77225..197ad25c 100644 --- a/src/osmo_gsm_tester/enb.py +++ b/src/osmo_gsm_tester/enb.py @@ -18,7 +18,7 @@ # along with this program. If not, see . from abc import ABCMeta, abstractmethod -from . import log +from . import log, config class eNodeB(log.Origin, metaclass=ABCMeta): @@ -33,6 +33,28 @@ class eNodeB(log.Origin, metaclass=ABCMeta): if self._addr is None: raise log.Error('addr not set') self.set_name('%s_%s' % (name, self._addr)) + self._txmode = 0 + self._num_prb = 0 + self._epc = None + + def configure(self, default_specifics): + values = dict(enb=config.get_defaults('enb')) + config.overlay(values, dict(enb=config.get_defaults(default_specifics))) + config.overlay(values, dict(enb=self.suite_run.config().get('enb', {}))) + config.overlay(values, dict(enb=self._conf)) + self._num_prb = int(values['enb'].get('num_prb', None)) + assert self._num_prb + self._txmode = int(values['enb'].get('transmission_mode', None)) + assert self._txmode + config.overlay(values, dict(enb={ 'num_ports': self.num_ports() })) + assert self._epc is not None + config.overlay(values, dict(enb={ 'mme_addr': self._epc.addr() })) + return values + + def num_ports(self): + if self._txmode == 1: + return 1 + return 2 ######################## # PUBLIC - INTERNAL API @@ -41,6 +63,9 @@ class eNodeB(log.Origin, metaclass=ABCMeta): 'Nothing to do by default. Subclass can override if required.' pass + def num_prb(self): + return self._num_prb + ################### # PUBLIC (test API included) ################### @@ -64,4 +89,30 @@ class eNodeB(log.Origin, metaclass=ABCMeta): def addr(self): return self._addr + def ue_max_rate(self, downlink=True): + # The max rate for a single UE per PRB configuration in TM1 + max_phy_rate_tm1_dl = { 6 : 3.5e6, + 15 : 11e6, + 25 : 18e6, + 50 : 36e6, + 75 : 55e6, + 100 : 75e6 } + max_phy_rate_tm1_ul = { 6 : 0.9e6, + 15 : 4.7e6, + 25 : 10e6, + 50 : 23e6, + 75 : 34e6, + 100 : 51e6 } + if downlink: + max_rate = max_phy_rate_tm1_dl[self.num_prb()] + else: + max_rate = max_phy_rate_tm1_ul[self.num_prb()] + #TODO: calculate for non-standard prb numbers. + if self._txmode > 2: + max_rate *= 2 + # We use 3 control symbols for 6, 15 and 25 PRBs which results in lower max rate + if self.num_prb() < 50: + max_rate *= 0.9 + return max_rate + # vim: expandtab tabstop=4 shiftwidth=4 diff --git a/src/osmo_gsm_tester/srs_enb.py b/src/osmo_gsm_tester/srs_enb.py index d4bdcaa2..91881c0c 100644 --- a/src/osmo_gsm_tester/srs_enb.py +++ b/src/osmo_gsm_tester/srs_enb.py @@ -59,7 +59,6 @@ class srsENB(enb.eNodeB): def __init__(self, suite_run, conf): super().__init__(suite_run, conf, srsENB.BINFILE) self.ue = None - self.epc = None self.run_dir = None self.config_file = None self.config_sib_file = None @@ -75,8 +74,6 @@ class srsENB(enb.eNodeB): self.remote_config_drb_file = None self.remote_log_file = None self.remote_pcap_file = None - self._num_prb = 0 - self._txmode = 0 self.enable_pcap = False self.suite_run = suite_run self.remote_user = conf.get('remote_user', None) @@ -104,7 +101,7 @@ class srsENB(enb.eNodeB): def start(self, epc): self.log('Starting srsENB') - self.epc = epc + self._epc = epc self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name())) self.configure() if self.remote_user: @@ -190,27 +187,18 @@ class srsENB(enb.eNodeB): f.write(r) def configure(self): - values = dict(enb=config.get_defaults('enb')) - config.overlay(values, dict(enb=config.get_defaults('srsenb'))) - config.overlay(values, dict(enb=self.suite_run.config().get('enb', {}))) - config.overlay(values, dict(enb=self._conf)) - config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() })) + values = super().configure('srsenb') # Convert parsed boolean string to Python boolean: self.enable_pcap = util.str2bool(values['enb'].get('enable_pcap', 'false')) config.overlay(values, dict(enb={'enable_pcap': self.enable_pcap})) - self._num_prb = int(values['enb'].get('num_prb', None)) - assert self._num_prb - self._txmode = int(values['enb'].get('transmission_mode', None)) - assert self._txmode self._num_cells = int(values['enb'].get('num_cells', None)) assert self._num_cells - config.overlay(values, dict(enb={ 'num_ports': self.num_ports() })) # 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._num_prb) + base_srate = num_prb2base_srate(self.num_prb()) rf_dev_args = 'fail_on_disconnect=true' \ + ',tx_port=tcp://' + self.addr() + ':2000' \ + ',tx_port2=tcp://' + self.addr() + ':2002' \ @@ -240,38 +228,4 @@ class srsENB(enb.eNodeB): def running(self): return not self.process.terminated() - def num_prb(self): - return self._num_prb - - def num_ports(self): - if self._txmode == 1: - return 1 - return 2 - - def ue_max_rate(self, downlink=True): - # The max rate for a single UE per PRB configuration in TM1 - max_phy_rate_tm1_dl = { 6 : 3.5e6, - 15 : 11e6, - 25 : 18e6, - 50 : 36e6, - 75 : 55e6, - 100 : 75e6 } - max_phy_rate_tm1_ul = { 6 : 0.9e6, - 15 : 4.7e6, - 25 : 10e6, - 50 : 23e6, - 75 : 34e6, - 100 : 51e6 } - if downlink: - max_rate = max_phy_rate_tm1_dl[self.num_prb()] - else: - max_rate = max_phy_rate_tm1_ul[self.num_prb()] - #TODO: calculate for non-standard prb numbers. - if self._txmode > 2: - max_rate *= 2 - # We use 3 control symbols for 6, 15 and 25 PRBs which results in lower max rate - if self.num_prb() < 50: - max_rate *= 0.9 - return max_rate - # vim: expandtab tabstop=4 shiftwidth=4