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 */