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/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() );