<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/21100">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sysmocom: Introduce suite 4g2enb<br><br>Change-Id: I73b1a5e07f81fa1e3d3db1db243a3d0b137bda8e<br>---<br>A sysmocom/scenarios/mod-2enb-gr-broker.conf<br>A sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf<br>A sysmocom/scenarios/suite-4g2enb@.conf<br>A sysmocom/suites/4g2enb/handover.py<br>A sysmocom/suites/4g2enb/ping.py<br>A sysmocom/suites/4g2enb/suite.conf<br>6 files changed, 175 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmocom/scenarios/mod-2enb-gr-broker.conf b/sysmocom/scenarios/mod-2enb-gr-broker.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..b1b6650</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/mod-2enb-gr-broker.conf</span><br><span>@@ -0,0 +1,13 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Select GNU Radio broker for channel management</span><br><span style="color: hsl(120, 100%, 40%);">+modifiers:</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+  - cell_list:</span><br><span style="color: hsl(120, 100%, 40%);">+    - dl_rfemu:</span><br><span style="color: hsl(120, 100%, 40%);">+       type: gnuradio_zmq</span><br><span style="color: hsl(120, 100%, 40%);">+    - dl_rfemu:</span><br><span style="color: hsl(120, 100%, 40%);">+       type: gnuradio_zmq</span><br><span style="color: hsl(120, 100%, 40%);">+  - cell_list:</span><br><span style="color: hsl(120, 100%, 40%);">+    - dl_rfemu:</span><br><span style="color: hsl(120, 100%, 40%);">+       type: gnuradio_zmq</span><br><span style="color: hsl(120, 100%, 40%);">+    - dl_rfemu:</span><br><span style="color: hsl(120, 100%, 40%);">+       type: gnuradio_zmq</span><br><span>diff --git a/sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf b/sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..75765c2</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/mod-enb-cells-inter-freq-ho.conf</span><br><span>@@ -0,0 +1,31 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# HO config for intra-frequency HO between two cells (same EARFCN) on different RF ports (srsENB)</span><br><span style="color: hsl(120, 100%, 40%);">+modifiers:</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+  - id: 0x19B</span><br><span style="color: hsl(120, 100%, 40%);">+    enable_measurements: true</span><br><span style="color: hsl(120, 100%, 40%);">+    cell_list:</span><br><span style="color: hsl(120, 100%, 40%);">+    - cell_id: 0x01</span><br><span style="color: hsl(120, 100%, 40%);">+      pci: 0x01</span><br><span style="color: hsl(120, 100%, 40%);">+      dl_earfcn: 2850</span><br><span style="color: hsl(120, 100%, 40%);">+      root_seq_idx: 204</span><br><span style="color: hsl(120, 100%, 40%);">+      rf_port: 0</span><br><span style="color: hsl(120, 100%, 40%);">+      scell_list: []</span><br><span style="color: hsl(120, 100%, 40%);">+      ncell_list:</span><br><span style="color: hsl(120, 100%, 40%);">+      - enb_id: 0x19C</span><br><span style="color: hsl(120, 100%, 40%);">+        cell_id: 0x02</span><br><span style="color: hsl(120, 100%, 40%);">+        pci: 0x02</span><br><span style="color: hsl(120, 100%, 40%);">+        dl_earfcn: 2850</span><br><span style="color: hsl(120, 100%, 40%);">+  - id: 0x19C</span><br><span style="color: hsl(120, 100%, 40%);">+    enable_measurements: true</span><br><span style="color: hsl(120, 100%, 40%);">+    cell_list:</span><br><span style="color: hsl(120, 100%, 40%);">+    - cell_id: 0x02</span><br><span style="color: hsl(120, 100%, 40%);">+      pci: 0x02</span><br><span style="color: hsl(120, 100%, 40%);">+      dl_earfcn: 2850</span><br><span style="color: hsl(120, 100%, 40%);">+      root_seq_idx: 205</span><br><span style="color: hsl(120, 100%, 40%);">+      rf_port: 0</span><br><span style="color: hsl(120, 100%, 40%);">+      scell_list: []</span><br><span style="color: hsl(120, 100%, 40%);">+      ncell_list:</span><br><span style="color: hsl(120, 100%, 40%);">+      - enb_id: 0x19B</span><br><span style="color: hsl(120, 100%, 40%);">+        cell_id: 0x01</span><br><span style="color: hsl(120, 100%, 40%);">+        pci: 0x01</span><br><span style="color: hsl(120, 100%, 40%);">+        dl_earfcn: 2850</span><br><span>diff --git a/sysmocom/scenarios/suite-4g2enb@.conf b/sysmocom/scenarios/suite-4g2enb@.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..2d1def4</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/suite-4g2enb@.conf</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config:</span><br><span style="color: hsl(120, 100%, 40%);">+  suite:</span><br><span style="color: hsl(120, 100%, 40%);">+    4g2enb:</span><br><span style="color: hsl(120, 100%, 40%);">+      handover:</span><br><span style="color: hsl(120, 100%, 40%);">+        duration: ${param1}</span><br><span style="color: hsl(120, 100%, 40%);">+        threshold: ${param2}</span><br><span>diff --git a/sysmocom/suites/4g2enb/handover.py b/sysmocom/suites/4g2enb/handover.py</span><br><span>new file mode 100755</span><br><span>index 0000000..addbda5</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/4g2enb/handover.py</span><br><span>@@ -0,0 +1,82 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+from osmo_gsm_tester.testenv import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import time</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test_config = tenv.config_test_specific()</span><br><span style="color: hsl(120, 100%, 40%);">+duration = int(test_config.get('duration', 0)) # 0 = one HO loop</span><br><span style="color: hsl(120, 100%, 40%);">+threshold = int(test_config.get('threshold', 2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+print("TEST_CONFIG:\n" + pprint.pformat(test_config))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# attenuation from 0 to 10, then back to 0</span><br><span style="color: hsl(120, 100%, 40%);">+cell1_att_li = list(range(0, 11, 1)) + list(range(9, -1, -1))</span><br><span style="color: hsl(120, 100%, 40%);">+# attenuation from 10 to 0, then back to 10</span><br><span style="color: hsl(120, 100%, 40%);">+cell2_att_li = list(range(10, 0, -1)) + list(range(0, 11, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def do_one_ho_loop(rfemu_cell1, rfemu_cell2):</span><br><span style="color: hsl(120, 100%, 40%);">+    step = 0</span><br><span style="color: hsl(120, 100%, 40%);">+    while step < len(cell1_att_li):</span><br><span style="color: hsl(120, 100%, 40%);">+        rfemu_cell1.set_attenuation(cell1_att_li[step])</span><br><span style="color: hsl(120, 100%, 40%);">+        rfemu_cell2.set_attenuation(cell2_att_li[step])</span><br><span style="color: hsl(120, 100%, 40%);">+        step += 1</span><br><span style="color: hsl(120, 100%, 40%);">+        sleep(1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+epc = tenv.epc()</span><br><span style="color: hsl(120, 100%, 40%);">+enbA = tenv.enb()</span><br><span style="color: hsl(120, 100%, 40%);">+enbB = tenv.enb()</span><br><span style="color: hsl(120, 100%, 40%);">+ue = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv = tenv.iperf3srv({'addr': epc.tun_addr()})</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.set_run_node(epc.run_node())</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli = iperf3srv.create_client()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli.set_run_node(ue.run_node())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+epc.subscriber_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+epc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+enbA.ue_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+enbB.ue_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+enbA.start(epc)</span><br><span style="color: hsl(120, 100%, 40%);">+enbB.start(epc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for ENB to connect to EPC...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(epc.enb_is_connected, enbA)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(epc.enb_is_connected, enbB)</span><br><span style="color: hsl(120, 100%, 40%);">+print('ENB is connected to EPC')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ue.connect(enbA)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.start()</span><br><span style="color: hsl(120, 100%, 40%);">+proc = iperf3cli.prepare_test_proc(iperf3cli.DIR_UL, ue.netns(), duration + 30)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for UE to attach...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ue.is_registered)</span><br><span style="color: hsl(120, 100%, 40%);">+print('UE is attached')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rfemu_cell1 = enbA.get_rfemu(0)</span><br><span style="color: hsl(120, 100%, 40%);">+rfemu_cell2 = enbB.get_rfemu(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('Iterating for %d seconds to produce at least %d handovers...' % (duration, threshold))</span><br><span style="color: hsl(120, 100%, 40%);">+try:</span><br><span style="color: hsl(120, 100%, 40%);">+    proc.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+    t_end = time.time() + duration</span><br><span style="color: hsl(120, 100%, 40%);">+    if duration == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+        t_end += 1 # allow loop to run once</span><br><span style="color: hsl(120, 100%, 40%);">+    while time.time() < t_end:</span><br><span style="color: hsl(120, 100%, 40%);">+        do_one_ho_loop(rfemu_cell1, rfemu_cell2)</span><br><span style="color: hsl(120, 100%, 40%);">+    num_handovers = ue.get_counter('handover_success')</span><br><span style="color: hsl(120, 100%, 40%);">+    if num_handovers < threshold:</span><br><span style="color: hsl(120, 100%, 40%);">+        raise Exception('Wrong number of handovers %d < threshold %d during %d seconds' % (num_handovers, threshold, duration))</span><br><span style="color: hsl(120, 100%, 40%);">+except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        proc.terminate() # make sure we always terminate the process</span><br><span style="color: hsl(120, 100%, 40%);">+    except Exception:</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Exception while terminating process %r" % repr(process))</span><br><span style="color: hsl(120, 100%, 40%);">+    raise e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+res_str = 'Got %d successful handovers (>= %d) during %d seconds' % (num_handovers, threshold, duration)</span><br><span style="color: hsl(120, 100%, 40%);">+print(res_str)</span><br><span style="color: hsl(120, 100%, 40%);">+test.set_report_stdout(res_str)</span><br><span style="color: hsl(120, 100%, 40%);">+proc.terminate()</span><br><span style="color: hsl(120, 100%, 40%);">+proc.wait()</span><br><span style="color: hsl(120, 100%, 40%);">+print("Done")</span><br><span>diff --git a/sysmocom/suites/4g2enb/ping.py b/sysmocom/suites/4g2enb/ping.py</span><br><span>new file mode 100755</span><br><span>index 0000000..e80b5f1</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/4g2enb/ping.py</span><br><span>@@ -0,0 +1,29 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+from osmo_gsm_tester.testenv import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+epc = tenv.epc()</span><br><span style="color: hsl(120, 100%, 40%);">+enbA = tenv.enb()</span><br><span style="color: hsl(120, 100%, 40%);">+enbB = tenv.enb()</span><br><span style="color: hsl(120, 100%, 40%);">+ue = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+epc.subscriber_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+epc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+enbA.ue_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+enbB.ue_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+enbA.start(epc)</span><br><span style="color: hsl(120, 100%, 40%);">+enbB.start(epc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for ENBs to connect to EPC...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(epc.enb_is_connected, enbA)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(epc.enb_is_connected, enbB)</span><br><span style="color: hsl(120, 100%, 40%);">+print('ENBs is connected to EPC')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ue.connect(enbA)</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for UE to attach...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ue.is_registered)</span><br><span style="color: hsl(120, 100%, 40%);">+print('UE is attached')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+proc = ue.run_netns_wait('ping', ('ping', '-c', '10', epc.tun_addr()))</span><br><span style="color: hsl(120, 100%, 40%);">+output = proc.get_stdout()</span><br><span style="color: hsl(120, 100%, 40%);">+print(output)</span><br><span style="color: hsl(120, 100%, 40%);">+test.set_report_stdout(output)</span><br><span>diff --git a/sysmocom/suites/4g2enb/suite.conf b/sysmocom/suites/4g2enb/suite.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..838ae6e</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/4g2enb/suite.conf</span><br><span>@@ -0,0 +1,14 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  run_node: # for EPC</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 1</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 2</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 1</span><br><span style="color: hsl(120, 100%, 40%);">+    features:</span><br><span style="color: hsl(120, 100%, 40%);">+    - 4g</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+schema:</span><br><span style="color: hsl(120, 100%, 40%);">+  handover:</span><br><span style="color: hsl(120, 100%, 40%);">+        duration: 'duration'</span><br><span style="color: hsl(120, 100%, 40%);">+        threshold: 'uint'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/21100">change 21100</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/+/21100"/><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: I73b1a5e07f81fa1e3d3db1db243a3d0b137bda8e </div>
<div style="display:none"> Gerrit-Change-Number: 21100 </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-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>