blob: a6af2a0305adeb18e1485a521d8668316cb5ecc1 [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 */
Vadim Yanitskiybefa21c2020-09-22 00:53:16 +070020 PCUIF_Version mp_pcuif_version := 10;
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070021};
22
Harald Welte883340c2018-02-28 18:59:29 +010023const charstring PCU_SOCK_DEFAULT := "/tmp/pcu_bts";
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +070024type integer PCUIF_Version (9..10); /* 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
Harald Welte883340c2018-02-28 18:59:29 +0100315
316type union PCUIF_MsgUnion {
317 PCUIF_data data_req,
318 PCUIF_data data_cnf,
319 PCUIF_data_cnf_dt data_cnf_dt,
320 PCUIF_data data_ind,
321 PCUIF_susp_req susp_req,
322 PCUIF_rts_req rts_req,
323 PCUIF_rach_ind rach_ind,
324 PCUIF_txt_ind txt_ind,
325 PCUIF_info_ind info_ind,
Philipp Maier310520b2023-05-04 13:10:18 +0200326 PCUIF_e1_ccu_ind e1_ccu_ind,
Harald Welte883340c2018-02-28 18:59:29 +0100327 PCUIF_act_req act_req,
328 PCUIF_time_ind time_ind,
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200329 PCUIF_interf_ind interf_ind,
Harald Welte11b734c2019-09-05 14:17:54 +0200330 PCUIF_pag_req pag_req,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200331 PCUIF_app_info_req app_info_req,
332 PCUIF_container container
Harald Welte883340c2018-02-28 18:59:29 +0100333} with { variant "" };
334
335type record PCUIF_Message {
336 PCUIF_MsgType msg_type,
337 uint8_t bts_nr,
338 OCT2 spare,
339 PCUIF_MsgUnion u
340} with { variant (u) "CROSSTAG(
341 data_req, msg_type = PCU_IF_MSG_DATA_REQ;
342 data_cnf, msg_type = PCU_IF_MSG_DATA_CNF;
343 data_cnf_dt, msg_type = PCU_IF_MSG_DATA_CNF_DT;
344 data_ind, msg_type = PCU_IF_MSG_DATA_IND;
345 susp_req, msg_type = PCU_IF_MSG_SUSP_REQ;
346 rts_req, msg_type = PCU_IF_MSG_RTS_REQ;
347 rach_ind, msg_type = PCU_IF_MSG_RACH_IND;
348 txt_ind, msg_type = PCU_IF_MSG_TXT_IND;
349 info_ind, msg_type = PCU_IF_MSG_INFO_IND;
Philipp Maier310520b2023-05-04 13:10:18 +0200350 e1_ccu_ind, msg_type = PCU_IF_MSG_E1_CCU_IND;
Harald Welte883340c2018-02-28 18:59:29 +0100351 act_req, msg_type = PCU_IF_MSG_ACT_REQ;
352 time_ind, msg_type = PCU_IF_MSG_TIME_IND;
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200353 interf_ind, msg_type = PCU_IF_MSG_INTERF_IND;
Harald Welte11b734c2019-09-05 14:17:54 +0200354 pag_req, msg_type = PCU_IF_MSG_PAG_REQ;
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200355 app_info_req, msg_type = PCU_IF_MSG_APP_INFO_REQ;
356 container, msg_type = PCU_IF_MSG_CONTAINER)"
Vadim Yanitskiy204fe622021-03-23 04:49:41 +0100357 /* PCUIFv10: 1006 * 8 = 8048 bits */
358 variant "PADDING(8048)"
Harald Welte883340c2018-02-28 18:59:29 +0100359};
360
361external function enc_PCUIF_Message(in PCUIF_Message pdu) return octetstring
362 with { extension "prototype(convert) encode(RAW)" };
363external function dec_PCUIF_Message(in octetstring stream) return PCUIF_Message
364 with { extension "prototype(convert) decode(RAW)" };
365
366
Vadim Yanitskiyf7d9c0f2019-09-06 00:08:17 +0200367/* Generic template for matching messages by type and/or the BTS number */
368template PCUIF_Message tr_PCUIF_MSG(template PCUIF_MsgType msg_type := ?,
369 template uint8_t bts_nr := ?) := {
370 msg_type := msg_type,
371 bts_nr := bts_nr,
372 spare := ?,
373 u := ?
374}
375
Harald Weltee1fd9162019-02-18 19:47:53 +0100376template (value) PCUIF_Message ts_PCUIF_RTS_REQ(template (value) uint8_t bts_nr,
377 template (value) uint8_t trx_nr,
378 template (value) uint8_t ts_nr,
379 template (value) PCUIF_Sapi sapi,
380 template (value) uint32_t fn,
381 template (value) uint16_t arfcn,
382 template (value) uint8_t block_nr
383 ) := {
384 msg_type := PCU_IF_MSG_RTS_REQ,
385 bts_nr := bts_nr,
386 spare := '0000'O,
387 u := {
388 rts_req := {
389 sapi := sapi,
390 spare := '000000'O,
391 fn := fn,
392 arfcn := arfcn,
393 trx_nr := trx_nr,
394 ts_nr := ts_nr,
395 block_nr := block_nr
396 }
397 }
398}
Harald Welte883340c2018-02-28 18:59:29 +0100399template PCUIF_Message tr_PCUIF_RTS_REQ(template uint8_t bts_nr := ?,
400 template uint8_t trx_nr := ?,
401 template uint8_t ts_nr := ?,
402 template PCUIF_Sapi sapi := ?,
403 template uint32_t fn := ?,
404 template uint8_t block_nr := ?
405 ) := {
406 msg_type := PCU_IF_MSG_RTS_REQ,
407 bts_nr := bts_nr,
408 spare := ?,
409 u := {
410 rts_req := {
411 sapi := sapi,
412 spare := ?,
413 fn := fn,
414 arfcn := ?,
415 trx_nr := trx_nr,
416 ts_nr := ts_nr,
417 block_nr := block_nr
418 }
419 }
420}
421
422template (value) PCUIF_Message ts_PCUIF_TXT_IND(uint8_t bts_nr, PCUIF_TextType tt, charstring text) := {
423 msg_type := PCU_IF_MSG_TXT_IND,
424 bts_nr := bts_nr,
425 spare := '0000'O,
426 u := {
427 txt_ind := {
428 txt_type := tt,
429 text := text
430 }
431 }
432}
Harald Weltee1fd9162019-02-18 19:47:53 +0100433template PCUIF_Message tr_PCUIF_TXT_IND(template uint8_t bts_nr, template PCUIF_TextType tt,
434 template charstring text := ?) := {
435 msg_type := PCU_IF_MSG_TXT_IND,
436 bts_nr := bts_nr,
437 spare := '0000'O,
438 u := {
439 txt_ind := {
440 txt_type := tt,
441 text := text
442 }
443 }
444}
445
446
Harald Welte883340c2018-02-28 18:59:29 +0100447
448template (value) PCUIF_Message ts_PCUIF_ACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
449 msg_type := PCU_IF_MSG_ACT_REQ,
450 bts_nr := bts_nr,
451 spare := '0000'O,
452 u := {
453 act_req := {
454 is_activate := 1,
455 trx_nr := trx_nr,
456 ts_nr := ts_nr,
457 spare := '00'O
458 }
459 }
460}
Harald Weltee1fd9162019-02-18 19:47:53 +0100461template PCUIF_Message tr_PCUIF_ACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
462 template uint8_t ts_nr) := {
463 msg_type := PCU_IF_MSG_ACT_REQ,
464 bts_nr := bts_nr,
465 spare := '0000'O,
466 u := {
467 act_req := {
468 is_activate := 1,
469 trx_nr := trx_nr,
470 ts_nr := ts_nr,
471 spare := '00'O
472 }
473 }
474}
Harald Welte883340c2018-02-28 18:59:29 +0100475
476template (value) PCUIF_Message ts_PCUIF_DEACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
477 msg_type := PCU_IF_MSG_ACT_REQ,
478 bts_nr := bts_nr,
479 spare := '0000'O,
480 u := {
481 act_req := {
482 is_activate := 0,
483 trx_nr := trx_nr,
484 ts_nr := ts_nr,
485 spare := '00'O
486 }
487 }
488}
Harald Weltee1fd9162019-02-18 19:47:53 +0100489template PCUIF_Message tr_PCUIF_DEACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
490 template uint8_t ts_nr) := {
491 msg_type := PCU_IF_MSG_ACT_REQ,
492 bts_nr := bts_nr,
493 spare := '0000'O,
494 u := {
495 act_req := {
496 is_activate := 0,
497 trx_nr := trx_nr,
498 ts_nr := ts_nr,
499 spare := '00'O
500 }
501 }
502}
Harald Welte883340c2018-02-28 18:59:29 +0100503
Harald Weltee1fd9162019-02-18 19:47:53 +0100504template (value) PCUIF_Message ts_PCUIF_DATA_IND(template (value) uint8_t bts_nr,
505 template (value) uint8_t trx_nr,
506 template (value) uint8_t ts_nr,
507 template (value) uint8_t block_nr,
508 template (value) PCUIF_Sapi sapi,
Vadim Yanitskiyc78ea262019-05-17 01:08:08 +0700509 template (value) octetstring data,
Harald Weltee1fd9162019-02-18 19:47:53 +0100510 template (value) uint32_t fn,
511 template (value) uint16_t arfcn,
512 template (value) int8_t rssi := -80,
513 template (value) uint16_t ber10k := 0,
514 template (value) int16_t ta_offs_qbits := 0,
Vadim Yanitskiy45749a82021-05-26 13:29:04 +0200515 template (value) int16_t lqual_cb := 10) := {
Harald Weltee1fd9162019-02-18 19:47:53 +0100516 msg_type := PCU_IF_MSG_DATA_IND,
517 bts_nr := bts_nr,
518 spare := '0000'O,
519 u := {
520 data_ind := {
521 sapi := sapi,
522 len := lengthof(valueof(data)),
523 data := data,
524 fn := fn,
525 arfcn := arfcn,
526 trx_nr := trx_nr,
527 ts_nr := ts_nr,
528 block_nr := block_nr,
529 rssi := rssi,
530 ber10k := ber10k,
531 ta_offs_qbits := ta_offs_qbits,
532 lqual_cb := lqual_cb
533 }
534 }
535}
Harald Welte883340c2018-02-28 18:59:29 +0100536template PCUIF_Message tr_PCUIF_DATA_IND(template uint8_t bts_nr := ?,
537 template uint8_t trx_nr := ?,
538 template uint8_t ts_nr := ?,
539 template uint8_t block_nr := ?,
540 template PCUIF_Sapi sapi := ?,
Vadim Yanitskiyc78ea262019-05-17 01:08:08 +0700541 template octetstring data := ?) := {
Harald Welte883340c2018-02-28 18:59:29 +0100542 msg_type := PCU_IF_MSG_DATA_IND,
543 bts_nr := bts_nr,
544 spare := ?,
545 u := {
546 data_ind := {
547 sapi := sapi,
548 len := ?,
549 data := data,
550 fn := ?,
551 arfcn := ?,
552 trx_nr := trx_nr,
553 ts_nr := ts_nr,
554 block_nr := block_nr,
555 rssi := ?,
556 ber10k := ?,
557 ta_offs_qbits := ?,
558 lqual_cb := ?
559 }
560 }
561}
562
Pau Espin Pedrolcf5c33e2021-01-19 18:56:55 +0100563template PCUIF_data tr_PCUIF_DATA(template uint8_t trx_nr,
564 template uint8_t ts_nr,
565 template uint8_t block_nr := ?,
566 template uint32_t fn := ?,
567 template PCUIF_Sapi sapi := ?,
568 template octetstring data := ?) := {
569 sapi := sapi,
570 len := ?,
571 data := data,
572 fn := fn,
573 arfcn := ?, /* unused in BTS */
574 trx_nr := trx_nr,
575 ts_nr := ts_nr,
576 block_nr := block_nr,
577 /* measurement parameters below unused on Tx */
578 rssi := 0,
579 ber10k := 0,
580 ta_offs_qbits := 0,
581 lqual_cb := 0
582
583}
584
Harald Welte883340c2018-02-28 18:59:29 +0100585template (value) PCUIF_Message ts_PCUIF_DATA_REQ(uint8_t bts_nr, uint8_t trx_nr,
586 uint8_t ts_nr, uint8_t block_nr,
587 uint32_t fn, PCUIF_Sapi sapi,
588 octetstring data) := {
589 msg_type := PCU_IF_MSG_DATA_REQ,
590 bts_nr := bts_nr,
591 spare := '0000'O,
592 u := {
593 data_req := {
594 sapi := sapi,
595 len := lengthof(data),
596 data := data,
597 fn := fn,
598 arfcn := 0, /* unused in BTS */
599 trx_nr := trx_nr,
600 ts_nr := ts_nr,
601 block_nr := block_nr,
602 /* measurement parameters below unused on Tx */
603 rssi := 0,
604 ber10k := 0,
605 ta_offs_qbits := 0,
606 lqual_cb := 0
607 }
608 }
609}
Harald Weltee1fd9162019-02-18 19:47:53 +0100610template PCUIF_Message tr_PCUIF_DATA_REQ(template uint8_t bts_nr,
611 template uint8_t trx_nr,
612 template uint8_t ts_nr,
613 template uint8_t block_nr := ?,
614 template uint32_t fn := ?,
615 template PCUIF_Sapi sapi := ?,
616 template octetstring data := ?) := {
617 msg_type := PCU_IF_MSG_DATA_REQ,
618 bts_nr := bts_nr,
619 spare := '0000'O,
620 u := {
Pau Espin Pedrolcf5c33e2021-01-19 18:56:55 +0100621 data_req := tr_PCUIF_DATA(trx_nr, ts_nr, block_nr, fn, sapi, data)
Harald Weltee1fd9162019-02-18 19:47:53 +0100622 }
623}
Harald Welte883340c2018-02-28 18:59:29 +0100624
Harald Weltee1fd9162019-02-18 19:47:53 +0100625template (value) PCUIF_Message ts_PCUIF_DATA_CNF(template (value) uint8_t bts_nr,
626 template (value) uint8_t trx_nr,
627 template (value) uint8_t ts_nr,
628 template (value) uint8_t block_nr,
629 template (value) uint32_t fn,
630 template (value) uint16_t arfcn,
631 template (value) PCUIF_Sapi sapi,
632 template (value) octetstring data) := {
633 msg_type := PCU_IF_MSG_DATA_CNF,
634 bts_nr := bts_nr,
635 spare := '0000'O,
636 u := {
637 data_cnf := {
638 sapi := sapi,
639 len := 0, /* overwritten */
640 data := data,
641 fn := fn,
642 arfcn := arfcn,
643 trx_nr := trx_nr,
644 ts_nr := ts_nr,
645 block_nr := block_nr,
646 rssi := 0,
647 ber10k := 0,
648 ta_offs_qbits := 0,
649 lqual_cb := 0
650 }
651 }
652}
Harald Welte883340c2018-02-28 18:59:29 +0100653template PCUIF_Message tr_PCUIF_DATA_CNF(template uint8_t bts_nr := ?,
654 template uint8_t trx_nr := ?,
655 template uint8_t ts_nr := ?,
656 template PCUIF_Sapi sapi := ?,
657 template octetstring data := ?) := {
658 msg_type := PCU_IF_MSG_DATA_CNF,
659 bts_nr := bts_nr,
660 spare := ?,
661 u := {
662 data_cnf := {
663 sapi := sapi,
664 len := ?,
665 data := data,
666 fn := ?,
667 arfcn := ?,
668 trx_nr := trx_nr,
669 ts_nr := ts_nr,
670 block_nr := ?,
671 rssi := ?,
672 ber10k := ?,
673 ta_offs_qbits := ?,
674 lqual_cb := ?
675 }
676 }
677}
678
Harald Weltee1fd9162019-02-18 19:47:53 +0100679template (value) PCUIF_Message ts_PCUIF_RACH_IND(template (value) uint8_t bts_nr,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700680 template (value) uint8_t trx_nr,
681 template (value) uint8_t ts_nr,
Harald Weltee1fd9162019-02-18 19:47:53 +0100682 template (value) uint16_t ra,
683 template (value) uint8_t is_11bit,
Harald Welte913bbf62019-03-01 00:39:19 +0100684 template (value) PCUIF_BurstType burst_type,
Harald Weltee1fd9162019-02-18 19:47:53 +0100685 template (value) uint32_t fn,
686 template (value) uint16_t arfcn,
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700687 template (value) int16_t qta := 0,
688 template (value) PCUIF_Sapi sapi := PCU_IF_SAPI_RACH
Harald Weltee1fd9162019-02-18 19:47:53 +0100689) := {
690 msg_type := PCU_IF_MSG_RACH_IND,
691 bts_nr := bts_nr,
692 spare := '0000'O,
693 u := {
694 rach_ind := {
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700695 sapi := sapi,
Harald Weltee1fd9162019-02-18 19:47:53 +0100696 ra := ra,
697 qta := qta,
698 fn := fn,
699 arfcn := arfcn,
700 is_11bit := is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700701 burst_type := burst_type,
702 trx_nr := trx_nr,
703 ts_nr := ts_nr
Harald Weltee1fd9162019-02-18 19:47:53 +0100704 }
705 }
706}
Harald Welte883340c2018-02-28 18:59:29 +0100707template PCUIF_Message tr_PCUIF_RACH_IND(template uint8_t bts_nr := ?,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700708 template uint8_t trx_nr := ?,
709 template uint8_t ts_nr := ?,
Harald Welte883340c2018-02-28 18:59:29 +0100710 template uint16_t ra := ?,
711 template uint8_t is_11bit := ?,
Harald Welte913bbf62019-03-01 00:39:19 +0100712 template PCUIF_BurstType burst_type := ?,
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700713 template uint32_t fn := ?,
714 template PCUIF_Sapi sapi := PCU_IF_SAPI_RACH) := {
Harald Welte883340c2018-02-28 18:59:29 +0100715 msg_type := PCU_IF_MSG_RACH_IND,
716 bts_nr := bts_nr,
717 spare := ?,
718 u := {
719 rach_ind := {
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700720 sapi := sapi,
Harald Welte883340c2018-02-28 18:59:29 +0100721 ra := ra,
722 qta := ?,
723 fn := fn,
724 arfcn := ?,
725 is_11bit := is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700726 burst_type := burst_type,
727 trx_nr := trx_nr,
728 ts_nr := ts_nr
Harald Welte883340c2018-02-28 18:59:29 +0100729 }
730 }
731}
732
Harald Weltee1fd9162019-02-18 19:47:53 +0100733template (value) PCUIF_Message ts_PCUIF_PAG_REQ(template (value) uint8_t bts_nr,
734 template (value) OCT9 id_lv,
735 template (value) uint8_t chan_needed,
736 template (value) PCUIF_Sapi sapi) := {
737 msg_type := PCU_IF_MSG_PAG_REQ,
738 bts_nr := bts_nr,
739 spare := '0000'O,
740 u := {
741 pag_req := {
742 sapi := sapi,
743 chan_needed := chan_needed,
744 identity_lv := id_lv
745 }
746 }
747}
Harald Welte883340c2018-02-28 18:59:29 +0100748template PCUIF_Message tr_PCUIF_PAG_REQ(template uint8_t bts_nr := ?,
749 template OCT9 id_lv := ?,
750 template uint8_t chan_needed := ?,
751 template PCUIF_Sapi sapi := ?) := {
752 msg_type := PCU_IF_MSG_PAG_REQ,
753 bts_nr := bts_nr,
754 spare := ?,
755 u := {
756 pag_req := {
757 sapi := ?,
758 chan_needed := chan_needed,
759 identity_lv := id_lv
760 }
761 }
762}
763
Harald Weltee1fd9162019-02-18 19:47:53 +0100764const PCUIF_Flags c_PCUIF_Flags_default := {
765 bts_active := true,
766 sysmo_direct_dsp := false,
767 spare := '00000000000000'B,
768 cs1 := true,
769 cs2 := true,
770 cs3 := true,
771 cs4 := true,
772 mcs1 := true,
773 mcs2 := true,
774 mcs3 := true,
775 mcs4 := true,
776 mcs5 := true,
777 mcs6 := true,
778 mcs7 := true,
779 mcs8 := true,
780 mcs9 := true,
781 spare2 := '000'B
782};
783
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100784const PCUIF_Flags c_PCUIF_Flags_noMCS := {
785 bts_active := true,
786 sysmo_direct_dsp := false,
787 spare := '00000000000000'B,
788 cs1 := true,
789 cs2 := true,
790 cs3 := true,
791 cs4 := true,
792 mcs1 := false,
793 mcs2 := false,
794 mcs3 := false,
795 mcs4 := false,
796 mcs5 := false,
797 mcs6 := false,
798 mcs7 := false,
799 mcs8 := false,
800 mcs9 := false,
801 spare2 := '000'B
802};
803
804function f_pcuif_ind_flags_egprs_enabled(PCUIF_Flags flags) return boolean {
805 return flags.mcs1 or flags.mcs2 or flags.mcs3 or flags.mcs4 or
806 flags.mcs5 or flags.mcs6 or flags.mcs7 or flags.mcs8 or
807 flags.mcs9;
808}
809
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700810template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH0(template (value) uint3_t tsc := 7) := {
811 tsc := tsc,
812 hopping := 0,
813 hsn := 0, maio := 0,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700814 ma_bit_len := 0,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700815 ma := f_pad_bit(''B, 64, '0'B)
816};
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700817template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH0(template uint3_t tsc := ?) := {
818 tsc := tsc,
819 hopping := 0,
820 hsn := ?, maio := ?,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700821 ma_bit_len := ?,
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700822 ma := ?
823};
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700824
825template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH1(template (value) uint3_t tsc := 7,
826 template (value) uint6_t hsn := 0,
827 template (value) uint6_t maio := 0,
828 template (value) bitstring ma := ''B) := {
829 tsc := tsc,
830 hopping := 1,
831 hsn := hsn,
832 maio := maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700833 ma_bit_len := lengthof(valueof(ma)),
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700834 ma := f_pad_bit(valueof(ma), 64, '0'B)
835};
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700836template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH1(template uint3_t tsc := ?,
837 template uint6_t hsn := ?,
838 template uint6_t maio := ?,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700839 template bitstring ma := ?,
840 template uint8_t ma_bit_len := ?) := {
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700841 tsc := tsc,
842 hopping := 1,
843 hsn := hsn,
844 maio := maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700845 ma_bit_len := ma_bit_len,
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700846 ma := ma
847};
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700848
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100849template (value) PCUIF_InfoTrx
850ts_PCUIF_InfoTrx(template (value) uint16_t arfcn := 871,
851 template (value) BIT8 pdch_mask := '00000001'B,
852 template (value) uint3_t tsc := 7) := {
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700853 arfcn := arfcn,
854 pdch_mask := pdch_mask,
Vadim Yanitskiyd8051722020-08-22 02:33:17 +0700855 spare := '00'O,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700856 hLayer1 := 0,
857 ts := {
858 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
859 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
860 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
861 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc)
862 }
863};
864
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100865template (value) PCUIF_InfoTrxs
866ts_PCUIF_InfoTrxs_def(uint16_t base_arfcn) := {
867 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 0),
868 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 1),
869 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 2),
870 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 3),
871 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 4),
872 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 5),
873 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 6),
874 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 7)
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700875};
Harald Weltee1fd9162019-02-18 19:47:53 +0100876
Harald Weltee1fd9162019-02-18 19:47:53 +0100877template (value) PCUIF_Message ts_PCUIF_INFO_IND(template (value) uint8_t bts_nr,
Pau Espin Pedrolf787b092019-10-04 18:34:05 +0200878 template (value) PCUIF_info_ind info_ind) := {
Harald Weltee1fd9162019-02-18 19:47:53 +0100879 msg_type := PCU_IF_MSG_INFO_IND,
880 bts_nr := bts_nr,
881 spare := '0000'O,
882 u := {
Pau Espin Pedrolf787b092019-10-04 18:34:05 +0200883 info_ind := info_ind
Harald Weltee1fd9162019-02-18 19:47:53 +0100884 }
885}
Harald Welted378a252018-03-13 17:02:14 +0100886template PCUIF_Message tr_PCUIF_INFO_IND(template uint8_t bts_nr := ?,
887 template PCUIF_Flags flags := ?,
Vadim Yanitskiyc1559302020-07-19 16:39:12 +0700888 template uint32_t version := mp_pcuif_version) := {
Harald Welted378a252018-03-13 17:02:14 +0100889 msg_type := PCU_IF_MSG_INFO_IND,
890 bts_nr := bts_nr,
891 spare := ?,
892 u := {
893 info_ind := {
894 version := version,
895 flags := flags,
896 trx := ?,
897 bsic := ?,
898 mcc := ?,
899 mnc :=?,
Harald Welte3568dc72018-03-13 17:06:51 +0100900 mnc_3_digits := ?,
Harald Welted378a252018-03-13 17:02:14 +0100901 lac := ?,
902 rac := ?,
903 nsei := ?,
904 nse_timer := ?,
905 cell_timer := ?,
906 cell_id := ?,
907 repeat_time := ?,
908 repeat_count := ?,
909 bvci := ?,
910 t3142 := ?,
911 t3169 := ?,
912 t3191 := ?,
913 t3193_10ms := ?,
914 t3195 := ?,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100915 n3101 := ?,
916 n3103 := ?,
917 n3105 := ?,
Harald Welted378a252018-03-13 17:02:14 +0100918 cv_countdown := ?,
919 dl_tbf_ext := ?,
920 ul_tbf_ext := ?,
921 initial_cs := ?,
922 initial_mcs := ?,
923 nsvci := ?,
Vadim Yanitskiy0d590802020-08-21 00:14:22 +0700924 local_port := ?,
Harald Welted378a252018-03-13 17:02:14 +0100925 remote_port := ?,
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200926 remote_addr := ?
Harald Welted378a252018-03-13 17:02:14 +0100927 }
928 }
929}
930
Harald Weltea3219812019-03-02 00:02:28 +0100931template (value) PCUIF_Message ts_PCUIF_TIME_IND(template (value) uint8_t bts_nr,
932 template (value) uint32_t fn) := {
933 msg_type := PCU_IF_MSG_TIME_IND,
934 bts_nr := bts_nr,
935 spare := '0000'O,
936 u := {
937 time_ind := {
938 fn := fn
939 }
940 }
941}
942template PCUIF_Message tr_PCUIF_TIME_IND(template uint8_t bts_nr,
943 template uint32_t fn) := {
944 msg_type := PCU_IF_MSG_TIME_IND,
945 bts_nr := bts_nr,
946 spare := ?,
947 u := {
948 time_ind := {
949 fn := fn
950 }
951 }
952}
Harald Welte883340c2018-02-28 18:59:29 +0100953
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200954template (value) PCUIF_Message
955ts_PCUIF_INTERF_IND(template (value) uint8_t bts_nr,
956 template (value) uint8_t trx_nr,
957 template (value) uint32_t fn,
958 template (value) PCUIF_interf interf) := {
959 msg_type := PCU_IF_MSG_INTERF_IND,
960 bts_nr := bts_nr,
961 spare := '0000'O,
962 u := {
963 interf_ind := {
964 trx_nr := trx_nr,
965 spare := '000000'O,
966 fn := fn,
967 interf := interf
968 }
969 }
970}
971template PCUIF_Message
972tr_PCUIF_INTERF_IND(template (present) uint8_t bts_nr := ?,
973 template (present) uint8_t trx_nr := ?,
974 template (present) uint32_t fn := ?,
975 template (present) PCUIF_interf interf := ?) := {
976 msg_type := PCU_IF_MSG_INTERF_IND,
977 bts_nr := bts_nr,
978 spare := ?,
979 u := {
980 interf_ind := {
981 trx_nr := trx_nr,
982 spare := ?,
983 fn := fn,
984 interf := interf
985 }
986 }
987}
988
Harald Welte4bff40a2019-03-21 21:34:10 +0100989template (value) PCUIF_Message ts_PCUIF_SUSP_REQ(template (value) uint8_t bts_nr,
990 template (value) OCT4 tlli,
991 template (value) OCT6 ra_id,
992 template (value) uint8_t cause) := {
993 msg_type := PCU_IF_MSG_SUSP_REQ,
994 bts_nr := bts_nr,
995 spare := '0000'O,
996 u := {
997 susp_req := {
998 tlli := tlli,
999 ra_id := ra_id,
1000 cause := cause
1001 }
1002 }
1003}
1004template PCUIF_Message tr_PCUIF_SUSP_REQ(template uint8_t bts_nr,
1005 template OCT4 tlli,
1006 template OCT6 ra_id,
1007 template uint8_t cause) := {
1008 msg_type := PCU_IF_MSG_SUSP_REQ,
1009 bts_nr := bts_nr,
1010 spare := '0000'O,
1011 u := {
1012 susp_req := {
1013 tlli := tlli,
1014 ra_id := ra_id,
1015 cause := cause
1016 }
1017 }
1018}
1019
Harald Welte11b734c2019-09-05 14:17:54 +02001020template (value) PCUIF_Message ts_PCUIF_APP_INFO_REQ(template (value) uint8_t bts_nr,
1021 template (value) uint8_t app_type,
1022 template (value) octetstring app_data) := {
1023 msg_type := PCU_IF_MSG_APP_INFO_REQ,
1024 bts_nr := bts_nr,
1025 spare := '0000'O,
1026 u := {
1027 app_info_req := {
1028 application_type := app_type,
1029 len := 0, /* overwritten */
1030 data := app_data
1031 }
1032 }
1033}
1034template (present) PCUIF_Message tr_PCUIF_APP_INFO_REQ(template (present) uint8_t bts_nr,
1035 template (present) uint8_t app_type,
1036 template (present) octetstring app_data) := {
1037 msg_type := PCU_IF_MSG_APP_INFO_REQ,
1038 bts_nr := bts_nr,
1039 spare := '0000'O,
1040 u := {
1041 app_info_req := {
1042 application_type := app_type,
1043 len := ?,
1044 data := app_data
1045 }
1046 }
1047}
1048
Harald Welte4bff40a2019-03-21 21:34:10 +01001049
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001050template (value) PCUIF_Message ts_PCUIF_CONTAINER(template (value) uint8_t bts_nr,
1051 template (value) PCUIF_container container) := {
1052 msg_type := PCU_IF_MSG_CONTAINER,
1053 bts_nr := bts_nr,
1054 spare := '0000'O,
1055 u := {
1056 container := container
1057 }
1058}
1059template (present) PCUIF_Message tr_PCUIF_CONTAINER(template (present) uint8_t bts_nr,
1060 template (present) PCUIF_container container) := {
1061 msg_type := PCU_IF_MSG_CONTAINER,
1062 bts_nr := bts_nr,
1063 spare := '0000'O,
1064 u := {
1065 container := container
1066 }
1067}
1068
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001069template (value) PCUIF_container ts_PCUIF_CONT_OTHER(PCUIF_MsgType msg_type, template (value) octetstring payload) := {
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001070 msg_type := msg_type,
1071 spare := '00'O,
1072 len := lengthof(payload),
1073 u := {
1074 other := payload
1075 }
1076}
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001077template (present) PCUIF_container tr_PCUIF_CONT_OTHER(template (present) PCUIF_MsgType msg_type,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001078 template (present) octetstring payload) := {
1079 msg_type := msg_type,
1080 spare := '00'O,
1081 len := ?,
1082 u := {
1083 other := payload
1084 }
1085}
1086
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001087template (present) PCUIF_container tr_PCUIF_CONT_NEIGH_ADDR_REQ(template (present) uint16_t local_lac := ?,
1088 template (present) uint16_t local_ci := ?,
1089 template (present) uint16_t tgt_arfcn := ?,
1090 template (present) uint8_t tgt_bsic := ?) := {
1091 msg_type := PCU_IF_MSG_NEIGH_ADDR_REQ,
1092 spare := '00'O,
1093 len := ?,
1094 u := {
1095 neigh_addr_req := {
1096 local_lac := local_lac,
1097 local_ci := local_ci,
1098 tgt_arfcn := tgt_arfcn,
1099 tgt_bsic := tgt_bsic
1100 }
1101 }
1102}
1103template (present) PCUIF_Message tr_PCUIF_NEIGH_ADDR_REQ(template (present) uint8_t bts_nr,
1104 template (present) uint16_t local_lac := ?,
1105 template (present) uint16_t local_ci := ?,
1106 template (present) uint16_t tgt_arfcn := ?,
1107 template (present) uint8_t tgt_bsic := ?) := {
1108 msg_type := PCU_IF_MSG_CONTAINER,
1109 bts_nr := bts_nr,
1110 spare := '0000'O,
1111 u := {
1112 container := tr_PCUIF_CONT_NEIGH_ADDR_REQ(local_lac, local_ci, tgt_arfcn, tgt_bsic)
1113 }
1114}
1115
1116template (value) PCUIF_container ts_PCUIF_CONT_NEIGH_ADDR_CNF(template (value) PCUIF_neigh_addr_req orig_req,
1117 template (value) uint8_t error_code := 0,
1118 template (value) uint16_t mcc := 0,
1119 template (value) uint16_t mnc := 0,
1120 template (value) uint8_t mnc_3_digits := 0,
1121 template (value) uint16_t lac := 0,
1122 template (value) uint8_t rac := 0,
1123 template (value) uint16_t cell_identity := 0) := {
1124 msg_type := PCU_IF_MSG_NEIGH_ADDR_CNF,
1125 spare := '00'O,
1126 len := 0, /* overwritten */
1127 u := {
1128 neigh_addr_cnf := {
1129 orig_req := orig_req,
1130 error_code := error_code,
1131 mcc := mcc,
1132 mnc := mnc,
1133 mnc_3_digits := mnc_3_digits,
1134 lac := lac,
1135 rac := rac,
1136 cell_identity := cell_identity
1137 }
1138 }
1139}
1140template (value) PCUIF_Message ts_PCUIF_NEIGH_ADDR_CNF(template (value) uint8_t bts_nr,
1141 template (value) PCUIF_neigh_addr_req orig_req,
1142 template (value) uint8_t error_code := 0,
1143 template (value) uint16_t mcc := 0,
1144 template (value) uint16_t mnc := 0,
1145 template (value) uint8_t mnc_3_digits := 0,
1146 template (value) uint16_t lac := 0,
1147 template (value) uint8_t rac := 0,
1148 template (value) uint16_t cell_identity := 0) := {
1149 msg_type := PCU_IF_MSG_CONTAINER,
1150 bts_nr := bts_nr,
1151 spare := '0000'O,
1152 u := {
1153 container := ts_PCUIF_CONT_NEIGH_ADDR_CNF(orig_req, error_code, mcc, mnc, mnc_3_digits,
1154 lac, rac, cell_identity)
1155 }
1156}
1157
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001158function f_PCUIF_PDCHMask_set(inout PCUIF_info_ind info, BIT8 pdch_mask,
1159 template (present) uint8_t trx_nr := ?)
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07001160{
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001161 for (var integer nr := 0; nr < lengthof(info.trx); nr := nr + 1) {
1162 if (match(nr, trx_nr)) {
1163 info.trx[nr].pdch_mask := pdch_mask;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07001164 }
1165 }
1166}
1167
Alexander Couzense0f7c542020-09-13 17:25:18 +02001168function f_PCUIF_AF2addr_type(AddressFamily address_family)
1169return PCUIF_AddrType {
1170 if (address_family == AF_INET) {
1171 return PCUIF_ADDR_TYPE_IPV4;
1172 } else if (address_family == AF_INET6) {
1173 return PCUIF_ADDR_TYPE_IPV6;
1174 } else {
1175 return PCUIF_ADDR_TYPE_UNSPEC;
1176 }
1177}
1178
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001179/* TODO: second (redundant) NSVC connection is not (yet) supported */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001180function f_PCUIF_RemoteAddr(PCUIF_AddrType addr_type,
1181 charstring addr_str)
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001182return PCUIF_RemoteAddr {
1183 var PCUIF_RemoteAddr remote_addr;
1184
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001185 remote_addr.addr_type[0] := addr_type;
1186 if (addr_type == PCUIF_ADDR_TYPE_IPV4) {
1187 remote_addr.addr[0] := f_inet_addr(addr_str);
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001188 } else {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001189 remote_addr.addr[0] := f_inet6_addr(addr_str);
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001190 }
1191
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001192 remote_addr.addr_type[1] := PCUIF_ADDR_TYPE_UNSPEC;
1193 remote_addr.addr[1] := f_pad_oct(''O, 16, '00'O);
1194
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001195 return remote_addr;
1196}
1197
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +07001198
Harald Welte883340c2018-02-28 18:59:29 +01001199} with { encode "RAW" variant "BYTEORDER(first)" };