blob: 65d0c41f340869349fcb45a276df95923906884f [file] [log] [blame]
Harald Welte34b5a952019-05-27 11:54:11 +02001/* Osmocom PCU Interface Types, as per osmo-pcu/include/osmocom/pcu/pcuif_proto.h
2 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
3 * contributions by Vadim Yanitskiy <axilirator@gmail.com>
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 Welte883340c2018-02-28 18:59:29 +010012module PCUIF_Types {
13
14import from General_Types all;
15import from Osmocom_Types all;
Alexander Couzens1e5dc482020-07-28 15:38:46 +020016import from Native_Functions all;
Harald Welte883340c2018-02-28 18:59:29 +010017
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070018modulepar {
19 /* PCUIF version supported by the IUT */
Philipp Maier3b4abb82023-06-23 16:27:46 +020020 PCUIF_Version mp_pcuif_version := 11;
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070021};
22
Harald Welte883340c2018-02-28 18:59:29 +010023const charstring PCU_SOCK_DEFAULT := "/tmp/pcu_bts";
Philipp Maier3b4abb82023-06-23 16:27:46 +020024type integer PCUIF_Version (9..11); /* supported versions */
Harald Welte883340c2018-02-28 18:59:29 +010025
26type enumerated PCUIF_MsgType {
27 PCU_IF_MSG_DATA_REQ ('00'O),
28 PCU_IF_MSG_DATA_CNF ('01'O),
29 PCU_IF_MSG_DATA_IND ('02'O),
30 PCU_IF_MSG_SUSP_REQ ('03'O),
Harald Welte11b734c2019-09-05 14:17:54 +020031 PCU_IF_MSG_APP_INFO_REQ ('04'O),
Harald Welte883340c2018-02-28 18:59:29 +010032 PCU_IF_MSG_RTS_REQ ('10'O),
33 PCU_IF_MSG_DATA_CNF_DT ('11'O),
34 PCU_IF_MSG_RACH_IND ('22'O),
35 PCU_IF_MSG_INFO_IND ('32'O),
Philipp Maier310520b2023-05-04 13:10:18 +020036 PCU_IF_MSG_E1_CCU_IND ('33'O),
Harald Welte883340c2018-02-28 18:59:29 +010037 PCU_IF_MSG_ACT_REQ ('40'O),
38 PCU_IF_MSG_TIME_IND ('52'O),
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +020039 PCU_IF_MSG_INTERF_IND ('53'O),
Harald Welte883340c2018-02-28 18:59:29 +010040 PCU_IF_MSG_PAG_REQ ('60'O),
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +020041 PCU_IF_MSG_TXT_IND ('70'O),
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +020042 PCU_IF_MSG_CONTAINER ('80'O),
43 /* Container payload message types: */
44 PCU_IF_MSG_NEIGH_ADDR_REQ ('81'O),
45 PCU_IF_MSG_NEIGH_ADDR_CNF ('82'O)
Harald Welte883340c2018-02-28 18:59:29 +010046} with { variant "FIELDLENGTH(8)" };
47
48type enumerated PCUIF_Sapi {
49 PCU_IF_SAPI_UNKNOWN ('00'O),
50 PCU_IF_SAPI_RACH ('01'O),
51 PCU_IF_SAPI_AGCH ('02'O),
52 PCU_IF_SAPI_PCH ('03'O),
53 PCU_IF_SAPI_BCCH ('04'O),
54 PCU_IF_SAPI_PDTCH ('05'O),
55 PCU_IF_SAPI_PRACH ('06'O),
56 PCU_IF_SAPI_PTCCH ('07'O),
Philipp Maier81503af2023-05-04 12:52:07 +020057 PCU_IF_SAPI_PCH_DT ('08'O)
Harald Welte883340c2018-02-28 18:59:29 +010058} with { variant "FIELDLENGTH(8)" };
59
60type record PCUIF_Flags {
61 boolean bts_active,
62 boolean sysmo_direct_dsp,
63 BIT14 spare,
64 boolean cs1,
65 boolean cs2,
66 boolean cs3,
67 boolean cs4,
68 boolean mcs1,
69 boolean mcs2,
70 boolean mcs3,
71 boolean mcs4,
72 boolean mcs5,
73 boolean mcs6,
74 boolean mcs7,
75 boolean mcs8,
76 boolean mcs9,
77 BIT3 spare2
78} with { variant "" };
79
80type enumerated PCUIF_TextType {
81 PCU_VERSION (0),
82 PCU_OML_ALERT (1)
83} with { variant "FIELDLENGTH(8)" };
84
Vadim Yanitskiye1527f72019-09-09 02:15:33 +020085type charstring PCUIF_Text length(128) with { variant "FIELDLENGTH(null_terminated)" };
Harald Welte883340c2018-02-28 18:59:29 +010086
87type record PCUIF_txt_ind {
88 PCUIF_TextType txt_type,
89 PCUIF_Text text
90} with { variant "" };
91
Harald Welte883340c2018-02-28 18:59:29 +010092type record PCUIF_data {
93 PCUIF_Sapi sapi,
94 uint8_t len,
Vadim Yanitskiyd8f28e62019-09-10 18:11:52 +020095 octetstring data length(162),
Harald Welte883340c2018-02-28 18:59:29 +010096 uint32_t fn,
97 uint16_t arfcn,
98 uint8_t trx_nr,
99 uint8_t ts_nr,
100 uint8_t block_nr,
101 int8_t rssi,
102 uint16_t ber10k,
103 int16_t ta_offs_qbits,
104 int16_t lqual_cb
Vadim Yanitskiyd8f28e62019-09-10 18:11:52 +0200105} with { variant (data) "FIELDLENGTH(162), ALIGN(left)" };
Harald Welte883340c2018-02-28 18:59:29 +0100106
107type record PCUIF_data_cnf_dt {
108 PCUIF_Sapi sapi,
109 OCT4 tlli,
110 uint32_t fn,
111 uint16_t arfcn,
112 uint8_t trx_nr,
113 uint8_t ts_nr,
114 uint8_t block_nr,
115 int8_t rssi,
116 uint16_t ber10k,
117 int16_t ta_offs_qbits,
118 int16_t lqual_cb
119} with { variant "" };
120
121type record PCUIF_rts_req {
122 PCUIF_Sapi sapi,
123 OCT3 spare,
124 uint32_t fn,
125 uint16_t arfcn,
126 uint8_t trx_nr,
127 uint8_t ts_nr,
128 uint8_t block_nr
129} with { variant "" };
130
Harald Welte913bbf62019-03-01 00:39:19 +0100131type enumerated PCUIF_BurstType {
132 BURST_TYPE_NONE (0),
133 BURST_TYPE_0 (1),
134 BURST_TYPE_1 (2),
135 BURST_TYPE_2 (3)
136} with { variant "FIELDLENGTH(8)" };
137
Harald Welte883340c2018-02-28 18:59:29 +0100138type record PCUIF_rach_ind {
139 PCUIF_Sapi sapi,
140 uint16_t ra,
141 int16_t qta,
142 uint32_t fn,
143 uint16_t arfcn,
144 uint8_t is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700145 PCUIF_BurstType burst_type,
146 uint8_t trx_nr,
147 uint8_t ts_nr
Harald Welte883340c2018-02-28 18:59:29 +0100148} with { variant "" };
149
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700150type record PCUIF_InfoTrxTs {
151 uint8_t tsc,
152 uint8_t hopping,
153 uint8_t hsn,
154 uint8_t maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700155 uint8_t ma_bit_len,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700156 bitstring ma length(64)
157} with { variant (ma) "BYTEORDER(first), BITORDER(msb)" };
158private type record length(8) of PCUIF_InfoTrxTs PCUIF_InfoTrxTsList;
159
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100160private type record PCUIF_InfoTrx {
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700161 uint16_t arfcn,
162 BIT8 pdch_mask,
Vadim Yanitskiyd8051722020-08-22 02:33:17 +0700163 OCT1 spare,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700164 uint32_t hLayer1,
165 PCUIF_InfoTrxTsList ts
166} with { variant (pdch_mask) "BITORDER(msb)" };
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100167type record length(8) of PCUIF_InfoTrx PCUIF_InfoTrxs;
Harald Welte883340c2018-02-28 18:59:29 +0100168
169type record PCUIF_info_ind {
170 uint32_t version,
171 PCUIF_Flags flags,
Harald Weltee1fd9162019-02-18 19:47:53 +0100172 PCUIF_InfoTrxs trx,
Harald Welte883340c2018-02-28 18:59:29 +0100173 uint8_t bsic,
174
175 uint16_t mcc,
176 uint16_t mnc,
Harald Welte3568dc72018-03-13 17:06:51 +0100177 uint8_t mnc_3_digits,
Harald Welte883340c2018-02-28 18:59:29 +0100178 uint16_t lac,
179 uint16_t rac,
180
181 uint16_t nsei,
182 record length(7) of uint8_t nse_timer,
183 record length(11) of uint8_t cell_timer,
184
185 uint16_t cell_id,
186 uint16_t repeat_time,
187 uint8_t repeat_count,
188 uint16_t bvci,
189 uint8_t t3142,
190 uint8_t t3169,
191 uint8_t t3191,
192 uint8_t t3193_10ms,
193 uint8_t t3195,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100194 uint8_t n3101,
195 uint8_t n3103,
196 uint8_t n3105,
Harald Welte883340c2018-02-28 18:59:29 +0100197 uint8_t cv_countdown,
198 uint16_t dl_tbf_ext,
199 uint16_t ul_tbf_ext,
200 uint8_t initial_cs,
201 uint8_t initial_mcs,
202
203 record length(2) of uint16_t nsvci,
Vadim Yanitskiy0d590802020-08-21 00:14:22 +0700204 record length(2) of uint16_t local_port,
Harald Welte883340c2018-02-28 18:59:29 +0100205 record length(2) of uint16_t remote_port,
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200206 PCUIF_RemoteAddr remote_addr
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200207} with { variant "" };
208
209type enumerated PCUIF_AddrType {
210 PCUIF_ADDR_TYPE_UNSPEC ('00'O),
211 PCUIF_ADDR_TYPE_IPV4 ('04'O),
212 PCUIF_ADDR_TYPE_IPV6 ('29'O)
213} with { variant "FIELDLENGTH(8)" };
214
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100215type record PCUIF_RemoteAddr {
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200216 record length(2) of PCUIF_AddrType addr_type,
217 record length(2) of octetstring addr length(16)
218} with { variant "" };
219
Philipp Maier310520b2023-05-04 13:10:18 +0200220/* E1 CCU connection parameters */
221type record PCUIF_e1_ccu_ind {
222 /* GSM/GPRS air interface */
223 uint8_t trx_nr,
224 uint8_t ts_nr,
225 /* E1 line interface */
226 uint8_t e1_nr,
227 uint8_t e1_ts,
228 uint8_t e1_ts_ss
229} with { variant "" };
230
Harald Welte883340c2018-02-28 18:59:29 +0100231type record PCUIF_act_req {
232 uint8_t is_activate,
233 uint8_t trx_nr,
234 uint8_t ts_nr,
235 OCT1 spare
236} with { variant "" };
237
238type record PCUIF_time_ind {
239 uint32_t fn
240} with { variant "" };
241
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200242type record length(8) of uint8_t PCUIF_interf;
243type record PCUIF_interf_ind {
244 uint8_t trx_nr,
245 OCT3 spare,
246 uint32_t fn,
247 PCUIF_interf interf
248} with { variant "" };
249
Harald Welte883340c2018-02-28 18:59:29 +0100250type record PCUIF_pag_req {
251 PCUIF_Sapi sapi,
252 uint8_t chan_needed,
253 OCT9 identity_lv
254} with { variant "" };
255
Harald Welte11b734c2019-09-05 14:17:54 +0200256type record PCUIF_app_info_req {
257 uint8_t application_type,
258 uint8_t len,
259 octetstring data
260} with {
261 variant (len) "LENGTHTO(data)"
262}
263
Harald Welte883340c2018-02-28 18:59:29 +0100264type record PCUIF_susp_req {
265 OCT4 tlli,
266 OCT6 ra_id,
267 uint8_t cause
Harald Welteeaa9a862019-05-26 23:01:08 +0200268} with {
269 variant (tlli) "BYTEORDER(last)"
270};
Harald Welte883340c2018-02-28 18:59:29 +0100271
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200272type record PCUIF_neigh_addr_req {
273 uint16_t local_lac,
274 uint16_t local_ci,
275 uint16_t tgt_arfcn,
276 uint8_t tgt_bsic
277} with { variant (local_lac) "BYTEORDER(last)"
278 variant (local_ci) "BYTEORDER(last)"
279 variant (tgt_arfcn) "BYTEORDER(last)" };
280
281type record PCUIF_neigh_addr_cnf {
282 PCUIF_neigh_addr_req orig_req,
283 uint8_t error_code,
284 uint16_t mcc,
285 uint16_t mnc,
286 uint8_t mnc_3_digits,
287 uint16_t lac,
288 uint8_t rac,
289 uint16_t cell_identity
290} with { variant (mcc) "BYTEORDER(last)"
291 variant (mnc) "BYTEORDER(last)"
292 variant (lac) "BYTEORDER(last)"
293 variant (cell_identity) "BYTEORDER(last)" };
294
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200295type union PCUIF_ContainerMsgUnion {
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200296 PCUIF_neigh_addr_req neigh_addr_req,
297 PCUIF_neigh_addr_cnf neigh_addr_cnf,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200298 octetstring other
299} with { variant "" };
300
301type record PCUIF_container {
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200302 PCUIF_MsgType msg_type,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200303 OCT1 spare,
304 uint16_t len, /* network byte order */
305 PCUIF_ContainerMsgUnion u
306} with {
307 variant (len) "BYTEORDER(last)"
308 variant (len) "LENGTHTO(u)"
309 variant (u) "CROSSTAG(
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200310 neigh_addr_req, msg_type = PCU_IF_MSG_NEIGH_ADDR_REQ;
311 neigh_addr_cnf, msg_type = PCU_IF_MSG_NEIGH_ADDR_CNF;
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200312 other, OTHERWISE)"
313};
314
Philipp Maier3241af32023-05-04 15:17:36 +0200315/* Record to send a (confirmed) IMMEDIATE ASSIGNMENT message via PCH. The record is sent by the PCU to the BTS as a
316 * data request (data_req) under SAPI PCU_IF_SAPI_PCH_DT. */
317type record PCUIF_pch_dt {
318 OCT4 tlli,
319 charstring imsi length(17),
320 octetstring data length(23)
321} with {
322 variant (tlli) "BYTEORDER(last)"
Philipp Maier8d426512023-06-23 16:21:02 +0200323 variant (imsi) "FIELDLENGTH(17)"
324 variant (data) "FIELDLENGTH(23)"
Philipp Maier3241af32023-05-04 15:17:36 +0200325};
Harald Welte883340c2018-02-28 18:59:29 +0100326
Philipp Maier3b4abb82023-06-23 16:27:46 +0200327external function enc_PCUIF_pch_dt(in PCUIF_pch_dt pdu) return octetstring
328 with { extension "prototype(convert) encode(RAW)" };
329
Harald Welte883340c2018-02-28 18:59:29 +0100330type union PCUIF_MsgUnion {
331 PCUIF_data data_req,
332 PCUIF_data data_cnf,
333 PCUIF_data_cnf_dt data_cnf_dt,
334 PCUIF_data data_ind,
335 PCUIF_susp_req susp_req,
336 PCUIF_rts_req rts_req,
337 PCUIF_rach_ind rach_ind,
338 PCUIF_txt_ind txt_ind,
339 PCUIF_info_ind info_ind,
Philipp Maier310520b2023-05-04 13:10:18 +0200340 PCUIF_e1_ccu_ind e1_ccu_ind,
Harald Welte883340c2018-02-28 18:59:29 +0100341 PCUIF_act_req act_req,
342 PCUIF_time_ind time_ind,
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200343 PCUIF_interf_ind interf_ind,
Harald Welte11b734c2019-09-05 14:17:54 +0200344 PCUIF_pag_req pag_req,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200345 PCUIF_app_info_req app_info_req,
346 PCUIF_container container
Harald Welte883340c2018-02-28 18:59:29 +0100347} with { variant "" };
348
349type record PCUIF_Message {
350 PCUIF_MsgType msg_type,
351 uint8_t bts_nr,
352 OCT2 spare,
353 PCUIF_MsgUnion u
354} with { variant (u) "CROSSTAG(
355 data_req, msg_type = PCU_IF_MSG_DATA_REQ;
356 data_cnf, msg_type = PCU_IF_MSG_DATA_CNF;
357 data_cnf_dt, msg_type = PCU_IF_MSG_DATA_CNF_DT;
358 data_ind, msg_type = PCU_IF_MSG_DATA_IND;
359 susp_req, msg_type = PCU_IF_MSG_SUSP_REQ;
360 rts_req, msg_type = PCU_IF_MSG_RTS_REQ;
361 rach_ind, msg_type = PCU_IF_MSG_RACH_IND;
362 txt_ind, msg_type = PCU_IF_MSG_TXT_IND;
363 info_ind, msg_type = PCU_IF_MSG_INFO_IND;
Philipp Maier310520b2023-05-04 13:10:18 +0200364 e1_ccu_ind, msg_type = PCU_IF_MSG_E1_CCU_IND;
Harald Welte883340c2018-02-28 18:59:29 +0100365 act_req, msg_type = PCU_IF_MSG_ACT_REQ;
366 time_ind, msg_type = PCU_IF_MSG_TIME_IND;
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200367 interf_ind, msg_type = PCU_IF_MSG_INTERF_IND;
Harald Welte11b734c2019-09-05 14:17:54 +0200368 pag_req, msg_type = PCU_IF_MSG_PAG_REQ;
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200369 app_info_req, msg_type = PCU_IF_MSG_APP_INFO_REQ;
370 container, msg_type = PCU_IF_MSG_CONTAINER)"
Vadim Yanitskiy204fe622021-03-23 04:49:41 +0100371 /* PCUIFv10: 1006 * 8 = 8048 bits */
372 variant "PADDING(8048)"
Harald Welte883340c2018-02-28 18:59:29 +0100373};
374
375external function enc_PCUIF_Message(in PCUIF_Message pdu) return octetstring
376 with { extension "prototype(convert) encode(RAW)" };
377external function dec_PCUIF_Message(in octetstring stream) return PCUIF_Message
378 with { extension "prototype(convert) decode(RAW)" };
379
Vadim Yanitskiyf7d9c0f2019-09-06 00:08:17 +0200380/* Generic template for matching messages by type and/or the BTS number */
381template PCUIF_Message tr_PCUIF_MSG(template PCUIF_MsgType msg_type := ?,
382 template uint8_t bts_nr := ?) := {
383 msg_type := msg_type,
384 bts_nr := bts_nr,
385 spare := ?,
386 u := ?
387}
388
Harald Weltee1fd9162019-02-18 19:47:53 +0100389template (value) PCUIF_Message ts_PCUIF_RTS_REQ(template (value) uint8_t bts_nr,
390 template (value) uint8_t trx_nr,
391 template (value) uint8_t ts_nr,
392 template (value) PCUIF_Sapi sapi,
393 template (value) uint32_t fn,
394 template (value) uint16_t arfcn,
395 template (value) uint8_t block_nr
396 ) := {
397 msg_type := PCU_IF_MSG_RTS_REQ,
398 bts_nr := bts_nr,
399 spare := '0000'O,
400 u := {
401 rts_req := {
402 sapi := sapi,
403 spare := '000000'O,
404 fn := fn,
405 arfcn := arfcn,
406 trx_nr := trx_nr,
407 ts_nr := ts_nr,
408 block_nr := block_nr
409 }
410 }
411}
Harald Welte883340c2018-02-28 18:59:29 +0100412template PCUIF_Message tr_PCUIF_RTS_REQ(template uint8_t bts_nr := ?,
413 template uint8_t trx_nr := ?,
414 template uint8_t ts_nr := ?,
415 template PCUIF_Sapi sapi := ?,
416 template uint32_t fn := ?,
417 template uint8_t block_nr := ?
418 ) := {
419 msg_type := PCU_IF_MSG_RTS_REQ,
420 bts_nr := bts_nr,
421 spare := ?,
422 u := {
423 rts_req := {
424 sapi := sapi,
425 spare := ?,
426 fn := fn,
427 arfcn := ?,
428 trx_nr := trx_nr,
429 ts_nr := ts_nr,
430 block_nr := block_nr
431 }
432 }
433}
434
435template (value) PCUIF_Message ts_PCUIF_TXT_IND(uint8_t bts_nr, PCUIF_TextType tt, charstring text) := {
436 msg_type := PCU_IF_MSG_TXT_IND,
437 bts_nr := bts_nr,
438 spare := '0000'O,
439 u := {
440 txt_ind := {
441 txt_type := tt,
442 text := text
443 }
444 }
445}
Harald Weltee1fd9162019-02-18 19:47:53 +0100446template PCUIF_Message tr_PCUIF_TXT_IND(template uint8_t bts_nr, template PCUIF_TextType tt,
447 template charstring text := ?) := {
448 msg_type := PCU_IF_MSG_TXT_IND,
449 bts_nr := bts_nr,
450 spare := '0000'O,
451 u := {
452 txt_ind := {
453 txt_type := tt,
454 text := text
455 }
456 }
457}
458
459
Harald Welte883340c2018-02-28 18:59:29 +0100460
461template (value) PCUIF_Message ts_PCUIF_ACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
462 msg_type := PCU_IF_MSG_ACT_REQ,
463 bts_nr := bts_nr,
464 spare := '0000'O,
465 u := {
466 act_req := {
467 is_activate := 1,
468 trx_nr := trx_nr,
469 ts_nr := ts_nr,
470 spare := '00'O
471 }
472 }
473}
Harald Weltee1fd9162019-02-18 19:47:53 +0100474template PCUIF_Message tr_PCUIF_ACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
475 template uint8_t ts_nr) := {
476 msg_type := PCU_IF_MSG_ACT_REQ,
477 bts_nr := bts_nr,
478 spare := '0000'O,
479 u := {
480 act_req := {
481 is_activate := 1,
482 trx_nr := trx_nr,
483 ts_nr := ts_nr,
484 spare := '00'O
485 }
486 }
487}
Harald Welte883340c2018-02-28 18:59:29 +0100488
489template (value) PCUIF_Message ts_PCUIF_DEACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
490 msg_type := PCU_IF_MSG_ACT_REQ,
491 bts_nr := bts_nr,
492 spare := '0000'O,
493 u := {
494 act_req := {
495 is_activate := 0,
496 trx_nr := trx_nr,
497 ts_nr := ts_nr,
498 spare := '00'O
499 }
500 }
501}
Harald Weltee1fd9162019-02-18 19:47:53 +0100502template PCUIF_Message tr_PCUIF_DEACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
503 template uint8_t ts_nr) := {
504 msg_type := PCU_IF_MSG_ACT_REQ,
505 bts_nr := bts_nr,
506 spare := '0000'O,
507 u := {
508 act_req := {
509 is_activate := 0,
510 trx_nr := trx_nr,
511 ts_nr := ts_nr,
512 spare := '00'O
513 }
514 }
515}
Harald Welte883340c2018-02-28 18:59:29 +0100516
Harald Weltee1fd9162019-02-18 19:47:53 +0100517template (value) PCUIF_Message ts_PCUIF_DATA_IND(template (value) uint8_t bts_nr,
518 template (value) uint8_t trx_nr,
519 template (value) uint8_t ts_nr,
520 template (value) uint8_t block_nr,
521 template (value) PCUIF_Sapi sapi,
Vadim Yanitskiyc78ea262019-05-17 01:08:08 +0700522 template (value) octetstring data,
Harald Weltee1fd9162019-02-18 19:47:53 +0100523 template (value) uint32_t fn,
524 template (value) uint16_t arfcn,
525 template (value) int8_t rssi := -80,
526 template (value) uint16_t ber10k := 0,
527 template (value) int16_t ta_offs_qbits := 0,
Vadim Yanitskiy45749a82021-05-26 13:29:04 +0200528 template (value) int16_t lqual_cb := 10) := {
Harald Weltee1fd9162019-02-18 19:47:53 +0100529 msg_type := PCU_IF_MSG_DATA_IND,
530 bts_nr := bts_nr,
531 spare := '0000'O,
532 u := {
533 data_ind := {
534 sapi := sapi,
535 len := lengthof(valueof(data)),
536 data := data,
537 fn := fn,
538 arfcn := arfcn,
539 trx_nr := trx_nr,
540 ts_nr := ts_nr,
541 block_nr := block_nr,
542 rssi := rssi,
543 ber10k := ber10k,
544 ta_offs_qbits := ta_offs_qbits,
545 lqual_cb := lqual_cb
546 }
547 }
548}
Harald Welte883340c2018-02-28 18:59:29 +0100549template PCUIF_Message tr_PCUIF_DATA_IND(template uint8_t bts_nr := ?,
550 template uint8_t trx_nr := ?,
551 template uint8_t ts_nr := ?,
552 template uint8_t block_nr := ?,
553 template PCUIF_Sapi sapi := ?,
Vadim Yanitskiyc78ea262019-05-17 01:08:08 +0700554 template octetstring data := ?) := {
Harald Welte883340c2018-02-28 18:59:29 +0100555 msg_type := PCU_IF_MSG_DATA_IND,
556 bts_nr := bts_nr,
557 spare := ?,
558 u := {
559 data_ind := {
560 sapi := sapi,
561 len := ?,
562 data := data,
563 fn := ?,
564 arfcn := ?,
565 trx_nr := trx_nr,
566 ts_nr := ts_nr,
567 block_nr := block_nr,
568 rssi := ?,
569 ber10k := ?,
570 ta_offs_qbits := ?,
571 lqual_cb := ?
572 }
573 }
574}
575
Pau Espin Pedrolcf5c33e2021-01-19 18:56:55 +0100576template PCUIF_data tr_PCUIF_DATA(template uint8_t trx_nr,
577 template uint8_t ts_nr,
578 template uint8_t block_nr := ?,
579 template uint32_t fn := ?,
580 template PCUIF_Sapi sapi := ?,
581 template octetstring data := ?) := {
582 sapi := sapi,
583 len := ?,
584 data := data,
585 fn := fn,
586 arfcn := ?, /* unused in BTS */
587 trx_nr := trx_nr,
588 ts_nr := ts_nr,
589 block_nr := block_nr,
590 /* measurement parameters below unused on Tx */
591 rssi := 0,
592 ber10k := 0,
593 ta_offs_qbits := 0,
594 lqual_cb := 0
595
596}
597
Harald Welte883340c2018-02-28 18:59:29 +0100598template (value) PCUIF_Message ts_PCUIF_DATA_REQ(uint8_t bts_nr, uint8_t trx_nr,
599 uint8_t ts_nr, uint8_t block_nr,
600 uint32_t fn, PCUIF_Sapi sapi,
601 octetstring data) := {
602 msg_type := PCU_IF_MSG_DATA_REQ,
603 bts_nr := bts_nr,
604 spare := '0000'O,
605 u := {
606 data_req := {
607 sapi := sapi,
608 len := lengthof(data),
609 data := data,
610 fn := fn,
611 arfcn := 0, /* unused in BTS */
612 trx_nr := trx_nr,
613 ts_nr := ts_nr,
614 block_nr := block_nr,
615 /* measurement parameters below unused on Tx */
616 rssi := 0,
617 ber10k := 0,
618 ta_offs_qbits := 0,
619 lqual_cb := 0
620 }
621 }
622}
Harald Weltee1fd9162019-02-18 19:47:53 +0100623template PCUIF_Message tr_PCUIF_DATA_REQ(template uint8_t bts_nr,
624 template uint8_t trx_nr,
625 template uint8_t ts_nr,
626 template uint8_t block_nr := ?,
627 template uint32_t fn := ?,
628 template PCUIF_Sapi sapi := ?,
629 template octetstring data := ?) := {
630 msg_type := PCU_IF_MSG_DATA_REQ,
631 bts_nr := bts_nr,
632 spare := '0000'O,
633 u := {
Pau Espin Pedrolcf5c33e2021-01-19 18:56:55 +0100634 data_req := tr_PCUIF_DATA(trx_nr, ts_nr, block_nr, fn, sapi, data)
Harald Weltee1fd9162019-02-18 19:47:53 +0100635 }
636}
Harald Welte883340c2018-02-28 18:59:29 +0100637
Harald Weltee1fd9162019-02-18 19:47:53 +0100638template (value) PCUIF_Message ts_PCUIF_DATA_CNF(template (value) uint8_t bts_nr,
639 template (value) uint8_t trx_nr,
640 template (value) uint8_t ts_nr,
641 template (value) uint8_t block_nr,
642 template (value) uint32_t fn,
643 template (value) uint16_t arfcn,
644 template (value) PCUIF_Sapi sapi,
645 template (value) octetstring data) := {
646 msg_type := PCU_IF_MSG_DATA_CNF,
647 bts_nr := bts_nr,
648 spare := '0000'O,
649 u := {
650 data_cnf := {
651 sapi := sapi,
652 len := 0, /* overwritten */
653 data := data,
654 fn := fn,
655 arfcn := arfcn,
656 trx_nr := trx_nr,
657 ts_nr := ts_nr,
658 block_nr := block_nr,
659 rssi := 0,
660 ber10k := 0,
661 ta_offs_qbits := 0,
662 lqual_cb := 0
663 }
664 }
665}
Harald Welte883340c2018-02-28 18:59:29 +0100666template PCUIF_Message tr_PCUIF_DATA_CNF(template uint8_t bts_nr := ?,
667 template uint8_t trx_nr := ?,
668 template uint8_t ts_nr := ?,
669 template PCUIF_Sapi sapi := ?,
670 template octetstring data := ?) := {
671 msg_type := PCU_IF_MSG_DATA_CNF,
672 bts_nr := bts_nr,
673 spare := ?,
674 u := {
675 data_cnf := {
676 sapi := sapi,
677 len := ?,
678 data := data,
679 fn := ?,
680 arfcn := ?,
681 trx_nr := trx_nr,
682 ts_nr := ts_nr,
683 block_nr := ?,
684 rssi := ?,
685 ber10k := ?,
686 ta_offs_qbits := ?,
687 lqual_cb := ?
688 }
689 }
690}
691
Philipp Maier704f31b2023-05-04 15:53:33 +0200692template (value) PCUIF_Message ts_PCUIF_DATA_CNF_DT(template (value) uint8_t bts_nr,
693 template (value) uint8_t trx_nr,
694 template (value) uint8_t ts_nr,
695 template (value) uint8_t block_nr,
696 template (value) uint32_t fn,
697 template (value) uint16_t arfcn,
698 template (value) PCUIF_Sapi sapi,
699 template (value) OCT4 tlli) := {
700 msg_type := PCU_IF_MSG_DATA_CNF_DT,
701 bts_nr := bts_nr,
702 spare := '0000'O,
703 u := {
704 data_cnf_dt := {
705 sapi := sapi,
706 tlli := tlli,
707 fn := fn,
708 arfcn := arfcn,
709 trx_nr := trx_nr,
710 ts_nr := ts_nr,
711 block_nr := block_nr,
712 rssi := 0,
713 ber10k := 0,
714 ta_offs_qbits := 0,
715 lqual_cb := 0
716 }
717 }
718}
719template PCUIF_Message tr_PCUIF_DATA_CNF_DT(template uint8_t bts_nr := ?,
720 template uint8_t trx_nr := ?,
721 template uint8_t ts_nr := ?,
722 template PCUIF_Sapi sapi := ?,
723 template OCT4 tlli := ?) := {
724 msg_type := PCU_IF_MSG_DATA_CNF_DT,
725 bts_nr := bts_nr,
726 spare := ?,
727 u := {
728 data_cnf_dt := {
729 sapi := sapi,
730 tlli := tlli,
731 fn := ?,
732 arfcn := ?,
733 trx_nr := trx_nr,
734 ts_nr := ts_nr,
735 block_nr := ?,
736 rssi := ?,
737 ber10k := ?,
738 ta_offs_qbits := ?,
739 lqual_cb := ?
740 }
741 }
742}
743
Harald Weltee1fd9162019-02-18 19:47:53 +0100744template (value) PCUIF_Message ts_PCUIF_RACH_IND(template (value) uint8_t bts_nr,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700745 template (value) uint8_t trx_nr,
746 template (value) uint8_t ts_nr,
Harald Weltee1fd9162019-02-18 19:47:53 +0100747 template (value) uint16_t ra,
748 template (value) uint8_t is_11bit,
Harald Welte913bbf62019-03-01 00:39:19 +0100749 template (value) PCUIF_BurstType burst_type,
Harald Weltee1fd9162019-02-18 19:47:53 +0100750 template (value) uint32_t fn,
751 template (value) uint16_t arfcn,
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700752 template (value) int16_t qta := 0,
753 template (value) PCUIF_Sapi sapi := PCU_IF_SAPI_RACH
Harald Weltee1fd9162019-02-18 19:47:53 +0100754) := {
755 msg_type := PCU_IF_MSG_RACH_IND,
756 bts_nr := bts_nr,
757 spare := '0000'O,
758 u := {
759 rach_ind := {
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700760 sapi := sapi,
Harald Weltee1fd9162019-02-18 19:47:53 +0100761 ra := ra,
762 qta := qta,
763 fn := fn,
764 arfcn := arfcn,
765 is_11bit := is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700766 burst_type := burst_type,
767 trx_nr := trx_nr,
768 ts_nr := ts_nr
Harald Weltee1fd9162019-02-18 19:47:53 +0100769 }
770 }
771}
Harald Welte883340c2018-02-28 18:59:29 +0100772template PCUIF_Message tr_PCUIF_RACH_IND(template uint8_t bts_nr := ?,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700773 template uint8_t trx_nr := ?,
774 template uint8_t ts_nr := ?,
Harald Welte883340c2018-02-28 18:59:29 +0100775 template uint16_t ra := ?,
776 template uint8_t is_11bit := ?,
Harald Welte913bbf62019-03-01 00:39:19 +0100777 template PCUIF_BurstType burst_type := ?,
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700778 template uint32_t fn := ?,
779 template PCUIF_Sapi sapi := PCU_IF_SAPI_RACH) := {
Harald Welte883340c2018-02-28 18:59:29 +0100780 msg_type := PCU_IF_MSG_RACH_IND,
781 bts_nr := bts_nr,
782 spare := ?,
783 u := {
784 rach_ind := {
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700785 sapi := sapi,
Harald Welte883340c2018-02-28 18:59:29 +0100786 ra := ra,
787 qta := ?,
788 fn := fn,
789 arfcn := ?,
790 is_11bit := is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700791 burst_type := burst_type,
792 trx_nr := trx_nr,
793 ts_nr := ts_nr
Harald Welte883340c2018-02-28 18:59:29 +0100794 }
795 }
796}
797
Harald Weltee1fd9162019-02-18 19:47:53 +0100798template (value) PCUIF_Message ts_PCUIF_PAG_REQ(template (value) uint8_t bts_nr,
799 template (value) OCT9 id_lv,
800 template (value) uint8_t chan_needed,
801 template (value) PCUIF_Sapi sapi) := {
802 msg_type := PCU_IF_MSG_PAG_REQ,
803 bts_nr := bts_nr,
804 spare := '0000'O,
805 u := {
806 pag_req := {
807 sapi := sapi,
808 chan_needed := chan_needed,
809 identity_lv := id_lv
810 }
811 }
812}
Harald Welte883340c2018-02-28 18:59:29 +0100813template PCUIF_Message tr_PCUIF_PAG_REQ(template uint8_t bts_nr := ?,
814 template OCT9 id_lv := ?,
815 template uint8_t chan_needed := ?,
816 template PCUIF_Sapi sapi := ?) := {
817 msg_type := PCU_IF_MSG_PAG_REQ,
818 bts_nr := bts_nr,
819 spare := ?,
820 u := {
821 pag_req := {
822 sapi := ?,
823 chan_needed := chan_needed,
824 identity_lv := id_lv
825 }
826 }
827}
828
Harald Weltee1fd9162019-02-18 19:47:53 +0100829const PCUIF_Flags c_PCUIF_Flags_default := {
830 bts_active := true,
831 sysmo_direct_dsp := false,
832 spare := '00000000000000'B,
833 cs1 := true,
834 cs2 := true,
835 cs3 := true,
836 cs4 := true,
837 mcs1 := true,
838 mcs2 := true,
839 mcs3 := true,
840 mcs4 := true,
841 mcs5 := true,
842 mcs6 := true,
843 mcs7 := true,
844 mcs8 := true,
845 mcs9 := true,
846 spare2 := '000'B
847};
848
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100849const PCUIF_Flags c_PCUIF_Flags_noMCS := {
850 bts_active := true,
851 sysmo_direct_dsp := false,
852 spare := '00000000000000'B,
853 cs1 := true,
854 cs2 := true,
855 cs3 := true,
856 cs4 := true,
857 mcs1 := false,
858 mcs2 := false,
859 mcs3 := false,
860 mcs4 := false,
861 mcs5 := false,
862 mcs6 := false,
863 mcs7 := false,
864 mcs8 := false,
865 mcs9 := false,
866 spare2 := '000'B
867};
868
869function f_pcuif_ind_flags_egprs_enabled(PCUIF_Flags flags) return boolean {
870 return flags.mcs1 or flags.mcs2 or flags.mcs3 or flags.mcs4 or
871 flags.mcs5 or flags.mcs6 or flags.mcs7 or flags.mcs8 or
872 flags.mcs9;
873}
874
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700875template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH0(template (value) uint3_t tsc := 7) := {
876 tsc := tsc,
877 hopping := 0,
878 hsn := 0, maio := 0,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700879 ma_bit_len := 0,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700880 ma := f_pad_bit(''B, 64, '0'B)
881};
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700882template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH0(template uint3_t tsc := ?) := {
883 tsc := tsc,
884 hopping := 0,
885 hsn := ?, maio := ?,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700886 ma_bit_len := ?,
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700887 ma := ?
888};
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700889
890template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH1(template (value) uint3_t tsc := 7,
891 template (value) uint6_t hsn := 0,
892 template (value) uint6_t maio := 0,
893 template (value) bitstring ma := ''B) := {
894 tsc := tsc,
895 hopping := 1,
896 hsn := hsn,
897 maio := maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700898 ma_bit_len := lengthof(valueof(ma)),
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700899 ma := f_pad_bit(valueof(ma), 64, '0'B)
900};
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700901template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH1(template uint3_t tsc := ?,
902 template uint6_t hsn := ?,
903 template uint6_t maio := ?,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700904 template bitstring ma := ?,
905 template uint8_t ma_bit_len := ?) := {
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700906 tsc := tsc,
907 hopping := 1,
908 hsn := hsn,
909 maio := maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700910 ma_bit_len := ma_bit_len,
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700911 ma := ma
912};
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700913
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100914template (value) PCUIF_InfoTrx
915ts_PCUIF_InfoTrx(template (value) uint16_t arfcn := 871,
916 template (value) BIT8 pdch_mask := '00000001'B,
917 template (value) uint3_t tsc := 7) := {
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700918 arfcn := arfcn,
919 pdch_mask := pdch_mask,
Vadim Yanitskiyd8051722020-08-22 02:33:17 +0700920 spare := '00'O,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700921 hLayer1 := 0,
922 ts := {
923 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
924 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
925 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
926 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc)
927 }
928};
929
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100930template (value) PCUIF_InfoTrxs
931ts_PCUIF_InfoTrxs_def(uint16_t base_arfcn) := {
932 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 0),
933 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 1),
934 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 2),
935 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 3),
936 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 4),
937 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 5),
938 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 6),
939 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 7)
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700940};
Harald Weltee1fd9162019-02-18 19:47:53 +0100941
Harald Weltee1fd9162019-02-18 19:47:53 +0100942template (value) PCUIF_Message ts_PCUIF_INFO_IND(template (value) uint8_t bts_nr,
Pau Espin Pedrolf787b092019-10-04 18:34:05 +0200943 template (value) PCUIF_info_ind info_ind) := {
Harald Weltee1fd9162019-02-18 19:47:53 +0100944 msg_type := PCU_IF_MSG_INFO_IND,
945 bts_nr := bts_nr,
946 spare := '0000'O,
947 u := {
Pau Espin Pedrolf787b092019-10-04 18:34:05 +0200948 info_ind := info_ind
Harald Weltee1fd9162019-02-18 19:47:53 +0100949 }
950}
Harald Welted378a252018-03-13 17:02:14 +0100951template PCUIF_Message tr_PCUIF_INFO_IND(template uint8_t bts_nr := ?,
952 template PCUIF_Flags flags := ?,
Vadim Yanitskiyc1559302020-07-19 16:39:12 +0700953 template uint32_t version := mp_pcuif_version) := {
Harald Welted378a252018-03-13 17:02:14 +0100954 msg_type := PCU_IF_MSG_INFO_IND,
955 bts_nr := bts_nr,
956 spare := ?,
957 u := {
958 info_ind := {
959 version := version,
960 flags := flags,
961 trx := ?,
962 bsic := ?,
963 mcc := ?,
964 mnc :=?,
Harald Welte3568dc72018-03-13 17:06:51 +0100965 mnc_3_digits := ?,
Harald Welted378a252018-03-13 17:02:14 +0100966 lac := ?,
967 rac := ?,
968 nsei := ?,
969 nse_timer := ?,
970 cell_timer := ?,
971 cell_id := ?,
972 repeat_time := ?,
973 repeat_count := ?,
974 bvci := ?,
975 t3142 := ?,
976 t3169 := ?,
977 t3191 := ?,
978 t3193_10ms := ?,
979 t3195 := ?,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100980 n3101 := ?,
981 n3103 := ?,
982 n3105 := ?,
Harald Welted378a252018-03-13 17:02:14 +0100983 cv_countdown := ?,
984 dl_tbf_ext := ?,
985 ul_tbf_ext := ?,
986 initial_cs := ?,
987 initial_mcs := ?,
988 nsvci := ?,
Vadim Yanitskiy0d590802020-08-21 00:14:22 +0700989 local_port := ?,
Harald Welted378a252018-03-13 17:02:14 +0100990 remote_port := ?,
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200991 remote_addr := ?
Harald Welted378a252018-03-13 17:02:14 +0100992 }
993 }
994}
995
Harald Weltea3219812019-03-02 00:02:28 +0100996template (value) PCUIF_Message ts_PCUIF_TIME_IND(template (value) uint8_t bts_nr,
997 template (value) uint32_t fn) := {
998 msg_type := PCU_IF_MSG_TIME_IND,
999 bts_nr := bts_nr,
1000 spare := '0000'O,
1001 u := {
1002 time_ind := {
1003 fn := fn
1004 }
1005 }
1006}
1007template PCUIF_Message tr_PCUIF_TIME_IND(template uint8_t bts_nr,
1008 template uint32_t fn) := {
1009 msg_type := PCU_IF_MSG_TIME_IND,
1010 bts_nr := bts_nr,
1011 spare := ?,
1012 u := {
1013 time_ind := {
1014 fn := fn
1015 }
1016 }
1017}
Harald Welte883340c2018-02-28 18:59:29 +01001018
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +02001019template (value) PCUIF_Message
1020ts_PCUIF_INTERF_IND(template (value) uint8_t bts_nr,
1021 template (value) uint8_t trx_nr,
1022 template (value) uint32_t fn,
1023 template (value) PCUIF_interf interf) := {
1024 msg_type := PCU_IF_MSG_INTERF_IND,
1025 bts_nr := bts_nr,
1026 spare := '0000'O,
1027 u := {
1028 interf_ind := {
1029 trx_nr := trx_nr,
1030 spare := '000000'O,
1031 fn := fn,
1032 interf := interf
1033 }
1034 }
1035}
1036template PCUIF_Message
1037tr_PCUIF_INTERF_IND(template (present) uint8_t bts_nr := ?,
1038 template (present) uint8_t trx_nr := ?,
1039 template (present) uint32_t fn := ?,
1040 template (present) PCUIF_interf interf := ?) := {
1041 msg_type := PCU_IF_MSG_INTERF_IND,
1042 bts_nr := bts_nr,
1043 spare := ?,
1044 u := {
1045 interf_ind := {
1046 trx_nr := trx_nr,
1047 spare := ?,
1048 fn := fn,
1049 interf := interf
1050 }
1051 }
1052}
1053
Harald Welte4bff40a2019-03-21 21:34:10 +01001054template (value) PCUIF_Message ts_PCUIF_SUSP_REQ(template (value) uint8_t bts_nr,
1055 template (value) OCT4 tlli,
1056 template (value) OCT6 ra_id,
1057 template (value) uint8_t cause) := {
1058 msg_type := PCU_IF_MSG_SUSP_REQ,
1059 bts_nr := bts_nr,
1060 spare := '0000'O,
1061 u := {
1062 susp_req := {
1063 tlli := tlli,
1064 ra_id := ra_id,
1065 cause := cause
1066 }
1067 }
1068}
1069template PCUIF_Message tr_PCUIF_SUSP_REQ(template uint8_t bts_nr,
1070 template OCT4 tlli,
1071 template OCT6 ra_id,
1072 template uint8_t cause) := {
1073 msg_type := PCU_IF_MSG_SUSP_REQ,
1074 bts_nr := bts_nr,
1075 spare := '0000'O,
1076 u := {
1077 susp_req := {
1078 tlli := tlli,
1079 ra_id := ra_id,
1080 cause := cause
1081 }
1082 }
1083}
1084
Harald Welte11b734c2019-09-05 14:17:54 +02001085template (value) PCUIF_Message ts_PCUIF_APP_INFO_REQ(template (value) uint8_t bts_nr,
1086 template (value) uint8_t app_type,
1087 template (value) octetstring app_data) := {
1088 msg_type := PCU_IF_MSG_APP_INFO_REQ,
1089 bts_nr := bts_nr,
1090 spare := '0000'O,
1091 u := {
1092 app_info_req := {
1093 application_type := app_type,
1094 len := 0, /* overwritten */
1095 data := app_data
1096 }
1097 }
1098}
1099template (present) PCUIF_Message tr_PCUIF_APP_INFO_REQ(template (present) uint8_t bts_nr,
1100 template (present) uint8_t app_type,
1101 template (present) octetstring app_data) := {
1102 msg_type := PCU_IF_MSG_APP_INFO_REQ,
1103 bts_nr := bts_nr,
1104 spare := '0000'O,
1105 u := {
1106 app_info_req := {
1107 application_type := app_type,
1108 len := ?,
1109 data := app_data
1110 }
1111 }
1112}
1113
Harald Welte4bff40a2019-03-21 21:34:10 +01001114
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001115template (value) PCUIF_Message ts_PCUIF_CONTAINER(template (value) uint8_t bts_nr,
1116 template (value) PCUIF_container container) := {
1117 msg_type := PCU_IF_MSG_CONTAINER,
1118 bts_nr := bts_nr,
1119 spare := '0000'O,
1120 u := {
1121 container := container
1122 }
1123}
1124template (present) PCUIF_Message tr_PCUIF_CONTAINER(template (present) uint8_t bts_nr,
1125 template (present) PCUIF_container container) := {
1126 msg_type := PCU_IF_MSG_CONTAINER,
1127 bts_nr := bts_nr,
1128 spare := '0000'O,
1129 u := {
1130 container := container
1131 }
1132}
1133
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001134template (value) PCUIF_container ts_PCUIF_CONT_OTHER(PCUIF_MsgType msg_type, template (value) octetstring payload) := {
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001135 msg_type := msg_type,
1136 spare := '00'O,
1137 len := lengthof(payload),
1138 u := {
1139 other := payload
1140 }
1141}
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001142template (present) PCUIF_container tr_PCUIF_CONT_OTHER(template (present) PCUIF_MsgType msg_type,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001143 template (present) octetstring payload) := {
1144 msg_type := msg_type,
1145 spare := '00'O,
1146 len := ?,
1147 u := {
1148 other := payload
1149 }
1150}
1151
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001152template (present) PCUIF_container tr_PCUIF_CONT_NEIGH_ADDR_REQ(template (present) uint16_t local_lac := ?,
1153 template (present) uint16_t local_ci := ?,
1154 template (present) uint16_t tgt_arfcn := ?,
1155 template (present) uint8_t tgt_bsic := ?) := {
1156 msg_type := PCU_IF_MSG_NEIGH_ADDR_REQ,
1157 spare := '00'O,
1158 len := ?,
1159 u := {
1160 neigh_addr_req := {
1161 local_lac := local_lac,
1162 local_ci := local_ci,
1163 tgt_arfcn := tgt_arfcn,
1164 tgt_bsic := tgt_bsic
1165 }
1166 }
1167}
1168template (present) PCUIF_Message tr_PCUIF_NEIGH_ADDR_REQ(template (present) uint8_t bts_nr,
1169 template (present) uint16_t local_lac := ?,
1170 template (present) uint16_t local_ci := ?,
1171 template (present) uint16_t tgt_arfcn := ?,
1172 template (present) uint8_t tgt_bsic := ?) := {
1173 msg_type := PCU_IF_MSG_CONTAINER,
1174 bts_nr := bts_nr,
1175 spare := '0000'O,
1176 u := {
1177 container := tr_PCUIF_CONT_NEIGH_ADDR_REQ(local_lac, local_ci, tgt_arfcn, tgt_bsic)
1178 }
1179}
1180
1181template (value) PCUIF_container ts_PCUIF_CONT_NEIGH_ADDR_CNF(template (value) PCUIF_neigh_addr_req orig_req,
1182 template (value) uint8_t error_code := 0,
1183 template (value) uint16_t mcc := 0,
1184 template (value) uint16_t mnc := 0,
1185 template (value) uint8_t mnc_3_digits := 0,
1186 template (value) uint16_t lac := 0,
1187 template (value) uint8_t rac := 0,
1188 template (value) uint16_t cell_identity := 0) := {
1189 msg_type := PCU_IF_MSG_NEIGH_ADDR_CNF,
1190 spare := '00'O,
1191 len := 0, /* overwritten */
1192 u := {
1193 neigh_addr_cnf := {
1194 orig_req := orig_req,
1195 error_code := error_code,
1196 mcc := mcc,
1197 mnc := mnc,
1198 mnc_3_digits := mnc_3_digits,
1199 lac := lac,
1200 rac := rac,
1201 cell_identity := cell_identity
1202 }
1203 }
1204}
1205template (value) PCUIF_Message ts_PCUIF_NEIGH_ADDR_CNF(template (value) uint8_t bts_nr,
1206 template (value) PCUIF_neigh_addr_req orig_req,
1207 template (value) uint8_t error_code := 0,
1208 template (value) uint16_t mcc := 0,
1209 template (value) uint16_t mnc := 0,
1210 template (value) uint8_t mnc_3_digits := 0,
1211 template (value) uint16_t lac := 0,
1212 template (value) uint8_t rac := 0,
1213 template (value) uint16_t cell_identity := 0) := {
1214 msg_type := PCU_IF_MSG_CONTAINER,
1215 bts_nr := bts_nr,
1216 spare := '0000'O,
1217 u := {
1218 container := ts_PCUIF_CONT_NEIGH_ADDR_CNF(orig_req, error_code, mcc, mnc, mnc_3_digits,
1219 lac, rac, cell_identity)
1220 }
1221}
1222
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001223function f_PCUIF_PDCHMask_set(inout PCUIF_info_ind info, BIT8 pdch_mask,
1224 template (present) uint8_t trx_nr := ?)
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07001225{
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001226 for (var integer nr := 0; nr < lengthof(info.trx); nr := nr + 1) {
1227 if (match(nr, trx_nr)) {
1228 info.trx[nr].pdch_mask := pdch_mask;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07001229 }
1230 }
1231}
1232
Alexander Couzense0f7c542020-09-13 17:25:18 +02001233function f_PCUIF_AF2addr_type(AddressFamily address_family)
1234return PCUIF_AddrType {
1235 if (address_family == AF_INET) {
1236 return PCUIF_ADDR_TYPE_IPV4;
1237 } else if (address_family == AF_INET6) {
1238 return PCUIF_ADDR_TYPE_IPV6;
1239 } else {
1240 return PCUIF_ADDR_TYPE_UNSPEC;
1241 }
1242}
1243
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001244/* TODO: second (redundant) NSVC connection is not (yet) supported */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001245function f_PCUIF_RemoteAddr(PCUIF_AddrType addr_type,
1246 charstring addr_str)
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001247return PCUIF_RemoteAddr {
1248 var PCUIF_RemoteAddr remote_addr;
1249
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001250 remote_addr.addr_type[0] := addr_type;
1251 if (addr_type == PCUIF_ADDR_TYPE_IPV4) {
1252 remote_addr.addr[0] := f_inet_addr(addr_str);
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001253 } else {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001254 remote_addr.addr[0] := f_inet6_addr(addr_str);
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001255 }
1256
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001257 remote_addr.addr_type[1] := PCUIF_ADDR_TYPE_UNSPEC;
1258 remote_addr.addr[1] := f_pad_oct(''O, 16, '00'O);
1259
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001260 return remote_addr;
1261}
1262
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +07001263
Harald Welte883340c2018-02-28 18:59:29 +01001264} with { encode "RAW" variant "BYTEORDER(first)" };