bsc: add TC_cm_reestablishment
Related: SYS#5130 Change-Id: I1e7d446644f46b8a0a94688e618ffb4f23a8900e
This commit is contained in:
parent
da4367875a
commit
feda88e51d
|
@ -9434,6 +9434,141 @@ testcase TC_reassignment_fr() runs on test_CT {
|
|||
f_shutdown_helper();
|
||||
}
|
||||
|
||||
const charstring REEST_LOST_CONNECTION := "REEST_LOST_CONNECTION";
|
||||
const charstring REEST_CLEAR := "REEST_CLEAR";
|
||||
const charstring REEST_CLEAR_DONE := "REEST_CLEAR_DONE";
|
||||
|
||||
/* CM Re-Establishment, 3GPP TS 24.008 4.5.1.6.
|
||||
* The MS <-> BTS loses radio connection, MS shows up on second BTS and asks for CM Re-Establishment.
|
||||
* BSC should establish a separate A conn for the same MS, the original A conn is then cleared by
|
||||
* the MSC as the CM Re-Establishment is handled.
|
||||
*
|
||||
* MS bts0 bts1 bsc msc test-component
|
||||
* |<----->|<----------------->|<-0-->| _1 Establish channel on bts 0
|
||||
* | | _1 wait a bit, to settle down
|
||||
* |<-x x--| | _1 "lose connection"
|
||||
* | | REEST_LOST_CONNECTION
|
||||
* |----------------->|------->|--1-->| _2 new A-conn: Chan Rqd, Imm Ass, Compl L3 with CM Re-Establishment Req
|
||||
* | | REEST_CLEAR
|
||||
* | |<-0---| _1 Clear Command on first A-conn
|
||||
* | |--0-->| _1 Clear Complete
|
||||
* | |<----------------->| | _1 Release first channel
|
||||
* | | REEST_CLEAR_DONE
|
||||
* |<-----------------|<-------|<-1---| _2 Chan Activ, Assignment Command
|
||||
* |<-----------------|<-------|<-1---| _2 Clear Command, Release
|
||||
*
|
||||
*/
|
||||
private function f_tc_cm_reestablishment_1(charstring id) runs on MSC_ConnHdlr {
|
||||
var template PDU_BSSAP exp_compl := f_gen_exp_compl();
|
||||
var PDU_BSSAP ass_cmd := f_gen_ass_req();
|
||||
|
||||
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
|
||||
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
|
||||
|
||||
f_establish_fully(ass_cmd, exp_compl);
|
||||
|
||||
/* The original channel loses connection, MS attemts CM Re-Establishment on another cell, see
|
||||
* f_tc_cm_reestablishment_2(). This established channel stays active until MSC sends a Clear Command. The time
|
||||
* when exactly that happens is determined by f_tc_cm_reestablishment_2(). */
|
||||
f_sleep(2.0);
|
||||
COORD.send(REEST_LOST_CONNECTION);
|
||||
|
||||
alt {
|
||||
[] COORD.receive(REEST_CLEAR);
|
||||
[] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {
|
||||
setverdict(fail, "Unexpected channel release");
|
||||
mtc.stop;
|
||||
}
|
||||
[] RSL.receive(tr_RSL_RF_CHAN_REL(g_chan_nr)) {
|
||||
setverdict(fail, "Unexpected channel release");
|
||||
mtc.stop;
|
||||
}
|
||||
}
|
||||
f_perform_clear()
|
||||
f_expect_dlcx_conns();
|
||||
COORD.send(REEST_CLEAR_DONE);
|
||||
}
|
||||
|
||||
private function f_tc_cm_reestablishment_2(charstring id) runs on MSC_ConnHdlr {
|
||||
f_MscConnHdlr_init(g_pars.media_nr, host_bts, host_mgw_mgcp, FR_AMR);
|
||||
|
||||
/* The MS lost the connection on the first channel, now establishes another one */
|
||||
COORD.receive(REEST_LOST_CONNECTION);
|
||||
|
||||
var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
|
||||
var PDU_ML3_MS_NW l3_info := valueof(ts_CM_REESTABL_REQ(mi));
|
||||
var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info);
|
||||
|
||||
f_create_bssmap_exp(l3_enc);
|
||||
RSL_Emulation.f_chan_est(g_pars.ra, l3_enc, g_pars.link_id, g_pars.fn);
|
||||
BSSAP.receive(tr_BSSMAP_ComplL3(l3_enc));
|
||||
|
||||
/* MSC got the CM Re-Establishment request and first off clears the previous conn. */
|
||||
COORD.send(REEST_CLEAR);
|
||||
COORD.receive(REEST_CLEAR_DONE);
|
||||
|
||||
f_sleep(2.0);
|
||||
|
||||
/* Answer the CM Re-Establishment with an Assignment Command. */
|
||||
var template PDU_BSSAP expect_assignment_compl := f_gen_exp_compl();
|
||||
var PDU_BSSAP ass_cmd := f_gen_ass_req();
|
||||
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
|
||||
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
|
||||
|
||||
var AssignmentState st := valueof(ts_AssignmentStateInit);
|
||||
st.voice_call := true;
|
||||
st.is_assignment := true;
|
||||
|
||||
var ExpectCriteria mgcpcrit := {
|
||||
connid := omit,
|
||||
endpoint := omit,
|
||||
transid := omit
|
||||
};
|
||||
f_create_mgcp_expect(mgcpcrit);
|
||||
|
||||
f_rslem_dchan_queue_enable();
|
||||
|
||||
BSSAP.send(ass_cmd);
|
||||
|
||||
var PDU_BSSAP bssap;
|
||||
|
||||
alt {
|
||||
[] as_assignment(st);
|
||||
[] as_Media();
|
||||
[st.assignment_done] BSSAP.receive(expect_assignment_compl) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
f_sleep(3.0);
|
||||
|
||||
f_logp(BSCVTY, "f_tc_cm_reestablishment_2 clearing");
|
||||
f_perform_clear();
|
||||
f_expect_dlcx_conns();
|
||||
}
|
||||
|
||||
testcase TC_cm_reestablishment() runs on test_CT {
|
||||
var TestHdlrParams pars1 := f_gen_test_hdlr_pars();
|
||||
var MSC_ConnHdlr vc_conn1;
|
||||
|
||||
var TestHdlrParams pars2 := f_gen_test_hdlr_pars();
|
||||
var MSC_ConnHdlr vc_conn2;
|
||||
pars2.imsi := pars1.imsi;
|
||||
pars2.media_nr := 2;
|
||||
|
||||
f_init(2, true, guard_timeout := 40.0);
|
||||
f_sleep(1.0);
|
||||
|
||||
vc_conn1 := f_start_handler_create(pars1);
|
||||
vc_conn2 := f_start_handler_create(pars2);
|
||||
connect(vc_conn1:COORD, vc_conn2:COORD);
|
||||
f_start_handler_run(vc_conn1, refers(f_tc_cm_reestablishment_1), pars1);
|
||||
f_start_handler_run(vc_conn2, refers(f_tc_cm_reestablishment_2), pars2);
|
||||
vc_conn1.done;
|
||||
vc_conn2.done;
|
||||
|
||||
f_shutdown_helper();
|
||||
}
|
||||
|
||||
control {
|
||||
/* CTRL interface testing */
|
||||
|
@ -9722,6 +9857,8 @@ control {
|
|||
execute( TC_refuse_mode_modif_to_vamos() );
|
||||
|
||||
execute( TC_reassignment_fr() );
|
||||
|
||||
execute( TC_cm_reestablishment() );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -372,6 +372,27 @@ template (value) PDU_ML3_MS_NW ts_CM_SERV_REQ(CmServiceType serv_type, MobileIde
|
|||
}
|
||||
}
|
||||
|
||||
template (value) PDU_ML3_MS_NW ts_CM_REESTABL_REQ(MobileIdentityLV mi_lv) := {
|
||||
discriminator := '0000'B, /* overwritten */
|
||||
tiOrSkip := {
|
||||
skipIndicator := '0000'B
|
||||
},
|
||||
msgs := {
|
||||
mm := {
|
||||
cMReEstablReq := {
|
||||
messageType := '000000'B, /* overwritten */
|
||||
nsd := '00'B,
|
||||
cipheringKeySequenceNumber := { '000'B, '0'B },
|
||||
spare := '0000'B,
|
||||
mobileStationClassmark2 := ts_CM2,
|
||||
mobileIdentityLV := mi_lv,
|
||||
locationAreaIdentification := omit,
|
||||
deviceProperties := omit
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template (value) CipheringKeySequenceNumberV ts_CKSN(integer key_seq) := {
|
||||
keySequence := int2bit(key_seq, 3),
|
||||
spare := '0'B
|
||||
|
|
Loading…
Reference in New Issue