blob: b977a7ddcb94f89b27e2a10e30e4c09be1997135 [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
19 type enumerated L1ctlMsgType {
20 L1CTL_NONE,
21 L1CTL_FBSB_REQ,
22 L1CTL_FBSB_CONF,
23 L1CTL_DATA_IND,
24 L1CTL_RACH_REQ,
25 L1CTL_DM_EST_REQ,
26 L1CTL_DATA_REQ,
27 L1CTL_RESET_IND,
28 L1CTL_PM_REQ, /* power measurement */
29 L1CTL_PM_CONF, /* power measurement */
30 L1CTL_ECHO_REQ,
31 L1CTL_ECHO_CONF,
32 L1CTL_RACH_CONF,
33 L1CTL_RESET_REQ,
34 L1CTL_RESET_CONF,
35 L1CTL_DATA_CONF,
36 L1CTL_CCCH_MODE_REQ,
37 L1CTL_CCCH_MODE_CONF,
38 L1CTL_DM_REL_REQ,
39 L1CTL_PARAM_REQ,
40 L1CTL_DM_FREQ_REQ,
41 L1CTL_CRYPTO_REQ,
42 L1CTL_SIM_REQ,
43 L1CTL_SIM_CONF,
44 L1CTL_TCH_MODE_REQ,
45 L1CTL_TCH_MODE_CONF,
46 L1CTL_NEIGH_PM_REQ,
47 L1CTL_NEIGH_PM_IND,
48 L1CTL_TRAFFIC_REQ,
49 L1CTL_TRAFFIC_CONF,
Harald Welte00d4dac2017-07-30 00:50:32 +020050 L1CTL_TRAFFIC_IND,
Vadim Yanitskiy4e79ff52019-04-22 06:38:21 +070051 L1CTL_BURST_IND,
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +070052 L1CTL_GPRS_UL_TBF_CFG_REQ,
53 L1CTL_GPRS_DL_TBF_CFG_REQ,
54 L1CTL_GPRS_UL_BLOCK_REQ,
55 L1CTL_GPRS_DL_BLOCK_IND,
Vadim Yanitskiy9f40dc52023-12-15 13:55:59 +070056 L1CTL_EXT_RACH_REQ,
Vadim Yanitskiy090759a2024-02-05 21:42:29 +070057 L1CTL_GPRS_RTS_IND,
58 L1CTL_GPRS_UL_BLOCK_CNF
Harald Weltef6543322017-07-16 07:35:10 +020059 } with { variant "FIELDLENGTH(8)" };
60
61 type enumerated L1ctlCcchMode {
62 CCCH_MODE_NONE (0),
63 CCCH_MODE_NON_COMBINED,
Harald Welte990a3612019-05-27 14:02:13 +020064 CCCH_MODE_COMBINED,
65 CCCH_MODE_COMBINED_CBCH
Harald Weltef6543322017-07-16 07:35:10 +020066 } with { variant "FIELDLENGTH(8)" };
67
68 type enumerated L1ctlNeighMode {
69 NEIGH_MODE_NONE (0),
70 NEIGH_MODE_PM,
71 NEIGH_MODE_SB
72 } with { variant "FIELDLENGTH(8)" };
73
74 type enumerated L1ctlResetType {
75 L1CTL_RES_T_BOOT (0),
76 L1CTL_RES_T_FULL,
77 L1CTL_RES_T_SCHED
78 } with { variant "FIELDLENGTH(8)" };
79
Harald Weltef6543322017-07-16 07:35:10 +020080 type record L1ctlHdrFlags {
81 BIT7 padding,
82 boolean f_done
83 } with { variant "" };
84
85 type record L1ctlHeader {
86 L1ctlMsgType msg_type,
87 L1ctlHdrFlags flags,
88 OCT2 padding
89 } with { variant "" };
90
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +070091 template L1ctlHeader
92 tr_L1ctlHeader(template (present) L1ctlMsgType msg_type) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +010093 msg_type := msg_type,
94 flags := ?,
95 padding := ?
96 };
97
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +070098 template (value) L1ctlHeader
99 ts_L1ctlHeader(template (value) L1ctlMsgType msg_type) := {
Harald Welte52c713c2017-07-16 15:44:44 +0200100 msg_type := msg_type,
101 flags := { padding := '0000000'B, f_done := false },
102 padding := '0000'O
103 };
104
Harald Weltef6543322017-07-16 07:35:10 +0200105 type record L1ctlDlInfo {
Harald Welte8e4db2c2017-07-16 18:54:55 +0200106 RslChannelNr chan_nr,
Harald Weltef6543322017-07-16 07:35:10 +0200107 RslLinkId link_id,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700108 GsmBandArfcn arfcn,
Harald Welte5f0d5c82017-07-16 18:56:01 +0200109 uint32_t frame_nr,
Harald Weltef6543322017-07-16 07:35:10 +0200110 GsmRxLev rx_level,
111 uint8_t snr,
112 uint8_t num_biterr,
113 uint8_t fire_crc
114 } with { variant "" };
115
116 type record L1ctlFbsbConf {
117 int16_t initial_freq_err,
118 uint8_t result,
119 uint8_t bsic
120 } with { variant "" };
121
122 type record L1ctlCcchModeConf {
123 L1ctlCcchMode ccch_mode,
124 OCT3 padding
125 } with { variant "" };
126
127 /* gsm48_chan_mode */
Vadim Yanitskiyfe052962020-10-19 13:27:09 +0700128 type enumerated L1ctlTchMode {
129 L1CTL_CHAN_MODE_SIGN ('00000000'B), /* Signalling */
130 L1CTL_CHAN_MODE_SPEECH_V1 ('00000001'B), /* FR or HR codec */
131 L1CTL_CHAN_MODE_SPEECH_V2 ('00100001'B), /* EFR codec */
Vadim Yanitskiy8fd78f72023-05-26 19:21:55 +0700132 L1CTL_CHAN_MODE_SPEECH_V3 ('01000001'B), /* AMR codec */
133 L1CTL_CHAN_MODE_DATA_14k5 ('00001111'B), /* CSD: TCH/F14.4 */
134 L1CTL_CHAN_MODE_DATA_12k0 ('00000011'B), /* CSD: TCH/F9.6 */
135 L1CTL_CHAN_MODE_DATA_6k0 ('00001011'B), /* CSD: TCH/{FH}4.8 */
136 L1CTL_CHAN_MODE_DATA_3k6 ('00010011'B) /* CSD: TCH/{FH}2.4 */
Vadim Yanitskiyfe052962020-10-19 13:27:09 +0700137 } with { variant "FIELDLENGTH(8)" };
Harald Weltef6543322017-07-16 07:35:10 +0200138
Vadim Yanitskiy7ce605f2020-10-19 16:04:38 +0700139 type enumerated L1ctlLoopMode {
140 L1CTL_LOOP_MODE_OPEN ('00000000'B),
141 L1CTL_LOOP_MODE_A ('00000001'B),
142 L1CTL_LOOP_MODE_B ('00000010'B),
143 L1CTL_LOOP_MODE_C ('00000011'B),
144 L1CTL_LOOP_MODE_D ('00000100'B),
145 L1CTL_LOOP_MODE_E ('00000101'B),
146 L1CTL_LOOP_MODE_F ('00000110'B),
147 L1CTL_LOOP_MODE_I ('00000111'B)
148 } with { variant "FIELDLENGTH(8)" };
149
Harald Weltef6543322017-07-16 07:35:10 +0200150 type record L1ctlAudioMode {
151 BIT4 padding,
152 boolean tx_microphone,
153 boolean tx_traffic_req,
154 boolean rx_speaker,
155 boolean rx_traffic_ind
156 } with { variant "" };
157
Harald Weltef8df4cb2018-03-10 15:15:08 +0100158 template (value) L1ctlAudioMode t_L1CTL_AudioModeNone := { '0000'B, false, false, false, false };
Harald Welte66110f02017-07-16 21:05:18 +0200159
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700160 /* Traffic forwarding mode (see TRAFFIC.{req,cnf,ind} messages) */
161 template (value) L1ctlAudioMode t_L1CTL_AudioModeFwd
162 modifies t_L1CTL_AudioModeNone := {
163 tx_traffic_req := true,
164 rx_traffic_ind := true
165 };
166
Harald Weltef6543322017-07-16 07:35:10 +0200167 type record L1ctlTchModeConf {
168 L1ctlTchMode tch_mode,
169 L1ctlAudioMode audio_mode,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200170 record {
171 uint8_t start_codec,
172 BIT8 codecs_bitmask
173 } amr
Harald Weltef6543322017-07-16 07:35:10 +0200174 } with { variant "" };
175
176 type record L1ctlDataInd {
Vadim Yanitskiy2a92e2a2019-05-28 21:13:35 +0700177 octetstring payload
Harald Welte7024baa2018-03-02 23:37:51 +0100178 } with {
179 variant (payload) "BYTEORDER(first)"
180 };
Harald Weltef6543322017-07-16 07:35:10 +0200181
Harald Weltef6543322017-07-16 07:35:10 +0200182
183 type record L1ctlUlInfo {
Harald Welte8e4db2c2017-07-16 18:54:55 +0200184 RslChannelNr chan_nr,
Harald Weltef6543322017-07-16 07:35:10 +0200185 RslLinkId link_id,
186 OCT2 padding
187 } with { variant "" };
188
189 type record L1ctlFbsbFlags {
190 BIT5 padding,
191 boolean sb,
192 boolean fb1,
193 boolean fb0
Harald Welte344c0cf2018-03-09 16:17:45 +0100194 } with { variant "FIELDORDER(msb)" };
Harald Weltef6543322017-07-16 07:35:10 +0200195
Harald Weltef8df4cb2018-03-10 15:15:08 +0100196 template (value) L1ctlFbsbFlags t_L1CTL_FBSB_F_ALL := {
Harald Welte66110f02017-07-16 21:05:18 +0200197 padding := '00000'B,
198 sb := true,
199 fb1 := true,
200 fb0 := true
201 };
202
Harald Weltef6543322017-07-16 07:35:10 +0200203 type record L1ctlFbsbReq {
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700204 GsmBandArfcn arfcn,
Harald Weltef6543322017-07-16 07:35:10 +0200205 uint16_t timeout_tdma_frames,
206 uint16_t freq_err_thresh1,
207 uint16_t freq_err_thresh2,
208 uint8_t num_freqerr_avg,
209 L1ctlFbsbFlags flags,
210 uint8_t sync_info_idx,
211 L1ctlCcchMode ccch_mode,
212 GsmRxLev rxlev_exp
213 } with { variant "" };
214
215 type record L1ctlCcchModeReq {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100216 L1ctlCcchMode ccch_mode,
217 OCT3 padding
Harald Weltef6543322017-07-16 07:35:10 +0200218 } with { variant "" };
219
220 type record L1ctlTchModeReq {
221 L1ctlTchMode tch_mode,
222 L1ctlAudioMode audio_mode,
Vadim Yanitskiy7ce605f2020-10-19 16:04:38 +0700223 L1ctlLoopMode loop_mode,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200224 record {
225 uint8_t start_codec,
226 BIT8 codecs_bitmask
227 } amr
Harald Weltef6543322017-07-16 07:35:10 +0200228 } with { variant "" };
229
230 type record L1ctlRachReq {
231 uint8_t ra,
232 uint8_t combined,
233 uint16_t offset
234 } with { variant "" };
235
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700236 type enumerated L1ctlRachSynchSeq {
237 RACH_SYNCH_SEQ_TS0 (0),
238 RACH_SYNCH_SEQ_TS1,
239 RACH_SYNCH_SEQ_TS2
240 } with { variant "FIELDLENGTH(8)" };
241
242 type record L1ctlExtRachReq {
243 uint16_t ra11,
244 L1ctlRachSynchSeq synch_seq,
245 uint8_t combined,
246 uint16_t offset
247 } with { variant "" };
248
Harald Weltef6543322017-07-16 07:35:10 +0200249 type record L1ctlParReq {
250 int8_t ta,
251 uint8_t tx_power,
252 OCT2 padding
253 } with { variant "" };
254
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200255 type record L1ctlDataReq {
256 SacchL1Header l1header optional,
257 octetstring l2_payload
258 } with { variant "" };
259
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700260 type record L1ctlH0 {
261 uint8_t h,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700262 GsmBandArfcn arfcn,
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700263 octetstring padding length(130)
264 } with { variant "" };
265
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700266 type record length(0..64) of GsmBandArfcn L1ctlMA;
Harald Weltef6543322017-07-16 07:35:10 +0200267 type record L1ctlH1 {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700268 uint8_t h,
Harald Weltef6543322017-07-16 07:35:10 +0200269 uint8_t hsn,
270 uint8_t maio,
271 uint8_t n,
Vadim Yanitskiye8ea3ee2020-05-27 13:29:48 +0700272 OCT1 spare,
273 L1ctlMA ma,
274 octetstring padding
275 } with {
276 variant (n) "LENGTHTO(ma)"
277 variant (n) "UNIT(elements)"
278 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562849.
279 * TL;DR The reference point of the PADDING attribute is the beginning
280 * of the message, not the beginning of the type/field it's applied on.
281 * Therefore we cannot use it here, and have to add padding manually.
282 * variant (ma) "PADDING(128)" */
283 };
Harald Weltef6543322017-07-16 07:35:10 +0200284
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700285 type union L1ctlH0H1 {
286 L1ctlH0 h0,
287 L1ctlH1 h1
288 } with { variant "TAG(h0, h = 0; h1, h = 1)" };
289
Harald Weltef6543322017-07-16 07:35:10 +0200290 type record L1ctlDmEstReq {
291 GsmTsc tsc,
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700292 L1ctlH0H1 h0h1,
Harald Weltef6543322017-07-16 07:35:10 +0200293 L1ctlTchMode tch_mode,
294 L1ctlAudioMode audio_mode
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700295 } with { variant "" };
Harald Weltef6543322017-07-16 07:35:10 +0200296
297 type record L1ctlReset {
298 L1ctlResetType reset_type,
299 OCT3 padding
300 } with { variant "" };
301
Harald Weltee613f962018-04-18 22:38:16 +0200302 type record L1CtlCryptoReq {
303 uint8_t algo,
304 uint8_t key_len,
305 octetstring key
306 } with { variant (key_len) "LENGTHTO(key)" };
307
Harald Weltef6543322017-07-16 07:35:10 +0200308
309 type record L1ctlTrafficReq {
Vadim Yanitskiye01691d2018-10-29 00:18:04 +0700310 octetstring data
Harald Welte7024baa2018-03-02 23:37:51 +0100311 } with {
312 variant (data) "BYTEORDER(first)"
313 }
Harald Weltef6543322017-07-16 07:35:10 +0200314
Harald Welte00d4dac2017-07-30 00:50:32 +0200315
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700316 /* payload of L1CTL_GPRS_UL_TBF_CFG_REQ */
317 type record L1ctlGprsUlTbfCfgReq {
318 uint8_t tbf_ref,
319 BIT8 slotmask,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700320 OCT2 pad ('0000'O),
321 uint32_t start_fn /* TBF Starting Time (absolute Fn) */
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700322 } with { variant (slotmask) "BITORDER(msb)" };
323
324 /* payload of L1CTL_GPRS_DL_TBF_CFG_REQ */
325 type record L1ctlGprsDlTbfCfgReq {
326 uint8_t tbf_ref,
327 BIT8 slotmask,
328 uint8_t dl_tfi,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700329 OCT1 pad ('00'O),
330 uint32_t start_fn /* TBF Starting Time (absolute Fn) */
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700331 } with { variant (slotmask) "BITORDER(msb)" };
332
333 /* part of L1CTL_GPRS_{UL,DL}_BLOCK_{REQ,IND} */
334 type record L1ctlGprsBlockHdr {
335 uint32_t fn,
336 uint8_t tn,
337 OCT3 pad ('000000'O)
338 } with { variant "" };
339
340 /* payload of L1CTL_GPRS_UL_BLOCK_REQ */
341 type record L1ctlGprsUlBlockReq {
342 L1ctlGprsBlockHdr hdr,
343 octetstring data
344 } with { variant (data) "BYTEORDER(first)" };
345
Vadim Yanitskiy090759a2024-02-05 21:42:29 +0700346 /* payload of L1CTL_GPRS_UL_BLOCK_CNF */
347 type record L1ctlGprsUlBlockCnf {
348 uint32_t fn,
349 uint8_t tn,
350 octetstring data
351 } with { variant "" };
352
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700353 /* payload of L1CTL_GPRS_DL_BLOCK_IND */
354 type record L1ctlGprsDlBlockInd {
355 L1ctlGprsBlockHdr hdr,
356 record {
357 uint16_t ber10k, /* Bit Error Rate */
358 int16_t ci_cb, /* C/I in centiBels */
359 uint8_t rx_level /* RxLev 0..63 */
360 } meas,
361 uint8_t usf,
362 octetstring data
363 } with { variant (data) "BYTEORDER(first)" };
364
Vadim Yanitskiy9f40dc52023-12-15 13:55:59 +0700365 /* payload of L1CTL_GPRS_RTS_IND */
366 type record L1ctlGprsRtsInd {
367 uint32_t fn,
368 uint8_t tn,
369 uint8_t usf
370 } with { variant "" };
371
Harald Welte00d4dac2017-07-30 00:50:32 +0200372
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700373 type union L1ctlMsgPayload {
Harald Weltef6543322017-07-16 07:35:10 +0200374 L1ctlFbsbReq fbsb_req,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700375 L1ctlFbsbConf fbsb_conf,
376 L1ctlDataInd data_ind,
Harald Weltef6543322017-07-16 07:35:10 +0200377 L1ctlRachReq rach_req,
Harald Weltef6543322017-07-16 07:35:10 +0200378 L1ctlDmEstReq dm_est_req,
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200379 L1ctlDataReq data_req,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700380 /* TODO: L1CTL_RESET_IND */
381 /* TODO: L1CTL_PM_REQ */
382 /* TODO: L1CTL_PM_CONF */
383 L1ctlReset reset_req,
384 L1ctlCcchModeReq ccch_mode_req,
385 L1ctlCcchModeConf ccch_mode_conf,
386 L1ctlParReq par_req,
387 /* TODO: L1CTL_DM_FREQ_REQ */
388 L1CtlCryptoReq crypto_req,
389 /* TODO: L1CTL_SIM_REQ */
390 /* TODO: L1CTL_SIM_CONF */
391 L1ctlTchModeReq tch_mode_req,
392 L1ctlTchModeConf tch_mode_conf,
393 /* TODO: L1CTL_NEIGH_PM_REQ */
394 /* TODO: L1CTL_NEIGH_PM_IND */
395 L1ctlTrafficReq traffic_req,
396 L1ctlTrafficReq traffic_ind,
397 /* TODO: L1CTL_BURST_IND */
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700398 L1ctlGprsUlTbfCfgReq ul_tbf_cfg_req,
399 L1ctlGprsDlTbfCfgReq dl_tbf_cfg_req,
400 L1ctlGprsUlBlockReq ul_block_req,
Vadim Yanitskiy090759a2024-02-05 21:42:29 +0700401 L1ctlGprsUlBlockCnf ul_block_cnf,
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700402 L1ctlGprsDlBlockInd dl_block_ind,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700403 L1ctlExtRachReq ext_rach_req,
Vadim Yanitskiy9f40dc52023-12-15 13:55:59 +0700404 L1ctlGprsRtsInd rts_ind,
Harald Weltef6543322017-07-16 07:35:10 +0200405 octetstring other
Harald Welte7024baa2018-03-02 23:37:51 +0100406 } with {
407 variant (other) "BYTEORDER(first)"
408 };
Harald Weltef6543322017-07-16 07:35:10 +0200409
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700410 type record L1ctlMessage {
Harald Weltef6543322017-07-16 07:35:10 +0200411 L1ctlHeader header,
412 L1ctlUlInfo ul_info optional,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700413 L1ctlDlInfo dl_info optional,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700414 L1ctlMsgPayload payload optional
Harald Weltef6543322017-07-16 07:35:10 +0200415 } 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)"
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700424 variant (dl_info) "PRESENCE(header.msg_type = L1CTL_FBSB_CONF,
425 header.msg_type = L1CTL_RACH_CONF,
426 header.msg_type = L1CTL_DATA_IND,
427 header.msg_type = L1CTL_DATA_CONF,
428 header.msg_type = L1CTL_TRAFFIC_IND,
429 header.msg_type = L1CTL_TRAFFIC_CONF)"
Harald Weltef6543322017-07-16 07:35:10 +0200430 variant (payload) "CROSSTAG(fbsb_req, header.msg_type = L1CTL_FBSB_REQ;
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700431 fbsb_conf, header.msg_type = L1CTL_FBSB_CONF;
432 data_ind, header.msg_type = L1CTL_DATA_IND;
Harald Weltef6543322017-07-16 07:35:10 +0200433 rach_req, header.msg_type = L1CTL_RACH_REQ;
Harald Weltef6543322017-07-16 07:35:10 +0200434 dm_est_req, header.msg_type = L1CTL_DM_EST_REQ;
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200435 data_req, header.msg_type = L1CTL_DATA_REQ;
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700436 /* TODO: reset_ind, header.msg_type = L1CTL_RESET_IND */
437 /* TODO: pm_req, header.msg_type = L1CTL_PM_REQ */
438 /* TODO: pm_conf, header.msg_type = L1CTL_PM_CONF */
439 reset_req, header.msg_type = L1CTL_RESET_REQ;
440 ccch_mode_req, header.msg_type = L1CTL_CCCH_MODE_REQ;
441 ccch_mode_conf, header.msg_type = L1CTL_CCCH_MODE_CONF;
442 par_req, header.msg_type = L1CTL_PARAM_REQ;
443 /* TODO: freq_req, header.msg_type = L1CTL_DM_FREQ_REQ */
444 crypto_req, header.msg_type = L1CTL_CRYPTO_REQ;
445 /* TODO: sim_req, header.msg_type = L1CTL_SIM_REQ */
446 /* TODO: sim_conf, header.msg_type = L1CTL_SIM_CONF */
447 tch_mode_req, header.msg_type = L1CTL_TCH_MODE_REQ;
448 tch_mode_conf, header.msg_type = L1CTL_TCH_MODE_CONF;
449 /* TODO: neigh_pm_req, header.msg_type = L1CTL_NEIGH_PM_REQ */
450 /* TODO: neigh_pm_ind, header.msg_type = L1CTL_NEIGH_PM_IND */
451 traffic_req, header.msg_type = L1CTL_TRAFFIC_REQ;
452 traffic_ind, header.msg_type = L1CTL_TRAFFIC_IND;
453 /* TODO: burst_ind, header.msg_type = L1CTL_BURST_IND */
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700454 ul_tbf_cfg_req, header.msg_type = L1CTL_GPRS_UL_TBF_CFG_REQ;
455 dl_tbf_cfg_req, header.msg_type = L1CTL_GPRS_DL_TBF_CFG_REQ;
456 ul_block_req, header.msg_type = L1CTL_GPRS_UL_BLOCK_REQ;
Vadim Yanitskiy090759a2024-02-05 21:42:29 +0700457 ul_block_cnf, header.msg_type = L1CTL_GPRS_UL_BLOCK_CNF;
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700458 dl_block_ind, header.msg_type = L1CTL_GPRS_DL_BLOCK_IND;
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700459 ext_rach_req, header.msg_type = L1CTL_EXT_RACH_REQ;
Vadim Yanitskiy9f40dc52023-12-15 13:55:59 +0700460 rts_ind, header.msg_type = L1CTL_GPRS_RTS_IND;
Harald Weltef6543322017-07-16 07:35:10 +0200461 other, OTHERWISE;
462 )" };
463
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700464 external function enc_L1ctlMessage(in L1ctlMessage msg) return octetstring
Harald Weltef6543322017-07-16 07:35:10 +0200465 with { extension "prototype(convert) encode(RAW)" };
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700466 external function dec_L1ctlMessage(in octetstring stream) return L1ctlMessage
Harald Weltef6543322017-07-16 07:35:10 +0200467 with { extension "prototype(convert) decode(RAW)" };
468
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700469 type record L1ctlMessageLV {
Harald Welte52c713c2017-07-16 15:44:44 +0200470 uint16_t len,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700471 L1ctlMessage msg
Harald Welte52c713c2017-07-16 15:44:44 +0200472 } with { variant (len) "LENGTHTO(msg)" };
473
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700474 external function enc_L1ctlMessageLV(in L1ctlMessageLV msg) return octetstring
Harald Welte52c713c2017-07-16 15:44:44 +0200475 with { extension "prototype(convert) encode(RAW)" };
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700476 external function dec_L1ctlMessageLV(in octetstring stream) return L1ctlMessageLV
Harald Welte52c713c2017-07-16 15:44:44 +0200477 with { extension "prototype(convert) decode(RAW)" };
478
479
Harald Welte9e4725d2017-07-16 23:18:09 +0200480
Harald Welte9e4725d2017-07-16 23:18:09 +0200481 /* for generating RESET_REQ */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700482 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700483 t_L1ctlResetReq(template (value) L1ctlResetType rst_type) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100484 header := ts_L1ctlHeader(L1CTL_RESET_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200485 ul_info := omit,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700486 dl_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200487 payload := {
488 reset_req := {
489 reset_type := rst_type,
490 padding := '000000'O
491 }
492 }
493 };
494
495 /* for generating FBSB_REQ */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700496 template (value) L1ctlMessage
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700497 ts_L1CTL_FBSB_REQ(template (value) GsmBandArfcn arfcn,
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700498 template (value) L1ctlFbsbFlags flags,
499 template (value) uint8_t sync_info_idx,
500 template (value) L1ctlCcchMode ccch_mode,
501 template (value) GsmRxLev rxlev_exp) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100502 header := ts_L1ctlHeader(L1CTL_FBSB_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200503 ul_info := omit,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700504 dl_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200505 payload := {
506 fbsb_req := {
507 arfcn := arfcn,
Harald Weltea82f7e62018-02-22 18:51:33 +0100508 timeout_tdma_frames := 250, /* about 1s */
Harald Welte9e4725d2017-07-16 23:18:09 +0200509 freq_err_thresh1 := 10000,
510 freq_err_thresh2 := 800,
511 num_freqerr_avg := 3,
512 flags := flags,
513 sync_info_idx := sync_info_idx,
514 ccch_mode := ccch_mode,
515 rxlev_exp := rxlev_exp
516 }
517 }
518 };
519
520 /* for matching against incoming FBSB_CONF */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700521 template L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700522 tr_L1CTL_FBSB_CONF(template (present) uint8_t result) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100523 header := tr_L1ctlHeader(L1CTL_FBSB_CONF),
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700524 ul_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200525 dl_info := ?,
526 payload := {
527 fbsb_conf := {
528 initial_freq_err := ?,
529 result := result,
530 bsic := ?
531 }
532 }
533 };
534
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700535 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700536 ts_L1CTL_CCCH_MODE_REQ(template (value) L1ctlCcchMode ccch_mode) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100537 header := ts_L1ctlHeader(L1CTL_CCCH_MODE_REQ),
538 ul_info := omit,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700539 dl_info := omit,
Harald Weltef8df4cb2018-03-10 15:15:08 +0100540 payload := {
541 ccch_mode_req := {
542 ccch_mode := ccch_mode,
543 padding := '000000'O
544 }
545 }
546 };
547
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700548 template (value) L1ctlMessage
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700549 ts_L1CTL_TCH_MODE_REQ(template (value) L1ctlTchMode tch_mode := L1CTL_CHAN_MODE_SIGN,
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700550 template (value) L1ctlAudioMode audio_mode := t_L1CTL_AudioModeFwd,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200551 template (value) L1ctlLoopMode loop_mode := L1CTL_LOOP_MODE_OPEN,
552 template (value) uint8_t amr_start_codec := 0,
553 template (value) BIT8 amr_codecs_bitmask := '00000000'B) := {
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700554 header := ts_L1ctlHeader(L1CTL_TCH_MODE_REQ),
555 ul_info := omit,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700556 dl_info := omit,
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700557 payload := {
558 tch_mode_req := {
559 tch_mode := tch_mode,
560 audio_mode := audio_mode,
561 loop_mode := loop_mode,
Pau Espin Pedrol440e1dc2022-09-02 16:35:49 +0200562 amr := {
563 start_codec := amr_start_codec,
564 codecs_bitmask := amr_codecs_bitmask
565 }
Vadim Yanitskiy3b1fae42020-10-19 16:16:41 +0700566 }
567 }
568 };
569
Harald Welte3757e602018-03-10 17:12:02 +0100570
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700571 template L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700572 tr_L1CTL_MsgType(template (present) L1ctlMsgType msg_type) := {
Harald Welte3757e602018-03-10 17:12:02 +0100573 header := tr_L1ctlHeader(msg_type),
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700574 ul_info := *,
Harald Welte3757e602018-03-10 17:12:02 +0100575 dl_info := *,
Harald Weltef56cc492018-04-15 10:58:43 +0200576 payload := *
Harald Welte3757e602018-03-10 17:12:02 +0100577 }
578
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700579 template L1ctlMessage tr_L1CTL_CCCH_MODE_CONF := tr_L1CTL_MsgType(L1CTL_CCCH_MODE_CONF);
Harald Weltef8df4cb2018-03-10 15:15:08 +0100580
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700581 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700582 ts_L1CTL_RACH_REQ(template (value) uint8_t ra,
583 template (value) uint8_t combined,
584 template (value) uint16_t offset,
585 template (value) RslChannelNr chan_nr := ts_RslChanNr_RACH(0),
586 template (value) RslLinkId link_id := ts_RslLinkID_DCCH(0)) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100587 header := ts_L1ctlHeader(L1CTL_RACH_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200588 ul_info := {
Vadim Yanitskiye432ba92019-05-31 18:44:13 +0700589 chan_nr := chan_nr,
590 link_id := link_id,
Harald Welte9e4725d2017-07-16 23:18:09 +0200591 padding := '0000'O
592 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700593 dl_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200594 payload := {
595 rach_req := {
596 ra := ra,
597 combined := combined,
598 offset := offset
599 }
600 }
601 }
602
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700603 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700604 ts_L1CTL_EXT_RACH_REQ(template (value) uint16_t ra11,
605 template (value) L1ctlRachSynchSeq seq,
606 template (value) uint8_t combined,
607 template (value) uint16_t offset) := {
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700608 header := ts_L1ctlHeader(L1CTL_EXT_RACH_REQ),
609 ul_info := {
610 /* FIXME: both RSL chan_nr and link_id should be configurable */
Vadim Yanitskiy443891b2022-03-12 17:46:57 +0300611 chan_nr := ts_RslChanNr_RACH(0),
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700612 link_id := ts_RslLinkID_DCCH(0),
613 padding := '0000'O
614 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700615 dl_info := omit,
Vadim Yanitskiy5c836792019-04-22 05:45:03 +0700616 payload := {
617 ext_rach_req := {
618 ra11 := ra11,
619 synch_seq := seq,
620 combined := combined,
621 offset := offset
622 }
623 }
624 }
625
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700626 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700627 ts_L1CTL_PAR_REQ(template (value) uint8_t ta,
628 template (value) uint8_t tx_power) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100629 header := ts_L1ctlHeader(L1CTL_PARAM_REQ),
Harald Welte37052732018-03-09 19:38:46 +0100630 ul_info := {
Vadim Yanitskiy443891b2022-03-12 17:46:57 +0300631 chan_nr := ts_RslChanNr_RACH(0),
Harald Welte37052732018-03-09 19:38:46 +0100632 link_id := ts_RslLinkID_DCCH(0),
633 padding := '0000'O
634 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700635 dl_info := omit,
Harald Welte37052732018-03-09 19:38:46 +0100636 payload := {
637 par_req := {
638 ta := ta,
639 tx_power := tx_power,
640 padding := '0000'O
641 }
642 }
643 }
644
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700645 /* Base template to be inherited by ts_L1CTL_DM_EST_REQ_H0 and ts_L1CTL_DM_EST_REQ_H1 */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700646 private template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700647 ts_L1CTL_DM_EST_REQ(template (value) RslChannelNr chan_nr,
648 template (value) GsmTsc tsc) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100649 header := ts_L1ctlHeader(L1CTL_DM_EST_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200650 ul_info := {
651 chan_nr := chan_nr,
652 link_id := ts_RslLinkID_DCCH(0),
653 padding := '0000'O
654 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700655 dl_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200656 payload := {
657 dm_est_req := {
658 tsc := tsc,
Vadim Yanitskiy0a3e31c2022-12-18 08:09:38 +0700659 h0h1 := -,
Vadim Yanitskiyfe052962020-10-19 13:27:09 +0700660 tch_mode := L1CTL_CHAN_MODE_SIGN,
Vadim Yanitskiy16185832020-10-19 21:20:43 +0700661 audio_mode := t_L1CTL_AudioModeFwd
Harald Welte9e4725d2017-07-16 23:18:09 +0200662 }
663 }
664 }
665
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700666 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700667 ts_L1CTL_DM_EST_REQ_H0(template (value) RslChannelNr chan_nr,
668 template (value) GsmTsc tsc,
669 template (value) GsmArfcn arfcn)
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700670 modifies ts_L1CTL_DM_EST_REQ := {
671 payload := {
672 dm_est_req := {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700673 h0h1 := {
674 h0 := {
675 h := 0,
Vadim Yanitskiy1acc7bb2020-11-14 04:24:57 +0700676 arfcn := ts_GsmBandArfcn(arfcn),
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700677 padding := f_pad_oct(''O, 130, '00'O)
678 }
679 }
Vadim Yanitskiy5afe8852020-05-27 14:40:51 +0700680 }
681 }
682 }
683
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700684 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700685 ts_L1CTL_DM_EST_REQ_H1(template (value) RslChannelNr chan_nr,
686 template (value) GsmTsc tsc,
687 template (value) uint6_t hsn,
688 template (value) uint6_t maio,
689 template (value) L1ctlMA ma)
Vadim Yanitskiyeda90812020-05-27 14:51:18 +0700690 modifies ts_L1CTL_DM_EST_REQ := {
691 payload := {
692 dm_est_req := {
Vadim Yanitskiy2cdb97f2020-10-19 14:17:38 +0700693 h0h1 := {
694 h1 := {
695 h := 1,
696 hsn := hsn,
697 maio := maio,
698 n := sizeof(ma),
699 spare := '00'O,
700 ma := ma,
701 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562849 */
702 padding := f_pad_oct(''O, (64 - sizeof(ma)) * 2, '00'O)
703 }
Vadim Yanitskiyeda90812020-05-27 14:51:18 +0700704 }
705 }
706 }
707 }
708
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700709 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700710 ts_L1CTL_DM_REL_REQ(template (value) RslChannelNr chan_nr) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100711 header := ts_L1ctlHeader(L1CTL_DM_REL_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200712 ul_info := {
713 chan_nr := chan_nr,
714 link_id := ts_RslLinkID_DCCH(0),
715 padding := '0000'O
716 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700717 dl_info := omit,
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700718 payload := omit
Harald Welte9e4725d2017-07-16 23:18:09 +0200719 }
720
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700721 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700722 ts_L1CTL_DATA_REQ(template (value) RslChannelNr chan_nr,
723 template (value) RslLinkId link_id,
724 octetstring l2_data) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100725 header := ts_L1ctlHeader(L1CTL_DATA_REQ),
Harald Welte9e4725d2017-07-16 23:18:09 +0200726 ul_info := {
727 chan_nr := chan_nr,
728 link_id := link_id,
729 padding := '0000'O
730 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700731 dl_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200732 payload := {
Vadim Yanitskiy0a8d6da2019-05-28 22:18:28 +0700733 data_req := {
734 l1header := omit,
735 l2_payload := l2_data
736 }
Harald Welte9e4725d2017-07-16 23:18:09 +0200737 }
738 }
739
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700740 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700741 ts_L1CTL_DATA_REQ_SACCH(template (value) RslChannelNr chan_nr,
742 template (value) RslLinkId link_id,
743 template (value) SacchL1Header l1h,
744 octetstring l2_data) := {
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200745 header := ts_L1ctlHeader(L1CTL_DATA_REQ),
746 ul_info := {
747 chan_nr := chan_nr,
748 link_id := link_id,
749 padding := '0000'O
750 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700751 dl_info := omit,
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200752 payload := {
Vadim Yanitskiy0a8d6da2019-05-28 22:18:28 +0700753 data_req := {
754 l1header := l1h,
755 l2_payload := l2_data
756 }
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200757 }
758 }
759
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700760 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700761 ts_L1CTL_TRAFFIC_REQ(template (value) RslChannelNr chan_nr,
762 template (value) RslLinkId link_id,
763 octetstring frame) := {
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700764 header := ts_L1ctlHeader(L1CTL_TRAFFIC_REQ),
765 ul_info := {
766 chan_nr := chan_nr,
767 link_id := link_id,
768 padding := '0000'O
769 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700770 dl_info := omit,
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700771 payload := {
772 traffic_req := {
773 data := frame
774 }
775 }
776 };
777
Harald Welte9e4725d2017-07-16 23:18:09 +0200778 /* for matching against incoming RACH_CONF */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700779 template L1ctlMessage tr_L1CTL_RACH_CONF := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100780 header := tr_L1ctlHeader(L1CTL_RACH_CONF),
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700781 ul_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200782 dl_info := ?,
Harald Weltef56cc492018-04-15 10:58:43 +0200783 payload := *
Harald Welte9e4725d2017-07-16 23:18:09 +0200784 };
785
Vadim Yanitskiy60b61882022-12-18 06:02:22 +0700786 /* for sending and matching L1CTL_DATA_IND */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700787 template (value) L1ctlMessage
Vadim Yanitskiy60b61882022-12-18 06:02:22 +0700788 ts_L1CTL_DATA_IND(template (value) RslChannelNr chan_nr,
789 template (value) RslLinkId link_id,
790 template (value) octetstring l2_data,
791 template (value) GsmBandArfcn arfcn,
792 template (value) uint32_t fn := 1337,
793 template (value) GsmRxLev rx_level := 63,
794 template (value) uint8_t num_biterr := 0,
795 template (value) uint8_t fire_crc := 0) := {
796 header := ts_L1ctlHeader(L1CTL_DATA_IND),
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700797 ul_info := omit,
Vadim Yanitskiy60b61882022-12-18 06:02:22 +0700798 dl_info := {
799 chan_nr := chan_nr,
800 link_id := link_id,
801 arfcn := arfcn,
802 frame_nr := fn,
803 rx_level := rx_level,
804 snr := 0,
805 num_biterr := num_biterr,
806 fire_crc := fire_crc
807 },
808 payload := {
809 data_ind := {
810 payload := l2_data
811 }
812 }
813 };
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700814 template L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700815 tr_L1CTL_DATA_IND(template (present) RslChannelNr chan_nr,
816 template (present) RslLinkId link_id := ?,
817 template (present) octetstring l2_data := ?,
818 template (present) uint8_t num_biterr := 0,
819 template (present) uint8_t fire_crc := 0) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100820 header := tr_L1ctlHeader(L1CTL_DATA_IND),
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700821 ul_info := omit,
Harald Welte9e4725d2017-07-16 23:18:09 +0200822 dl_info := {
823 chan_nr := chan_nr,
Harald Weltece6dc442018-02-21 22:00:21 +0100824 link_id := link_id,
Harald Welte9e4725d2017-07-16 23:18:09 +0200825 arfcn := ?,
826 frame_nr := ?,
827 rx_level := ?,
828 snr := ?,
Harald Welte629cc6b2018-03-11 17:19:05 +0100829 num_biterr := num_biterr,
Pau Espin Pedrol17da3232022-09-02 16:35:32 +0200830 fire_crc := fire_crc
Harald Welte9e4725d2017-07-16 23:18:09 +0200831 },
832 payload := {
Harald Welte68e495b2018-02-25 00:05:57 +0100833 data_ind := {
834 payload := l2_data
835 }
Harald Welte9e4725d2017-07-16 23:18:09 +0200836 }
837 };
838
Vadim Yanitskiy3f5b6932024-03-11 03:10:12 +0700839 /* for sending and matching L1CTL_DATA_CONF */
840 template (value) L1ctlMessage
841 ts_L1CTL_DATA_CONF(template (value) RslChannelNr chan_nr,
842 template (value) RslLinkId link_id,
843 template (value) GsmBandArfcn arfcn,
844 template (value) GsmFrameNumber fn) := {
845 header := ts_L1ctlHeader(L1CTL_DATA_CONF),
846 ul_info := omit,
847 dl_info := {
848 chan_nr := chan_nr,
849 link_id := link_id,
850 arfcn := arfcn,
851 frame_nr := fn,
852 rx_level := 0,
853 snr := 0,
854 num_biterr := 0,
855 fire_crc := 0
856 },
857 payload := omit
858 };
859 template L1ctlMessage
860 tr_L1CTL_DATA_CONF(template (present) RslChannelNr chan_nr,
861 template (present) RslLinkId link_id := ?,
862 template (present) GsmBandArfcn arfcn := ?,
863 template (present) GsmFrameNumber fn := ?) := {
864 header := tr_L1ctlHeader(L1CTL_DATA_CONF),
865 ul_info := omit,
866 dl_info := {
867 chan_nr := chan_nr,
868 link_id := link_id,
869 arfcn := arfcn,
870 frame_nr := fn,
871 rx_level := ?,
872 snr := ?,
873 num_biterr := ?,
874 fire_crc := ?
875 },
876 payload := omit
877 };
878
879 /* for sending and matching L1CTL_TRAFFIC_CONF */
880 template (value) L1ctlMessage
881 ts_L1CTL_TRAFFIC_CONF(template (value) RslChannelNr chan_nr,
882 template (value) RslLinkId link_id,
883 template (value) GsmBandArfcn arfcn,
884 template (value) GsmFrameNumber fn)
885 modifies ts_L1CTL_DATA_CONF := {
886 header := ts_L1ctlHeader(L1CTL_TRAFFIC_CONF)
887 };
888 template L1ctlMessage
889 tr_L1CTL_TRAFFIC_CONF(template (present) RslChannelNr chan_nr,
890 template (present) RslLinkId link_id := ?,
891 template (present) GsmBandArfcn arfcn := ?,
892 template (present) GsmFrameNumber fn := ?)
893 modifies tr_L1CTL_DATA_CONF := {
894 header := tr_L1ctlHeader(L1CTL_TRAFFIC_CONF)
895 };
896
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700897 /* for matching against incoming TRAFFIC_IND */
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700898 template L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700899 tr_L1CTL_TRAFFIC_IND(template (present) RslChannelNr chan_nr,
900 template (present) RslLinkId link_id := ?,
901 template (present) octetstring frame := ?,
902 template (present) uint8_t num_biterr := ?,
903 template (present) uint8_t fire_crc := ?) := {
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700904 header := tr_L1ctlHeader(L1CTL_TRAFFIC_IND),
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700905 ul_info := omit,
Vadim Yanitskiyf3cc6492019-06-30 16:34:30 +0700906 dl_info := {
907 chan_nr := chan_nr,
908 link_id := link_id,
909 arfcn := ?,
910 frame_nr := ?,
911 rx_level := ?,
912 snr := ?,
913 num_biterr := num_biterr,
914 fire_crc := fire_crc
915 },
916 payload := {
917 traffic_ind := {
918 data := frame
919 }
920 }
921 };
922
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700923 template (value) L1ctlMessage
Vadim Yanitskiybe33f6b2020-11-14 04:05:34 +0700924 ts_L1CTL_CRYPTO_REQ(template (value) RslChannelNr chan_nr,
925 template (value) uint8_t algo,
926 template (value) octetstring key) := {
Harald Weltee613f962018-04-18 22:38:16 +0200927 header := ts_L1ctlHeader(L1CTL_CRYPTO_REQ),
928 ul_info := {
929 chan_nr := chan_nr,
930 link_id := ts_RslLinkID_DCCH(0),
931 padding := '0000'O
932 },
Vadim Yanitskiyaf0aae62023-03-18 06:49:18 +0700933 dl_info := omit,
Harald Weltee613f962018-04-18 22:38:16 +0200934 payload := {
935 crypto_req := {
936 algo := algo,
937 key_len := 0, /* overwritten */
938 key := key
939 }
940 }
941 };
942
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700943
944 template (value) L1ctlMessage
945 ts_L1CTL_GPRS_UL_TBF_CFG_REQ(template (value) uint8_t tbf_ref,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700946 template (value) BIT8 slotmask := '00000000'B,
947 template (value) uint32_t start_fn := c_UINT32_MAX) := {
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700948 header := ts_L1ctlHeader(L1CTL_GPRS_UL_TBF_CFG_REQ),
949 ul_info := omit,
950 dl_info := omit,
951 payload := {
952 ul_tbf_cfg_req := {
953 tbf_ref := tbf_ref,
954 slotmask := slotmask,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700955 pad := '0000'O,
956 start_fn := start_fn
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700957 }
958 }
959 };
960 template L1ctlMessage
961 tr_L1CTL_GPRS_UL_TBF_CFG_REQ(template (present) uint8_t tbf_ref := ?,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700962 template (present) BIT8 slotmask := ?,
963 template (present) uint32_t start_fn := ?) := {
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700964 header := tr_L1ctlHeader(L1CTL_GPRS_UL_TBF_CFG_REQ),
965 ul_info := omit,
966 dl_info := omit,
967 payload := {
968 ul_tbf_cfg_req := {
969 tbf_ref := tbf_ref,
970 slotmask := slotmask,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700971 pad := ?,
972 start_fn := start_fn
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700973 }
974 }
975 };
976
977 template (value) L1ctlMessage
978 ts_L1CTL_GPRS_DL_TBF_CFG_REQ(template (value) uint8_t tbf_ref,
979 template (value) BIT8 slotmask := '00000000'B,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700980 template (value) uint32_t start_fn := c_UINT32_MAX,
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700981 template (value) uint5_t dl_tfi := 0) := {
982 header := ts_L1ctlHeader(L1CTL_GPRS_DL_TBF_CFG_REQ),
983 ul_info := omit,
984 dl_info := omit,
985 payload := {
986 dl_tbf_cfg_req := {
987 tbf_ref := tbf_ref,
988 slotmask := slotmask,
989 dl_tfi := dl_tfi,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700990 pad := '00'O,
991 start_fn := start_fn
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700992 }
993 }
994 };
995 template L1ctlMessage
996 tr_L1CTL_GPRS_DL_TBF_CFG_REQ(template (present) uint8_t tbf_ref := ?,
997 template (present) BIT8 slotmask := ?,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +0700998 template (present) uint32_t start_fn := ?,
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +0700999 template (present) uint5_t dl_tfi := ?) := {
1000 header := tr_L1ctlHeader(L1CTL_GPRS_DL_TBF_CFG_REQ),
1001 ul_info := omit,
1002 dl_info := omit,
1003 payload := {
1004 dl_tbf_cfg_req := {
1005 tbf_ref := tbf_ref,
1006 slotmask := slotmask,
1007 dl_tfi := dl_tfi,
Vadim Yanitskiy0e5693f2023-08-27 14:09:32 +07001008 pad := ?,
1009 start_fn := start_fn
Vadim Yanitskiy72a76b52023-03-18 00:12:09 +07001010 }
1011 }
1012 };
1013
1014 template (value) L1ctlMessage
1015 ts_L1CTL_GPRS_UL_BLOCK_REQ(template (value) GsmFrameNumber fn,
1016 template (value) uint3_t tn,
1017 template (value) octetstring data) := {
1018 header := ts_L1ctlHeader(L1CTL_GPRS_UL_BLOCK_REQ),
1019 ul_info := omit,
1020 dl_info := omit,
1021 payload := {
1022 ul_block_req := {
1023 hdr := {
1024 fn := fn,
1025 tn := tn,
1026 pad := '000000'O
1027 },
1028 data := data
1029 }
1030 }
1031 };
1032 template L1ctlMessage
1033 tr_L1CTL_GPRS_UL_BLOCK_REQ(template (present) GsmFrameNumber fn := ?,
1034 template (present) uint3_t tn := ?,
1035 template (present) octetstring data := ?) := {
1036 header := tr_L1ctlHeader(L1CTL_GPRS_UL_BLOCK_REQ),
1037 ul_info := omit,
1038 dl_info := omit,
1039 payload := {
1040 ul_block_req := {
1041 hdr := {
1042 fn := fn,
1043 tn := tn,
1044 pad := ?
1045 },
1046 data := data
1047 }
1048 }
1049 };
1050
1051 template (value) L1ctlMessage
1052 ts_L1CTL_GPRS_DL_BLOCK_IND(template (value) GsmFrameNumber fn,
1053 template (value) uint3_t tn,
1054 template (value) uint3_t usf,
1055 template (value) octetstring data,
1056 template (value) uint16_t ber10k := 0,
1057 template (value) int16_t ci_cb := 180 /* 18 dB */,
1058 template (value) GsmRxLev rx_level := 63) := {
1059 header := ts_L1ctlHeader(L1CTL_GPRS_DL_BLOCK_IND),
1060 ul_info := omit,
1061 dl_info := omit,
1062 payload := {
1063 dl_block_ind := {
1064 hdr := {
1065 fn := fn,
1066 tn := tn,
1067 pad := '000000'O
1068 },
1069 meas := {
1070 ber10k := ber10k,
1071 ci_cb := ci_cb,
1072 rx_level := rx_level
1073 },
1074 usf := usf,
1075 data := data
1076 }
1077 }
1078 };
1079 template L1ctlMessage
1080 tr_L1CTL_GPRS_DL_BLOCK_IND(template (present) GsmFrameNumber fn := ?,
1081 template (present) uint3_t tn := ?,
1082 template (present) uint3_t usf := ?,
1083 template (present) octetstring data := ?,
1084 template (present) uint16_t ber10k := ?,
1085 template (present) int16_t ci_cb := ?,
1086 template (present) GsmRxLev rx_level := ?) := {
1087 header := tr_L1ctlHeader(L1CTL_GPRS_DL_BLOCK_IND),
1088 ul_info := omit,
1089 dl_info := omit,
1090 payload := {
1091 dl_block_ind := {
1092 hdr := {
1093 fn := fn,
1094 tn := tn,
1095 pad := ?
1096 },
1097 meas := {
1098 ber10k := ber10k,
1099 ci_cb := ci_cb,
1100 rx_level := rx_level
1101 },
1102 usf := usf,
1103 data := data
1104 }
1105 }
1106 };
1107
Harald Welte68e495b2018-02-25 00:05:57 +01001108 const octetstring c_DummyUI := '0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O;
1109
Harald Welte7024baa2018-03-02 23:37:51 +01001110/* We use "BYTEORDER(last)" so we get little-endian integers. Unfortuantely, this also
1111 switches the byte ordering in octet strings, so we need to explicitly annotate them :/ */
Harald Weltef6543322017-07-16 07:35:10 +02001112} with { encode "RAW" };