sysmocom: Introduce suite to test emergency calls

Change-Id: I2e851c94311ded0abd4ff072b8cc72316d972750
diff --git a/src/osmo_gsm_tester/obj/bts.py b/src/osmo_gsm_tester/obj/bts.py
index 56e5aaa..5b43642 100644
--- a/src/osmo_gsm_tester/obj/bts.py
+++ b/src/osmo_gsm_tester/obj/bts.py
@@ -19,7 +19,10 @@
 
 import copy
 from abc import ABCMeta, abstractmethod
-from ..core import log, config, schema
+from ..core import log
+from ..core import config
+from ..core import schema
+from ..core import util
 
 def on_register_schemas():
     resource_schema = {
@@ -31,6 +34,7 @@
         'ciphers[]': schema.CIPHER,
         'channel_allocator': schema.CHAN_ALLOCATOR,
         'gprs_mode': schema.GPRS_MODE,
+        'emergency_calls_allowed': schema.BOOL_STR,
         'num_trx': schema.UINT,
         'max_trx': schema.UINT,
         'trx_list[].addr': schema.IPV4,
@@ -132,6 +136,8 @@
         if self.bvci is not None:
             config.overlay(values, { 'bvci': self.bvci })
 
+        config.overlay(values, { 'emergency_calls_allowed': util.str2bool(values.get('emergency_calls_allowed', 'false')) } )
+
         conf = copy.deepcopy(self.conf)
         trx_list = conf.get('trx_list')
         if trx_list and len(trx_list) != self.num_trx():
diff --git a/src/osmo_gsm_tester/obj/ms.py b/src/osmo_gsm_tester/obj/ms.py
index 60103d7..70ce558 100644
--- a/src/osmo_gsm_tester/obj/ms.py
+++ b/src/osmo_gsm_tester/obj/ms.py
@@ -120,5 +120,8 @@
             self.set_msisdn(self.testenv.msisdn())
         return self._msisdn
 
+    def emergency_numbers(self):
+        return ['112']
+
     def get_counter(self, counter_name):
         raise log.Error('get_counter() not implemented!')
diff --git a/src/osmo_gsm_tester/obj/ms_ofono.py b/src/osmo_gsm_tester/obj/ms_ofono.py
index 38fa4d4..a5ee3ea 100644
--- a/src/osmo_gsm_tester/obj/ms_ofono.py
+++ b/src/osmo_gsm_tester/obj/ms_ofono.py
@@ -834,4 +834,10 @@
         service_type, response = ss.Initiate(command)
         return response
 
+    def emergency_numbers(self):
+        cmgr = self.dbus.interface(I_CALLMGR)
+        props = cmgr.GetProperties()
+        self.dbg('got Call properties', props)
+        return props.get('EmergencyNumbers', [])
+
 # vim: expandtab tabstop=4 shiftwidth=4
diff --git a/src/osmo_gsm_tester/obj/msc_osmo.py b/src/osmo_gsm_tester/obj/msc_osmo.py
index 173bc94..67e1d31 100644
--- a/src/osmo_gsm_tester/obj/msc_osmo.py
+++ b/src/osmo_gsm_tester/obj/msc_osmo.py
@@ -27,6 +27,7 @@
 def on_register_schemas():
     resource_schema = {
         'path': schema.STR,
+        'emergency_call_msisdn': schema.MSISDN,
         }
     schema.register_resource_schema('modem', resource_schema)
 
@@ -43,6 +44,7 @@
         self.use_osmux = "off"
         self.testenv = testenv
         self.ip_address = ip_address
+        self._emergency_call_msisdn = None
         self.hlr = hlr
         self.mgw = mgw
         self.stp = stp
@@ -94,7 +96,8 @@
         if self.authentication is not None:
             config.overlay(values, dict(msc=dict(net=dict(authentication=self.authentication))))
         config.overlay(values, dict(msc=dict(use_osmux=self.use_osmux)))
-
+        if self._emergency_call_msisdn is not None:
+            config.overlay(values, dict(msc=dict(emergency_call_msisdn=self._emergency_call_msisdn)))
 
         self.config = values
 
@@ -146,6 +149,10 @@
     def imsi_list_attached(self):
         return OsmoMscCtrl(self).subscriber_list_active()
 
+    def set_emergency_call_msisdn(self, msisdn):
+        self.dbg('Setting Emergency Call MSISDN', msisdn=msisdn)
+        self._emergency_call_msisdn = msisdn
+
     def running(self):
         return not self.process.terminated()
 
diff --git a/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl b/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl
index a03bb0b..66fa9e5 100644
--- a/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl
+++ b/src/osmo_gsm_tester/templates/osmo-bsc.cfg.tmpl
@@ -58,6 +58,11 @@
 % endif
   ip.access unit_id ${bts.ipa_unit_id} 0
   oml ip.access stream_id ${bts.stream_id} line 0
+% if bts.get('emergency_calls_allowed', False):
+  rach emergency call allowed 1
+% else:
+  rach emergency call allowed 0
+%endif
 % if bts.get('sgsn', False) and bts['gprs_mode'] != 'none':
   gprs mode ${bts.gprs_mode}
   gprs routing area ${bts.routing_area_code}
@@ -105,6 +110,7 @@
 msc
  core-mobile-country-code ${bsc.net.mcc}
  core-mobile-network-code ${bsc.net.mnc}
+ allow-emergency allow
  ip.access rtp-base 25000
  mgw remote-ip ${mgw.ip_address.addr}
  mgw remote-port 2427
diff --git a/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl b/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl
index 8d0ab23..bf7fc2b 100644
--- a/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl
+++ b/src/osmo_gsm_tester/templates/osmo-msc.cfg.tmpl
@@ -31,6 +31,9 @@
  mgw bts-base 8000
  osmux ${msc.use_osmux}
  assign-tmsi
+%if msc.get('emergency_call_msisdn', None) is not None:
+ emergency-call route-to-msisdn ${msc.emergency_call_msisdn}
+%endif
  cs7-instance-iu 0
  cs7-instance-a 0
 ctrl