From d81b28293a5e2c49375e890797e8ad73b199ca61 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Feb 2019 16:27:10 +0100 Subject: MSC: Verify CSFB INDICATOR is present in CLEAR COMMAND When a CSFB voice call is cleared by the MCS, it must include the CSFB INDICATOR in order to trigger the BSC to perform actions required for Fast Return to LTE. This patch changes TC_sgsap_lu_and_mt_call() and TC_bssap_lu_sgsap_lu_and_mt_call() to ensure the CSFB INDICATOR IE is present as expected. Change-Id: I6ce3a34f85aca7143cf7925cb9319bc679e8d395 --- library/BSSMAP_Templates.ttcn | 15 +++++++++++++++ msc/BSC_ConnectionHandler.ttcn | 9 +++++++-- msc/MSC_Tests.ttcn | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn index a30b8e71..b538095c 100644 --- a/library/BSSMAP_Templates.ttcn +++ b/library/BSSMAP_Templates.ttcn @@ -638,6 +638,21 @@ template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := { } } +template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := { + pdu := { + bssmap := { + clearCommand := { + messageType := '20'O, /* overwritten */ + layer3HeaderInfo := *, + cause := ?, + cSFB_Indication := { + elementIdentifier := '8F'O + } + } + } + } +} + template (value) PDU_BSSAP ts_BSSMAP_ClearComplete modifies ts_BSSAP_BSSMAP := { pdu := { diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn index 7b881923..b0410075 100644 --- a/msc/BSC_ConnectionHandler.ttcn +++ b/msc/BSC_ConnectionHandler.ttcn @@ -646,13 +646,18 @@ runs on BSC_ConnHdlr { setverdict(pass); } -function f_call_hangup(inout CallParameters cpars, boolean release_by_ms) +function f_call_hangup(inout CallParameters cpars, boolean release_by_ms, boolean is_csfb := false) runs on BSC_ConnHdlr { var MobileIdentityLV mi; var MNCC_PDU mncc; var MgcpCommand mgcp_cmd; var boolean respond_to_dlcx; + var template PDU_BSSAP t_clear := tr_BSSMAP_ClearCommand; + + if (is_csfb) { + t_clear := tr_BSSMAP_ClearCommandCSFB; + } MNCC.send(ts_MNCC_DISC_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23)))); BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id))); @@ -673,7 +678,7 @@ runs on BSC_ConnHdlr { /* clearing of radio channel */ interleave { - [] BSSAP.receive(tr_BSSMAP_ClearCommand) { + [] BSSAP.receive(t_clear) { BSSAP.send(ts_BSSMAP_ClearComplete); BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND); } diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn index 00f9bec1..7129f81e 100644 --- a/msc/MSC_Tests.ttcn +++ b/msc/MSC_Tests.ttcn @@ -4471,7 +4471,7 @@ private function f_mt_lu_and_csfb_call(charstring id, BSC_ConnHdlrPars pars, boo /* Complete the call, hold it for some time and then tear it down */ f_mt_call_complete(cpars); f_sleep(3.0); - f_call_hangup(cpars, true); + f_call_hangup(cpars, true, is_csfb := true); /* Make sure that subscriber is still present and the SGs association is in tact (ref-counting) */ f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED"); -- cgit v1.2.3