summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-11-12 00:26:35 +0900
committerHarald Welte <laforge@gnumonks.org>2017-11-11 23:25:40 +0000
commit0195c30df582811dd0252fb6b455c156f4a7ee95 (patch)
tree4ccd570751af84bf5a2becf2b8f72d7f3f18fc9b
parent71b68bed2a93359fa84617292cf6159a4ed09c16 (diff)
osmo-bsc-sccplite: Implement incoming RESET procedure
In osmo-bsc-sccplite we so far didn't implement the inbound RESET procedure. We instead ignored any RESET message from the MSC. This commit adds support for RESET: We will destrpy any SCCP connections and acknowledge the RESET to the MSC. As osmo-msc is requiring the BSC to handle an inbound RESET procedure, this commit allows osmo-msc to properly initialize the A interface towards osmo-bsc-sccplite via a translating/routing osmo-stp. While we don't anticipate any new deployments of osmo-bsc-sccplite, making it interoperate with osmo-msc enables us to do more testing of osmo-bsc-sccplite. Change-Id: Iceb8278deb36d6103662a704f489ba0d685e04d3
-rw-r--r--openbsc/include/openbsc/bsc_msc_data.h1
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_bssap.c33
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_sccp.c2
3 files changed, 35 insertions, 1 deletions
diff --git a/openbsc/include/openbsc/bsc_msc_data.h b/openbsc/include/openbsc/bsc_msc_data.h
index 38e87cfb9..9a92955d9 100644
--- a/openbsc/include/openbsc/bsc_msc_data.h
+++ b/openbsc/include/openbsc/bsc_msc_data.h
@@ -138,5 +138,6 @@ int osmo_bsc_audio_init(struct gsm_network *network);
struct bsc_msc_data *osmo_msc_data_find(struct gsm_network *, int);
struct bsc_msc_data *osmo_msc_data_alloc(struct gsm_network *, int);
+void bsc_notify_and_close_conns(struct bsc_msc_connection *msc_con);
#endif
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_bssap.c b/openbsc/src/osmo-bsc/osmo_bsc_bssap.c
index 9c549c3b7..349c98f3c 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_bssap.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_bssap.c
@@ -29,6 +29,7 @@
#include <osmocom/gsm/protocol/gsm_08_08.h>
#include <osmocom/gsm/gsm0808.h>
+#include <osmocom/sccp/sccp.h>
/*
* helpers for the assignment command
@@ -96,6 +97,35 @@ static int bssmap_handle_reset_ack(struct bsc_msc_data *msc,
return 0;
}
+static int bssmap_send_reset_ack(struct bsc_msc_data *msc)
+{
+ struct msgb *resp;
+ int rc;
+
+ LOGP(DMSC, LOGL_NOTICE, "Tx RESET-ACK to MSC\n");
+
+ resp = gsm0808_create_reset_ack();
+ OSMO_ASSERT(resp);
+
+ rc = sccp_write(resp, &sccp_ssn_bssap, &sccp_ssn_bssap, 0, msc->msc_con);
+ msgb_free(resp);
+ return rc;
+}
+
+static int bssmap_handle_reset(struct bsc_msc_data *msc,
+ struct msgb *msg, unsigned int length)
+{
+ LOGP(DMSC, LOGL_NOTICE, "Rx RESET from MSC\n");
+
+ /* Instruct the BSC to close all open SCCP connections and to close all
+ * active radio channels on the BTS side as well */
+ bsc_notify_and_close_conns(msc->msc_con);
+
+ /* Inform the MSC that we have received the reset request and
+ * that we acted accordingly */
+ return bssmap_send_reset_ack(msc);
+}
+
/* GSM 08.08 ยง 3.2.1.19 */
static int bssmap_handle_paging(struct bsc_msc_data *msc,
struct msgb *msg, unsigned int payload_length)
@@ -404,6 +434,9 @@ static int bssmap_rcvmsg_udt(struct bsc_msc_data *msc,
case BSS_MAP_MSG_RESET_ACKNOWLEDGE:
ret = bssmap_handle_reset_ack(msc, msg, length);
break;
+ case BSS_MAP_MSG_RESET:
+ ret = bssmap_handle_reset(msc, msg, length);
+ break;
case BSS_MAP_MSG_PAGING:
ret = bssmap_handle_paging(msc, msg, length);
break;
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_sccp.c b/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
index e242390ef..8388f88a5 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_sccp.c
@@ -287,7 +287,7 @@ static void bsc_notify_msc_lost(struct osmo_bsc_sccp_con *con)
bsc_send_ussd_release_complete(conn);
}
-static void bsc_notify_and_close_conns(struct bsc_msc_connection *msc_con)
+void bsc_notify_and_close_conns(struct bsc_msc_connection *msc_con)
{
struct osmo_bsc_sccp_con *con, *tmp;