Add VTY command to configure destination MSISDN for emergency calls

As in GSM/3GPP networks emergency calls carry no explicit destination
number/address, add a VTY commadn to patch in some destination handler
in the EMERGENCY SETUP before delivering to [internal or external] MNCC.

Change-Id: I7c9f43ba312fadda2b9a9483b3cf50e4abca9599
This commit is contained in:
Harald Welte 2018-02-09 20:41:14 +01:00
parent a172e9e231
commit 69c54a8b3c
3 changed files with 38 additions and 0 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -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