Change in osmo-gsm-tester[master]: srsLTE: Support configuring different RF backends

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Thu Feb 20 15:13:43 UTC 2020


pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17237 )

Change subject: srsLTE: Support configuring different RF backends
......................................................................

srsLTE: Support configuring different RF backends

Before this patch, only virtual RF through ZeroMQ was supported.
This patch allows configuring srsUE and srsENB to use a real SDR with
UHD/SoapySDR backend connected through a physical RF network, while
still keeping compatibility to run on virtual RF ZeroMQ network, based
on the resources used (controlled by scenarios). For instance, one can
first run a suite through the phyisical RF (using 2 UHD-controlled SDRs)
and afterwards with ZeroMQ using the following default-suites.conf:

- 4g:srsenb-rftype-uhd+srsue-rftype-uhd
- 4g:srsenb-rftype-zmq+srsue-rftype-zmq

Change-Id: I7dbbe328f4c0225fe74e878bb2da13fe39ccf049
---
M example/default-suites.conf
M example/resources.conf.prod
A example/scenarios/srsenb-rftype-uhd.conf
A example/scenarios/srsenb-rftype-zmq.conf
A example/scenarios/srsue-rftype-soapy.conf
A example/scenarios/srsue-rftype-uhd.conf
A example/scenarios/srsue-rftype-zmq.conf
M src/osmo_gsm_tester/resource.py
M src/osmo_gsm_tester/srs_enb.py
M src/osmo_gsm_tester/srs_ue.py
M src/osmo_gsm_tester/templates/srsenb.conf.tmpl
M src/osmo_gsm_tester/templates/srsue.conf.tmpl
12 files changed, 73 insertions(+), 17 deletions(-)

Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved



diff --git a/example/default-suites.conf b/example/default-suites.conf
index cfac1ca..4910dbc 100644
--- a/example/default-suites.conf
+++ b/example/default-suites.conf
@@ -162,4 +162,4 @@
 - smpp
 - encryption
 
-- 4g
+- 4g:srsenb-rftype-zmq+srsue-rftype-zmq
diff --git a/example/resources.conf.prod b/example/resources.conf.prod
index 943160b..cbcaafd 100644
--- a/example/resources.conf.prod
+++ b/example/resources.conf.prod
@@ -157,6 +157,15 @@
 enb:
 - label: srsENB-zmq
   type: srsenb
+  rf_dev_type: zmq
+  rf_dev_args: auto
+  remote_user: jenkins
+  addr: 10.42.42.117
+
+- label: srsENB-B200
+  type: srsenb
+  rf_dev_type: UHD
+  rf_dev_args: "type=b200,serial=306BD11,recv_frame_size=9232,send_frame_size=9232"
   remote_user: jenkins
   addr: 10.42.42.117
 
@@ -241,12 +250,23 @@
 
 - label: srsUE-zmq_1
   type: srsue
+  rf_dev_type: zmq
+  rf_dev_args: auto
   remote_user: jenkins
   addr: 10.42.42.116
   imsi: '001010123456789'
   ki: '00112233445566778899aabbccddeeff'
   auth_algo: 'xor'
 
+- label: srsUE-soapy-lms_1
+  type: srsue
+  rf_dev_type: soapy
+  rf_dev_args: driver=lime,serial=00090706024F0A22,rxant=LNAW,txant=BAND1
+  remote_user: jenkins
+  addr: 10.42.42.116
+  imsi: '001010123456789'
+  ki: '00112233445566778899aabbccddeeff'
+  auth_algo: 'xor'
 
 osmocon_phone:
   - serial_device: '/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_00897B41-if00-port0'
diff --git a/example/scenarios/srsenb-rftype-uhd.conf b/example/scenarios/srsenb-rftype-uhd.conf
new file mode 100644
index 0000000..293c109
--- /dev/null
+++ b/example/scenarios/srsenb-rftype-uhd.conf
@@ -0,0 +1,4 @@
+resources:
+  enb:
+  - type: srsenb
+    rf_dev_type: UHD
diff --git a/example/scenarios/srsenb-rftype-zmq.conf b/example/scenarios/srsenb-rftype-zmq.conf
new file mode 100644
index 0000000..e0f9c9d
--- /dev/null
+++ b/example/scenarios/srsenb-rftype-zmq.conf
@@ -0,0 +1,4 @@
+resources:
+  enb:
+  - type: srsenb
+    rf_dev_type: zmq
diff --git a/example/scenarios/srsue-rftype-soapy.conf b/example/scenarios/srsue-rftype-soapy.conf
new file mode 100644
index 0000000..5f034af
--- /dev/null
+++ b/example/scenarios/srsue-rftype-soapy.conf
@@ -0,0 +1,4 @@
+resources:
+  modem:
+  - type: srsue
+    rf_dev_type: soapy
diff --git a/example/scenarios/srsue-rftype-uhd.conf b/example/scenarios/srsue-rftype-uhd.conf
new file mode 100644
index 0000000..fef8696
--- /dev/null
+++ b/example/scenarios/srsue-rftype-uhd.conf
@@ -0,0 +1,4 @@
+resources:
+  modem:
+  - type: srsue
+    rf_dev_type: UHD
diff --git a/example/scenarios/srsue-rftype-zmq.conf b/example/scenarios/srsue-rftype-zmq.conf
new file mode 100644
index 0000000..d30a84b
--- /dev/null
+++ b/example/scenarios/srsue-rftype-zmq.conf
@@ -0,0 +1,4 @@
+resources:
+  modem:
+  - type: srsue
+    rf_dev_type: zmq
diff --git a/src/osmo_gsm_tester/resource.py b/src/osmo_gsm_tester/resource.py
index 0804591..e8ca859 100644
--- a/src/osmo_gsm_tester/resource.py
+++ b/src/osmo_gsm_tester/resource.py
@@ -89,7 +89,8 @@
         'enb[].type': schema.STR,
         'enb[].remote_user': schema.STR,
         'enb[].addr': schema.IPV4,
