diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn index 074fa60f2..d15b2ecf0 100644 --- a/bsc/BSC_Tests.ttcn +++ b/bsc/BSC_Tests.ttcn @@ -5226,11 +5226,15 @@ private function f_ho_into_this_bsc(charstring id, template (omit) BSSMAP_oldToN } private function f_tc_ho_into_this_bsc(charstring id) runs on MSC_ConnHdlr { - var template PDU_ML3_NW_MS exp_rr_rel_tmpl := tr_RRM_RR_RELEASE; + var template PDU_ML3_NW_MS exp_rr_rel_tmpl; var template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit; if (not istemplatekind(g_pars.last_used_eutran_plmn, "omit")) { oldToNewBSSIEs := f_ts_BSSMAP_oldToNewBSSIEs(ts_BSSMAP_LastUsedEUTRANPLMNId(g_pars.last_used_eutran_plmn)); + } + if (g_pars.exp_fast_return) { exp_rr_rel_tmpl := tr_RRM_RR_RELEASE_CellSelectInd; + } else { + exp_rr_rel_tmpl := tr_RRM_RR_RELEASE; } f_ho_into_this_bsc(id, oldToNewBSSIEs); f_perform_clear(RSL, exp_rr_rel_tmpl); @@ -5278,10 +5282,26 @@ testcase TC_ho_into_this_bsc_tla_v6() runs on test_CT { testcase TC_srvcc_eutran_to_geran() runs on test_CT { var TestHdlrParams pars := f_gen_test_hdlr_pars(); pars.last_used_eutran_plmn := '323454'O; + pars.exp_fast_return := true; f_tc_ho_into_this_bsc_main(pars); f_shutdown_helper(); } +/* Same as TC_srvcc_eutran_to_geran, but test explicitly forbiding fast return + on the BTS. As a result, RR Release shouldn't contain the EUTRAN neighbor + list when the channel is released. */ +testcase TC_srvcc_eutran_to_geran_forbid_fast_return() runs on test_CT { + f_init_vty(); + f_vty_allow_srvcc_fast_return(true, 0) + + var TestHdlrParams pars := f_gen_test_hdlr_pars(); + pars.last_used_eutran_plmn := '323454'O; + pars.exp_fast_return := false; + f_tc_ho_into_this_bsc_main(pars); + f_vty_allow_srvcc_fast_return(false, 0); + f_shutdown_helper(); +} + private function f_tc_srvcc_eutran_to_geran_ho_out(charstring id) runs on MSC_ConnHdlr { var template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs; oldToNewBSSIEs := f_ts_BSSMAP_oldToNewBSSIEs(ts_BSSMAP_LastUsedEUTRANPLMNId(g_pars.last_used_eutran_plmn)); @@ -5289,15 +5309,16 @@ private function f_tc_srvcc_eutran_to_geran_ho_out(charstring id) runs on MSC_Co f_ho_out_of_this_bsc(oldToNewBSSIEs); setverdict(pass); } -/* First, HO into BSC from EUTRAN (SRVCC): HO Request contains "Old BSS to New - BSS Information" IE with "Last Used E-UTRAN PLMN Id". - Second, HO to another BSC: HO Required contains "Old BSS to New BSS Information" - IE with "Last Used E-UTRAN PLMN Id" from first step. */ -testcase TC_srvcc_eutran_to_geran_ho_out() runs on test_CT { + +private function f_tc_srvcc_eutran_to_geran_ho_out_main(boolean disable_fast_return) + runs on test_CT { var MSC_ConnHdlr vc_conn; var TestHdlrParams pars := f_gen_test_hdlr_pars(); f_init(1, true); + if (disable_fast_return) { + f_vty_allow_srvcc_fast_return(true, 0); + } f_sleep(1.0); f_ctrs_bsc_and_bts_init(); @@ -5316,9 +5337,26 @@ testcase TC_srvcc_eutran_to_geran_ho_out() runs on test_CT { f_ctrs_bsc_and_bts_add(0, "interbsc_ho_out:attempted", 1); f_ctrs_bsc_and_bts_add(0, "interbsc_ho_out:completed", 1); f_ctrs_bsc_and_bts_verify(); + + if (disable_fast_return) { + f_vty_allow_srvcc_fast_return(false, 0); + } f_shutdown_helper(); } +/* First, HO into BSC from EUTRAN (SRVCC): HO Request contains "Old BSS to New + BSS Information" IE with "Last Used E-UTRAN PLMN Id". + Second, HO to another BSC: HO Required contains "Old BSS to New BSS Information" + IE with "Last Used E-UTRAN PLMN Id" from first step. */ +testcase TC_srvcc_eutran_to_geran_ho_out() runs on test_CT { + f_tc_srvcc_eutran_to_geran_ho_out_main(false); +} +/* Validate subsequent intra-GSM-HO works the same (with OldBSSToNewBSSInfo IE) + * independently of fast-reture allowed/forbidden in local BTS */ +testcase TC_srvcc_eutran_to_geran_ho_out_forbid_fast_return() runs on test_CT { + f_tc_srvcc_eutran_to_geran_ho_out_main(true); +} + private function f_tc_ho_in_fail_msc_clears(charstring id) runs on MSC_ConnHdlr { var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH)); f_rslem_register(0, new_chan_nr); @@ -7306,6 +7344,19 @@ private function f_vty_allow_emerg_bts(boolean allow, integer bts_nr) runs on te f_vty_transceive(BSCVTY, "exit"); } +/* Allow/Forbid Fast Return after SRVCC on a given BTS via VTY */ +private function f_vty_allow_srvcc_fast_return(boolean allow, integer bts_nr) runs on test_CT { + f_vty_enter_cfg_bts(BSCVTY, bts_nr); + if (allow) { + f_vty_transceive(BSCVTY, "srvcc fast-return allow"); + } else { + f_vty_transceive(BSCVTY, "srvcc fast-return forbid"); + } + f_vty_transceive(BSCVTY, "exit"); + f_vty_transceive(BSCVTY, "exit"); + f_vty_transceive(BSCVTY, "exit"); +} + /* Begin assignmet procedure and send an EMERGENCY SETUP (RR) */ private function f_assignment_emerg_setup() runs on MSC_ConnHdlr { var PDU_ML3_MS_NW emerg_setup; @@ -8950,6 +9001,8 @@ control { } execute( TC_srvcc_eutran_to_geran() ); execute( TC_srvcc_eutran_to_geran_ho_out() ); + execute( TC_srvcc_eutran_to_geran_forbid_fast_return() ); + execute( TC_srvcc_eutran_to_geran_ho_out_forbid_fast_return() ); execute( TC_ho_in_fail_msc_clears() ); execute( TC_ho_in_fail_msc_clears_after_ho_detect() ); execute( TC_ho_in_fail_no_detect() ); diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn index c29ccd42e..a4f1f5104 100644 --- a/bsc/MSC_ConnectionHandler.ttcn +++ b/bsc/MSC_ConnectionHandler.ttcn @@ -590,6 +590,7 @@ type record TestHdlrParams { TestHdlrParamsMSCPool mscpool, boolean media_mgw_offer_ipv6, OCT3 last_used_eutran_plmn optional, + boolean exp_fast_return, /* RR Release expected to contain CellSelectInd ? */ boolean expect_channel_mode_modify, uint3_t expect_tsc optional }; @@ -628,6 +629,7 @@ template (value) TestHdlrParams t_def_TestHdlrPars := { }, media_mgw_offer_ipv6 := true, last_used_eutran_plmn := omit, + exp_fast_return := false, expect_channel_mode_modify := false, expect_tsc := omit }