aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/msc/gsm_data.h5
-rw-r--r--src/libmsc/gsm_04_08.c8
-rw-r--r--src/libmsc/msc_vty.c25
3 files changed, 38 insertions, 0 deletions
diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h
index 3f322b3d8..06328dceb 100644
--- a/include/osmocom/msc/gsm_data.h
+++ b/include/osmocom/msc/gsm_data.h
@@ -413,6 +413,11 @@ struct gsm_network {
struct llist_head bscs;
struct osmo_sccp_instance *sccp;
} a;
+
+ struct {
+ /* MSISDN to which to route MO emergency calls */
+ char *route_to_msisdn;
+ } emergency;
};
struct osmo_esme;
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index 76f8c799a..7b6e94a58 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -1645,6 +1645,14 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
if (msg_type == GSM48_MT_CC_EMERG_SETUP) {
setup.fields |= MNCC_F_EMERGENCY;
setup.emergency = 1;
+ /* use destination number as configured by user (if any) */
+ if (trans->net->emergency.route_to_msisdn) {
+ setup.fields |= MNCC_F_CALLED;
+ setup.called.type = 0; /* unknown */
+ setup.called.plan = 0; /* unknown */
+ OSMO_STRLCPY_ARRAY(setup.called.number,
+ trans->net->emergency.route_to_msisdn);
+ }
}
/* use subscriber as calling party number */
diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c
index faf17ec3c..ad4014da9 100644
--- a/src/libmsc/msc_vty.c
+++ b/src/libmsc/msc_vty.c
@@ -125,6 +125,20 @@ DEFUN(cfg_msc_paging_response_timer, cfg_msc_paging_response_timer_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_msc_emergency_msisdn, cfg_msc_emergency_msisdn_cmd,
+ "emergency-call route-to-msisdn MSISDN",
+ "Configure Emergency Call Behaviour\n"
+ "MSISDN to which Emergency Calls are Dispatched\n"
+ "MSISDN (E.164 Phone Number)\n")
+{
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
+
+ osmo_talloc_replace_string(gsmnet, &gsmnet->emergency.route_to_msisdn, argv[0]);
+
+ return CMD_SUCCESS;
+}
+
+
static int config_write_msc(struct vty *vty)
{
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
@@ -149,6 +163,11 @@ static int config_write_msc(struct vty *vty)
if (gsmnet->paging_response_timer != MSC_PAGING_RESPONSE_TIMER_DEFAULT)
vty_out(vty, " paging response-timer %u%s", gsmnet->paging_response_timer, VTY_NEWLINE);
+ if (gsmnet->emergency.route_to_msisdn) {
+ vty_out(vty, " emergency-call route-to-msisdn %s%s",
+ gsmnet->emergency.route_to_msisdn, VTY_NEWLINE);
+ }
+
mgcp_client_config_write(vty, " ");
#ifdef BUILD_IU
ranap_iu_vty_config_write(vty, " ");
@@ -196,6 +215,11 @@ static int config_write_net(struct vty *vty)
vty_out(vty, " periodic location update %u%s",
gsmnet->t3212 * 6, VTY_NEWLINE);
+ if (gsmnet->emergency.route_to_msisdn) {
+ vty_out(vty, " emergency-call route-to-msisdn %s%s",
+ gsmnet->emergency.route_to_msisdn, VTY_NEWLINE);
+ }
+
return CMD_SUCCESS;
}
@@ -212,6 +236,7 @@ void msc_vty_init(struct gsm_network *msc_network)
install_element(MSC_NODE, &cfg_msc_cs7_instance_a_cmd);
install_element(MSC_NODE, &cfg_msc_cs7_instance_iu_cmd);
install_element(MSC_NODE, &cfg_msc_paging_response_timer_cmd);
+ install_element(MSC_NODE, &cfg_msc_emergency_msisdn_cmd);
mgcp_client_vty_init(msc_network, MSC_NODE, &msc_network->mgw.conf);
#ifdef BUILD_IU