blob: c8767e2625d009dd0761641941734c7b2aee5dbb [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 Yanitskiy0a3e31c2022-12-18 08:09:38 +0700653 h0h1 := -,
Vadim Yanitskiyfe052962020-10-19 13:27:09 +0700654 tch_mode := L1CTL_CHAN_MODE_SIGN,
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700655 audio_mode := t_L1CTL_AudioModeFwd
Harald Welte9e4725d2017-07-16 23:18:09 +0200656 }
657 }
658 }
659
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700660 template (value) L1ctlUlMessage
661 ts_L1CTL_DM_EST_REQ_H0(template (value) RslChannelNr chan_nr,
662 template (value) GsmTsc tsc,
663 template (value) GsmArfcn arfcn)
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700664 modifies ts_L1CTL_DM_EST_REQ := {
665 payload := {
666 dm_est_req := {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700667 h0h1 := {
668 h0 := {
669 h := 0,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700670 arfcn := ts_GsmBandArfcn(arfcn),
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700671 padding := f_pad_oct(''O, 130, '00'O)
672 }
673 }
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700674 }
675 }
676 }
677
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700678 template (value) L1ctlUlMessage
679 ts_L1CTL_DM_EST_REQ_H1(template (value) RslChannelNr chan_nr,
680 template (value) GsmTsc tsc,
681 template (value) uint6_t hsn,
682 template (value) uint6_t maio,
683 template (value) L1ctlMA ma)
Vadim Yanitskiyeda90812020-05-27 14:51:18 +0700684 modifies ts_L1CTL_DM_EST_REQ := {
685 payload := {
686 dm_est_req := {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700687 h0h1 := {
688 h1 := {
689 h := 1,
690 hsn := hsn,
691 maio := maio,
692 n := sizeof(ma),
693 spare := '00'O,
694 ma := ma,
695 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562849 */
696 padding := f_pad_oct(''O, (64 - sizeof(ma)) * 2, '00'O)
697 }
Vadim Yanitskiyeda90812020-05-27 14:51:18 +0700698 }
699 }
700 }
701 }
702
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700703 template (value) L1ctlUlMessage
704 ts_L1CTL_DM_REL_REQ(template (value) RslChannelNr chan_nr) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100705 header := ts_L1ctlHeader(L1CTL_DM_REL_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200706 ul_info := {
707 chan_nr := chan_nr,
708 link_id := ts_RslLinkID_DCCH(0),
709 padding := '0000'O
710 },
Harald Welteb3c226e2017-07-30 17:18:01 +0200711 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100712 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200713 payload := {
714 other := ''O
715 }
716 }
717
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700718 template (value) L1ctlUlMessage
719 ts_L1CTL_DATA_REQ(template (value) RslChannelNr chan_nr,
720 template (value) RslLinkId link_id,
721 octetstring l2_data) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100722 header := ts_L1ctlHeader(L1CTL_DATA_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200723 ul_info := {
724 chan_nr := chan_nr,
725 link_id := link_id,
726 padding := '0000'O
727 },
Harald Welteb3c226e2017-07-30 17:18:01 +0200728 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100729 ul_info_abs := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200730 payload := {
Vadim Yanitskiy0a8d6da2019-05-28 22:18:28 +0700731 data_req := {
732 l1header := omit,
733 l2_payload := l2_data
734 }
Harald Welte9e4725d2017-07-16 23:18:09 +0200735 }
736 }
737
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700738 template (value) L1ctlUlMessage
739 ts_L1CTL_DATA_REQ_SACCH(template (value) RslChannelNr chan_nr,
740 template (value) RslLinkId link_id,
741 template (value) SacchL1Header l1h,
742 octetstring l2_data) := {
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200743 header := ts_L1ctlHeader(L1CTL_DATA_REQ),
744 ul_info := {
745 chan_nr := chan_nr,
746 link_id := link_id,
747 padding := '0000'O
748 },
749 ul_info_tbf := omit,
750 ul_info_abs := omit,
751 payload := {
Vadim Yanitskiy0a8d6da2019-05-28 22:18:28 +0700752 data_req := {
753 l1header := l1h,
754 l2_payload := l2_data
755 }
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200756 }
757 }
758
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700759 template (value) L1ctlUlMessage
760 ts_L1CTL_TRAFFIC_REQ(template (value) RslChannelNr chan_nr,
761 template (value) RslLinkId link_id,
762 octetstring frame) := {
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700763 header := ts_L1ctlHeader(L1CTL_TRAFFIC_REQ),
764 ul_info := {
765 chan_nr := chan_nr,
766 link_id := link_id,
767 padding := '0000'O
768 },
769 ul_info_tbf := omit,
770 ul_info_abs := omit,
771 payload := {
772 traffic_req := {
773 data := frame
774 }
775 }
776 };
777
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700778 template (value) L1ctlUlMessage
779 ts_L1CTL_TBF_CFG_REQ(template (value) boolean is_uplink,
780 template (value) TfiUsfArr tfi_usf) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100781 header := ts_L1ctlHeader(L1CTL_TBF_CFG_REQ),
Harald Welte00d4dac2017-07-30 00:50:32 +0200782 ul_info := omit,
Harald Welteb3c226e2017-07-30 17:18:01 +0200783 ul_info_tbf := omit,
Harald Welte3a40ec72018-03-02 20:45:04 +0100784 ul_info_abs := omit,
Harald Welte00d4dac2017-07-30 00:50:32 +0200785 payload := {
786 tbf_cfg_req := {
787 tbf_nr := 0,
788 is_uplink := is_uplink,
789 padding := '0000'O,
790 tfi_usf := tfi_usf
791 }
792 }
793 };
794
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700795 template L1ctlDlMessage
796 tr_L1CTL_TBF_CFG_CONF(template (present) boolean is_uplink) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100797 header := tr_L1ctlHeader(L1CTL_TBF_CFG_CONF),
Harald Welte00d4dac2017-07-30 00:50:32 +0200798 dl_info := omit,
799 payload := {
800 tbf_cfg_conf := {
801 tbf_nr := 0,
802 is_uplink := is_uplink,
803 padding := ?,
804 tfi_usf := ?
805 }
806 }
807 };
808
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700809 template (value) L1ctlUlMessage
810 ts_L1CTL_DATA_TBF_REQ(octetstring l2_data,
811 template (value) L1ctlGprsCs cs := L1CTL_CS1,
812 template (value) uint8_t tbf_nr := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100813 header := ts_L1ctlHeader(L1CTL_DATA_TBF_REQ),
Harald Welteb3c226e2017-07-30 17:18:01 +0200814 ul_info := omit,
815 ul_info_tbf := {
816 tbf_nr := tbf_nr,
Harald Welte1dcc3712017-08-01 00:05:52 +0200817 cs := cs,
818 padding := '0000'O
Harald Welteb3c226e2017-07-30 17:18:01 +0200819 },
Harald Welte3a40ec72018-03-02 20:45:04 +0100820 ul_info_abs := omit,
Harald Welteb3c226e2017-07-30 17:18:01 +0200821 payload := {
822 other := l2_data
823 }
824 }
825
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700826 template (value) L1ctlUlMessage
827 ts_L1CTL_DATA_ABS_REQ(octetstring l2_data,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700828 template (value) GsmBandArfcn arfcn,
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700829 template (value) uint8_t ts,
830 template (value) GsmFrameNumber fn,
831 template (value) L1ctlGprsCs cs := L1CTL_CS1,
832 template (value) uint8_t tbf_nr := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100833 header := ts_L1ctlHeader(L1CTL_DATA_ABS_REQ),
Harald Welte3a40ec72018-03-02 20:45:04 +0100834 ul_info := omit,
835 ul_info_tbf := omit,
836 ul_info_abs := {
837 tbf_nr := tbf_nr,
838 cs := cs,
839 ts_nr := ts,
840 padding := '00'O,
841 fn := fn,
842 arfcn := arfcn,
843 padding2 := '0000'O
844 },
845 payload := {
846 other := l2_data
847 }
848 }
849
850
Harald Welte9e4725d2017-07-16 23:18:09 +0200851 /* for matching against incoming RACH_CONF */
Harald Weltef8df4cb2018-03-10 15:15:08 +0100852 template L1ctlDlMessage tr_L1CTL_RACH_CONF := {
853 header := tr_L1ctlHeader(L1CTL_RACH_CONF),
Harald Welte9e4725d2017-07-16 23:18:09 +0200854 dl_info := ?,
Harald Weltef56cc492018-04-15 10:58:43 +0200855 payload := *
Harald Welte9e4725d2017-07-16 23:18:09 +0200856 };
857
Vadim Yanitskiy60b61882022-12-18 06:02:22 +0700858 /* for sending and matching L1CTL_DATA_IND */
859 template (value) L1ctlDlMessage
860 ts_L1CTL_DATA_IND(template (value) RslChannelNr chan_nr,
861 template (value) RslLinkId link_id,
862 template (value) octetstring l2_data,
863 template (value) GsmBandArfcn arfcn,
864 template (value) uint32_t fn := 1337,
865 template (value) GsmRxLev rx_level := 63,
866 template (value) uint8_t num_biterr := 0,
867 template (value) uint8_t fire_crc := 0) := {
868 header := ts_L1ctlHeader(L1CTL_DATA_IND),
869 dl_info := {
870 chan_nr := chan_nr,
871 link_id := link_id,
872 arfcn := arfcn,
873 frame_nr := fn,
874 rx_level := rx_level,
875 snr := 0,
876 num_biterr := num_biterr,
877 fire_crc := fire_crc
878 },
879 payload := {
880 data_ind := {
881 payload := l2_data
882 }
883 }
884 };
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700885 template L1ctlDlMessage
886 tr_L1CTL_DATA_IND(template (present) RslChannelNr chan_nr,
887 template (present) RslLinkId link_id := ?,
888 template (present) octetstring l2_data := ?,
889 template (present) uint8_t num_biterr := 0,
890 template (present) uint8_t fire_crc := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100891 header := tr_L1ctlHeader(L1CTL_DATA_IND),
Harald Welte9e4725d2017-07-16 23:18:09 +0200892 dl_info := {
893 chan_nr := chan_nr,
Harald Weltece6dc442018-02-21 22:00:21 +0100894 link_id := link_id,
Harald Welte9e4725d2017-07-16 23:18:09 +0200895 arfcn := ?,
896 frame_nr := ?,
897 rx_level := ?,
898 snr := ?,
Harald Welte629cc6b2018-03-11 17:19:05 +0100899 num_biterr := num_biterr,
Pau Espin Pedrol17da3232022-09-02 16:35:32 +0200900 fire_crc := fire_crc
Harald Welte9e4725d2017-07-16 23:18:09 +0200901 },
902 payload := {
Harald Welte68e495b2018-02-25 00:05:57 +0100903 data_ind := {
904 payload := l2_data
905 }
Harald Welte9e4725d2017-07-16 23:18:09 +0200906 }
907 };
908
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700909 /* for matching against incoming TRAFFIC_IND */
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700910 template L1ctlDlMessage
911 tr_L1CTL_TRAFFIC_IND(template (present) RslChannelNr chan_nr,
912 template (present) RslLinkId link_id := ?,
913 template (present) octetstring frame := ?,
914 template (present) uint8_t num_biterr := ?,
915 template (present) uint8_t fire_crc := ?) := {
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700916 header := tr_L1ctlHeader(L1CTL_TRAFFIC_IND),
917 dl_info := {
918 chan_nr := chan_nr,
919 link_id := link_id,
920 arfcn := ?,
921 frame_nr := ?,
922 rx_level := ?,
923 snr := ?,
924 num_biterr := num_biterr,
925 fire_crc := fire_crc
926 },
927 payload := {
928 traffic_ind := {
929 data := frame
930 }
931 }
932 };
933
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700934 template (value) L1ctlUlMessage
935 ts_L1CTL_CRYPTO_REQ(template (value) RslChannelNr chan_nr,
936 template (value) uint8_t algo,
937 template (value) octetstring key) := {
Harald Weltee613f962018-04-18 22:38:16 +0200938 header := ts_L1ctlHeader(L1CTL_CRYPTO_REQ),
939 ul_info := {
940 chan_nr := chan_nr,
941 link_id := ts_RslLinkID_DCCH(0),
942 padding := '0000'O
943 },
944 ul_info_tbf := omit,
945 ul_info_abs := omit,
946 payload := {
947 crypto_req := {
948 algo := algo,
949 key_len := 0, /* overwritten */
950 key := key
951 }
952 }
953 };
954
Harald Welte68e495b2018-02-25 00:05:57 +0100955 const octetstring c_DummyUI := '0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O;
956
Harald Welte7024baa2018-03-02 23:37:51 +0100957/* We use "BYTEORDER(last)" so we get little-endian integers. Unfortuantely, this also
958 switches the byte ordering in octet strings, so we need to explicitly annotate them :/ */
Harald Weltef6543322017-07-16 07:35:10 +0200959} with { encode "RAW" };