-        'enb[].band': schema.BAND,
+        'enb[].rf_dev_type': schema.STR,
+        'enb[].rf_dev_args': schema.STR,
         'arfcn[].arfcn': schema.INT,
         'arfcn[].band': schema.BAND,
         'modem[].type': schema.STR,
@@ -102,6 +103,8 @@
         'modem[].addr': schema.IPV4,
         'modem[].ciphers[]': schema.CIPHER,
         'modem[].features[]': schema.MODEM_FEATURE,
+        'modem[].rf_dev_type': schema.STR,
+        'modem[].rf_dev_args': schema.STR,
         'osmocon_phone[].serial_device': schema.STR,
     }
 
diff --git a/src/osmo_gsm_tester/srs_enb.py b/src/osmo_gsm_tester/srs_enb.py
index 2b65a5b..6fb186f 100644
--- a/src/osmo_gsm_tester/srs_enb.py
+++ b/src/osmo_gsm_tester/srs_enb.py
@@ -22,6 +22,9 @@
 
 from . import log, util, config, template, process, remote
 
+def rf_type_valid(rf_type_str):
+    return rf_type_str in ('zmq', 'UHD', 'soapy', 'bladeRF')
+
 class srsENB(log.Origin):
 
     REMOTE_DIR = '/osmo-gsm-tester-srsenb'
@@ -34,6 +37,7 @@
 
     def __init__(self, suite_run, conf):
         super().__init__(log.C_RUN, 'srsenb')
+        self._conf = conf
         self._addr = conf.get('addr', None)
         if self._addr is None:
             raise log.Error('addr not set')
@@ -59,6 +63,8 @@
         else:
           self.base_srate=23.04e6
         self.remote_user = conf.get('remote_user', None)
+        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))
 
     def cleanup(self):
         if self.process is None:
@@ -117,8 +123,6 @@
                 '--enb_files.sib_config=' + self.remote_config_sib_file,
                 '--enb_files.rr_config=' + self.remote_config_rr_file,
                 '--enb_files.drb_config=' + self.remote_config_drb_file,
-                '--rf.device_name=zmq',
-                '--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) + '"',
                 '--expert.nof_phy_threads=1',
                 '--expert.rrc_inactivity_timer=1500',
                 '--enb.n_prb=' + str(self.nof_prb),
@@ -145,8 +149,6 @@
                 '--enb_files.sib_config=' + os.path.abspath(self.config_sib_file),
                 '--enb_files.rr_config=' + os.path.abspath(self.config_rr_file),
                 '--enb_files.drb_config=' + os.path.abspath(self.config_drb_file),
-                '--rf.device_name=zmq',
-                '--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) + '"',
                 '--expert.nof_phy_threads=1',
                 '--expert.rrc_inactivity_timer=1500',
                 '--enb.n_prb=' + str(self.nof_prb),
@@ -161,8 +163,12 @@
 
         values = dict(enb=config.get_defaults('srsenb'))
         config.overlay(values, self.suite_run.config())
-        config.overlay(values, dict(enb={ 'run_addr': self.addr(),
-                                          'mme_addr': self.epc.addr()}))
+        config.overlay(values, dict(enb=self._conf))
+        config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() }))
+
+        # We need to set some specific variables programatically here to match IP addresses:
+        if self._conf.get('rf_dev_type') == 'zmq':
+            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))))
 
         self.dbg('srsENB ' + filename + ':\n' + pprint.pformat(values))
 
diff --git a/src/osmo_gsm_tester/srs_ue.py b/src/osmo_gsm_tester/srs_ue.py
index c68c726..4a99ad9 100644
--- a/src/osmo_gsm_tester/srs_ue.py
+++ b/src/osmo_gsm_tester/srs_ue.py
@@ -24,6 +24,9 @@
 from .run_node import RunNode
 from .ms import MS
 
