pcu: Introduce TC_mt_ping_pong_with_dl_racap

Allows checking how pcu parses MS RA Capabilities coming from SGSN.

Change-Id: Iedd8ab278547471b72252743d93a0f9e11d7e787
This commit is contained in:
Pau Espin 2020-01-23 17:51:04 +01:00
parent e7cabe6f54
commit 2422d1fa82
2 changed files with 89 additions and 4 deletions

View File

@ -1091,6 +1091,58 @@ octetstring sdu) := {
}
}
private function f_presece_bit_MultislotCap_GPRS_BSSGP(template (omit) MultislotCap_GPRS_BSSGP mscap_gprs) return BIT1 {
if (istemplatekind(mscap_gprs, "omit")) {
return '0'B;
}
return '1'B;
}
private function f_presece_bit_MultislotCap_EGPRS_BSSGP(template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs) return BIT1 {
if (istemplatekind(mscap_egprs, "omit")) {
return '0'B;
}
return '1'B;
}
template (value) MSRACapabilityValuesRecord_BSSGP ts_RaCapRec_BSSGP(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS_BSSGP mscap_gprs := omit, template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs := omit) := {
mSRACapabilityValues := {
mSRACapabilityValuesExclude1111 := {
accessTechnType := att, /* E-GSM */
accessCapabilities := {
lengthIndicator := 0, /* overwritten */
accessCapabilities := {
rfPowerCapability := '001'B, /* FIXME */
presenceBitA5 := '0'B,
a5bits := omit,
esind := '1'B,
psbit := '0'B,
vgcs := '0'B,
vbs := '0'B,
presenceBitMultislot := '1'B,
multislotcap := {
presenceBitHscsd := '0'B,
hscsdmultislotclass := omit,
presenceBitGprs := f_presece_bit_MultislotCap_GPRS_BSSGP(mscap_gprs),
gprsmultislot := mscap_gprs,
presenceBitSms := '0'B,
multislotCap_SMS := omit,
multislotCapAdditionsAfterRel97 := {
presenceBitEcsdmulti := '0'B,
ecsdmultislotclass := omit,
presenceBitEgprsmulti := f_presece_bit_MultislotCap_EGPRS_BSSGP(mscap_egprs),
multislotCap_EGPRS := mscap_egprs,
presenceBitDtmGprsmulti := '0'B,
multislotCapdtmgprsmultislotsubclass := omit
}
},
accessCapAdditionsAfterRel97 := omit
},
spare_bits := omit
}
}
},
presenceBitMSRACap := '0'B
};
template QoS_Profile_V t_defaultQos := {
peak_Bit_Rate := int2oct(80, 2),
precedence := '000'B,
@ -1133,13 +1185,30 @@ octetstring sdu) := {
cnSpecificDRXCycleLength := '0000'B
}
template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu) := {
function ts_BSSGP_IE_MSRAcap_omit(template (omit) MSRadioAccessCapabilityV_BSSGP racap) return template (omit) MS_Radio_Access_Capability {
var template (omit) MS_Radio_Access_Capability ret;
if (istemplatekind(racap, "omit")) {
return omit;
} else {
ret := {
iEI := '00'O,
ext := '1'B,
lengthIndicator := {
length1 := 1
},
mSRadioAccessCapabilityV_BSSGP := racap
}
return ret;
}
}
template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu, template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
pDU_BSSGP_DL_UNITDATA := {
bssgpPduType := '00'O,
tLLI_current := tlli,
qoS_Profile := t_defaultQos,
pDU_Lifetime := t_DefaultLifetime(65535),
mS_Radio_Access_Capability := omit,
mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap),
priority := omit,
dRX_Parameters := omit,
iMSI := omit,

View File

@ -1202,7 +1202,7 @@ testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
/* Test scenario where SGSN wants to send some data against MS and it is
* answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
*/
testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
var GsmRrMessage rr_imm_ass;
var PacketUlAssign ul_tbf_ass;
var PacketDlAssign dl_tbf_ass;
@ -1225,7 +1225,7 @@ testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);
/* SGSN sends some DL data, PCU will page on CCCH (PCH) */
BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));
BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data, ms_racap));
f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);
ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);
@ -1264,6 +1264,21 @@ testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));
}
testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
f_TC_mt_ping_pong(omit);
}
/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
/* information about the MS */
testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
var MultislotCap_GPRS_BSSGP mscap_gprs := {
gprsmultislotclass := '00011'B,
gprsextendeddynalloccap := '0'B
} ;
var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
f_TC_mt_ping_pong(ms_racap);
}
/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
* will retry by retransmitting both the IMM ASS + DL block after poll (ack)
* timeout occurs (specified by sent RRBP on DL block). */
@ -1503,6 +1518,7 @@ control {
execute( TC_t3193() );
execute( TC_mo_ping_pong() );
execute( TC_mt_ping_pong() );
execute( TC_mt_ping_pong_with_dl_racap() );
execute( TC_imm_ass_dl_block_retrans() );
execute( TC_paging_cs_from_bts() );
execute (TC_paging_cs_from_sgsn_sign() );