pcu: Introduce test TC_mo_ping_pong_with_ul_racap
Test sending MS RA capabilities through Packet Resource Request to
update GPRS multislot class.
EGPRS multislot will come in a later commit.
Change-Id: I5026d8b78a3fb82093956b65989d18fa6f6d5424
diff --git a/bsc-nat/gen_links.sh b/bsc-nat/gen_links.sh
index 5da9d4e..471753e 100755
--- a/bsc-nat/gen_links.sh
+++ b/bsc-nat/gen_links.sh
@@ -52,7 +52,7 @@
gen_links $DIR $FILES
DIR=../library
-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_VTY_Functions.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn BSSAP_CodecPort.ttcn"
+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn RLCMAC_CSN1_Types.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_VTY_Functions.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn BSSAP_CodecPort.ttcn"
gen_links $DIR $FILES
ignore_pp_results
diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn
index 7c22415..8af9acc 100644
--- a/library/L3_Templates.ttcn
+++ b/library/L3_Templates.ttcn
@@ -20,6 +20,7 @@
import from MobileL3_CC_Types all;
import from MobileL3_GMM_SM_Types all;
import from MobileL3_SMS_Types all;
+import from RLCMAC_CSN1_Types all;
/* TS 24.007 Table 11.3 TI Flag */
const BIT1 c_TIF_ORIG := '0'B;
@@ -2012,33 +2013,6 @@
cnSpecificDRXCycleLength := '0000'B /* SI value used */
};
-template (value) AccessCapabilitiesStruct ts_AccesssCap := {
- 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 := '0'B,
- multislotcap := omit,
- accessCapAdditionsAfterRel97 := omit
- },
- spare_bits := omit
-}
-
-template (value) MSRACapabilityValuesRecord ts_RaCapRec(BIT4 att) := {
- mSRACapabilityValues := {
- mSRACapabilityValuesExclude1111 := {
- accessTechnType := '0001'B, /* E-GSM */
- accessCapabilities := ts_AccesssCap
- }
- },
- presenceBitMSRACap := '0'B
-};
-
template (value) MSRadioAccessCapabilityLV ts_MS_RaCapa := {
lengthIndicator := 0, /* overwritten */
msRadioAccessCapabilityV := {
diff --git a/library/RLCMAC_CSN1_Types.ttcn b/library/RLCMAC_CSN1_Types.ttcn
index 9ceb339..b545368 100644
--- a/library/RLCMAC_CSN1_Types.ttcn
+++ b/library/RLCMAC_CSN1_Types.ttcn
@@ -420,10 +420,9 @@
variant (tlli) "BYTEORDER(first)"
};
- /* 12.30 MS Radio Access Capability 2 (feature bitmask)
- * (value part, see 3GPP TS 24.008, 10.5.5.12a) */
+ /* TS 44.060 sec 12.30 MS Radio Access Capability 2
+ * (for value part, see 3GPP TS 24.008 sec 10.5.5.12a and table 10.5.146) */
type union MSRadioAccCap2 {
- /* TODO: see table 10.5.146/3GPP TS 24.008 */
MSRadioAccessCapabilityV msRadioAccessCapabilityV
};
@@ -676,10 +675,88 @@
}
}
- template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_RES_REQ(
- GprsTlli tlli, ChannelReqDescription ch_req_desc,
- RlcAccessType acc_type := RLC_ACC_TYPE_TWO_PHASE
- ) := {
+ private function f_presence_bit_MultislotCap_GPRS(template (omit) MultislotCap_GPRS mscap_gprs) return BIT1 {
+ if (istemplatekind(mscap_gprs, "omit")) {
+ return '0'B;
+ }
+ return '1'B;
+ }
+ private function f_presence_bit_MultislotCap_EGPRS(template (omit) MultislotCap_EGPRS mscap_egprs) return BIT1 {
+ if (istemplatekind(mscap_egprs, "omit")) {
+ return '0'B;
+ }
+ return '1'B;
+ }
+ template (value) MSRACapabilityValuesRecord ts_RaCapRec(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS mscap_gprs := omit, template (omit) MultislotCap_EGPRS 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_presence_bit_MultislotCap_GPRS(mscap_gprs),
+ gprsmultislot := mscap_gprs,
+ presenceBitSms := '0'B,
+ multislotCap_SMS := omit,
+ multislotCapAdditionsAfterRel97 := {
+ presenceBitEcsdmulti := '0'B,
+ ecsdmultislotclass := omit,
+ presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS(mscap_egprs),
+ multislotCap_EGPRS := mscap_egprs,
+ presenceBitDtmGprsmulti := '0'B,
+ multislotCapdtmgprsmultislotsubclass := omit
+ }
+ },
+ accessCapAdditionsAfterRel97 := omit
+ },
+ spare_bits := omit
+ }
+ }
+ },
+ presenceBitMSRACap := '0'B
+ };
+
+ private function f_presence_bit_MSRadioAccessCapabilityV(template (omit) MSRadioAccessCapabilityV ms_rac) return BIT1 {
+ if (istemplatekind(ms_rac, "omit")) {
+ return '0'B;
+ }
+ return '1'B;
+ }
+
+ private function f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(template (omit) MSRadioAccessCapabilityV ms_rac) return template (omit) MSRadioAccCap2 {
+ var template (omit) MSRadioAccCap2 ms_rac2 := omit;
+ if (istemplatekind(ms_rac, "omit")) {
+ return ms_rac2;
+ }
+ ms_rac2 := { msRadioAccessCapabilityV := ms_rac };
+ return ms_rac2;
+ }
+
+ private const ChannelReqDescription c_ChReqDesc_default := {
+ peak_tput_class := 0,
+ priority := 0,
+ rlc_mode := RLC_MODE_UNACKNOWLEDGED,
+ llc_pdu_type := LLC_PDU_IS_NOT_SACK_OR_ACK,
+ RlcOctetCount := 0
+ }
+
+ /* TS 44.060 sec 11.2.16 */
+ template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_RES_REQ(GprsTlli tlli,
+ template (omit) MSRadioAccessCapabilityV ms_rac,
+ ChannelReqDescription ch_req_desc := c_ChReqDesc_default,
+ RlcAccessType acc_type := RLC_ACC_TYPE_TWO_PHASE)
+ := {
msg_type := PACKET_RESOURCE_REQUEST,
u := {
resource_req := {
@@ -687,8 +764,8 @@
acc_type := acc_type,
id_type := '1'B,
id := { tlli := tlli },
- ms_rac2_presence := '0'B,
- ms_rac2 := omit,
+ ms_rac2_presence := f_presence_bit_MSRadioAccessCapabilityV(ms_rac),
+ ms_rac2 := f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(ms_rac),
ch_req_desc := ch_req_desc,
change_mark_presence := '0'B,
change_mark := omit,
diff --git a/library/RLCMAC_Types.ttcn b/library/RLCMAC_Types.ttcn
index dbcf4ae..97b89da 100644
--- a/library/RLCMAC_Types.ttcn
+++ b/library/RLCMAC_Types.ttcn
@@ -445,6 +445,32 @@
}
}
+ template RlcmacDlBlock tr_RLCMAC_UL_PACKET_ASS(template uint3_t usf := ?) := {
+ ctrl := {
+ mac_hdr := {
+ payload_type := (MAC_PT_RLCMAC_NO_OPT, MAC_PT_RLCMAC_OPT),
+ rrbp:= ?,
+ rrbp_valid := ?,
+ usf := usf
+ },
+ opt := *,
+ payload := {
+ msg_type := PACKET_UL_ASSIGNMENT,
+ u := {
+ ul_assignment := {
+ page_mode := ?,
+ persistence_levels_present := ?,
+ persistence_levels := *,
+ identity := ?,
+ is_egprs := ?, /* msg escape */
+ gprs := *
+ }
+ }
+ }
+ }
+ }
+
+
/* Receive Template for Uplink ACK/NACK */
template RlcmacDlBlock tr_RLCMAC_UL_ACK_NACK(template uint5_t ul_tfi, template GprsTlli tlli := ?) := {
ctrl := {
diff --git a/mme/gen_links.sh b/mme/gen_links.sh
index f22f1ca..469b92f 100755
--- a/mme/gen_links.sh
+++ b/mme/gen_links.sh
@@ -56,7 +56,7 @@
DIR=../library
FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
FILES+="SGsAP_Templates.ttcn SGsAP_CodecPort.ttcn SGsAP_CodecPort_CtrlFunct.ttcn SGsAP_CodecPort_CtrlFunctDef.cc SGsAP_Emulation.ttcn DNS_Helpers.ttcn "
-FILES+="L3_Templates.ttcn "
+FILES+="L3_Templates.ttcn RLCMAC_CSN1_Types.ttcn "
FILES+="S1AP_CodecPort.ttcn S1AP_CodecPort_CtrlFunctDef.cc S1AP_CodecPort_CtrlFunct.ttcn S1AP_Emulation.ttcn "
FILES+="NAS_Templates.ttcn GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "
FILES+="DIAMETER_Types.ttcn DIAMETER_CodecPort.ttcn DIAMETER_CodecPort_CtrlFunct.ttcn DIAMETER_CodecPort_CtrlFunctDef.cc DIAMETER_Emulation.ttcn DIAMETER_Templates.ttcn "
diff --git a/msc/gen_links.sh b/msc/gen_links.sh
index 7aaba2b..329a7d1 100755
--- a/msc/gen_links.sh
+++ b/msc/gen_links.sh
@@ -93,7 +93,7 @@
DIR=../library
FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "
-FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn L3_Common.ttcn "
+FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn RLCMAC_CSN1_Types.ttcn L3_Common.ttcn "
FILES+="RAN_Emulation.ttcnpp BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn RAN_Adapter.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn "
FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "
diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn
index 1d13b8e..54412e3 100644
--- a/pcu/PCU_Tests_RAW.ttcn
+++ b/pcu/PCU_Tests_RAW.ttcn
@@ -26,6 +26,7 @@
import from Osmocom_VTY_Functions all;
import from TELNETasp_PortType all;
+import from MobileL3_GMM_SM_Types all;
import from RLCMAC_CSN1_Types all;
import from RLCMAC_Types all;
@@ -496,6 +497,20 @@
poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);
}
+private function f_rx_rlcmac_dl_block_exp_pkt_ul_ass(out RlcmacDlBlock dl_block, out uint32_t poll_fn)
+runs on RAW_PCU_Test_CT {
+ var uint32_t dl_fn;
+
+ 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;
+ }
+
+ poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);
+}
+
+
private function f_rx_rlcmac_dl_block_exp_pkt_pag_req(out RlcmacDlBlock dl_block)
runs on RAW_PCU_Test_CT {
var uint32_t dl_fn;
@@ -1201,7 +1216,7 @@
/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
* answered, so TBFs for uplink and later for downlink are created.
*/
-testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
+private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_racap := omit, template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {
var GsmRrMessage rr_imm_ass;
var PacketUlAssign ul_tbf_ass;
var PacketDlAssign dl_tbf_ass;
@@ -1235,6 +1250,18 @@
mtc.stop;
}
+ if (not istemplatekind(ms_racap, "omit")) {
+ /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS
+ * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
+ */
+ f_tx_rlcmac_ul_block(ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_RES_REQ(tlli, ms_racap))), 0);
+ 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;
+ }
+ }
+
/* Send one UL block and make sure it is ACKED fine */
f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);
f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
@@ -1256,13 +1283,33 @@
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);
+ f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);
/* ACK the DL block */
f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B);
f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn);
}
+/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
+ * answered, so TBFs for uplink and later for downlink are created.
+ */
+testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
+ var CodingScheme exp_cs_mcs := CS_1;
+ f_TC_mo_ping_pong(omit, exp_cs_mcs);
+}
+
+
+testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
+ var MultislotCap_GPRS mscap_gprs := {
+ gprsmultislotclass := '00011'B,
+ gprsextendeddynalloccap := '0'B
+ };
+ var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
+ var CodingScheme exp_cs_mcs := CS_2;
+
+ f_TC_mo_ping_pong(ms_racap, exp_cs_mcs);
+}
+
/* 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.
*/
@@ -1724,6 +1771,7 @@
execute( TC_t3169() );
execute( TC_t3193() );
execute( TC_mo_ping_pong() );
+ execute( TC_mo_ping_pong_with_ul_racap() );
execute( TC_mt_ping_pong() );
execute( TC_mt_ping_pong_with_dl_racap() );
execute( TC_imm_ass_dl_block_retrans() );