@ -101,6 +101,11 @@ type record lqual_range {
}
type component RAW_PCU_Test_CT extends bssgp_CT {
/* PCU interface abstraction component */
var RAW_PCUIF_CT vc_PCUIF;
/* Virtual BTS component */
var RAW_PCU_BTS_CT vc_BTS;
/* Connection to the BTS component (one for now) */
port RAW_PCU_MSG_PT BTS;
/* Connection to the PCUIF component */
@ -140,7 +145,7 @@ type component RAW_PCU_Test_CT extends bssgp_CT {
private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
[] g_T_guard.timeout {
setverdict(fail, "Timeout of T_guard");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
@ -189,9 +194,6 @@ private function f_init_vty(charstring id) runs on RAW_PCU_Test_CT {
function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
runs on RAW_PCU_Test_CT {
var RAW_PCUIF_CT vc_PCUIF;
var RAW_PCU_BTS_CT vc_BTS;
/* Start the guard timer */
g_T_guard.start;
activate(as_Tguard_RAW());
@ -215,6 +217,26 @@ runs on RAW_PCU_Test_CT {
BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
}
private function f_shutdown(charstring file, integer line,
boolean final := false)
runs on RAW_PCU_Test_CT {
/* Determine if the test case was aborted in the middle */
if (not final) {
log("Test case ", testcasename(), " aborted at ", file, ":", line);
} else {
/* Guard verdict to avoid 'none' */
setverdict(pass);
}
/* Properly shutdown virtual BTS and its clock generator */
BTS.send(ts_RAW_PCU_CMD(GENERAL_CMD_SHUTDOWN));
vc_BTS.done; /* wait untill it's done */
/* Shutdown the others and MTC */
all component.stop;
mtc.stop;
}
template AckNackDescription t_AckNackDescription_init := {
final_ack := '0'B,
starting_seq_nr := 0,
@ -432,7 +454,7 @@ runs on RAW_PCU_Test_CT {
rr_imm_ass := dec_GsmRrMessage(macblock);
if (not match(rr_imm_ass, tr_IMM_TBF_ASS())) {
setverdict(fail, "Failed to match Immediate Assignment: ", rr_imm_ass);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
f_pcuif_tx_data_cnf(pcu_msg);
}
@ -461,13 +483,13 @@ runs on RAW_PCU_Test_CT return GsmRrMessage {
rr_pag_req1 := dec_GsmRrMessage(macblock);
if (not match(rr_pag_req1, tr_PAG_REQ1(tr_MI_LV(mi1)))) {
setverdict(fail, "Failed to match Paging Request Type 1: ", rr_pag_req1);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Make sure that received paging froup matches the expected one */
if (not match(pag_group_rx, pag_group)) {
setverdict(fail, "Paging group", pag_group_rx, " does not match expected ", pag_group);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
f_pcuif_tx_data_cnf(pcu_msg);
@ -515,7 +537,7 @@ runs on RAW_PCU_Test_CT {
var CodingScheme cs_mcs := f_rlcmac_block_len2cs_mcs(len)
if (not match(f_rlcmac_block_len2cs_mcs(len), exp_cs_mcs)) {
setverdict(fail, "Failed to match Coding Scheme exp ", exp_cs_mcs, " vs ", cs_mcs, " (", len, ")");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
@ -526,7 +548,7 @@ runs on RAW_PCU_Test_CT {
f_rx_rlcmac_dl_block(dl_block, dl_fn);
if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK(ul_tfi := ?, tlli := ?))) {
setverdict(fail, "Failed to match Packet Uplink ACK / NACK");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);
@ -539,7 +561,7 @@ runs on RAW_PCU_Test_CT {
f_rx_rlcmac_dl_block(dl_block, dl_fn);
if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
setverdict(fail, "Failed to match Packet DUMMY DL");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
@ -550,7 +572,7 @@ runs on RAW_PCU_Test_CT {
f_rx_rlcmac_dl_block(dl_block, dl_fn);
if (not match(dl_block, tr_RLCMAC_DL_PACKET_ASS())) {
setverdict(fail, "Failed to match Packet Downlink Assignment");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);
@ -563,7 +585,7 @@ runs on RAW_PCU_Test_CT {
f_rx_rlcmac_dl_block(dl_block, dl_fn);
if (not match(dl_block, tr_RLCMAC_UL_PACKET_ASS())) {
setverdict(fail, "Failed to match Packet Uplink Assignment");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);
@ -577,12 +599,15 @@ runs on RAW_PCU_Test_CT {
f_rx_rlcmac_dl_block(dl_block, dl_fn);
if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ())) {
setverdict(fail, "Failed to match Packet Paging Request: ", dl_block, " vs ", tr_RLCMAC_PACKET_PAG_REQ());
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)
{
private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn,
out uint32_t ack_fn, octetstring data,
template (present) uint7_t exp_bsn := ?,
template (present) CodingScheme exp_cs := ?)
runs on RAW_PCU_Test_CT {
log("verifying dl data block (gprs): ", dl_block);
ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp);
@ -594,31 +619,34 @@ private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint
if (lengthof(dl_block.data.blocks) < 1) {
setverdict(fail, "DL block has no LLC payload: ", dl_block);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
if (ispresent(dl_block.data.blocks[0].hdr) and dl_block.data.blocks[0].hdr.length_ind != lengthof(data)) {
setverdict(fail, "DL block has LLC header with wrong expected size: ",
dl_block.data.blocks[0].hdr.length_ind, " vs ", lengthof(data));
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
if (dl_block.data.blocks[0].payload != data) {
setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Check next data blocks contain dummy frames */
if (lengthof(dl_block.data.blocks) > 1 and substr(dl_block.data.blocks[1].payload, 0, 3) != '43C001'O) {
setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* TODO: check exp_cs */
}
private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint14_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)
{
private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn,
out uint32_t ack_fn, octetstring data,
template (present) uint14_t exp_bsn := ?,
template (present) CodingScheme exp_cs := ?)
runs on RAW_PCU_Test_CT {
log("verifying dl data block (egprs): ", dl_block);
ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data_egprs.mac_hdr.rrbp);
@ -630,31 +658,34 @@ private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uin
if (lengthof(dl_block.data_egprs.blocks) < 1) {
setverdict(fail, "DL block has no LLC payload: ", dl_block);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
if (ispresent(dl_block.data_egprs.blocks[0].hdr) and dl_block.data_egprs.blocks[0].hdr.length_ind != lengthof(data)) {
setverdict(fail, "DL block has LLC header with wrong expected size: ",
dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data));
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
if (dl_block.data_egprs.blocks[0].payload != data) {
setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Check next data blocks contain dummy frames */
if (lengthof(dl_block.data_egprs.blocks) > 1 and substr(dl_block.data_egprs.blocks[1].payload, 0, 3) != '43C001'O) {
setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* TODO: Check exp_cs. In the case of EGPRS, first check mac_hdr.header_type and then decode CPS = exp_cs based on mac_hdr.header_type.
See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */
}
private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)
private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn,
octetstring data,
template (present) uint7_t exp_bsn := ?,
template (present) CodingScheme exp_cs := ?)
runs on RAW_PCU_Test_CT {
var PCUIF_Message pcu_msg;
var uint32_t dl_fn;
@ -668,7 +699,7 @@ runs on RAW_PCU_Test_CT {
dl_template.data_egprs.blocks := ?;
if (not match(dl_block, dl_template)) {
setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
is_egprs := true;
}
@ -705,6 +736,8 @@ testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
}
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Test of correct Timing Advance at the time of TBF establishment
@ -723,7 +756,7 @@ testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_msg, bts_nr := 0, ta := ta);
if (not ok) {
setverdict(fail, "Failed to establish an Uplink TBF");
mtc.stop ;
break ;
}
/* Make sure Timing Advance IE matches out expectations */
@ -731,9 +764,11 @@ testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
setverdict(fail, "Timing Advance mismatch: ",
rr_msg.payload.imm_ass.timing_advance,
" vs expected ", ta);
mtc.stop ;
break ;
}
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
@ -764,8 +799,9 @@ testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
* the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
if (not match(rr_imm_ass, tr_IMM_TBF_ASS(ta := 0))) {
setverdict(fail, "Timing Advance value doesn't match");
mtc.stop;
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Verify that the PCU generates valid PTCCH/D messages
@ -792,7 +828,7 @@ testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
[] BTS.receive(PCUIF_Message:?) { repeat; }
[] T.timeout {
setverdict(fail, "Timeout waiting for a PTCCH/D block");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
@ -803,8 +839,9 @@ testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
* TODO: do we expect all TA values to be equal '1111111'B? */
if (not match(ptcch_msg, tr_PTCCHDownlinkMsg)) {
setverdict(fail, "Malformed PTCCH/D message");
mtc.stop;
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Test of correct Timing Advance during an active Uplink TBF.
@ -856,7 +893,9 @@ runs on RAW_PCU_Test_CT {
/* Send Access Bursts on PTCCH/U for every TA Index */
[] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
if (ss < 0) { mtc.stop; } /* Shall not happen */
if (ss < 0) { /* Shall not happen */
f_shutdown(__BFILE__, __LINE__);
}
log("Sending an Access Burst on PTCCH/U",
", sub-slot=", ss, " (TAI)",
@ -898,16 +937,13 @@ runs on RAW_PCU_Test_CT {
log("Rx PTCCH/D message: ", ta_msg);
/* Make sure Timing Advance values match our expectations */
if (match(ta_msg, t_ta_msg)) {
setverdict(pass);
} else {
if (not match(ta_msg, t_ta_msg)) {
setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
}
}
[] BTS.receive { repeat; }
[] T.timeout {
setverdict(fail, "Timeout waiting for a PTCCH/D block");
mtc.stop;
}
}
}
@ -929,7 +965,7 @@ testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_msg[i], ta := 0);
if (not ok) {
setverdict(fail, "Failed to establish an Uplink TBF #", i);
mtc.stop ;
break ;
}
/* Make sure we received an UL TBF Assignment */
@ -938,14 +974,14 @@ testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
log("Rx Uplink TBF assignment for #", i, ": ", ul_tbf_ass[i]);
} else {
setverdict(fail, "Failed to match UL TBF Assignment for #", i);
mtc.stop ;
break ;
}
/* We expect incremental TFI/USF assignment (dynamic allocation) */
t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
if (not match(ul_tbf_ass[i], t_ul_tbf_ass)) {
setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
mtc.stop ;
break ;
}
/* We also expect Timing Advance Index to be a part of the assignment */
@ -979,6 +1015,8 @@ testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
/* Other values are out of our interest */
tai6_ta := ?));
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
@ -1010,13 +1048,13 @@ testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(
@ -1068,10 +1106,10 @@ testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
} else {
setverdict(pass);
}
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Test the max UL CS set by VTY works fine */
@ -1099,13 +1137,13 @@ testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(
@ -1133,11 +1171,8 @@ testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
if (last_ch_coding != CH_CODING_CS3) {
setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
mtc.stop;
}
setverdict(pass);
/* Remaining UL blocks are used to make sure regardless of initial
/* lqual, we can go lower at any time */
@ -1158,9 +1193,9 @@ testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
if (last_ch_coding != CH_CODING_CS1) {
setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
} else {
setverdict(pass);
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Test the max UL CS set by VTY works fine */
@ -1184,13 +1219,13 @@ testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(
@ -1219,9 +1254,9 @@ testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
if (last_ch_coding != CH_CODING_CS3) {
setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
} else {
setverdict(pass);
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Verify PCU drops TBF after some time of inactivity. */
@ -1254,13 +1289,13 @@ testcase TC_t3169() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Send one UL block and make sure it is ACKED fine */
@ -1275,6 +1310,8 @@ testcase TC_t3169() runs on RAW_PCU_Test_CT {
/* Send an UL block once again, the TBF should be gone by now so no ACK */
f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);
f_rx_rlcmac_dl_block_exp_dummy(dl_block);
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
@ -1306,7 +1343,7 @@ testcase TC_t3193() runs on RAW_PCU_Test_CT {
ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not a Downlink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
@ -1329,6 +1366,8 @@ testcase TC_t3193() runs on RAW_PCU_Test_CT {
f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);
f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);
f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
@ -1360,12 +1399,12 @@ private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_r
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
if (not istemplatekind(ms_racap, "omit")) {
@ -1376,7 +1415,7 @@ private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_r
f_rx_rlcmac_dl_block_exp_pkt_ul_ass(dl_block, sched_fn);
if (dl_block.ctrl.payload.u.ul_assignment.identity.tlli.tlli != tlli) {
setverdict(fail, "Wrong TLLI ", dl_block.ctrl.payload.u.ul_assignment.identity.tlli, " received vs exp ", tlli);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
@ -1396,7 +1435,7 @@ private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_r
ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not a Downlink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
@ -1406,6 +1445,8 @@ private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_r
/* ACK the DL block */
f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);
f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);
f_shutdown(__BFILE__, __LINE__, final := true);
}
/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
@ -1460,7 +1501,7 @@ private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSG
ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not a Downlink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
@ -1475,12 +1516,12 @@ private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSG
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Send one UL block and make sure it is ACKED fine */
@ -1491,6 +1532,8 @@ private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSG
/* UL block should be received in SGSN */
BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));
f_shutdown(__BFILE__, __LINE__, final := true);
}
testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
@ -1539,7 +1582,7 @@ testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not a Downlink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
@ -1553,7 +1596,7 @@ testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not a Downlink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
@ -1562,35 +1605,40 @@ testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
/* ACK the DL block */
f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);
f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);
f_shutdown(__BFILE__, __LINE__, final := true);
}
private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi) {
private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi)
runs on RAW_PCU_Test_CT {
var MobileIdentityLV_Paging mi_lv := req.repeated_pageinfo.cs.mobile_identity;
var MobileIdentityV mi := dec_MobileIdentityV(mi_lv.mobile_id);
if (mi_lv.len != 8) { /* 8 octets: type of ID (3 bits) + even/odd flag (1 bit) + 15 BCD-encoded digits (60 bits) */
setverdict(fail, "Mobile Identity length mismatch: ",
"expected: 8, got: ", mi_lv.len);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Make sure MI contains IMSI before referencing it */
if (mi.typeOfIdentity != '001'B) {
setverdict(fail, "Mobile Identity must be of type IMSI ('001'B), ",
"got: ", mi.typeOfIdentity);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
} else if (mi.oddEvenInd_identity.imsi.digits != imsi) {
setverdict(fail, "Mobile Identity contains unexpected IMSI, ",
"expected: ", imsi, " got: ", mi.oddEvenInd_identity.imsi.digits);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
private function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi) {
private function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi)
runs on RAW_PCU_Test_CT {
var MobileIdentityLV_Paging mi_lv := req.repeated_pageinfo.cs.mobile_identity;
if (not match(req.repeated_pageinfo.cs.tmsi, tmsi)) {
setverdict(fail, "Mobile Identity (TMSI/P-TMSI) mismatch: ",
"expected: ", tmsi, "got: ", req.repeated_pageinfo.cs.tmsi);
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
}
@ -1626,13 +1674,13 @@ testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
@ -1649,7 +1697,7 @@ testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
/* Make sure that Packet Paging Request contains the same IMSI */
f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);
setverdict(pass );
f_shutdown(__BFILE__, __LINE__, final := true );
}
/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
@ -1678,13 +1726,13 @@ runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_imm_ass);
if (not ok) {
setverdict(fail, "Failed to establish TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);
if (not ok) {
setverdict(fail, "Immediate Assignment not an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
/* Send paging request with or without TMSI */
@ -1705,7 +1753,7 @@ runs on RAW_PCU_Test_CT {
f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);
}
setverdict(pass );
f_shutdown(__BFILE__, __LINE__, final := true );
}
testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
@ -1749,7 +1797,7 @@ runs on RAW_PCU_Test_CT {
f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
}
setverdict(pass );
f_shutdown(__BFILE__, __LINE__, final := true );
}
testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
@ -1778,12 +1826,12 @@ runs on RAW_PCU_Test_CT {
ok := f_establish_tbf(rr_msg, ra := ra11, is_11bit := 1, burst_type := bt);
if (not ok) {
setverdict(fail, "Failed to establush an Uplink TBF");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
if (not match(rr_msg, t_imm_ass)) {
setverdict(fail, "Immediate Assignment does not match");
mtc.stop ;
f_shutdown(__BFILE__, __LINE__) ;
}
setverdict(pass);
@ -1813,6 +1861,8 @@ testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
f_TC_egprs_pkt_chan_req(req, imm_ass);
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
@ -1845,6 +1895,8 @@ testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
f_TC_egprs_pkt_chan_req(req, imm_ass);
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
@ -1875,6 +1927,8 @@ testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
f_TC_egprs_pkt_chan_req(req, imm_ass);
}
f_shutdown(__BFILE__, __LINE__, final := true);
}
control {