L1CTL_Types.ttcn: accept SacchL1Header in ts_L1CTL_DATA_REQ_SACCH

In BTS_Tests.ttcn we used to compose L1ctlDataReq manually. This
can be done by ts_L1CTL_DATA_REQ_SACCH() template itself, so
let's abstract BTS_Tests.ttcn from doing that.

Change-Id: I1ae948bd0314cdf15c21ce4b6346d5e32f1fcf95
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 37a5e3c..7aa74d2 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -1523,12 +1523,15 @@
 		var LapdmFrameAB lb := valueof(ts_LAPDm_AB(0, false, false, enc_GsmRrL3Message(meas_rep)));
 		log("LAPDm: ", lb);
 
-		var L1ctlDataReq data_req := {
-			l1header := valueof(ts_SacchL1Header(g_pars.l1_pars.ms_power_level, false, g_pars.l1_pars.ms_actual_ta)),
-			l2_payload := f_pad_oct(enc_LapdmFrameAB(lb), 21, '2B'O)
-		}
-		log("Sending Measurement Report: ", data_req);
-		L1CTL.send(ts_L1CTL_DATA_REQ_SACCH(g_chan_nr, ts_RslLinkID_SACCH(0), data_req));
+		var template (value) SacchL1Header l1h := ts_SacchL1Header(
+			g_pars.l1_pars.ms_power_level, false,
+			g_pars.l1_pars.ms_actual_ta);
+
+		/* TODO: we can use an extension of TTCN-3 for that, i.e. PADDING('2B'O) */
+		var octetstring l2 := f_pad_oct(enc_LapdmFrameAB(lb), 21, '2B'O);
+
+		log("Sending Measurement Report: ", l1h, l2);
+		L1CTL.send(ts_L1CTL_DATA_REQ_SACCH(g_chan_nr, ts_RslLinkID_SACCH(0), l1h, l2));
 		repeat;
 		}
 }
@@ -4522,19 +4525,16 @@
 private function f_tx_lapdm(template (value) LapdmFrame l,
 			    template (value) RslLinkId link_id) runs on ConnHdlr {
 	var octetstring l2 := enc_LapdmFrame(valueof(l));
+	var template (value) SacchL1Header l1h;
+
+	/* TODO: we can use an extension of TTCN-3 for padding, i.e. PADDING('2B'O) */
 	if (valueof(link_id.c) == SACCH) {
-		/* prepend dummy L1 header */
-		var L1ctlDataReq l1hl2 := {
-			l1header := valueof(ts_SacchL1Header(g_pars.l1_pars.ms_power_level, false, g_pars.l1_pars.ms_actual_ta)),
-			l2_payload := f_pad_oct(l2, 21, '2B'O)
-		}
-		L1CTL.send(ts_L1CTL_DATA_REQ_SACCH(g_chan_nr, link_id, l1hl2));
+		/* Compose dummy L1 header */
+		l1h := ts_SacchL1Header(g_pars.l1_pars.ms_power_level, false, g_pars.l1_pars.ms_actual_ta);
+		L1CTL.send(ts_L1CTL_DATA_REQ_SACCH(g_chan_nr, link_id, l1h, f_pad_oct(l2, 21, '2B'O)));
 	} else {
 		/* If required, pad L2 frame with constant 0x2b filling */
-		l2 := f_pad_oct(l2, 23, '2B'O);
-
-		log("encoding ", l, " to ", l2);
-		L1CTL.send(ts_L1CTL_DATA_REQ(g_chan_nr, link_id, l2));
+		L1CTL.send(ts_L1CTL_DATA_REQ(g_chan_nr, link_id, f_pad_oct(l2, 23, '2B'O)));
 	}
 }