aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2013-08-28 10:16:54 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-08-28 11:10:44 +0200
commit1b894022fd168d7b9a3e8cafaef1622c3a24885b (patch)
tree9fdaa9f2a1b853c265a0a4bed85d9838e11d3b11 /openbsc/src/osmo-bsc/osmo_bsc_sccp.c
parent0c0e1c308f0d13cf366315bd9f35df6e8bb9038c (diff)
bsc/ussd: Optionally send USSD message on MSC disconnection
Send an USSD message on each MS connection if the connection to the MSC has been lost. Add a vty config command 'bsc-msc-loss-txt' in 'config-msc' to set the notification string and to enable the feature. Ticket: OW#957
Diffstat (limited to 'openbsc/src/osmo-bsc/osmo_bsc_sccp.c')
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_sccp.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_sccp.c b/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
index 3533d6df0..ad554e82a 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
@@ -262,13 +262,35 @@ int bsc_delete_connection(struct osmo_bsc_sccp_con *sccp)
return 0;
}
-static void bsc_close_connections(struct bsc_msc_connection *msc_con)
+static void bsc_notify_msc_lost(struct osmo_bsc_sccp_con *con)
+{
+ struct gsm_subscriber_connection *conn = con->conn;
+
+ /* send USSD notification if string configured and con->data is set */
+ if (!conn)
+ return;
+
+ /* check for config string */
+ if (!con->msc->ussd_msc_lost_txt)
+ return;
+ if (con->msc->ussd_msc_lost_txt[0] == '\0')
+ return;
+
+ /* send USSD notification */
+ gsm0480_send_ussdNotify(conn, 1, conn->sccp_con->msc->ussd_welcome_txt);
+ gsm0480_send_releaseComplete(conn);
+}
+
+static void bsc_notify_and_close_conns(struct bsc_msc_connection *msc_con)
{
struct osmo_bsc_sccp_con *con, *tmp;
llist_for_each_entry_safe(con, tmp, &active_connections, entry) {
- if (con->msc->msc_con == msc_con)
- bsc_sccp_force_free(con);
+ if (con->msc->msc_con != msc_con)
+ continue;
+
+ bsc_notify_msc_lost(con);
+ bsc_sccp_force_free(con);
}
}
@@ -282,7 +304,7 @@ static int handle_msc_signal(unsigned int subsys, unsigned int signal,
msc = signal_data;
if (signal == S_MSC_LOST)
- bsc_close_connections(msc->data->msc_con);
+ bsc_notify_and_close_conns(msc->data->msc_con);
return 0;
}