aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-10-22 11:59:48 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2020-11-09 19:12:22 +0100
commit998be6574b261259b2db35a4784f508c20be8314 (patch)
tree75a04197e5a2b93260da9fbbf88638e43bf0b570
parentef7256a1382a237065073d4b38a465cfaf648ab0 (diff)
sysmocom: Introduce suite 4g2enbpespin/intraenb
-rw-r--r--sysmocom/scenarios/mod-2enb-gr-broker.conf13
-rw-r--r--sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf31
-rw-r--r--sysmocom/scenarios/suite-4g2enb@.conf6
-rwxr-xr-xsysmocom/suites/4g2enb/handover.py82
-rwxr-xr-xsysmocom/suites/4g2enb/ping.py29
-rw-r--r--sysmocom/suites/4g2enb/suite.conf14
6 files changed, 175 insertions, 0 deletions
diff --git a/sysmocom/scenarios/mod-2enb-gr-broker.conf b/sysmocom/scenarios/mod-2enb-gr-broker.conf
new file mode 100644
index 0000000..b1b6650
--- /dev/null
+++ b/sysmocom/scenarios/mod-2enb-gr-broker.conf
@@ -0,0 +1,13 @@
+# Select GNU Radio broker for channel management
+modifiers:
+ enb:
+ - cell_list:
+ - dl_rfemu:
+ type: gnuradio_zmq
+ - dl_rfemu:
+ type: gnuradio_zmq
+ - cell_list:
+ - dl_rfemu:
+ type: gnuradio_zmq
+ - dl_rfemu:
+ type: gnuradio_zmq
diff --git a/sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf b/sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf
new file mode 100644
index 0000000..75765c2
--- /dev/null
+++ b/sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf
@@ -0,0 +1,31 @@
+# HO config for intra-frequency HO between two cells (same EARFCN) on different RF ports (srsENB)
+modifiers:
+ enb:
+ - id: 0x19B
+ enable_measurements: true
+ cell_list:
+ - cell_id: 0x01
+ pci: 0x01
+ dl_earfcn: 2850
+ root_seq_idx: 204
+ rf_port: 0
+ scell_list: []
+ ncell_list:
+ - enb_id: 0x19C
+ cell_id: 0x02
+ pci: 0x02
+ dl_earfcn: 2850
+ - id: 0x19C
+ enable_measurements: true
+ cell_list:
+ - cell_id: 0x02
+ pci: 0x02
+ dl_earfcn: 2850
+ root_seq_idx: 205
+ rf_port: 0
+ scell_list: []
+ ncell_list:
+ - enb_id: 0x19B
+ cell_id: 0x01
+ pci: 0x01
+ dl_earfcn: 2850
diff --git a/sysmocom/scenarios/suite-4g2enb@.conf b/sysmocom/scenarios/suite-4g2enb@.conf
new file mode 100644
index 0000000..2d1def4
--- /dev/null
+++ b/sysmocom/scenarios/suite-4g2enb@.conf
@@ -0,0 +1,6 @@
+config:
+ suite:
+ 4g2enb:
+ handover:
+ duration: ${param1}
+ threshold: ${param2}
diff --git a/sysmocom/suites/4g2enb/handover.py b/sysmocom/suites/4g2enb/handover.py
new file mode 100755
index 0000000..addbda5
--- /dev/null
+++ b/sysmocom/suites/4g2enb/handover.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+from osmo_gsm_tester.testenv import *
+
+import time
+
+test_config = tenv.config_test_specific()
+duration = int(test_config.get('duration', 0)) # 0 = one HO loop
+threshold = int(test_config.get('threshold', 2))
+
+import pprint
+print("TEST_CONFIG:\n" + pprint.pformat(test_config))
+
+# attenuation from 0 to 10, then back to 0
+cell1_att_li = list(range(0, 11, 1)) + list(range(9, -1, -1))
+# attenuation from 10 to 0, then back to 10
+cell2_att_li = list(range(10, 0, -1)) + list(range(0, 11, 1))
+
+def do_one_ho_loop(rfemu_cell1, rfemu_cell2):
+ step = 0
+ while step < len(cell1_att_li):
+ rfemu_cell1.set_attenuation(cell1_att_li[step])
+ rfemu_cell2.set_attenuation(cell2_att_li[step])
+ step += 1
+ sleep(1)
+
+epc = tenv.epc()
+enbA = tenv.enb()
+enbB = tenv.enb()
+ue = tenv.modem()
+iperf3srv = tenv.iperf3srv({'addr': epc.tun_addr()})
+iperf3srv.set_run_node(epc.run_node())
+iperf3cli = iperf3srv.create_client()
+iperf3cli.set_run_node(ue.run_node())
+
+epc.subscriber_add(ue)
+epc.start()
+enbA.ue_add(ue)
+enbB.ue_add(ue)
+enbA.start(epc)
+enbB.start(epc)
+
+print('waiting for ENB to connect to EPC...')
+wait(epc.enb_is_connected, enbA)
+wait(epc.enb_is_connected, enbB)
+print('ENB is connected to EPC')
+
+ue.connect(enbA)
+
+iperf3srv.start()
+proc = iperf3cli.prepare_test_proc(iperf3cli.DIR_UL, ue.netns(), duration + 30)
+
+print('waiting for UE to attach...')
+wait(ue.is_registered)
+print('UE is attached')
+
+rfemu_cell1 = enbA.get_rfemu(0)
+rfemu_cell2 = enbB.get_rfemu(0)
+
+print('Iterating for %d seconds to produce at least %d handovers...' % (duration, threshold))
+try:
+ proc.launch()
+ t_end = time.time() + duration
+ if duration == 0:
+ t_end += 1 # allow loop to run once
+ while time.time() < t_end:
+ do_one_ho_loop(rfemu_cell1, rfemu_cell2)
+ num_handovers = ue.get_counter('handover_success')
+ if num_handovers < threshold:
+ raise Exception('Wrong number of handovers %d < threshold %d during %d seconds' % (num_handovers, threshold, duration))
+except Exception as e:
+ try:
+ proc.terminate() # make sure we always terminate the process
+ except Exception:
+ print("Exception while terminating process %r" % repr(process))
+ raise e
+
+res_str = 'Got %d successful handovers (>= %d) during %d seconds' % (num_handovers, threshold, duration)
+print(res_str)
+test.set_report_stdout(res_str)
+proc.terminate()
+proc.wait()
+print("Done")
diff --git a/sysmocom/suites/4g2enb/ping.py b/sysmocom/suites/4g2enb/ping.py
new file mode 100755
index 0000000..e80b5f1
--- /dev/null
+++ b/sysmocom/suites/4g2enb/ping.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+from osmo_gsm_tester.testenv import *
+
+epc = tenv.epc()
+enbA = tenv.enb()
+enbB = tenv.enb()
+ue = tenv.modem()
+
+epc.subscriber_add(ue)
+epc.start()
+enbA.ue_add(ue)
+enbB.ue_add(ue)
+enbA.start(epc)
+enbB.start(epc)
+
+print('waiting for ENBs to connect to EPC...')
+wait(epc.enb_is_connected, enbA)
+wait(epc.enb_is_connected, enbB)
+print('ENBs is connected to EPC')
+
+ue.connect(enbA)
+print('waiting for UE to attach...')
+wait(ue.is_registered)
+print('UE is attached')
+
+proc = ue.run_netns_wait('ping', ('ping', '-c', '10', epc.tun_addr()))
+output = proc.get_stdout()
+print(output)
+test.set_report_stdout(output)
diff --git a/sysmocom/suites/4g2enb/suite.conf b/sysmocom/suites/4g2enb/suite.conf
new file mode 100644
index 0000000..838ae6e
--- /dev/null
+++ b/sysmocom/suites/4g2enb/suite.conf
@@ -0,0 +1,14 @@
+resources:
+ run_node: # for EPC
+ - times: 1
+ enb:
+ - times: 2
+ modem:
+ - times: 1
+ features:
+ - 4g
+
+schema:
+ handover:
+ duration: 'duration'
+ threshold: 'uint'