+def rf_type_valid(rf_type_str):
+    return rf_type_str in ('zmq', 'UHD', 'soapy', 'bladeRF')
+
 class srsUE(MS):
 
     REMOTE_DIR = '/osmo-gsm-tester-srsue'
@@ -54,6 +57,8 @@
         else:
           self.base_srate=23.04e6
         self.remote_user = conf.get('remote_user', None)
+        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))
 
     def cleanup(self):
         if self.process is None:
@@ -122,8 +127,6 @@
 
         #'strace', '-ff',
         args = (remote_binary, self.remote_config_file,
-                '--rf.device_name=zmq',
-                '--rf.device_args="tx_port=tcp://'+ self.addr() +':2001,rx_port=tcp://'+ self.enb.addr() +':2000,id=ue,base_srate='+ str(self.base_srate) + '"',
                 '--phy.nof_phy_threads=1',
                 '--gw.netns=' + self.netns(),
                 '--log.filename=' + 'stdout', #self.remote_log_file,
@@ -157,8 +160,6 @@
         util.setcap_netsys_admin(binary, self.run_dir.new_dir('setcap_netsys_admin'))
 
         args = (binary, os.path.abspath(self.config_file),
-                '--rf.device_name=zmq',
-                '--rf.device_args="tx_port=tcp://'+ self.addr() +':2001,rx_port=tcp://'+ self.enb.addr() +':2000,id=ue,base_srate='+ str(self.base_srate) + '"',
                 '--phy.nof_phy_threads=1',
                 '--gw.netns=' + self.netns(),
                 '--log.filename=' + self.log_file,
@@ -180,6 +181,10 @@
         config.overlay(values, self.suite_run.config())
         config.overlay(values, dict(ue=self._conf))
 
+        # We need to set some specific variables programatically here to match IP addresses:
+        if self._conf.get('rf_dev_type') == 'zmq':
+            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))))
+
         self.dbg('SRSUE CONFIG:\n' + pprint.pformat(values))
 
         with open(self.config_file, 'w') as f:
diff --git a/src/osmo_gsm_tester/templates/srsenb.conf.tmpl b/src/osmo_gsm_tester/templates/srsenb.conf.tmpl
index 0eba35b..2006832 100644
--- a/src/osmo_gsm_tester/templates/srsenb.conf.tmpl
+++ b/src/osmo_gsm_tester/templates/srsenb.conf.tmpl
@@ -26,8 +26,8 @@
 mcc = ${enb.mcc}
 mnc = ${enb.mnc}
 mme_addr = ${enb.mme_addr}
-gtp_bind_addr = ${enb.run_addr}
-s1c_bind_addr = ${enb.run_addr}
+gtp_bind_addr = ${enb.addr}
+s1c_bind_addr = ${enb.addr}
 n_prb = 50
 #tm = 4
 #nof_ports = 2
@@ -70,7 +70,7 @@
 tx_gain = 80
 rx_gain = 40
 
-#device_name = auto
+device_name = ${enb.rf_dev_type}
 
 # For best performance in 2x2 MIMO and >= 15 MHz use the following device_args settings:
 #     USRP B210: num_recv_frames=64,num_send_frames=64
@@ -78,7 +78,7 @@
 # For best performance when BW<5 MHz (25 PRB), use the following device_args settings:
 #     USRP B210: send_frame_size=512,recv_frame_size=512
 
-#device_args = auto
+device_args = ${enb.rf_dev_args}
 #time_adv_nsamples = auto
 #burst_preamble_us = auto
 
diff --git a/src/osmo_gsm_tester/templates/srsue.conf.tmpl b/src/osmo_gsm_tester/templates/srsue.conf.tmpl
index 5e5676d..eef5a7e 100644
--- a/src/osmo_gsm_tester/templates/srsue.conf.tmpl
+++ b/src/osmo_gsm_tester/templates/srsue.conf.tmpl
@@ -39,13 +39,15 @@
 #nof_radios = 1
 #nof_rx_ant = 1
 
+device_name = ${ue.rf_dev_type}
+
 # For best performance in 2x2 MIMO and >= 15 MHz use the following device_args settings:
 #     USRP B210: num_recv_frames=64,num_send_frames=64
 
 # For best performance when BW<5 MHz (25 PRB), use the following device_args settings:
 #     USRP B210: send_frame_size=512,recv_frame_size=512
 
-#device_args = auto
+device_args = ${ue.rf_dev_args}
 #time_adv_nsamples = auto
 #burst_preamble_us = auto
 #continuous_tx     = auto

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17237
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Change-Id: I7dbbe328f4c0225fe74e878bb2da13fe39ccf049
Gerrit-Change-Number: 17237
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200220/479080f0/attachment.htm>


More information about the gerrit-log mailing list