<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20668">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sysmocom: Introduce suite to test emergency calls<br><br>Change-Id: I2e851c94311ded0abd4ff072b8cc72316d972750<br>---<br>M src/osmo_gsm_tester/obj/bts.py<br>M src/osmo_gsm_tester/obj/ms.py<br>M src/osmo_gsm_tester/obj/ms_ofono.py<br>M src/osmo_gsm_tester/obj/msc_osmo.py<br>M src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl<br>M src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl<br>A sysmocom/suites/emergency/emergency_mo_mt_call.py<br>A sysmocom/suites/emergency/suite.conf<br>8 files changed, 109 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/68/20668/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/obj/bts.py b/src/osmo_gsm_tester/obj/bts.py</span><br><span>index 56e5aaa..5b43642 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>@@ -19,7 +19,10 @@</span><br><span> </span><br><span> import copy</span><br><span> from abc import ABCMeta, abstractmethod</span><br><span style="color: hsl(0, 100%, 40%);">-from ..core import log, config, schema</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import config</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import util</span><br><span> </span><br><span> def on_register_schemas():</span><br><span>     resource_schema = {</span><br><span>@@ -31,6 +34,7 @@</span><br><span>         'ciphers[]': schema.CIPHER,</span><br><span>         'channel_allocator': schema.CHAN_ALLOCATOR,</span><br><span>         'gprs_mode': schema.GPRS_MODE,</span><br><span style="color: hsl(120, 100%, 40%);">+        'emergency_calls_allowed': schema.BOOL_STR,</span><br><span>         'num_trx': schema.UINT,</span><br><span>         'max_trx': schema.UINT,</span><br><span>         'trx_list[].addr': schema.IPV4,</span><br><span>@@ -132,6 +136,8 @@</span><br><span>         if self.bvci is not None:</span><br><span>             config.overlay(values, { 'bvci': self.bvci })</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, { 'emergency_calls_allowed': util.str2bool(values.get('emergency_calls_allowed', 'false')) } )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         conf = copy.deepcopy(self.conf)</span><br><span>         trx_list = conf.get('trx_list')</span><br><span>         if trx_list and len(trx_list) != self.num_trx():</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 60103d7..70ce558 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>@@ -120,5 +120,8 @@</span><br><span>             self.set_msisdn(self.testenv.msisdn())</span><br><span>         return self._msisdn</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def emergency_numbers(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return ['112']</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def get_counter(self, counter_name):</span><br><span>         raise log.Error('get_counter() not implemented!')</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_ofono.py b/src/osmo_gsm_tester/obj/ms_ofono.py</span><br><span>index 38fa4d4..a5ee3ea 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_ofono.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_ofono.py</span><br><span>@@ -834,4 +834,10 @@</span><br><span>         service_type, response = ss.Initiate(command)</span><br><span>         return response</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def emergency_numbers(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        cmgr = self.dbus.interface(I_CALLMGR)</span><br><span style="color: hsl(120, 100%, 40%);">+        props = cmgr.GetProperties()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('got Call properties', props)</span><br><span style="color: hsl(120, 100%, 40%);">+        return props.get('EmergencyNumbers', [])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/msc_osmo.py b/src/osmo_gsm_tester/obj/msc_osmo.py</span><br><span>index 173bc94..67e1d31 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/msc_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/msc_osmo.py</span><br><span>@@ -27,6 +27,7 @@</span><br><span> def on_register_schemas():</span><br><span>     resource_schema = {</span><br><span>         'path': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+        'emergency_call_msisdn': schema.MSISDN,</span><br><span>         }</span><br><span>     schema.register_resource_schema('modem', resource_schema)</span><br><span> </span><br><span>@@ -43,6 +44,7 @@</span><br><span>         self.use_osmux = "off"</span><br><span>         self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span style="color: hsl(120, 100%, 40%);">+        self._emergency_call_msisdn = None</span><br><span>         self.hlr = hlr</span><br><span>         self.mgw = mgw</span><br><span>         self.stp = stp</span><br><span>@@ -94,7 +96,8 @@</span><br><span>         if self.authentication is not None:</span><br><span>             config.overlay(values, dict(msc=dict(net=dict(authentication=self.authentication))))</span><br><span>         config.overlay(values, dict(msc=dict(use_osmux=self.use_osmux)))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._emergency_call_msisdn is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+            config.overlay(values, dict(msc=dict(emergency_call_msisdn=self._emergency_call_msisdn)))</span><br><span> </span><br><span>         self.config = values</span><br><span> </span><br><span>@@ -146,6 +149,10 @@</span><br><span>     def imsi_list_attached(self):</span><br><span>         return OsmoMscCtrl(self).subscriber_list_active()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def set_emergency_call_msisdn(self, msisdn):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('Setting Emergency Call MSISDN', msisdn=msisdn)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._emergency_call_msisdn = msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def running(self):</span><br><span>         return not self.process.terminated()</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl b/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl</span><br><span>index a03bb0b..66fa9e5 100644</span><br><span>--- a/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl</span><br><span>+++ b/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl</span><br><span>@@ -58,6 +58,11 @@</span><br><span> % endif</span><br><span>   ip.access unit_id ${bts.ipa_unit_id} 0</span><br><span>   oml ip.access stream_id ${bts.stream_id} line 0</span><br><span style="color: hsl(120, 100%, 40%);">+% if bts.get('emergency_calls_allowed', False):</span><br><span style="color: hsl(120, 100%, 40%);">+  rach emergency call allowed 1</span><br><span style="color: hsl(120, 100%, 40%);">+% else:</span><br><span style="color: hsl(120, 100%, 40%);">+  rach emergency call allowed 0</span><br><span style="color: hsl(120, 100%, 40%);">+%endif</span><br><span> % if bts.get('sgsn', False) and bts['gprs_mode'] != 'none':</span><br><span>   gprs mode ${bts.gprs_mode}</span><br><span>   gprs routing area ${bts.routing_area_code}</span><br><span>@@ -105,6 +110,7 @@</span><br><span> msc</span><br><span>  core-mobile-country-code ${bsc.net.mcc}</span><br><span>  core-mobile-network-code ${bsc.net.mnc}</span><br><span style="color: hsl(120, 100%, 40%);">+ allow-emergency allow</span><br><span>  ip.access rtp-base 25000</span><br><span>  mgw remote-ip ${mgw.ip_address.addr}</span><br><span>  mgw remote-port 2427</span><br><span>diff --git a/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl b/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl</span><br><span>index 8d0ab23..bf7fc2b 100644</span><br><span>--- a/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl</span><br><span>+++ b/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl</span><br><span>@@ -31,6 +31,9 @@</span><br><span>  mgw bts-base 8000</span><br><span>  osmux ${msc.use_osmux}</span><br><span>  assign-tmsi</span><br><span style="color: hsl(120, 100%, 40%);">+%if msc.get('emergency_call_msisdn', None) is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+ emergency-call route-to-msisdn ${msc.emergency_call_msisdn}</span><br><span style="color: hsl(120, 100%, 40%);">+%endif</span><br><span>  cs7-instance-iu 0</span><br><span>  cs7-instance-a 0</span><br><span> ctrl</span><br><span>diff --git a/sysmocom/suites/emergency/emergency_mo_mt_call.py b/sysmocom/suites/emergency/emergency_mo_mt_call.py</span><br><span>new file mode 100755</span><br><span>index 0000000..7fa9b6f</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/emergency/emergency_mo_mt_call.py</span><br><span>@@ -0,0 +1,64 @@</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%);">+hlr = tenv.hlr()</span><br><span style="color: hsl(120, 100%, 40%);">+bts = tenv.bts()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_msc = tenv.mgw()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_bsc = tenv.mgw()</span><br><span style="color: hsl(120, 100%, 40%);">+stp = tenv.stp()</span><br><span style="color: hsl(120, 100%, 40%);">+msc = tenv.msc(hlr, mgw_msc, stp)</span><br><span style="color: hsl(120, 100%, 40%);">+bsc = tenv.bsc(msc, mgw_bsc, stp)</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mo = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.start()</span><br><span style="color: hsl(120, 100%, 40%);">+stp.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Set MSC to route emergency call to ms_mt:</span><br><span style="color: hsl(120, 100%, 40%);">+msc.set_emergency_call_msisdn(ms_mt.msisdn())</span><br><span style="color: hsl(120, 100%, 40%);">+msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_bsc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.bts_add(bts)</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bts.start()</span><br><span style="color: hsl(120, 100%, 40%);">+wait(bsc.bts_is_connected, bts)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.subscriber_add(ms_mo)</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.subscriber_add(ms_mt)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mo.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mo.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for modems to attach...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mo.is_registered, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mt.is_registered, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+wait(msc.subscriber_attached, ms_mo, ms_mt)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+assert len(ms_mo.call_id_list()) == 0 and len(ms_mt.call_id_list()) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+# Calling emergency number should be redirected to ms_mt as configured further above:</span><br><span style="color: hsl(120, 100%, 40%);">+emerg_numbers = ms_mo.emergency_numbers()</span><br><span style="color: hsl(120, 100%, 40%);">+assert len(emerg_numbers) > 0</span><br><span style="color: hsl(120, 100%, 40%);">+print('dialing Emergency Number %s' % (emerg_numbers[0]))</span><br><span style="color: hsl(120, 100%, 40%);">+mo_cid = ms_mo.call_dial(emerg_numbers[0])</span><br><span style="color: hsl(120, 100%, 40%);">+mt_cid = ms_mt.call_wait_incoming(ms_mo)</span><br><span style="color: hsl(120, 100%, 40%);">+print('dial success')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+assert not ms_mo.call_is_active(mo_cid) and not ms_mt.call_is_active(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt.call_answer(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mo.call_is_active, mo_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mt.call_is_active, mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+print('answer success, call established and ongoing')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sleep(5) # maintain the call active for 5 seconds</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+assert ms_mo.call_is_active(mo_cid) and ms_mt.call_is_active(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt.call_hangup(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(lambda: len(ms_mo.call_id_list()) == 0 and len(ms_mt.call_id_list()) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+print('hangup success')</span><br><span>diff --git a/sysmocom/suites/emergency/suite.conf b/sysmocom/suites/emergency/suite.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..eb0de71</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/emergency/suite.conf</span><br><span>@@ -0,0 +1,12 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  ip_address:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 6 # msc, bsc, hlr, stp, mgw*2</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 1</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 2</span><br><span style="color: hsl(120, 100%, 40%);">+    features:</span><br><span style="color: hsl(120, 100%, 40%);">+    - voice</span><br><span style="color: hsl(120, 100%, 40%);">+modifiers:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - emergency_calls_allowed: true</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20668">change 20668</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/+/20668"/><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: I2e851c94311ded0abd4ff072b8cc72316d972750 </div>
<div style="display:none"> Gerrit-Change-Number: 20668 </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-MessageType: newchange </div>