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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">enb: Set cipher and integrity via scenario file<br><br>This patch enables setting cipher and integrity algorithms<br>in Amarisoft eNB and srsENB via scenario files. If no<br>settings are defined following defaults are applied:<br>- Cipher algorithm: EEA0, EEA2, EEA1<br>- Integrity algorithm: EIA2, EIA1, EIA0<br><br>Example of setting cipher algorithms:<br>- 4g:srsue-rftype@uhd+srsenb-rftype@uhd+mod-enb-cipher@eea1+mod-enb-cipher@eea0+mod-enb-nprb@6<br><br>Change-Id: I595206b7d49016fb6d0aec175c828d9537c53886<br>---<br>M src/osmo_gsm_tester/core/schema.py<br>M src/osmo_gsm_tester/obj/bts.py<br>M src/osmo_gsm_tester/obj/enb.py<br>M src/osmo_gsm_tester/obj/enb_amarisoft.py<br>M src/osmo_gsm_tester/obj/ms.py<br>M src/osmo_gsm_tester/templates/amarisoft_enb.cfg.tmpl<br>M src/osmo_gsm_tester/templates/srsenb.conf.tmpl<br>M sysmocom/defaults.conf<br>A sysmocom/scenarios/mod-enb-cipher@.conf<br>A sysmocom/scenarios/mod-enb-integrity@.conf<br>10 files changed, 45 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/core/schema.py b/src/osmo_gsm_tester/core/schema.py</span><br><span>index d4a460d..4064c20 100644</span><br><span>--- a/src/osmo_gsm_tester/core/schema.py</span><br><span>+++ b/src/osmo_gsm_tester/core/schema.py</span><br><span>@@ -105,11 +105,22 @@</span><br><span>         raise ValueError('Positive value >0 expected instead of %d' % n)</span><br><span>     return True</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def cipher(val):</span><br><span style="color: hsl(120, 100%, 40%);">+def cipher_2g(val):</span><br><span>     if val in ('a5_0', 'a5_1', 'a5_2', 'a5_3', 'a5_4', 'a5_5', 'a5_6', 'a5_7'):</span><br><span>         return True</span><br><span>     raise ValueError('Unknown Cipher value: %r' % val)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def cipher_4g(val):</span><br><span style="color: hsl(120, 100%, 40%);">+    if val.lower() in ('eea0', 'eea1', 'eea2'):</span><br><span style="color: hsl(120, 100%, 40%);">+        return True</span><br><span style="color: hsl(120, 100%, 40%);">+    raise ValueError('Unknown 4G cipher value: %r' % val)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def integrity_4g(val):</span><br><span style="color: hsl(120, 100%, 40%);">+    if val.lower() in ('eia0', 'eia1', 'eia2'):</span><br><span style="color: hsl(120, 100%, 40%);">+        # srsENB</span><br><span style="color: hsl(120, 100%, 40%);">+        return True</span><br><span style="color: hsl(120, 100%, 40%);">+    raise ValueError('Unknown 4G integrity value %r' % val)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def modem_feature(val):</span><br><span>     if val in ('sms', 'gprs', 'voice', 'ussd', 'sim', '2g', '3g', '4g', 'dl_qam256', 'ul_qam64', 'qc_diag'):</span><br><span>         return True</span><br><span>@@ -165,7 +176,9 @@</span><br><span> MSISDN = 'msisdn'</span><br><span> AUTH_ALGO = 'auth_algo'</span><br><span> TIMES='times'</span><br><span style="color: hsl(0, 100%, 40%);">-CIPHER = 'cipher'</span><br><span style="color: hsl(120, 100%, 40%);">+CIPHER_2G = 'cipher_2g'</span><br><span style="color: hsl(120, 100%, 40%);">+CIPHER_4G = 'cipher_4g'</span><br><span style="color: hsl(120, 100%, 40%);">+INTEGRITY_4G = 'integrity_4g'</span><br><span> MODEM_FEATURE = 'modem_feature'</span><br><span> PHY_CHAN = 'chan'</span><br><span> CHAN_ALLOCATOR = 'chan_allocator'</span><br><span>@@ -189,7 +202,8 @@</span><br><span>         MSISDN: msisdn,</span><br><span>         AUTH_ALGO: auth_algo,</span><br><span>         TIMES: times,</span><br><span style="color: hsl(0, 100%, 40%);">-        CIPHER: cipher,</span><br><span style="color: hsl(120, 100%, 40%);">+        CIPHER_2G: cipher_2g,</span><br><span style="color: hsl(120, 100%, 40%);">+        CIPHER_4G: cipher_4g,</span><br><span>         MODEM_FEATURE: modem_feature,</span><br><span>         PHY_CHAN: phy_channel_config,</span><br><span>         CHAN_ALLOCATOR: channel_allocator,</span><br><span>@@ -198,6 +212,7 @@</span><br><span>         OSMO_TRX_CLOCK_REF: osmo_trx_clock_ref,</span><br><span>         LTE_TRANSMISSION_MODE: lte_transmission_mode,</span><br><span>         DURATION: duration,</span><br><span style="color: hsl(120, 100%, 40%);">+        INTEGRITY_4G: integrity_4g,</span><br><span>     }</span><br><span> </span><br><span> def add(dest, src):</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts.py b/src/osmo_gsm_tester/obj/bts.py</span><br><span>index 76a6875..fd9fa3a 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts.py</span><br><span>@@ -31,7 +31,7 @@</span><br><span>         'addr': schema.IPV4,</span><br><span>         'band': schema.BAND,</span><br><span>         'direct_pcu': schema.BOOL_STR,</span><br><span style="color: hsl(0, 100%, 40%);">-        'ciphers[]': schema.CIPHER,</span><br><span style="color: hsl(120, 100%, 40%);">+        'ciphers[]': schema.CIPHER_2G,</span><br><span>         'channel_allocator': schema.CHAN_ALLOCATOR,</span><br><span>         'gprs_mode': schema.GPRS_MODE,</span><br><span>         'emergency_calls_allowed': schema.BOOL_STR,</span><br><span>diff --git a/src/osmo_gsm_tester/obj/enb.py b/src/osmo_gsm_tester/obj/enb.py</span><br><span>index 50a8832..32ead69 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb.py</span><br><span>@@ -44,6 +44,8 @@</span><br><span>         'enable_measurements': schema.BOOL_STR,</span><br><span>         'enable_dl_awgn': schema.BOOL_STR,</span><br><span>         'dl_awgn_snr': schema.INT,</span><br><span style="color: hsl(120, 100%, 40%);">+        'cipher_list[]': schema.CIPHER_4G,</span><br><span style="color: hsl(120, 100%, 40%);">+        'integrity_list[]': schema.INTEGRITY_4G,</span><br><span>         'a1_report_type': schema.STR,</span><br><span>         'a1_report_value': schema.INT,</span><br><span>         'a1_hysteresis': schema.INT,</span><br><span>diff --git a/src/osmo_gsm_tester/obj/enb_amarisoft.py b/src/osmo_gsm_tester/obj/enb_amarisoft.py</span><br><span>index b7ede3b..e97bb90 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb_amarisoft.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb_amarisoft.py</span><br><span>@@ -176,6 +176,10 @@</span><br><span> </span><br><span>         config.overlay(values, dict(enb={'enable_dl_awgn': util.str2bool(values['enb'].get('enable_dl_awgn', 'false'))}))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        # Remove EEA0 from cipher list, if specified, as it's always assumed as default</span><br><span style="color: hsl(120, 100%, 40%);">+        cipher_list = values['enb'].get('cipher_list', None)</span><br><span style="color: hsl(120, 100%, 40%);">+        if "eea0" in cipher_list: cipher_list.remove("eea0")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         # We need to set some specific variables programatically here to match IP addresses:</span><br><span>         if self._conf.get('rf_dev_type') == 'zmq':</span><br><span>             base_srate = self.num_prb2base_srate(self.num_prb())</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms.py b/src/osmo_gsm_tester/obj/ms.py</span><br><span>index 552de71..cd4a8a1 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms.py</span><br><span>@@ -31,7 +31,7 @@</span><br><span>         'opc': schema.OPC,</span><br><span>         'auth_algo': schema.AUTH_ALGO,</span><br><span>         'apn_ipaddr': schema.IPV4,</span><br><span style="color: hsl(0, 100%, 40%);">-        'ciphers[]': schema.CIPHER,</span><br><span style="color: hsl(120, 100%, 40%);">+        'ciphers[]': schema.CIPHER_2G,</span><br><span>         'features[]': schema.MODEM_FEATURE</span><br><span>         }</span><br><span>     schema.register_resource_schema('modem', resource_schema)</span><br><span>diff --git a/src/osmo_gsm_tester/templates/amarisoft_enb.cfg.tmpl b/src/osmo_gsm_tester/templates/amarisoft_enb.cfg.tmpl</span><br><span>index 4c7aa33..2c6fcc0 100644</span><br><span>--- a/src/osmo_gsm_tester/templates/amarisoft_enb.cfg.tmpl</span><br><span>+++ b/src/osmo_gsm_tester/templates/amarisoft_enb.cfg.tmpl</span><br><span>@@ -224,9 +224,9 @@</span><br><span>     dpc_pucch_snr_target: 10,</span><br><span> </span><br><span>     /* RRC/UP ciphering algorithm preference. EEA0 is always the last. */</span><br><span style="color: hsl(0, 100%, 40%);">-    cipher_algo_pref: [],</span><br><span style="color: hsl(120, 100%, 40%);">+    cipher_algo_pref: [${', '.join(list(dict.fromkeys(enb.cipher_list))).split("eea")[1] if len(list(dict.fromkeys(enb.cipher_list))) > 0 else ''}],</span><br><span>     /* RRC integrity algorithm preference. EIA0 is always the last. */</span><br><span style="color: hsl(0, 100%, 40%);">-    integ_algo_pref: [2, 1],</span><br><span style="color: hsl(120, 100%, 40%);">+    integ_algo_pref: [${', '.join(list(dict.fromkeys(enb.integrity_list))).split("eia")[1]}],</span><br><span> </span><br><span>     /* (in ms) send RRC connection release after this time of network</span><br><span>        inactivity */</span><br><span>diff --git a/src/osmo_gsm_tester/templates/srsenb.conf.tmpl b/src/osmo_gsm_tester/templates/srsenb.conf.tmpl</span><br><span>index 7ac75bb..794edea 100644</span><br><span>--- a/src/osmo_gsm_tester/templates/srsenb.conf.tmpl</span><br><span>+++ b/src/osmo_gsm_tester/templates/srsenb.conf.tmpl</span><br><span>@@ -285,5 +285,5 @@</span><br><span> #link_failure_nof_err = 50</span><br><span> rrc_inactivity_timer = ${enb.inactivity_timer}</span><br><span> #max_prach_offset_us  = 30</span><br><span style="color: hsl(0, 100%, 40%);">-#eea_pref_list = EEA0, EEA2, EEA1</span><br><span style="color: hsl(0, 100%, 40%);">-#eia_pref_list = EIA2, EIA1, EIA0</span><br><span style="color: hsl(120, 100%, 40%);">+eea_pref_list = ${', '.join(list(dict.fromkeys(enb.cipher_list))).upper()}</span><br><span style="color: hsl(120, 100%, 40%);">+eia_pref_list = ${', '.join(list(dict.fromkeys(enb.integrity_list))).upper()}</span><br><span>diff --git a/sysmocom/defaults.conf b/sysmocom/defaults.conf</span><br><span>index 7f1368b..d66e030 100644</span><br><span>--- a/sysmocom/defaults.conf</span><br><span>+++ b/sysmocom/defaults.conf</span><br><span>@@ -144,6 +144,13 @@</span><br><span>      root_seq_idx: 205</span><br><span>      scell_list: []</span><br><span>      ncell_list: []</span><br><span style="color: hsl(120, 100%, 40%);">+  cipher_4g:</span><br><span style="color: hsl(120, 100%, 40%);">+   - eea0</span><br><span style="color: hsl(120, 100%, 40%);">+   - eea2</span><br><span style="color: hsl(120, 100%, 40%);">+   - eea1</span><br><span style="color: hsl(120, 100%, 40%);">+  integrity_4g:</span><br><span style="color: hsl(120, 100%, 40%);">+   - eia2</span><br><span style="color: hsl(120, 100%, 40%);">+   - eia1</span><br><span> </span><br><span> srsenb:</span><br><span>   num_prb: 100</span><br><span>diff --git a/sysmocom/scenarios/mod-enb-cipher@.conf b/sysmocom/scenarios/mod-enb-cipher@.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..7cd453f</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/mod-enb-cipher@.conf</span><br><span>@@ -0,0 +1,4 @@</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%);">+  - cipher_list:</span><br><span style="color: hsl(120, 100%, 40%);">+    - ${param1}</span><br><span>diff --git a/sysmocom/scenarios/mod-enb-integrity@.conf b/sysmocom/scenarios/mod-enb-integrity@.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..fa708ad</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/mod-enb-integrity@.conf</span><br><span>@@ -0,0 +1,4 @@</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%);">+  - integrity_list:</span><br><span style="color: hsl(120, 100%, 40%);">+    - ${param1}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/21582">change 21582</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/+/21582"/><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: I595206b7d49016fb6d0aec175c828d9537c53886 </div>
<div style="display:none"> Gerrit-Change-Number: 21582 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </div>
<div style="display:none"> Gerrit-Owner: ninjab3s <nils.fuerste@softwareradiosystems.com> </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-Reviewer: srs_andre <andre@softwareradiosystems.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>