pcu: Specify (M)CS to use when sending UL rlcmac data blocks

Apply padding and spare bits in the encoder according to CS/MCS format.

Change-Id: I918acac81f550077daeda3374b3de9b426ff3572
diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
index 8f424ab..f183e4c 100644
--- a/pcu/PCU_Tests.ttcn
+++ b/pcu/PCU_Tests.ttcn
@@ -97,7 +97,7 @@
 	dl_tbf_ext := 250 * 10, /* ms */
 	ul_tbf_ext := 250 * 10, /* ms */
 	initial_cs := 2,
-	initial_mcs := 6,
+	initial_mcs := 1,
 	nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
 	local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
 	remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
@@ -1085,7 +1085,7 @@
 
 	/* Send one UL block (with TLLI since we are in One-Phase Access
 	   contention resoultion) and make sure it is ACKED fine. */
-	total_payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
+	total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
 	/* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
 	f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
 	f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
@@ -1114,6 +1114,8 @@
 	var template (value) RlcmacUlBlock ul_data;
 	var template (value) LlcBlockHdr blk_hdr;
 	var template (value) LlcBlocks blocks;
+	var integer blk_len;
+	var CodingScheme tx_cs;
 	var GprsMS ms;
 
 	/* Initialize NS/BSSGP side */
@@ -1139,7 +1141,8 @@
 					 more := false, e := true);
 	blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
 	/* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
-	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
+	ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
+					 tfi := ms.ul_tbf.tfi,
 					 cv := 15,
 					 bsn := ms.ul_tbf.bsn,
 					 blocks := blocks,
@@ -1166,12 +1169,15 @@
 			cv := max_size - i;
 		}
 
+		blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
+		tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
 		payload := f_rnd_octstring(i);
 		blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
 						 more := false, e := true);
 		blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
 		/* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
-		ul_data := t_RLCMAC_UL_DATA(tfi := ms.ul_tbf.tfi,
+		ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
+					    tfi := ms.ul_tbf.tfi,
 					    cv := cv,
 					    bsn := ms.ul_tbf.bsn,
 					    blocks := blocks);
@@ -1218,7 +1224,8 @@
 	blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
 					 more := false, e := true);
 	blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
-	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
+	ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
+					 tfi := ms.ul_tbf.tfi,
 					 cv := cv,
 					 bsn := ms.ul_tbf.bsn,
 					 blocks := blocks,
@@ -1368,7 +1375,7 @@
 
 	/* Send one UL block (without TLLI since we are in Second-Phase Access)
 	   and make sure it is ACKED fine */
-	f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);  /* TODO: send using cs_mcs */
+	f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
 
 	/* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
@@ -1524,6 +1531,7 @@
 	var octetstring lost_payload;
 	var uint5_t tfi;
 	var GprsMS ms;
+	var uint32_t payload_fill_len;
 
 	/* Initialize NS/BSSGP side */
 	f_init_bssgp();
@@ -1544,7 +1552,7 @@
 
 	/* Send one UL block (with TLLI since we are in One-Phase Access
 	   contention resoultion) and make sure it is ACKED fine. */
-	payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
+	payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
 	f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
 
 	f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
@@ -1552,20 +1560,22 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 	total_payload := payload;
 
+	payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
+
 	/* Send 2 packets, skip 1 (inc bsn) and send another one */
-	payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */
+	payload := f_rnd_octstring(payload_fill_len);
 	f_ms_tx_ul_data_block(ms, payload, cv := 15);
 	total_payload := total_payload & payload;
 
-	payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */
+	payload := f_rnd_octstring(payload_fill_len);
 	f_ms_tx_ul_data_block(ms, payload, cv := 15);
 	total_payload := total_payload & payload;
 
-	lost_payload := f_rnd_octstring(20);
+	lost_payload := f_rnd_octstring(payload_fill_len);
 	ms.ul_tbf.bsn := ms.ul_tbf.bsn + 1;  /* LOST PAYLOAD bsn=3, will be retransmitted, next bsn is increased +2 */
 	total_payload := total_payload & lost_payload;
 
-	payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */
+	payload := f_rnd_octstring(payload_fill_len)
 	f_ms_tx_ul_data_block(ms, payload, cv := 15);
 	total_payload := total_payload & payload;
 
@@ -1575,7 +1585,11 @@
 	/* On CV=0, we'll receive a UL ACK asking about missing block */
 	f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
 	/* TODO: check ack ack bitmap (URBB) */
-	ul_data := t_RLCMAC_UL_DATA(tfi := tfi, cv := 15, bsn := 3, blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
+	ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
+				    tfi := tfi,
+				    cv := 15,
+				    bsn := 3,
+				    blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
 	f_ms_tx_ul_block(ms, ul_data);
 
 	/* Now final ack is recieved */
@@ -1760,7 +1774,8 @@
 	 */
 
 	/*  UL RlcDataBlock(dataA) [BSN=0, CV=3] */
-	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
+	ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
+				    tfi := ms.ul_tbf.tfi,
 				    cv := 3,
 				    bsn := ms.ul_tbf.bsn,
 				    blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
@@ -1772,7 +1787,8 @@
 	f_ms_tx_ul_block(ms, ul_data);
 
 	/* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
-	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
+	ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
+				    tfi := ms.ul_tbf.tfi,
 				    cv := 2,
 				    bsn := ms.ul_tbf.bsn,
 				    blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
@@ -1787,7 +1803,8 @@
 	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataA));
 
 	/* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
-	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
+	ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
+				    tfi := ms.ul_tbf.tfi,
 				    cv := 1,
 				    bsn := ms.ul_tbf.bsn,
 				    blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
@@ -1805,7 +1822,9 @@
 	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataC));
 
 	/* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
-	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
+	ul_data := t_RLCMAC_UL_DATA_TLLI(
+				    cs := CS_1,
+				    tfi := ms.ul_tbf.tfi,
 				    cv := 0,
 				    bsn := ms.ul_tbf.bsn,
 				    blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),