aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2019-09-24 09:26:47 +0200
committerlaforge <laforge@gnumonks.org>2019-09-26 19:23:54 +0000
commit002fb01faa5c19820c7dfedffc4f768f1b9145b9 (patch)
tree5ae1dc0d13481d5300215e6c8b03a02a0d300803
parent6dcdfb036a7a129ea038b8f7b44a18132fa831ef (diff)
paging: Send SGsAP-SERVICE-ABORT-REQUEST on paging timeout
When pagig for a CS-Call via SGs times out, the MME expects to be informed about this via an SGsAP-SERVICE-ABORT-REQUEST, make sure this message is sent, but only for CS-Fallback calls. Change-Id: I3f8f153afe24cf2efa245713509bdc8488902877 Depends: osmo-ttcn3-hacks I99950a17ccf26aaa0eebded5480f33be4c57586a Related: OS#3614
-rw-r--r--include/osmocom/msc/sgs_iface.h1
-rw-r--r--src/libmsc/paging.c4
-rw-r--r--src/libmsc/sgs_iface.c22
3 files changed, 27 insertions, 0 deletions
diff --git a/include/osmocom/msc/sgs_iface.h b/include/osmocom/msc/sgs_iface.h
index 575468e10..a31966370 100644
--- a/include/osmocom/msc/sgs_iface.h
+++ b/include/osmocom/msc/sgs_iface.h
@@ -89,4 +89,5 @@ enum sgsap_service_ind sgs_serv_ind_from_paging_cause(enum paging_cause);
int sgs_iface_tx_paging(struct vlr_subscr *vsub, enum sgsap_service_ind serv_ind);
int sgs_iface_tx_dtap_ud(struct msc_a *msc_a, struct msgb *msg);
void sgs_iface_tx_release(struct vlr_subscr *vsub);
+void sgs_iface_tx_serv_abrt(struct vlr_subscr *vsub);
diff --git a/src/libmsc/paging.c b/src/libmsc/paging.c
index 182b03682..743ce5c86 100644
--- a/src/libmsc/paging.c
+++ b/src/libmsc/paging.c
@@ -49,6 +49,10 @@ const struct value_string paging_cause_names[] = {
static void paging_response_timer_cb(void *data)
{
struct vlr_subscr *vsub = data;
+
+ if (vsub->cs.attached_via_ran == OSMO_RAT_EUTRAN_SGS)
+ sgs_iface_tx_serv_abrt(vsub);
+
paging_expired(vsub);
}
diff --git a/src/libmsc/sgs_iface.c b/src/libmsc/sgs_iface.c
index a4527f460..5ccded775 100644
--- a/src/libmsc/sgs_iface.c
+++ b/src/libmsc/sgs_iface.c
@@ -1256,6 +1256,28 @@ void sgs_iface_tx_release(struct vlr_subscr *vsub)
sgs_tx(mme->conn, msg_sgs);
}
+/*! Send SGsAP-SERVICE-ABORT-REQUEST message to MME
+ * \param[in] vsub subscriber context */
+void sgs_iface_tx_serv_abrt(struct vlr_subscr *vsub)
+{
+ struct msgb *msg_sgs;
+ struct sgs_mme_ctx *mme;
+
+ OSMO_ASSERT(vsub);
+
+ /* The service abort procedure is only defined for MT calls,
+ * see also 3GPP TS 29.118, chapter 5.13.2 */
+ if (vsub->sgs.paging_serv_ind != SGSAP_SERV_IND_CS_CALL)
+ return;
+
+ mme = sgs_mme_ctx_by_vsub(vsub, SGSAP_MSGT_DL_UD);
+ if (!mme)
+ return;
+
+ msg_sgs = gsm29118_create_service_abort_req(vsub->imsi);
+ sgs_tx(mme->conn, msg_sgs);
+}
+
/*! initalize SGs new interface
* \param[in] ctx talloc context
* \param[in] network associated gsm network