blob: 1b50703a243372b6fd05060de35134760e66f034 [file] [log] [blame]
Harald Weltef6543322017-07-16 07:35:10 +02001/* Data Types / Encoding / Decoding for OsmocomBB L1CTL interface */
2/* (C) 2017 by Harald Welte <laforge@gnumonks.org>, derived from l1ctl_proto.h
Harald Welte34b5a952019-05-27 11:54:11 +02003 * which is (C) 2010 by Harald Welte + Holger Hans Peter Freyther
4 * All rights reserved.
5 *
6 * Released under the terms of GNU General Public License, Version 2 or
7 * (at your option) any later version.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
Harald Weltef6543322017-07-16 07:35:10 +020012module L1CTL_Types {
13
14 import from General_Types all;
15 import from GSM_Types all;
Harald Welte9419c8a2017-07-30 04:07:05 +020016 import from GSM_RR_Types all;
Harald Weltef6543322017-07-16 07:35:10 +020017 import from Osmocom_Types all;
18
Harald Welte7024baa2018-03-02 23:37:51 +010019 type uint32_t uint32_le with { variant "BYTEORDER(first)" };
20
Harald Weltef6543322017-07-16 07:35:10 +020021 type enumerated L1ctlMsgType {
22 L1CTL_NONE,
23 L1CTL_FBSB_REQ,
24 L1CTL_FBSB_CONF,
25 L1CTL_DATA_IND,
26 L1CTL_RACH_REQ,
27 L1CTL_DM_EST_REQ,
28 L1CTL_DATA_REQ,
29 L1CTL_RESET_IND,
30 L1CTL_PM_REQ, /* power measurement */
31 L1CTL_PM_CONF, /* power measurement */
32 L1CTL_ECHO_REQ,
33 L1CTL_ECHO_CONF,
34 L1CTL_RACH_CONF,
35 L1CTL_RESET_REQ,
36 L1CTL_RESET_CONF,
37 L1CTL_DATA_CONF,
38 L1CTL_CCCH_MODE_REQ,
39 L1CTL_CCCH_MODE_CONF,
40 L1CTL_DM_REL_REQ,
41 L1CTL_PARAM_REQ,
42 L1CTL_DM_FREQ_REQ,
43 L1CTL_CRYPTO_REQ,
44 L1CTL_SIM_REQ,
45 L1CTL_SIM_CONF,
46 L1CTL_TCH_MODE_REQ,
47 L1CTL_TCH_MODE_CONF,
48 L1CTL_NEIGH_PM_REQ,
49 L1CTL_NEIGH_PM_IND,
50 L1CTL_TRAFFIC_REQ,
51 L1CTL_TRAFFIC_CONF,
Harald Welte00d4dac2017-07-30 00:50:32 +020052 L1CTL_TRAFFIC_IND,
Vadim Yanitskiy4e79ff52019-04-22 06:38:21 +070053 L1CTL_BURST_IND,
Harald Welte00d4dac2017-07-30 00:50:32 +020054 L1CTL_TBF_CFG_REQ,
Harald Welteb3c226e2017-07-30 17:18:01 +020055 L1CTL_TBF_CFG_CONF,
56 L1CTL_DATA_TBF_REQ,
Harald Welte3a40ec72018-03-02 20:45:04 +010057 L1CTL_DATA_TBF_CONF,
Vadim Yanitskiy5c836792019-04-22 05:45:03 +070058 L1CTL_EXT_RACH_REQ,
59 L1CTL_DATA_ABS_REQ /*!< FIXME: no such message in OsmocomBB */
Harald Weltef6543322017-07-16 07:35:10 +020060 } with { variant "FIELDLENGTH(8)" };
61
62 type enumerated L1ctlCcchMode {
63 CCCH_MODE_NONE (0),
64 CCCH_MODE_NON_COMBINED,
Harald Welte990a3612019-05-27 14:02:13 +020065 CCCH_MODE_COMBINED,
66 CCCH_MODE_COMBINED_CBCH
Harald Weltef6543322017-07-16 07:35:10 +020067 } with { variant "FIELDLENGTH(8)" };
68
69 type enumerated L1ctlNeighMode {
70 NEIGH_MODE_NONE (0),
71 NEIGH_MODE_PM,
72 NEIGH_MODE_SB
73 } with { variant "FIELDLENGTH(8)" };
74
Harald Welte1dcc3712017-08-01 00:05:52 +020075 type enumerated L1ctlGprsCs {
76 L1CTL_CS1 (1),
77 L1CTL_CS2,
78 L1CTL_CS3,
79 L1CTL_CS4,
80 L1CTL_MCS1,
81 L1CTL_MCS2,
82 L1CTL_MCS3,
83 L1CTL_MCS4,
84 L1CTL_MCS5,
85 L1CTL_MCS6,
86 L1CTL_MCS7,
87 L1CTL_MCS8,
88 L1CTL_MCS9
89 } with { variant "FIELDLENGTH(8)" };
90
Harald Weltef6543322017-07-16 07:35:10 +020091 type enumerated L1ctlResetType {
92 L1CTL_RES_T_BOOT (0),
93 L1CTL_RES_T_FULL,
94 L1CTL_RES_T_SCHED
95 } with { variant "FIELDLENGTH(8)" };
96
Harald Weltef6543322017-07-16 07:35:10 +020097 type record L1ctlHdrFlags {
98 BIT7 padding,
99 boolean f_done
100 } with { variant "" };
101
102 type record L1ctlHeader {
103 L1ctlMsgType msg_type,
104 L1ctlHdrFlags flags,
105 OCT2 padding
106 } with { variant "" };
107
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700108 template L1ctlHeader
109 tr_L1ctlHeader(template (present) L1ctlMsgType msg_type) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100110 msg_type := msg_type,
111 flags := ?,
112 padding := ?
113 };
114
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700115 template (value) L1ctlHeader
116 ts_L1ctlHeader(template (value) L1ctlMsgType msg_type) := {
Harald Welte52c713c2017-07-16 15:44:44 +0200117 msg_type := msg_type,
118 flags := { padding := '0000000'B, f_done := false },
119 padding := '0000'O
120 };
121
Harald Weltef6543322017-07-16 07:35:10 +0200122 type record L1ctlDlInfo {
Harald Welte8e4db2c2017-07-16 18:54:55 +0200123 RslChannelNr chan_nr,
Harald Weltef6543322017-07-16 07:35:10 +0200124 RslLinkId link_id,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700125 GsmBandArfcn arfcn,
Harald Welte5f0d5c82017-07-16 18:56:01 +0200126 uint32_t frame_nr,
Harald Weltef6543322017-07-16 07:35:10 +0200127 GsmRxLev rx_level,
128 uint8_t snr,
129 uint8_t num_biterr,
130 uint8_t fire_crc
131 } with { variant "" };
132
133 type record L1ctlFbsbConf {
134 int16_t initial_freq_err,
135 uint8_t result,
136 uint8_t bsic
137 } with { variant "" };
138
139 type record L1ctlCcchModeConf {
140 L1ctlCcchMode ccch_mode,
141 OCT3 padding
142 } with { variant "" };
143
144 /* gsm48_chan_mode */
Vadim Yanitskiyfe052962020-10-19 13:27:09 +0700145 type enumerated L1ctlTchMode {
146 L1CTL_CHAN_MODE_SIGN ('00000000'B), /* Signalling */
147 L1CTL_CHAN_MODE_SPEECH_V1 ('00000001'B), /* FR or HR codec */
148 L1CTL_CHAN_MODE_SPEECH_V2 ('00100001'B), /* EFR codec */
149 L1CTL_CHAN_MODE_SPEECH_V3 ('01000001'B) /* AMR codec */
150 /* Other modes are not supported for now */
151 } with { variant "FIELDLENGTH(8)" };
Harald Weltef6543322017-07-16 07:35:10 +0200152
Vadim Yanitskiy7ce605f2020-10-19 16:04:38 +0700153 type enumerated L1ctlLoopMode {
154 L1CTL_LOOP_MODE_OPEN ('00000000'B),
155 L1CTL_LOOP_MODE_A ('00000001'B),
156 L1CTL_LOOP_MODE_B ('00000010'B),
157 L1CTL_LOOP_MODE_C ('00000011'B),
158 L1CTL_LOOP_MODE_D ('00000100'B),
159 L1CTL_LOOP_MODE_E ('00000101'B),
160 L1CTL_LOOP_MODE_F ('00000110'B),
161 L1CTL_LOOP_MODE_I ('00000111'B)
162 } with { variant "FIELDLENGTH(8)" };
163
Harald Weltef6543322017-07-16 07:35:10 +0200164 type record L1ctlAudioMode {
165 BIT4 padding,
166 boolean tx_microphone,
167 boolean tx_traffic_req,
168 boolean rx_speaker,
169 boolean rx_traffic_ind
170 } with { variant "" };
171
Harald Weltef8df4cb2018-03-10 15:15:08 +0100172 template (value) L1ctlAudioMode t_L1CTL_AudioModeNone := { '0000'B, false, false, false, false };
Harald Welte66110f02017-07-16 21:05:18 +0200173
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700174 /* Traffic forwarding mode (see TRAFFIC.{req,cnf,ind} messages) */
175 template (value) L1ctlAudioMode t_L1CTL_AudioModeFwd
176 modifies t_L1CTL_AudioModeNone := {
177 tx_traffic_req := true,
178 rx_traffic_ind := true
179 };
180
Harald Weltef6543322017-07-16 07:35:10 +0200181 type record L1ctlTchModeConf {
182 L1ctlTchMode tch_mode,
183 L1ctlAudioMode audio_mode,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200184 record {
185 uint8_t start_codec,
186 BIT8 codecs_bitmask
187 } amr
Harald Weltef6543322017-07-16 07:35:10 +0200188 } with { variant "" };
189
190 type record L1ctlDataInd {
Vadim Yanitskiy2a92e2a2019-05-28 21:13:35 +0700191 octetstring payload
Harald Welte7024baa2018-03-02 23:37:51 +0100192 } with {
193 variant (payload) "BYTEORDER(first)"
194 };
Harald Weltef6543322017-07-16 07:35:10 +0200195
196 type union L1ctlDlPayload {
197 L1ctlFbsbConf fbsb_conf,
198 L1ctlCcchModeConf ccch_mode_conf,
199 L1ctlTchModeConf tch_mode_conf,
200 L1ctlDataInd data_ind,
201 L1ctlTrafficReq traffic_ind,
Harald Welte00d4dac2017-07-30 00:50:32 +0200202 L1ctlTbfCfgReq tbf_cfg_conf,
Harald Weltef6543322017-07-16 07:35:10 +0200203 octetstring other
Harald Welte7024baa2018-03-02 23:37:51 +0100204 } with {
205 variant (other) "BYTEORDER(first)"
206 };
Harald Weltef6543322017-07-16 07:35:10 +0200207
208 type record L1ctlDlMessage {
209 L1ctlHeader header,
210 L1ctlDlInfo dl_info optional,
Harald Weltef56cc492018-04-15 10:58:43 +0200211 L1ctlDlPayload payload optional
Harald Weltef6543322017-07-16 07:35:10 +0200212 } with { variant (dl_info) "PRESENCE(header.msg_type = L1CTL_FBSB_CONF,
213 header.msg_type = L1CTL_RACH_CONF,
214 header.msg_type = L1CTL_DATA_IND,
215 header.msg_type = L1CTL_DATA_CONF,
Harald Welte3c4cbf62018-03-30 10:31:39 +0200216 header.msg_type = L1CTL_TRAFFIC_IND,
217 header.msg_type = L1CTL_TRAFFIC_CONF)"
Harald Weltef6543322017-07-16 07:35:10 +0200218 variant (payload) "CROSSTAG(fbsb_conf, header.msg_type = L1CTL_FBSB_CONF;
219 ccch_mode_conf, header.msg_type = L1CTL_CCCH_MODE_CONF;
220 tch_mode_conf, header.msg_type = L1CTL_TCH_MODE_CONF;
221 data_ind, header.msg_type = L1CTL_DATA_IND;
222 traffic_ind, header.msg_type = L1CTL_TRAFFIC_IND;
Harald Welte00d4dac2017-07-30 00:50:32 +0200223 tbf_cfg_conf, header.msg_type = L1CTL_TBF_CFG_CONF;
Harald Weltef6543322017-07-16 07:35:10 +0200224 other, OTHERWISE;
225 )" };
226
227 external function enc_L1ctlDlMessage(in L1ctlDlMessage msg) return octetstring
228 with { extension "prototype(convert) encode(RAW)" };
229 external function dec_L1ctlDlMessage(in octetstring stream) return L1ctlDlMessage
230 with { extension "prototype(convert) decode(RAW)" };
231
232
233 type record L1ctlUlInfo {
Harald Welte8e4db2c2017-07-16 18:54:55 +0200234 RslChannelNr chan_nr,
Harald Weltef6543322017-07-16 07:35:10 +0200235 RslLinkId link_id,
236 OCT2 padding
237 } with { variant "" };
238
Harald Welteb3c226e2017-07-30 17:18:01 +0200239 type record L1ctlUlTbfInfo {
240 uint8_t tbf_nr,
Harald Welte1dcc3712017-08-01 00:05:52 +0200241 L1ctlGprsCs cs,
242 OCT2 padding
Harald Welteb3c226e2017-07-30 17:18:01 +0200243 } with { variant "" };
244
Harald Welte3a40ec72018-03-02 20:45:04 +0100245 type record L1ctlUlAbsInfo {
246 uint8_t tbf_nr,
247 L1ctlGprsCs cs,
248 uint8_t ts_nr,
249 OCT1 padding,
Harald Welte7024baa2018-03-02 23:37:51 +0100250 uint32_le fn,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700251 GsmBandArfcn arfcn,
Harald Welte3a40ec72018-03-02 20:45:04 +0100252 OCT2 padding2
253 } with { variant "" };
254
Harald Weltef6543322017-07-16 07:35:10 +0200255 type record L1ctlFbsbFlags {
256 BIT5 padding,
257 boolean sb,
258 boolean fb1,
259 boolean fb0
Harald Welte344c0cf2018-03-09 16:17:45 +0100260 } with { variant "FIELDORDER(msb)" };
Harald Weltef6543322017-07-16 07:35:10 +0200261
Harald Weltef8df4cb2018-03-10 15:15:08 +0100262 template (value) L1ctlFbsbFlags t_L1CTL_FBSB_F_ALL := {
Harald Welte66110f02017-07-16 21:05:18 +0200263 padding := '00000'B,
264 sb := true,
265 fb1 := true,
266 fb0 := true
267 };
268
Harald Weltef6543322017-07-16 07:35:10 +0200269 type record L1ctlFbsbReq {
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700270 GsmBandArfcn arfcn,
Harald Weltef6543322017-07-16 07:35:10 +0200271 uint16_t timeout_tdma_frames,
272 uint16_t freq_err_thresh1,
273 uint16_t freq_err_thresh2,
274 uint8_t num_freqerr_avg,
275 L1ctlFbsbFlags flags,
276 uint8_t sync_info_idx,
277 L1ctlCcchMode ccch_mode,
278 GsmRxLev rxlev_exp
279 } with { variant "" };
280
281 type record L1ctlCcchModeReq {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100282 L1ctlCcchMode ccch_mode,
283 OCT3 padding
Harald Weltef6543322017-07-16 07:35:10 +0200284 } with { variant "" };
285
286 type record L1ctlTchModeReq {
287 L1ctlTchMode tch_mode,
288 L1ctlAudioMode audio_mode,
Vadim Yanitskiy7ce605f2020-10-19 16:04:38 +0700289 L1ctlLoopMode loop_mode,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200290 record {
291 uint8_t start_codec,
292 BIT8 codecs_bitmask
293 } amr
Harald Weltef6543322017-07-16 07:35:10 +0200294 } with { variant "" };
295
296 type record L1ctlRachReq {
297 uint8_t ra,
298 uint8_t combined,
299 uint16_t offset
300 } with { variant "" };
301
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700302 type enumerated L1ctlRachSynchSeq {
303 RACH_SYNCH_SEQ_TS0 (0),
304 RACH_SYNCH_SEQ_TS1,
305 RACH_SYNCH_SEQ_TS2
306 } with { variant "FIELDLENGTH(8)" };
307
308 type record L1ctlExtRachReq {
309 uint16_t ra11,
310 L1ctlRachSynchSeq synch_seq,
311 uint8_t combined,
312 uint16_t offset
313 } with { variant "" };
314
Harald Weltef6543322017-07-16 07:35:10 +0200315 type record L1ctlParReq {
316 int8_t ta,
317 uint8_t tx_power,
318 OCT2 padding
319 } with { variant "" };
320
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200321 type record L1ctlDataReq {
322 SacchL1Header l1header optional,
323 octetstring l2_payload
324 } with { variant "" };
325
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700326 type record L1ctlH0 {
327 uint8_t h,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700328 GsmBandArfcn arfcn,
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700329 octetstring padding length(130)
330 } with { variant "" };
331
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700332 type record length(0..64) of GsmBandArfcn L1ctlMA;
Harald Weltef6543322017-07-16 07:35:10 +0200333 type record L1ctlH1 {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700334 uint8_t h,
Harald Weltef6543322017-07-16 07:35:10 +0200335 uint8_t hsn,
336 uint8_t maio,
337 uint8_t n,
Vadim Yanitskiye8ea3ee2020-05-27 13:29:48 +0700338 OCT1 spare,
339 L1ctlMA ma,
340 octetstring padding
341 } with {
342 variant (n) "LENGTHTO(ma)"
343 variant (n) "UNIT(elements)"
344 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562849.
345 * TL;DR The reference point of the PADDING attribute is the beginning
346 * of the message, not the beginning of the type/field it's applied on.
347 * Therefore we cannot use it here, and have to add padding manually.
348 * variant (ma) "PADDING(128)" */
349 };
Harald Weltef6543322017-07-16 07:35:10 +0200350
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700351 type union L1ctlH0H1 {
352 L1ctlH0 h0,
353 L1ctlH1 h1
354 } with { variant "TAG(h0, h = 0; h1, h = 1)" };
355
Harald Weltef6543322017-07-16 07:35:10 +0200356 type record L1ctlDmEstReq {
357 GsmTsc tsc,
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700358 L1ctlH0H1 h0h1,
Harald Weltef6543322017-07-16 07:35:10 +0200359 L1ctlTchMode tch_mode,
360 L1ctlAudioMode audio_mode
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700361 } with { variant "" };
Harald Weltef6543322017-07-16 07:35:10 +0200362
363 type record L1ctlReset {
364 L1ctlResetType reset_type,
365 OCT3 padding
366 } with { variant "" };
367
Harald Weltee613f962018-04-18 22:38:16 +0200368 type record L1CtlCryptoReq {
369 uint8_t algo,
370 uint8_t key_len,
371 octetstring key
372 } with { variant (key_len) "LENGTHTO(key)" };
373
Harald Weltef6543322017-07-16 07:35:10 +0200374
375 type record L1ctlTrafficReq {
Vadim Yanitskiye01691d2018-10-29 00:18:04 +0700376 octetstring data
Harald Welte7024baa2018-03-02 23:37:51 +0100377 } with {
378 variant (data) "BYTEORDER(first)"
379 }
Harald Weltef6543322017-07-16 07:35:10 +0200380
Harald Welte00d4dac2017-07-30 00:50:32 +0200381 type record length(8) of uint8_t TfiUsfArr;
382
383 type record L1ctlTbfCfgReq {
384 uint8_t tbf_nr,
385 boolean is_uplink,
386 OCT2 padding,
387 TfiUsfArr tfi_usf
388 } with { variant (is_uplink) "FIELDLENGTH(8)" };
389
Harald Weltef6543322017-07-16 07:35:10 +0200390 type union L1ctlUlPayload {
391 L1ctlFbsbReq fbsb_req,
392 L1ctlCcchModeReq ccch_mode_req,
393 L1ctlTchModeReq tch_mode_req,
394 L1ctlRachReq rach_req,
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700395 L1ctlExtRachReq ext_rach_req,
Harald Weltef6543322017-07-16 07:35:10 +0200396 L1ctlParReq par_req,
397 L1ctlDmEstReq dm_est_req,
398 L1ctlReset reset_req,
399 //L1ctlNeighPmReq neigh_pm_req,
Harald Weltee613f962018-04-18 22:38:16 +0200400 L1CtlCryptoReq crypto_req,
Harald Weltef6543322017-07-16 07:35:10 +0200401 L1ctlTrafficReq traffic_req,
Harald Welte00d4dac2017-07-30 00:50:32 +0200402 L1ctlTbfCfgReq tbf_cfg_req,
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200403 L1ctlDataReq data_req,
Harald Weltef6543322017-07-16 07:35:10 +0200404 octetstring other
Harald Welte7024baa2018-03-02 23:37:51 +0100405 } with {
406 variant (other) "BYTEORDER(first)"
407 };
Harald Weltef6543322017-07-16 07:35:10 +0200408
409 type record L1ctlUlMessage {
410 L1ctlHeader header,
411 L1ctlUlInfo ul_info optional,
Harald Welteb3c226e2017-07-30 17:18:01 +0200412 L1ctlUlTbfInfo ul_info_tbf optional,
Harald Welte3a40ec72018-03-02 20:45:04 +0100413 L1ctlUlAbsInfo ul_info_abs optional,
Harald Weltef6543322017-07-16 07:35:10 +0200414 L1ctlUlPayload payload
415 } with { variant (ul_info) "PRESENCE(header.msg_type = L1CTL_RACH_REQ,
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700416 header.msg_type = L1CTL_EXT_RACH_REQ,
Harald Weltef6543322017-07-16 07:35:10 +0200417 header.msg_type = L1CTL_PARAM_REQ,
418 header.msg_type = L1CTL_CRYPTO_REQ,
419 header.msg_type = L1CTL_DATA_REQ,
420 header.msg_type = L1CTL_DM_EST_REQ,
421 header.msg_type = L1CTL_DM_FREQ_REQ,
422 header.msg_type = L1CTL_DM_REL_REQ,
423 header.msg_type = L1CTL_TRAFFIC_REQ)"
Harald Welteb3c226e2017-07-30 17:18:01 +0200424 variant (ul_info_tbf) "PRESENCE(header.msg_type = L1CTL_DATA_TBF_REQ)"
Harald Welte3a40ec72018-03-02 20:45:04 +0100425 variant (ul_info_abs) "PRESENCE(header.msg_type = L1CTL_DATA_ABS_REQ)"
Harald Weltef6543322017-07-16 07:35:10 +0200426 variant (payload) "CROSSTAG(fbsb_req, header.msg_type = L1CTL_FBSB_REQ;
427 ccch_mode_req, header.msg_type = L1CTL_CCCH_MODE_REQ;
428 tch_mode_req, header.msg_type = L1CTL_TCH_MODE_REQ;
429 rach_req, header.msg_type = L1CTL_RACH_REQ;
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700430 ext_rach_req, header.msg_type = L1CTL_EXT_RACH_REQ;
Harald Weltef6543322017-07-16 07:35:10 +0200431 par_req, header.msg_type = L1CTL_PARAM_REQ;
432 dm_est_req, header.msg_type = L1CTL_DM_EST_REQ;
433 reset_req, header.msg_type = L1CTL_RESET_REQ;
Harald Weltee613f962018-04-18 22:38:16 +0200434 crypto_req, header.msg_type = L1CTL_CRYPTO_REQ;
Harald Weltef6543322017-07-16 07:35:10 +0200435 traffic_req, header.msg_type = L1CTL_TRAFFIC_REQ;
Harald Welte00d4dac2017-07-30 00:50:32 +0200436 tbf_cfg_req, header.msg_type = L1CTL_TBF_CFG_REQ;
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200437 data_req, header.msg_type = L1CTL_DATA_REQ;
Harald Weltef6543322017-07-16 07:35:10 +0200438 other, OTHERWISE;
439 )" };
440
441 external function enc_L1ctlUlMessage(in L1ctlUlMessage msg) return octetstring
442 with { extension "prototype(convert) encode(RAW)" };
443 external function dec_L1ctlUlMessage(in octetstring stream) return L1ctlUlMessage
444 with { extension "prototype(convert) decode(RAW)" };
445
Harald Welte52c713c2017-07-16 15:44:44 +0200446 type record L1ctlUlMessageLV {
447 uint16_t len,
448 L1ctlUlMessage msg
449 } with { variant (len) "LENGTHTO(msg)" };
450
451 external function enc_L1ctlUlMessageLV(in L1ctlUlMessageLV msg) return octetstring
452 with { extension "prototype(convert) encode(RAW)" };
453 external function dec_L1ctlUlMessageLV(in octetstring stream) return L1ctlUlMessageLV
454 with { extension "prototype(convert) decode(RAW)" };
455
456 type record L1ctlDlMessageLV {
457 uint16_t len,
458 L1ctlDlMessage msg
459 } with { variant (len) "LENGTHTO(msg)" };
460
461 external function enc_L1ctlDlMessageLV(in L1ctlDlMessageLV msg) return octetstring
462 with { extension "prototype(convert) encode(RAW)" };
463 external function dec_L1ctlDlMessageLV(in octetstring stream) return L1ctlDlMessageLV
464 with { extension "prototype(convert) decode(RAW)" };
465
466
Harald Welte9e4725d2017-07-16 23:18:09 +0200467
468
469 /* for generating RESET_REQ */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700470 template (value) L1ctlUlMessage
471 t_L1ctlResetReq(template (value) L1ctlResetType rst_type) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100472 header := ts_L1ctlHeader(L1CTL_RESET_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200473 ul_info := omit,
Harald Welteb3c226e2017-07-30 17:18:01 +0200474 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100475 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200476 payload := {
477 reset_req := {
478 reset_type := rst_type,
479 padding := '000000'O
480 }
481 }
482 };
483
484 /* for generating FBSB_REQ */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700485 template (value) L1ctlUlMessage
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700486 ts_L1CTL_FBSB_REQ(template (value) GsmBandArfcn arfcn,
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700487 template (value) L1ctlFbsbFlags flags,
488 template (value) uint8_t sync_info_idx,
489 template (value) L1ctlCcchMode ccch_mode,
490 template (value) GsmRxLev rxlev_exp) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100491 header := ts_L1ctlHeader(L1CTL_FBSB_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200492 ul_info := omit,
Harald Welteb3c226e2017-07-30 17:18:01 +0200493 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100494 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200495 payload := {
496 fbsb_req := {
497 arfcn := arfcn,
Harald Weltea82f7e62018-02-22 18:51:33 +0100498 timeout_tdma_frames := 250, /* about 1s */
Harald Welte9e4725d2017-07-16 23:18:09 +0200499 freq_err_thresh1 := 10000,
500 freq_err_thresh2 := 800,
501 num_freqerr_avg := 3,
502 flags := flags,
503 sync_info_idx := sync_info_idx,
504 ccch_mode := ccch_mode,
505 rxlev_exp := rxlev_exp
506 }
507 }
508 };
509
510 /* for matching against incoming FBSB_CONF */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700511 template L1ctlDlMessage
512 tr_L1CTL_FBSB_CONF(template (present) uint8_t result) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100513 header := tr_L1ctlHeader(L1CTL_FBSB_CONF),
Harald Welte9e4725d2017-07-16 23:18:09 +0200514 dl_info := ?,
515 payload := {
516 fbsb_conf := {
517 initial_freq_err := ?,
518 result := result,
519 bsic := ?
520 }
521 }
522 };
523
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700524 template (value) L1ctlUlMessage
525 ts_L1CTL_CCCH_MODE_REQ(template (value) L1ctlCcchMode ccch_mode) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100526 header := ts_L1ctlHeader(L1CTL_CCCH_MODE_REQ),
527 ul_info := omit,
528 ul_info_tbf := omit,
529 ul_info_abs := omit,
530 payload := {
531 ccch_mode_req := {
532 ccch_mode := ccch_mode,
533 padding := '000000'O
534 }
535 }
536 };
537
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700538 template (value) L1ctlUlMessage
539 ts_L1CTL_TCH_MODE_REQ(template (value) L1ctlTchMode tch_mode := L1CTL_CHAN_MODE_SIGN,
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700540 template (value) L1ctlAudioMode audio_mode := t_L1CTL_AudioModeFwd,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200541 template (value) L1ctlLoopMode loop_mode := L1CTL_LOOP_MODE_OPEN,
542 template (value) uint8_t amr_start_codec := 0,
543 template (value) BIT8 amr_codecs_bitmask := '00000000'B) := {
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700544 header := ts_L1ctlHeader(L1CTL_TCH_MODE_REQ),
545 ul_info := omit,
546 ul_info_tbf := omit,
547 ul_info_abs := omit,
548 payload := {
549 tch_mode_req := {
550 tch_mode := tch_mode,
551 audio_mode := audio_mode,
552 loop_mode := loop_mode,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200553 amr := {
554 start_codec := amr_start_codec,
555 codecs_bitmask := amr_codecs_bitmask
556 }
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700557 }
558 }
559 };
560
Harald Welte3757e602018-03-10 17:12:02 +0100561
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700562 template L1ctlDlMessage
563 tr_L1CTL_MsgType(template (present) L1ctlMsgType msg_type) := {
Harald Welte3757e602018-03-10 17:12:02 +0100564 header := tr_L1ctlHeader(msg_type),
565 dl_info := *,
Harald Weltef56cc492018-04-15 10:58:43 +0200566 payload := *
Harald Welte3757e602018-03-10 17:12:02 +0100567 }
568
569 template L1ctlDlMessage tr_L1CTL_CCCH_MODE_CONF := tr_L1CTL_MsgType(L1CTL_CCCH_MODE_CONF);
Harald Weltef8df4cb2018-03-10 15:15:08 +0100570
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700571 template (value) L1ctlUlMessage
572 ts_L1CTL_RACH_REQ(template (value) uint8_t ra,
573 template (value) uint8_t combined,
574 template (value) uint16_t offset,
575 template (value) RslChannelNr chan_nr := ts_RslChanNr_RACH(0),
576 template (value) RslLinkId link_id := ts_RslLinkID_DCCH(0)) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100577 header := ts_L1ctlHeader(L1CTL_RACH_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200578 ul_info := {
Vadim Yanitskiye432ba92019-05-31 18:44:13 +0700579 chan_nr := chan_nr,
580 link_id := link_id,
Harald Welte9e4725d2017-07-16 23:18:09 +0200581 padding := '0000'O
582 },
Harald Welteb3c226e2017-07-30 17:18:01 +0200583 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100584 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200585 payload := {
586 rach_req := {
587 ra := ra,
588 combined := combined,
589 offset := offset
590 }
591 }
592 }
593
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700594 template (value) L1ctlUlMessage
595 ts_L1CTL_EXT_RACH_REQ(template (value) uint16_t ra11,
596 template (value) L1ctlRachSynchSeq seq,
597 template (value) uint8_t combined,
598 template (value) uint16_t offset) := {
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700599 header := ts_L1ctlHeader(L1CTL_EXT_RACH_REQ),
600 ul_info := {
601 /* FIXME: both RSL chan_nr and link_id should be configurable */
Vadim Yanitskiy443891b2022-03-12 17:46:57 +0300602 chan_nr := ts_RslChanNr_RACH(0),
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700603 link_id := ts_RslLinkID_DCCH(0),
604 padding := '0000'O
605 },
606 ul_info_tbf := omit,
607 ul_info_abs := omit,
608 payload := {
609 ext_rach_req := {
610 ra11 := ra11,
611 synch_seq := seq,
612 combined := combined,
613 offset := offset
614 }
615 }
616 }
617
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700618 template (value) L1ctlUlMessage
619 ts_L1CTL_PAR_REQ(template (value) uint8_t ta,
620 template (value) uint8_t tx_power) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100621 header := ts_L1ctlHeader(L1CTL_PARAM_REQ),
Harald Welte37052732018-03-09 19:38:46 +0100622 ul_info := {
Vadim Yanitskiy443891b2022-03-12 17:46:57 +0300623 chan_nr := ts_RslChanNr_RACH(0),
Harald Welte37052732018-03-09 19:38:46 +0100624 link_id := ts_RslLinkID_DCCH(0),
625 padding := '0000'O
626 },
627 ul_info_tbf := omit,
628 ul_info_abs := omit,
629 payload := {
630 par_req := {
631 ta := ta,
632 tx_power := tx_power,
633 padding := '0000'O
634 }
635 }
636 }
637
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700638 /* Base template to be inherited by ts_L1CTL_DM_EST_REQ_H0 and ts_L1CTL_DM_EST_REQ_H1 */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700639 private template (value) L1ctlUlMessage
640 ts_L1CTL_DM_EST_REQ(template (value) RslChannelNr chan_nr,
641 template (value) GsmTsc tsc) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100642 header := ts_L1ctlHeader(L1CTL_DM_EST_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200643 ul_info := {
644 chan_nr := chan_nr,
645 link_id := ts_RslLinkID_DCCH(0),
646 padding := '0000'O
647 },
Harald Welteb3c226e2017-07-30 17:18:01 +0200648 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100649 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200650 payload := {
651 dm_est_req := {
652 tsc := tsc,
Vadim Yanitskiyfe052962020-10-19 13:27:09 +0700653 tch_mode := L1CTL_CHAN_MODE_SIGN,
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700654 audio_mode := t_L1CTL_AudioModeFwd
Harald Welte9e4725d2017-07-16 23:18:09 +0200655 }
656 }
657 }
658
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700659 template (value) L1ctlUlMessage
660 ts_L1CTL_DM_EST_REQ_H0(template (value) RslChannelNr chan_nr,
661 template (value) GsmTsc tsc,
662 template (value) GsmArfcn arfcn)
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700663 modifies ts_L1CTL_DM_EST_REQ := {
664 payload := {
665 dm_est_req := {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700666 h0h1 := {
667 h0 := {
668 h := 0,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700669 arfcn := ts_GsmBandArfcn(arfcn),
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700670 padding := f_pad_oct(''O, 130, '00'O)
671 }
672 }
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700673 }
674 }
675 }
676
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700677 template (value) L1ctlUlMessage
678 ts_L1CTL_DM_EST_REQ_H1(template (value) RslChannelNr chan_nr,
679 template (value) GsmTsc tsc,
680 template (value) uint6_t hsn,
681 template (value) uint6_t maio,
682 template (value) L1ctlMA ma)
Vadim Yanitskiyeda90812020-05-27 14:51:18 +0700683 modifies ts_L1CTL_DM_EST_REQ := {
684 payload := {
685 dm_est_req := {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700686 h0h1 := {
687 h1 := {
688 h := 1,
689 hsn := hsn,
690 maio := maio,
691 n := sizeof(ma),
692 spare := '00'O,
693 ma := ma,
694 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562849 */
695 padding := f_pad_oct(''O, (64 - sizeof(ma)) * 2, '00'O)
696 }
Vadim Yanitskiyeda90812020-05-27 14:51:18 +0700697 }
698 }
699 }
700 }
701
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700702 template (value) L1ctlUlMessage
703 ts_L1CTL_DM_REL_REQ(template (value) RslChannelNr chan_nr) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100704 header := ts_L1ctlHeader(L1CTL_DM_REL_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200705 ul_info := {
706 chan_nr := chan_nr,
707 link_id := ts_RslLinkID_DCCH(0),
708 padding := '0000'O
709 },
Harald Welteb3c226e2017-07-30 17:18:01 +0200710 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100711 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200712 payload := {
713 other := ''O
714 }
715 }
716
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700717 template (value) L1ctlUlMessage
718 ts_L1CTL_DATA_REQ(template (value) RslChannelNr chan_nr,
719 template (value) RslLinkId link_id,
720 octetstring l2_data) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100721 header := ts_L1ctlHeader(L1CTL_DATA_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200722 ul_info := {
723 chan_nr := chan_nr,
724 link_id := link_id,
725 padding := '0000'O
726 },
Harald Welteb3c226e2017-07-30 17:18:01 +0200727 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100728 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200729 payload := {
Vadim Yanitskiy0a8d6da2019-05-28 22:18:28 +0700730 data_req := {
731 l1header := omit,
732 l2_payload := l2_data
733 }
Harald Welte9e4725d2017-07-16 23:18:09 +0200734 }
735 }
736
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700737 template (value) L1ctlUlMessage
738 ts_L1CTL_DATA_REQ_SACCH(template (value) RslChannelNr chan_nr,
739 template (value) RslLinkId link_id,
740 template (value) SacchL1Header l1h,
741 octetstring l2_data) := {
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200742 header := ts_L1ctlHeader(L1CTL_DATA_REQ),
743 ul_info := {
744 chan_nr := chan_nr,
745 link_id := link_id,
746 padding := '0000'O
747 },
748 ul_info_tbf := omit,
749 ul_info_abs := omit,
750 payload := {
Vadim Yanitskiy0a8d6da2019-05-28 22:18:28 +0700751 data_req := {
752 l1header := l1h,
753 l2_payload := l2_data
754 }
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200755 }
756 }
757
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700758 template (value) L1ctlUlMessage
759 ts_L1CTL_TRAFFIC_REQ(template (value) RslChannelNr chan_nr,
760 template (value) RslLinkId link_id,
761 octetstring frame) := {
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700762 header := ts_L1ctlHeader(L1CTL_TRAFFIC_REQ),
763 ul_info := {
764 chan_nr := chan_nr,
765 link_id := link_id,
766 padding := '0000'O
767 },
768 ul_info_tbf := omit,
769 ul_info_abs := omit,
770 payload := {
771 traffic_req := {
772 data := frame
773 }
774 }
775 };
776
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700777 template (value) L1ctlUlMessage
778 ts_L1CTL_TBF_CFG_REQ(template (value) boolean is_uplink,
779 template (value) TfiUsfArr tfi_usf) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100780 header := ts_L1ctlHeader(L1CTL_TBF_CFG_REQ),
Harald Welte00d4dac2017-07-30 00:50:32 +0200781 ul_info := omit,
Harald Welteb3c226e2017-07-30 17:18:01 +0200782 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100783 ul_info_abs := omit,
Harald Welte00d4dac2017-07-30 00:50:32 +0200784 payload := {
785 tbf_cfg_req := {
786 tbf_nr := 0,
787 is_uplink := is_uplink,
788 padding := '0000'O,
789 tfi_usf := tfi_usf
790 }
791 }
792 };
793
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700794 template L1ctlDlMessage
795 tr_L1CTL_TBF_CFG_CONF(template (present) boolean is_uplink) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100796 header := tr_L1ctlHeader(L1CTL_TBF_CFG_CONF),
Harald Welte00d4dac2017-07-30 00:50:32 +0200797 dl_info := omit,
798 payload := {
799 tbf_cfg_conf := {
800 tbf_nr := 0,
801 is_uplink := is_uplink,
802 padding := ?,
803 tfi_usf := ?
804 }
805 }
806 };
807
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700808 template (value) L1ctlUlMessage
809 ts_L1CTL_DATA_TBF_REQ(octetstring l2_data,
810 template (value) L1ctlGprsCs cs := L1CTL_CS1,
811 template (value) uint8_t tbf_nr := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100812 header := ts_L1ctlHeader(L1CTL_DATA_TBF_REQ),
Harald Welteb3c226e2017-07-30 17:18:01 +0200813 ul_info := omit,
814 ul_info_tbf := {
815 tbf_nr := tbf_nr,
Harald Welte1dcc3712017-08-01 00:05:52 +0200816 cs := cs,
817 padding := '0000'O
Harald Welteb3c226e2017-07-30 17:18:01 +0200818 },
Harald Welte3a40ec72018-03-02 20:45:04 +0100819 ul_info_abs := omit,
Harald Welteb3c226e2017-07-30 17:18:01 +0200820 payload := {
821 other := l2_data
822 }
823 }
824
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700825 template (value) L1ctlUlMessage
826 ts_L1CTL_DATA_ABS_REQ(octetstring l2_data,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700827 template (value) GsmBandArfcn arfcn,
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700828 template (value) uint8_t ts,
829 template (value) GsmFrameNumber fn,
830 template (value) L1ctlGprsCs cs := L1CTL_CS1,
831 template (value) uint8_t tbf_nr := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100832 header := ts_L1ctlHeader(L1CTL_DATA_ABS_REQ),
Harald Welte3a40ec72018-03-02 20:45:04 +0100833 ul_info := omit,
834 ul_info_tbf := omit,
835 ul_info_abs := {
836 tbf_nr := tbf_nr,
837 cs := cs,
838 ts_nr := ts,
839 padding := '00'O,
840 fn := fn,
841 arfcn := arfcn,
842 padding2 := '0000'O
843 },
844 payload := {
845 other := l2_data
846 }
847 }
848
849
Harald Welte9e4725d2017-07-16 23:18:09 +0200850 /* for matching against incoming RACH_CONF */
Harald Weltef8df4cb2018-03-10 15:15:08 +0100851 template L1ctlDlMessage tr_L1CTL_RACH_CONF := {
852 header := tr_L1ctlHeader(L1CTL_RACH_CONF),
Harald Welte9e4725d2017-07-16 23:18:09 +0200853 dl_info := ?,
Harald Weltef56cc492018-04-15 10:58:43 +0200854 payload := *
Harald Welte9e4725d2017-07-16 23:18:09 +0200855 };
856
Harald Weltece6dc442018-02-21 22:00:21 +0100857 /* for matching against incoming DATA_IND */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700858 template L1ctlDlMessage
859 tr_L1CTL_DATA_IND(template (present) RslChannelNr chan_nr,
860 template (present) RslLinkId link_id := ?,
861 template (present) octetstring l2_data := ?,
862 template (present) uint8_t num_biterr := 0,
863 template (present) uint8_t fire_crc := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100864 header := tr_L1ctlHeader(L1CTL_DATA_IND),
Harald Welte9e4725d2017-07-16 23:18:09 +0200865 dl_info := {
866 chan_nr := chan_nr,
Harald Weltece6dc442018-02-21 22:00:21 +0100867 link_id := link_id,
Harald Welte9e4725d2017-07-16 23:18:09 +0200868 arfcn := ?,
869 frame_nr := ?,
870 rx_level := ?,
871 snr := ?,
Harald Welte629cc6b2018-03-11 17:19:05 +0100872 num_biterr := num_biterr,
Pau Espin Pedrol17da3232022-09-02 16:35:32 +0200873 fire_crc := fire_crc
Harald Welte9e4725d2017-07-16 23:18:09 +0200874 },
875 payload := {
Harald Welte68e495b2018-02-25 00:05:57 +0100876 data_ind := {
877 payload := l2_data
878 }
Harald Welte9e4725d2017-07-16 23:18:09 +0200879 }
880 };
881
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700882 /* for matching against incoming TRAFFIC_IND */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700883 template L1ctlDlMessage
884 tr_L1CTL_TRAFFIC_IND(template (present) RslChannelNr chan_nr,
885 template (present) RslLinkId link_id := ?,
886 template (present) octetstring frame := ?,
887 template (present) uint8_t num_biterr := ?,
888 template (present) uint8_t fire_crc := ?) := {
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700889 header := tr_L1ctlHeader(L1CTL_TRAFFIC_IND),
890 dl_info := {
891 chan_nr := chan_nr,
892 link_id := link_id,
893 arfcn := ?,
894 frame_nr := ?,
895 rx_level := ?,
896 snr := ?,
897 num_biterr := num_biterr,
898 fire_crc := fire_crc
899 },
900 payload := {
901 traffic_ind := {
902 data := frame
903 }
904 }
905 };
906
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700907 template (value) L1ctlUlMessage
908 ts_L1CTL_CRYPTO_REQ(template (value) RslChannelNr chan_nr,
909 template (value) uint8_t algo,
910 template (value) octetstring key) := {
Harald Weltee613f962018-04-18 22:38:16 +0200911 header := ts_L1ctlHeader(L1CTL_CRYPTO_REQ),
912 ul_info := {
913 chan_nr := chan_nr,
914 link_id := ts_RslLinkID_DCCH(0),
915 padding := '0000'O
916 },
917 ul_info_tbf := omit,
918 ul_info_abs := omit,
919 payload := {
920 crypto_req := {
921 algo := algo,
922 key_len := 0, /* overwritten */
923 key := key
924 }
925 }
926 };
927
Harald Welte68e495b2018-02-25 00:05:57 +0100928 const octetstring c_DummyUI := '0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O;
929
Harald Welte7024baa2018-03-02 23:37:51 +0100930/* We use "BYTEORDER(last)" so we get little-endian integers. Unfortuantely, this also
931 switches the byte ordering in octet strings, so we need to explicitly annotate them :/ */
Harald Weltef6543322017-07-16 07:35:10 +0200932} with { encode "RAW" };