MSC: Verify CSFB INDICATOR is present in CLEAR COMMAND

When a CSFB voice call is cleared by the MSC, 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
This commit is contained in:
Harald Welte 2019-02-17 16:27:10 +01:00
parent b1b853a8ec
commit 4c422b76ff
3 changed files with 23 additions and 3 deletions

View File

@ -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 := {

View File

@ -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);
}

View File

@ -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");