From 002fb01faa5c19820c7dfedffc4f768f1b9145b9 Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Tue, 24 Sep 2019 09:26:47 +0200 Subject: [PATCH] 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 --- include/osmocom/msc/sgs_iface.h | 1 + src/libmsc/paging.c | 4 ++++ src/libmsc/sgs_iface.c | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+) 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