gprs_gb: working Uplink PACKET_CONTROL_ACK against OsmoPCU

Change-Id: I2c7d0eb9371911e28f328caeaed63cb8ec311ac1
diff --git a/library/LAPDm_RAW_PT.ttcn b/library/LAPDm_RAW_PT.ttcn
index 229aff0..ab99538 100644
--- a/library/LAPDm_RAW_PT.ttcn
+++ b/library/LAPDm_RAW_PT.ttcn
@@ -47,13 +47,27 @@
 	/* PH-DATA.ind / PH-DATA.req */
 	type record RLCMAC_ph_data_ind {
 		GprsCodingScheme cs,
+		uint8_t ts_nr,
+		GsmFrameNumber fn,
 		RlcmacDlBlock block
 	}
-	type record RLCMAC_ph_data_req {
+	type record RLCMAC_ph_data_req_dyn {
 		uint8_t tbf_id,
 		GprsCodingScheme cs,
 		RlcmacUlBlock block
 	}
+	type record RLCMAC_ph_data_req_abs {
+		uint8_t tbf_id,
+		GprsCodingScheme cs,
+		uint8_t ts_nr,
+		GsmFrameNumber fn,
+		Arfcn arfcn,
+		RlcmacUlBlock block
+	}
+	type union RLCMAC_ph_data_req {
+		RLCMAC_ph_data_req_dyn	dyn,
+		RLCMAC_ph_data_req_abs	abs
+	}
 
 	/* port from our (internal) point of view */
 	type port LAPDm_SP_PT message {
@@ -223,6 +237,19 @@
 		}
 	};
 
+	template (value) RLCMAC_ph_data_req ts_PH_DATA_ABS(uint8_t tbf_id, GprsCodingScheme cs,
+							   uint8_t ts, uint32_t fn, Arfcn arfcn,
+							   RlcmacUlBlock block) := {
+		abs := {
+			tbf_id := tbf_id,
+			cs := CS1,	/* FIXME */
+			ts_nr := ts,
+			fn := fn,
+			arfcn := arfcn,
+			block := block
+		}
+	}
+
 	private function f_establish_tbf(uint8_t ra) runs on lapdm_CT {
 		var ImmediateAssignment imm_ass;
 		var GsmFrameNumber rach_fn;
@@ -377,6 +404,8 @@
 			/* decode + forward any blocks from L1 to L23*/
 			[] L1CTL.receive(t_L1CTL_DATA_IND(t_RslChanNr_PDCH(?))) -> value dl {
 				rpdi.block := dec_RlcmacDlBlock(dl.payload.data_ind.payload);
+				rpdi.fn := dl.dl_info.frame_nr;
+				rpdi.ts_nr := dl.dl_info.chan_nr.tn;
 				rpdi.cs := CS1; /* FIXME */
 				log("RPDI: ", rpdi);
 				LAPDM_SP.send(rpdi);
@@ -387,9 +416,15 @@
 			/* encode + forward any blocks from L23 to L1 */
 			[] LAPDM_SP.receive(RLCMAC_ph_data_req:?) -> value rpdr {
 				var octetstring buf;
-
-				buf := enc_RlcmacUlBlock(rpdr.block);
-				L1CTL.send(t_L1CTL_DATA_TBF_REQ(buf, L1CTL_CS1, rpdr.tbf_id));
+				if (ischosen(rpdr.dyn)) {
+					buf := enc_RlcmacUlBlock(rpdr.dyn.block);
+					L1CTL.send(t_L1CTL_DATA_TBF_REQ(buf, L1CTL_CS1, rpdr.dyn.tbf_id));
+				} else {
+					buf := enc_RlcmacUlBlock(rpdr.abs.block);
+					L1CTL.send(t_L1CTL_DATA_ABS_REQ(buf, rpdr.abs.arfcn,
+									rpdr.abs.ts_nr, rpdr.abs.fn,
+									L1CTL_CS1, rpdr.abs.tbf_id));
+				}
 			}
 
 			/* FIXME: release TBF mode */