blob: 70838845ae549226c7d3bd26b24e2239cf2594ea [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 Maiere0666ea2023-11-01 16:55:45 +010020 PCUIF_Version mp_pcuif_version := 12;
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 Yanitskiy8f86bbe2023-12-15 15:19:09 +070024type integer PCUIF_Version (11..12); /* supported versions */
Harald Welte883340c2018-02-28 18:59:29 +010025
26type enumerated PCUIF_MsgType {
27 PCU_IF_MSG_DATA_REQ ('00'O),
Vadim Yanitskiy8f86bbe2023-12-15 15:19:09 +070028 /* RFU, removed in PCUIFv11 ('01'O), */
Harald Welte883340c2018-02-28 18:59:29 +010029 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),
Philipp Maiere6838282023-08-10 15:22:43 +020033 PCU_IF_MSG_DATA_CNF_2 ('11'O),
Harald Welte883340c2018-02-28 18:59:29 +010034 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),
Vadim Yanitskiy8f86bbe2023-12-15 15:19:09 +070051 /* RFU, removed in PCUIFv11 ('02'O), */
52 /* RFU, removed in PCUIFv11 ('03'O), */
Harald Welte883340c2018-02-28 18:59:29 +010053 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 Maier896cbc92023-08-22 17:02:27 +020057 PCU_IF_SAPI_PCH_2 ('08'O),
58 PCU_IF_SAPI_AGCH_2 ('09'O)
Harald Welte883340c2018-02-28 18:59:29 +010059} with { variant "FIELDLENGTH(8)" };
60
61type record PCUIF_Flags {
62 boolean bts_active,
Philipp Maier8dabc502023-09-29 14:57:39 +020063 boolean direct_phy,
Harald Welte883340c2018-02-28 18:59:29 +010064 BIT14 spare,
65 boolean cs1,
66 boolean cs2,
67 boolean cs3,
68 boolean cs4,
69 boolean mcs1,
70 boolean mcs2,
71 boolean mcs3,
72 boolean mcs4,
73 boolean mcs5,
74 boolean mcs6,
75 boolean mcs7,
76 boolean mcs8,
77 boolean mcs9,
78 BIT3 spare2
79} with { variant "" };
80
Philipp Maiere0666ea2023-11-01 16:55:45 +010081type enumerated PCUIF_bts_model {
82 PCU_IF_BTS_MODEL_UNSPEC ('00'O),
83 PCU_IF_BTS_MODEL_LC15 ('01'O),
84 PCU_IF_BTS_MODEL_OC2G ('02'O),
85 PCU_IF_BTS_MODEL_OCTPHY ('03'O),
86 PCU_IF_BTS_MODEL_SYSMO ('04'O),
87 PCU_IF_BTS_MODEL_TRX ('05'O),
88 PCU_IF_BTS_MODEL_RBS ('06'O)
89} with { variant "FIELDLENGTH(8)" };
90
Harald Welte883340c2018-02-28 18:59:29 +010091type enumerated PCUIF_TextType {
92 PCU_VERSION (0),
93 PCU_OML_ALERT (1)
94} with { variant "FIELDLENGTH(8)" };
95
Vadim Yanitskiye1527f72019-09-09 02:15:33 +020096type charstring PCUIF_Text length(128) with { variant "FIELDLENGTH(null_terminated)" };
Harald Welte883340c2018-02-28 18:59:29 +010097
98type record PCUIF_txt_ind {
99 PCUIF_TextType txt_type,
100 PCUIF_Text text
101} with { variant "" };
102
Harald Welte883340c2018-02-28 18:59:29 +0100103type record PCUIF_data {
104 PCUIF_Sapi sapi,
105 uint8_t len,
Vadim Yanitskiyd8f28e62019-09-10 18:11:52 +0200106 octetstring data length(162),
Harald Welte883340c2018-02-28 18:59:29 +0100107 uint32_t fn,
108 uint16_t arfcn,
109 uint8_t trx_nr,
110 uint8_t ts_nr,
111 uint8_t block_nr,
112 int8_t rssi,
113 uint16_t ber10k,
114 int16_t ta_offs_qbits,
115 int16_t lqual_cb
Vadim Yanitskiyd0859cf2023-08-30 03:43:07 +0700116} with {
117 variant (data) "FIELDLENGTH(162), ALIGN(left)"
118 variant (lqual_cb) "COMP(2scompl)"
119};
Harald Welte883340c2018-02-28 18:59:29 +0100120
Philipp Maiere6838282023-08-10 15:22:43 +0200121type record PCUIF_data_cnf {
Harald Welte883340c2018-02-28 18:59:29 +0100122 PCUIF_Sapi sapi,
Philipp Maier19797d62023-08-08 17:30:50 +0200123 OCT4 msg_id
Philipp Maier7a2d9592023-09-22 11:47:58 +0200124} with {
125 variant (msg_id) "BYTEORDER(last)"
126};
Harald Welte883340c2018-02-28 18:59:29 +0100127
128type record PCUIF_rts_req {
129 PCUIF_Sapi sapi,
130 OCT3 spare,
131 uint32_t fn,
132 uint16_t arfcn,
133 uint8_t trx_nr,
134 uint8_t ts_nr,
135 uint8_t block_nr
136} with { variant "" };
137
Harald Welte913bbf62019-03-01 00:39:19 +0100138type enumerated PCUIF_BurstType {
139 BURST_TYPE_NONE (0),
140 BURST_TYPE_0 (1),
141 BURST_TYPE_1 (2),
142 BURST_TYPE_2 (3)
143} with { variant "FIELDLENGTH(8)" };
144
Harald Welte883340c2018-02-28 18:59:29 +0100145type record PCUIF_rach_ind {
146 PCUIF_Sapi sapi,
147 uint16_t ra,
148 int16_t qta,
149 uint32_t fn,
150 uint16_t arfcn,
151 uint8_t is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700152 PCUIF_BurstType burst_type,
153 uint8_t trx_nr,
154 uint8_t ts_nr
Harald Welte883340c2018-02-28 18:59:29 +0100155} with { variant "" };
156
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700157type record PCUIF_InfoTrxTs {
158 uint8_t tsc,
159 uint8_t hopping,
160 uint8_t hsn,
161 uint8_t maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700162 uint8_t ma_bit_len,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700163 bitstring ma length(64)
164} with { variant (ma) "BYTEORDER(first), BITORDER(msb)" };
165private type record length(8) of PCUIF_InfoTrxTs PCUIF_InfoTrxTsList;
166
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100167private type record PCUIF_InfoTrx {
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700168 uint16_t arfcn,
169 BIT8 pdch_mask,
Vadim Yanitskiyd8051722020-08-22 02:33:17 +0700170 OCT1 spare,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700171 uint32_t hLayer1,
172 PCUIF_InfoTrxTsList ts
173} with { variant (pdch_mask) "BITORDER(msb)" };
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100174type record length(8) of PCUIF_InfoTrx PCUIF_InfoTrxs;
Harald Welte883340c2018-02-28 18:59:29 +0100175
176type record PCUIF_info_ind {
177 uint32_t version,
178 PCUIF_Flags flags,
Harald Weltee1fd9162019-02-18 19:47:53 +0100179 PCUIF_InfoTrxs trx,
Harald Welte883340c2018-02-28 18:59:29 +0100180 uint8_t bsic,
181
182 uint16_t mcc,
183 uint16_t mnc,
Harald Welte3568dc72018-03-13 17:06:51 +0100184 uint8_t mnc_3_digits,
Harald Welte883340c2018-02-28 18:59:29 +0100185 uint16_t lac,
186 uint16_t rac,
187
188 uint16_t nsei,
189 record length(7) of uint8_t nse_timer,
190 record length(11) of uint8_t cell_timer,
191
192 uint16_t cell_id,
193 uint16_t repeat_time,
194 uint8_t repeat_count,
195 uint16_t bvci,
196 uint8_t t3142,
197 uint8_t t3169,
198 uint8_t t3191,
199 uint8_t t3193_10ms,
200 uint8_t t3195,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100201 uint8_t n3101,
202 uint8_t n3103,
203 uint8_t n3105,
Harald Welte883340c2018-02-28 18:59:29 +0100204 uint8_t cv_countdown,
205 uint16_t dl_tbf_ext,
206 uint16_t ul_tbf_ext,
207 uint8_t initial_cs,
208 uint8_t initial_mcs,
209
210 record length(2) of uint16_t nsvci,
Vadim Yanitskiy0d590802020-08-21 00:14:22 +0700211 record length(2) of uint16_t local_port,
Harald Welte883340c2018-02-28 18:59:29 +0100212 record length(2) of uint16_t remote_port,
Philipp Maiere0666ea2023-11-01 16:55:45 +0100213 PCUIF_RemoteAddr remote_addr,
214
Philipp Maierc65db252023-11-22 15:38:22 +0100215 /* The bts_model field was introduced with PCUIF v12 as a new mandatory field. This also means that when we
216 * use the testsuite to test against latest builds (still uses PCUIF v11) this field is not included in
217 * the PCUIF_info_ind message. Since the testsuite does not check on this field we decided to declare the
218 * field as an optional field until PCUIF v12 is also used in the latest builds.*/
219 PCUIF_bts_model bts_model optional
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200220} with { variant "" };
221
222type enumerated PCUIF_AddrType {
223 PCUIF_ADDR_TYPE_UNSPEC ('00'O),
224 PCUIF_ADDR_TYPE_IPV4 ('04'O),
225 PCUIF_ADDR_TYPE_IPV6 ('29'O)
226} with { variant "FIELDLENGTH(8)" };
227
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100228type record PCUIF_RemoteAddr {
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200229 record length(2) of PCUIF_AddrType addr_type,
230 record length(2) of octetstring addr length(16)
231} with { variant "" };
232
Philipp Maier310520b2023-05-04 13:10:18 +0200233/* E1 CCU connection parameters */
234type record PCUIF_e1_ccu_ind {
235 /* GSM/GPRS air interface */
236 uint8_t trx_nr,
237 uint8_t ts_nr,
238 /* E1 line interface */
239 uint8_t e1_nr,
240 uint8_t e1_ts,
241 uint8_t e1_ts_ss
242} with { variant "" };
243
Harald Welte883340c2018-02-28 18:59:29 +0100244type record PCUIF_act_req {
245 uint8_t is_activate,
246 uint8_t trx_nr,
247 uint8_t ts_nr,
248 OCT1 spare
249} with { variant "" };
250
251type record PCUIF_time_ind {
252 uint32_t fn
253} with { variant "" };
254
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200255type record length(8) of uint8_t PCUIF_interf;
256type record PCUIF_interf_ind {
257 uint8_t trx_nr,
258 OCT3 spare,
259 uint32_t fn,
260 PCUIF_interf interf
261} with { variant "" };
262
Harald Welte883340c2018-02-28 18:59:29 +0100263type record PCUIF_pag_req {
264 PCUIF_Sapi sapi,
265 uint8_t chan_needed,
266 OCT9 identity_lv
267} with { variant "" };
268
Harald Welte11b734c2019-09-05 14:17:54 +0200269type record PCUIF_app_info_req {
270 uint8_t application_type,
271 uint8_t len,
272 octetstring data
273} with {
274 variant (len) "LENGTHTO(data)"
275}
276
Harald Welte883340c2018-02-28 18:59:29 +0100277type record PCUIF_susp_req {
278 OCT4 tlli,
279 OCT6 ra_id,
280 uint8_t cause
Harald Welteeaa9a862019-05-26 23:01:08 +0200281} with {
282 variant (tlli) "BYTEORDER(last)"
283};
Harald Welte883340c2018-02-28 18:59:29 +0100284
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200285type record PCUIF_neigh_addr_req {
286 uint16_t local_lac,
287 uint16_t local_ci,
288 uint16_t tgt_arfcn,
289 uint8_t tgt_bsic
290} with { variant (local_lac) "BYTEORDER(last)"
291 variant (local_ci) "BYTEORDER(last)"
292 variant (tgt_arfcn) "BYTEORDER(last)" };
293
294type record PCUIF_neigh_addr_cnf {
295 PCUIF_neigh_addr_req orig_req,
296 uint8_t error_code,
297 uint16_t mcc,
298 uint16_t mnc,
299 uint8_t mnc_3_digits,
300 uint16_t lac,
301 uint8_t rac,
302 uint16_t cell_identity
303} with { variant (mcc) "BYTEORDER(last)"
304 variant (mnc) "BYTEORDER(last)"
305 variant (lac) "BYTEORDER(last)"
306 variant (cell_identity) "BYTEORDER(last)" };
307
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200308type union PCUIF_ContainerMsgUnion {
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200309 PCUIF_neigh_addr_req neigh_addr_req,
310 PCUIF_neigh_addr_cnf neigh_addr_cnf,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200311 octetstring other
312} with { variant "" };
313
314type record PCUIF_container {
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200315 PCUIF_MsgType msg_type,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200316 OCT1 spare,
317 uint16_t len, /* network byte order */
318 PCUIF_ContainerMsgUnion u
319} with {
320 variant (len) "BYTEORDER(last)"
321 variant (len) "LENGTHTO(u)"
322 variant (u) "CROSSTAG(
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +0200323 neigh_addr_req, msg_type = PCU_IF_MSG_NEIGH_ADDR_REQ;
324 neigh_addr_cnf, msg_type = PCU_IF_MSG_NEIGH_ADDR_CNF;
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200325 other, OTHERWISE)"
326};
327
Philipp Maier3241af32023-05-04 15:17:36 +0200328/* Record to send a (confirmed) IMMEDIATE ASSIGNMENT message via PCH. The record is sent by the PCU to the BTS as a
Philipp Maiere6838282023-08-10 15:22:43 +0200329 * data request (data_req) under SAPI PCU_IF_SAPI_PCH_2. */
330type record PCUIF_pch {
Philipp Maiera6708cf2023-08-08 16:12:27 +0200331 OCT4 msg_id,
Philipp Maier3241af32023-05-04 15:17:36 +0200332 charstring imsi length(17),
Philipp Maier02212482023-08-24 13:13:10 +0200333 octetstring data length(23),
334 boolean confirm
Philipp Maier3241af32023-05-04 15:17:36 +0200335} with {
Philipp Maiera6708cf2023-08-08 16:12:27 +0200336 variant (msg_id) "BYTEORDER(last)"
Philipp Maier8d426512023-06-23 16:21:02 +0200337 variant (imsi) "FIELDLENGTH(17)"
338 variant (data) "FIELDLENGTH(23)"
Philipp Maier3241af32023-05-04 15:17:36 +0200339};
Harald Welte883340c2018-02-28 18:59:29 +0100340
Philipp Maiere6838282023-08-10 15:22:43 +0200341external function enc_PCUIF_pch(in PCUIF_pch pdu) return octetstring
Philipp Maier3b4abb82023-06-23 16:27:46 +0200342 with { extension "prototype(convert) encode(RAW)" };
Philipp Maiere6838282023-08-10 15:22:43 +0200343external function dec_PCUIF_pch(in octetstring stream) return PCUIF_pch
Philipp Maierba272322023-07-18 15:18:31 +0200344 with { extension "prototype(convert) decode(RAW)" };
Philipp Maier3b4abb82023-06-23 16:27:46 +0200345
Philipp Maier896cbc92023-08-22 17:02:27 +0200346/* Record to send a (confirmed) IMMEDIATE ASSIGNMENT message via AGCH. The record is sent by the PCU to the BTS as a
347 * data request (data_req) under SAPI PCU_IF_SAPI_AGCH_2. */
348type record PCUIF_agch {
349 OCT4 msg_id,
350 octetstring data length(23),
351 boolean confirm
352} with {
353 variant (msg_id) "BYTEORDER(last)"
354 variant (data) "FIELDLENGTH(23)"
355};
356
357external function enc_PCUIF_agch(in PCUIF_agch pdu) return octetstring
358 with { extension "prototype(convert) encode(RAW)" };
359external function dec_PCUIF_agch(in octetstring stream) return PCUIF_agch
360 with { extension "prototype(convert) decode(RAW)" };
361
Harald Welte883340c2018-02-28 18:59:29 +0100362type union PCUIF_MsgUnion {
363 PCUIF_data data_req,
Philipp Maiere6838282023-08-10 15:22:43 +0200364 PCUIF_data_cnf data_cnf2,
Harald Welte883340c2018-02-28 18:59:29 +0100365 PCUIF_data data_ind,
366 PCUIF_susp_req susp_req,
367 PCUIF_rts_req rts_req,
368 PCUIF_rach_ind rach_ind,
369 PCUIF_txt_ind txt_ind,
370 PCUIF_info_ind info_ind,
Philipp Maier310520b2023-05-04 13:10:18 +0200371 PCUIF_e1_ccu_ind e1_ccu_ind,
Harald Welte883340c2018-02-28 18:59:29 +0100372 PCUIF_act_req act_req,
373 PCUIF_time_ind time_ind,
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200374 PCUIF_interf_ind interf_ind,
Harald Welte11b734c2019-09-05 14:17:54 +0200375 PCUIF_pag_req pag_req,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200376 PCUIF_app_info_req app_info_req,
377 PCUIF_container container
Harald Welte883340c2018-02-28 18:59:29 +0100378} with { variant "" };
379
380type record PCUIF_Message {
381 PCUIF_MsgType msg_type,
382 uint8_t bts_nr,
383 OCT2 spare,
384 PCUIF_MsgUnion u
385} with { variant (u) "CROSSTAG(
386 data_req, msg_type = PCU_IF_MSG_DATA_REQ;
Philipp Maiere6838282023-08-10 15:22:43 +0200387 data_cnf2, msg_type = PCU_IF_MSG_DATA_CNF_2;
Harald Welte883340c2018-02-28 18:59:29 +0100388 data_ind, msg_type = PCU_IF_MSG_DATA_IND;
389 susp_req, msg_type = PCU_IF_MSG_SUSP_REQ;
390 rts_req, msg_type = PCU_IF_MSG_RTS_REQ;
391 rach_ind, msg_type = PCU_IF_MSG_RACH_IND;
392 txt_ind, msg_type = PCU_IF_MSG_TXT_IND;
393 info_ind, msg_type = PCU_IF_MSG_INFO_IND;
Philipp Maier310520b2023-05-04 13:10:18 +0200394 e1_ccu_ind, msg_type = PCU_IF_MSG_E1_CCU_IND;
Harald Welte883340c2018-02-28 18:59:29 +0100395 act_req, msg_type = PCU_IF_MSG_ACT_REQ;
396 time_ind, msg_type = PCU_IF_MSG_TIME_IND;
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200397 interf_ind, msg_type = PCU_IF_MSG_INTERF_IND;
Harald Welte11b734c2019-09-05 14:17:54 +0200398 pag_req, msg_type = PCU_IF_MSG_PAG_REQ;
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +0200399 app_info_req, msg_type = PCU_IF_MSG_APP_INFO_REQ;
400 container, msg_type = PCU_IF_MSG_CONTAINER)"
Vadim Yanitskiy284387a2023-12-15 14:31:29 +0700401 /* PCUIFv12: 1007 * 8 = 8056 bits */
402 variant "PADDING(8056)"
Harald Welte883340c2018-02-28 18:59:29 +0100403};
404
405external function enc_PCUIF_Message(in PCUIF_Message pdu) return octetstring
406 with { extension "prototype(convert) encode(RAW)" };
407external function dec_PCUIF_Message(in octetstring stream) return PCUIF_Message
408 with { extension "prototype(convert) decode(RAW)" };
409
Vadim Yanitskiyf7d9c0f2019-09-06 00:08:17 +0200410/* Generic template for matching messages by type and/or the BTS number */
411template PCUIF_Message tr_PCUIF_MSG(template PCUIF_MsgType msg_type := ?,
412 template uint8_t bts_nr := ?) := {
413 msg_type := msg_type,
414 bts_nr := bts_nr,
415 spare := ?,
416 u := ?
417}
418
Harald Weltee1fd9162019-02-18 19:47:53 +0100419template (value) PCUIF_Message ts_PCUIF_RTS_REQ(template (value) uint8_t bts_nr,
420 template (value) uint8_t trx_nr,
421 template (value) uint8_t ts_nr,
422 template (value) PCUIF_Sapi sapi,
423 template (value) uint32_t fn,
424 template (value) uint16_t arfcn,
425 template (value) uint8_t block_nr
426 ) := {
427 msg_type := PCU_IF_MSG_RTS_REQ,
428 bts_nr := bts_nr,
429 spare := '0000'O,
430 u := {
431 rts_req := {
432 sapi := sapi,
433 spare := '000000'O,
434 fn := fn,
435 arfcn := arfcn,
436 trx_nr := trx_nr,
437 ts_nr := ts_nr,
438 block_nr := block_nr
439 }
440 }
441}
Harald Welte883340c2018-02-28 18:59:29 +0100442template PCUIF_Message tr_PCUIF_RTS_REQ(template uint8_t bts_nr := ?,
443 template uint8_t trx_nr := ?,
444 template uint8_t ts_nr := ?,
445 template PCUIF_Sapi sapi := ?,
446 template uint32_t fn := ?,
447 template uint8_t block_nr := ?
448 ) := {
449 msg_type := PCU_IF_MSG_RTS_REQ,
450 bts_nr := bts_nr,
451 spare := ?,
452 u := {
453 rts_req := {
454 sapi := sapi,
455 spare := ?,
456 fn := fn,
457 arfcn := ?,
458 trx_nr := trx_nr,
459 ts_nr := ts_nr,
460 block_nr := block_nr
461 }
462 }
463}
464
465template (value) PCUIF_Message ts_PCUIF_TXT_IND(uint8_t bts_nr, PCUIF_TextType tt, charstring text) := {
466 msg_type := PCU_IF_MSG_TXT_IND,
467 bts_nr := bts_nr,
468 spare := '0000'O,
469 u := {
470 txt_ind := {
471 txt_type := tt,
472 text := text
473 }
474 }
475}
Harald Weltee1fd9162019-02-18 19:47:53 +0100476template PCUIF_Message tr_PCUIF_TXT_IND(template uint8_t bts_nr, template PCUIF_TextType tt,
477 template charstring text := ?) := {
478 msg_type := PCU_IF_MSG_TXT_IND,
479 bts_nr := bts_nr,
480 spare := '0000'O,
481 u := {
482 txt_ind := {
483 txt_type := tt,
484 text := text
485 }
486 }
487}
488
489
Harald Welte883340c2018-02-28 18:59:29 +0100490
491template (value) PCUIF_Message ts_PCUIF_ACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
492 msg_type := PCU_IF_MSG_ACT_REQ,
493 bts_nr := bts_nr,
494 spare := '0000'O,
495 u := {
496 act_req := {
497 is_activate := 1,
498 trx_nr := trx_nr,
499 ts_nr := ts_nr,
500 spare := '00'O
501 }
502 }
503}
Harald Weltee1fd9162019-02-18 19:47:53 +0100504template PCUIF_Message tr_PCUIF_ACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
505 template uint8_t ts_nr) := {
506 msg_type := PCU_IF_MSG_ACT_REQ,
507 bts_nr := bts_nr,
508 spare := '0000'O,
509 u := {
510 act_req := {
511 is_activate := 1,
512 trx_nr := trx_nr,
513 ts_nr := ts_nr,
514 spare := '00'O
515 }
516 }
517}
Harald Welte883340c2018-02-28 18:59:29 +0100518
519template (value) PCUIF_Message ts_PCUIF_DEACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
520 msg_type := PCU_IF_MSG_ACT_REQ,
521 bts_nr := bts_nr,
522 spare := '0000'O,
523 u := {
524 act_req := {
525 is_activate := 0,
526 trx_nr := trx_nr,
527 ts_nr := ts_nr,
528 spare := '00'O
529 }
530 }
531}
Harald Weltee1fd9162019-02-18 19:47:53 +0100532template PCUIF_Message tr_PCUIF_DEACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
533 template uint8_t ts_nr) := {
534 msg_type := PCU_IF_MSG_ACT_REQ,
535 bts_nr := bts_nr,
536 spare := '0000'O,
537 u := {
538 act_req := {
539 is_activate := 0,
540 trx_nr := trx_nr,
541 ts_nr := ts_nr,
542 spare := '00'O
543 }
544 }
545}
Harald Welte883340c2018-02-28 18:59:29 +0100546
Harald Weltee1fd9162019-02-18 19:47:53 +0100547template (value) PCUIF_Message ts_PCUIF_DATA_IND(template (value) uint8_t bts_nr,
548 template (value) uint8_t trx_nr,
549 template (value) uint8_t ts_nr,
550 template (value) uint8_t block_nr,
551 template (value) PCUIF_Sapi sapi,
Vadim Yanitskiyc78ea262019-05-17 01:08:08 +0700552 template (value) octetstring data,
Harald Weltee1fd9162019-02-18 19:47:53 +0100553 template (value) uint32_t fn,
554 template (value) uint16_t arfcn,
555 template (value) int8_t rssi := -80,
556 template (value) uint16_t ber10k := 0,
557 template (value) int16_t ta_offs_qbits := 0,
Vadim Yanitskiy45749a82021-05-26 13:29:04 +0200558 template (value) int16_t lqual_cb := 10) := {
Harald Weltee1fd9162019-02-18 19:47:53 +0100559 msg_type := PCU_IF_MSG_DATA_IND,
560 bts_nr := bts_nr,
561 spare := '0000'O,
562 u := {
563 data_ind := {
564 sapi := sapi,
565 len := lengthof(valueof(data)),
566 data := data,
567 fn := fn,
568 arfcn := arfcn,
569 trx_nr := trx_nr,
570 ts_nr := ts_nr,
571 block_nr := block_nr,
572 rssi := rssi,
573 ber10k := ber10k,
574 ta_offs_qbits := ta_offs_qbits,
575 lqual_cb := lqual_cb
576 }
577 }
578}
Harald Welte883340c2018-02-28 18:59:29 +0100579template PCUIF_Message tr_PCUIF_DATA_IND(template uint8_t bts_nr := ?,
580 template uint8_t trx_nr := ?,
581 template uint8_t ts_nr := ?,
582 template uint8_t block_nr := ?,
583 template PCUIF_Sapi sapi := ?,
Vadim Yanitskiyc78ea262019-05-17 01:08:08 +0700584 template octetstring data := ?) := {
Harald Welte883340c2018-02-28 18:59:29 +0100585 msg_type := PCU_IF_MSG_DATA_IND,
586 bts_nr := bts_nr,
587 spare := ?,
588 u := {
589 data_ind := {
590 sapi := sapi,
591 len := ?,
592 data := data,
593 fn := ?,
594 arfcn := ?,
595 trx_nr := trx_nr,
596 ts_nr := ts_nr,
597 block_nr := block_nr,
598 rssi := ?,
599 ber10k := ?,
600 ta_offs_qbits := ?,
601 lqual_cb := ?
602 }
603 }
604}
605
Pau Espin Pedrolcf5c33e2021-01-19 18:56:55 +0100606template PCUIF_data tr_PCUIF_DATA(template uint8_t trx_nr,
607 template uint8_t ts_nr,
608 template uint8_t block_nr := ?,
609 template uint32_t fn := ?,
610 template PCUIF_Sapi sapi := ?,
611 template octetstring data := ?) := {
612 sapi := sapi,
613 len := ?,
614 data := data,
615 fn := fn,
616 arfcn := ?, /* unused in BTS */
617 trx_nr := trx_nr,
618 ts_nr := ts_nr,
619 block_nr := block_nr,
620 /* measurement parameters below unused on Tx */
621 rssi := 0,
622 ber10k := 0,
623 ta_offs_qbits := 0,
624 lqual_cb := 0
625
626}
627
Harald Welte883340c2018-02-28 18:59:29 +0100628template (value) PCUIF_Message ts_PCUIF_DATA_REQ(uint8_t bts_nr, uint8_t trx_nr,
629 uint8_t ts_nr, uint8_t block_nr,
630 uint32_t fn, PCUIF_Sapi sapi,
631 octetstring data) := {
632 msg_type := PCU_IF_MSG_DATA_REQ,
633 bts_nr := bts_nr,
634 spare := '0000'O,
635 u := {
636 data_req := {
637 sapi := sapi,
638 len := lengthof(data),
639 data := data,
640 fn := fn,
641 arfcn := 0, /* unused in BTS */
642 trx_nr := trx_nr,
643 ts_nr := ts_nr,
644 block_nr := block_nr,
645 /* measurement parameters below unused on Tx */
646 rssi := 0,
647 ber10k := 0,
648 ta_offs_qbits := 0,
649 lqual_cb := 0
650 }
651 }
652}
Harald Weltee1fd9162019-02-18 19:47:53 +0100653template PCUIF_Message tr_PCUIF_DATA_REQ(template uint8_t bts_nr,
654 template uint8_t trx_nr,
655 template uint8_t ts_nr,
656 template uint8_t block_nr := ?,
657 template uint32_t fn := ?,
658 template PCUIF_Sapi sapi := ?,
659 template octetstring data := ?) := {
660 msg_type := PCU_IF_MSG_DATA_REQ,
661 bts_nr := bts_nr,
662 spare := '0000'O,
663 u := {
Pau Espin Pedrolcf5c33e2021-01-19 18:56:55 +0100664 data_req := tr_PCUIF_DATA(trx_nr, ts_nr, block_nr, fn, sapi, data)
Harald Weltee1fd9162019-02-18 19:47:53 +0100665 }
666}
Harald Welte883340c2018-02-28 18:59:29 +0100667
Philipp Maiere6838282023-08-10 15:22:43 +0200668template (value) PCUIF_Message ts_PCUIF_DATA_CNF_2(template (value) uint8_t bts_nr,
669 template (value) PCUIF_Sapi sapi,
670 template (value) OCT4 msg_id) := {
671 msg_type := PCU_IF_MSG_DATA_CNF_2,
Philipp Maier704f31b2023-05-04 15:53:33 +0200672 bts_nr := bts_nr,
673 spare := '0000'O,
674 u := {
Philipp Maiere6838282023-08-10 15:22:43 +0200675 data_cnf2 := {
Philipp Maier704f31b2023-05-04 15:53:33 +0200676 sapi := sapi,
Philipp Maier19797d62023-08-08 17:30:50 +0200677 msg_id := msg_id
Philipp Maier704f31b2023-05-04 15:53:33 +0200678 }
679 }
680}
Philipp Maiere6838282023-08-10 15:22:43 +0200681template PCUIF_Message tr_PCUIF_DATA_CNF_2(template uint8_t bts_nr,
682 template PCUIF_Sapi sapi := ?,
683 template OCT4 msg_id := ?) := {
684 msg_type := PCU_IF_MSG_DATA_CNF_2,
Philipp Maier704f31b2023-05-04 15:53:33 +0200685 bts_nr := bts_nr,
686 spare := ?,
687 u := {
Philipp Maiere6838282023-08-10 15:22:43 +0200688 data_cnf2 := {
Philipp Maier704f31b2023-05-04 15:53:33 +0200689 sapi := sapi,
Philipp Maier19797d62023-08-08 17:30:50 +0200690 msg_id := msg_id
Philipp Maier704f31b2023-05-04 15:53:33 +0200691 }
692 }
693}
694
Harald Weltee1fd9162019-02-18 19:47:53 +0100695template (value) PCUIF_Message ts_PCUIF_RACH_IND(template (value) uint8_t bts_nr,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700696 template (value) uint8_t trx_nr,
697 template (value) uint8_t ts_nr,
Harald Weltee1fd9162019-02-18 19:47:53 +0100698 template (value) uint16_t ra,
699 template (value) uint8_t is_11bit,
Harald Welte913bbf62019-03-01 00:39:19 +0100700 template (value) PCUIF_BurstType burst_type,
Harald Weltee1fd9162019-02-18 19:47:53 +0100701 template (value) uint32_t fn,
702 template (value) uint16_t arfcn,
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700703 template (value) int16_t qta := 0,
704 template (value) PCUIF_Sapi sapi := PCU_IF_SAPI_RACH
Harald Weltee1fd9162019-02-18 19:47:53 +0100705) := {
706 msg_type := PCU_IF_MSG_RACH_IND,
707 bts_nr := bts_nr,
708 spare := '0000'O,
709 u := {
710 rach_ind := {
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700711 sapi := sapi,
Harald Weltee1fd9162019-02-18 19:47:53 +0100712 ra := ra,
713 qta := qta,
714 fn := fn,
715 arfcn := arfcn,
716 is_11bit := is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700717 burst_type := burst_type,
718 trx_nr := trx_nr,
719 ts_nr := ts_nr
Harald Weltee1fd9162019-02-18 19:47:53 +0100720 }
721 }
722}
Harald Welte883340c2018-02-28 18:59:29 +0100723template PCUIF_Message tr_PCUIF_RACH_IND(template uint8_t bts_nr := ?,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700724 template uint8_t trx_nr := ?,
725 template uint8_t ts_nr := ?,
Harald Welte883340c2018-02-28 18:59:29 +0100726 template uint16_t ra := ?,
727 template uint8_t is_11bit := ?,
Harald Welte913bbf62019-03-01 00:39:19 +0100728 template PCUIF_BurstType burst_type := ?,
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700729 template uint32_t fn := ?,
730 template PCUIF_Sapi sapi := PCU_IF_SAPI_RACH) := {
Harald Welte883340c2018-02-28 18:59:29 +0100731 msg_type := PCU_IF_MSG_RACH_IND,
732 bts_nr := bts_nr,
733 spare := ?,
734 u := {
735 rach_ind := {
Vadim Yanitskiy36aa6112019-10-04 16:43:00 +0700736 sapi := sapi,
Harald Welte883340c2018-02-28 18:59:29 +0100737 ra := ra,
738 qta := ?,
739 fn := fn,
740 arfcn := ?,
741 is_11bit := is_11bit,
Vadim Yanitskiy36558d92019-11-17 02:23:51 +0700742 burst_type := burst_type,
743 trx_nr := trx_nr,
744 ts_nr := ts_nr
Harald Welte883340c2018-02-28 18:59:29 +0100745 }
746 }
747}
748
Harald Weltee1fd9162019-02-18 19:47:53 +0100749template (value) PCUIF_Message ts_PCUIF_PAG_REQ(template (value) uint8_t bts_nr,
750 template (value) OCT9 id_lv,
751 template (value) uint8_t chan_needed,
752 template (value) PCUIF_Sapi sapi) := {
753 msg_type := PCU_IF_MSG_PAG_REQ,
754 bts_nr := bts_nr,
755 spare := '0000'O,
756 u := {
757 pag_req := {
758 sapi := sapi,
759 chan_needed := chan_needed,
760 identity_lv := id_lv
761 }
762 }
763}
Harald Welte883340c2018-02-28 18:59:29 +0100764template PCUIF_Message tr_PCUIF_PAG_REQ(template uint8_t bts_nr := ?,
765 template OCT9 id_lv := ?,
766 template uint8_t chan_needed := ?,
767 template PCUIF_Sapi sapi := ?) := {
768 msg_type := PCU_IF_MSG_PAG_REQ,
769 bts_nr := bts_nr,
770 spare := ?,
771 u := {
772 pag_req := {
773 sapi := ?,
774 chan_needed := chan_needed,
775 identity_lv := id_lv
776 }
777 }
778}
779
Harald Weltee1fd9162019-02-18 19:47:53 +0100780const PCUIF_Flags c_PCUIF_Flags_default := {
781 bts_active := true,
Philipp Maier8dabc502023-09-29 14:57:39 +0200782 direct_phy := false,
Harald Weltee1fd9162019-02-18 19:47:53 +0100783 spare := '00000000000000'B,
784 cs1 := true,
785 cs2 := true,
786 cs3 := true,
787 cs4 := true,
788 mcs1 := true,
789 mcs2 := true,
790 mcs3 := true,
791 mcs4 := true,
792 mcs5 := true,
793 mcs6 := true,
794 mcs7 := true,
795 mcs8 := true,
796 mcs9 := true,
797 spare2 := '000'B
798};
799
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100800const PCUIF_Flags c_PCUIF_Flags_noMCS := {
801 bts_active := true,
Philipp Maier8dabc502023-09-29 14:57:39 +0200802 direct_phy := false,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100803 spare := '00000000000000'B,
804 cs1 := true,
805 cs2 := true,
806 cs3 := true,
807 cs4 := true,
808 mcs1 := false,
809 mcs2 := false,
810 mcs3 := false,
811 mcs4 := false,
812 mcs5 := false,
813 mcs6 := false,
814 mcs7 := false,
815 mcs8 := false,
816 mcs9 := false,
817 spare2 := '000'B
818};
819
820function f_pcuif_ind_flags_egprs_enabled(PCUIF_Flags flags) return boolean {
821 return flags.mcs1 or flags.mcs2 or flags.mcs3 or flags.mcs4 or
822 flags.mcs5 or flags.mcs6 or flags.mcs7 or flags.mcs8 or
823 flags.mcs9;
824}
825
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700826template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH0(template (value) uint3_t tsc := 7) := {
827 tsc := tsc,
828 hopping := 0,
829 hsn := 0, maio := 0,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700830 ma_bit_len := 0,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700831 ma := f_pad_bit(''B, 64, '0'B)
832};
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700833template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH0(template uint3_t tsc := ?) := {
834 tsc := tsc,
835 hopping := 0,
836 hsn := ?, maio := ?,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700837 ma_bit_len := ?,
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700838 ma := ?
839};
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700840
841template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH1(template (value) uint3_t tsc := 7,
842 template (value) uint6_t hsn := 0,
843 template (value) uint6_t maio := 0,
844 template (value) bitstring ma := ''B) := {
845 tsc := tsc,
846 hopping := 1,
847 hsn := hsn,
848 maio := maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700849 ma_bit_len := lengthof(valueof(ma)),
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700850 ma := f_pad_bit(valueof(ma), 64, '0'B)
851};
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700852template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH1(template uint3_t tsc := ?,
853 template uint6_t hsn := ?,
854 template uint6_t maio := ?,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700855 template bitstring ma := ?,
856 template uint8_t ma_bit_len := ?) := {
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700857 tsc := tsc,
858 hopping := 1,
859 hsn := hsn,
860 maio := maio,
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +0700861 ma_bit_len := ma_bit_len,
Vadim Yanitskiy355604c2020-08-03 04:19:05 +0700862 ma := ma
863};
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700864
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100865template (value) PCUIF_InfoTrx
866ts_PCUIF_InfoTrx(template (value) uint16_t arfcn := 871,
867 template (value) BIT8 pdch_mask := '00000001'B,
868 template (value) uint3_t tsc := 7) := {
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700869 arfcn := arfcn,
870 pdch_mask := pdch_mask,
Vadim Yanitskiyd8051722020-08-22 02:33:17 +0700871 spare := '00'O,
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700872 hLayer1 := 0,
873 ts := {
874 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
875 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
876 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
877 ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc)
878 }
879};
880
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100881template (value) PCUIF_InfoTrxs
882ts_PCUIF_InfoTrxs_def(uint16_t base_arfcn) := {
883 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 0),
884 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 1),
885 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 2),
886 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 3),
887 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 4),
888 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 5),
889 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 6),
890 ts_PCUIF_InfoTrx(arfcn := base_arfcn + 7)
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +0700891};
Harald Weltee1fd9162019-02-18 19:47:53 +0100892
Harald Weltee1fd9162019-02-18 19:47:53 +0100893template (value) PCUIF_Message ts_PCUIF_INFO_IND(template (value) uint8_t bts_nr,
Pau Espin Pedrolf787b092019-10-04 18:34:05 +0200894 template (value) PCUIF_info_ind info_ind) := {
Harald Weltee1fd9162019-02-18 19:47:53 +0100895 msg_type := PCU_IF_MSG_INFO_IND,
896 bts_nr := bts_nr,
897 spare := '0000'O,
898 u := {
Pau Espin Pedrolf787b092019-10-04 18:34:05 +0200899 info_ind := info_ind
Harald Weltee1fd9162019-02-18 19:47:53 +0100900 }
901}
Harald Welted378a252018-03-13 17:02:14 +0100902template PCUIF_Message tr_PCUIF_INFO_IND(template uint8_t bts_nr := ?,
903 template PCUIF_Flags flags := ?,
Vadim Yanitskiyc1559302020-07-19 16:39:12 +0700904 template uint32_t version := mp_pcuif_version) := {
Harald Welted378a252018-03-13 17:02:14 +0100905 msg_type := PCU_IF_MSG_INFO_IND,
906 bts_nr := bts_nr,
907 spare := ?,
908 u := {
909 info_ind := {
910 version := version,
911 flags := flags,
912 trx := ?,
913 bsic := ?,
914 mcc := ?,
915 mnc :=?,
Harald Welte3568dc72018-03-13 17:06:51 +0100916 mnc_3_digits := ?,
Harald Welted378a252018-03-13 17:02:14 +0100917 lac := ?,
918 rac := ?,
919 nsei := ?,
920 nse_timer := ?,
921 cell_timer := ?,
922 cell_id := ?,
923 repeat_time := ?,
924 repeat_count := ?,
925 bvci := ?,
926 t3142 := ?,
927 t3169 := ?,
928 t3191 := ?,
929 t3193_10ms := ?,
930 t3195 := ?,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100931 n3101 := ?,
932 n3103 := ?,
933 n3105 := ?,
Harald Welted378a252018-03-13 17:02:14 +0100934 cv_countdown := ?,
935 dl_tbf_ext := ?,
936 ul_tbf_ext := ?,
937 initial_cs := ?,
938 initial_mcs := ?,
939 nsvci := ?,
Vadim Yanitskiy0d590802020-08-21 00:14:22 +0700940 local_port := ?,
Harald Welted378a252018-03-13 17:02:14 +0100941 remote_port := ?,
Philipp Maiere0666ea2023-11-01 16:55:45 +0100942 remote_addr := ?,
Philipp Maierc65db252023-11-22 15:38:22 +0100943 /* See note in record PCUIF_info_ind */
944 bts_model := *
Harald Welted378a252018-03-13 17:02:14 +0100945 }
946 }
947}
948
Harald Weltea3219812019-03-02 00:02:28 +0100949template (value) PCUIF_Message ts_PCUIF_TIME_IND(template (value) uint8_t bts_nr,
950 template (value) uint32_t fn) := {
951 msg_type := PCU_IF_MSG_TIME_IND,
952 bts_nr := bts_nr,
953 spare := '0000'O,
954 u := {
955 time_ind := {
956 fn := fn
957 }
958 }
959}
960template PCUIF_Message tr_PCUIF_TIME_IND(template uint8_t bts_nr,
961 template uint32_t fn) := {
962 msg_type := PCU_IF_MSG_TIME_IND,
963 bts_nr := bts_nr,
964 spare := ?,
965 u := {
966 time_ind := {
967 fn := fn
968 }
969 }
970}
Harald Welte883340c2018-02-28 18:59:29 +0100971
Vadim Yanitskiyd0766b22021-06-18 15:39:04 +0200972template (value) PCUIF_Message
973ts_PCUIF_INTERF_IND(template (value) uint8_t bts_nr,
974 template (value) uint8_t trx_nr,
975 template (value) uint32_t fn,
976 template (value) PCUIF_interf interf) := {
977 msg_type := PCU_IF_MSG_INTERF_IND,
978 bts_nr := bts_nr,
979 spare := '0000'O,
980 u := {
981 interf_ind := {
982 trx_nr := trx_nr,
983 spare := '000000'O,
984 fn := fn,
985 interf := interf
986 }
987 }
988}
989template PCUIF_Message
990tr_PCUIF_INTERF_IND(template (present) uint8_t bts_nr := ?,
991 template (present) uint8_t trx_nr := ?,
992 template (present) uint32_t fn := ?,
993 template (present) PCUIF_interf interf := ?) := {
994 msg_type := PCU_IF_MSG_INTERF_IND,
995 bts_nr := bts_nr,
996 spare := ?,
997 u := {
998 interf_ind := {
999 trx_nr := trx_nr,
1000 spare := ?,
1001 fn := fn,
1002 interf := interf
1003 }
1004 }
1005}
1006
Harald Welte4bff40a2019-03-21 21:34:10 +01001007template (value) PCUIF_Message ts_PCUIF_SUSP_REQ(template (value) uint8_t bts_nr,
1008 template (value) OCT4 tlli,
1009 template (value) OCT6 ra_id,
1010 template (value) uint8_t cause) := {
1011 msg_type := PCU_IF_MSG_SUSP_REQ,
1012 bts_nr := bts_nr,
1013 spare := '0000'O,
1014 u := {
1015 susp_req := {
1016 tlli := tlli,
1017 ra_id := ra_id,
1018 cause := cause
1019 }
1020 }
1021}
1022template PCUIF_Message tr_PCUIF_SUSP_REQ(template uint8_t bts_nr,
1023 template OCT4 tlli,
1024 template OCT6 ra_id,
1025 template uint8_t cause) := {
1026 msg_type := PCU_IF_MSG_SUSP_REQ,
1027 bts_nr := bts_nr,
1028 spare := '0000'O,
1029 u := {
1030 susp_req := {
1031 tlli := tlli,
1032 ra_id := ra_id,
1033 cause := cause
1034 }
1035 }
1036}
1037
Harald Welte11b734c2019-09-05 14:17:54 +02001038template (value) PCUIF_Message ts_PCUIF_APP_INFO_REQ(template (value) uint8_t bts_nr,
1039 template (value) uint8_t app_type,
1040 template (value) octetstring app_data) := {
1041 msg_type := PCU_IF_MSG_APP_INFO_REQ,
1042 bts_nr := bts_nr,
1043 spare := '0000'O,
1044 u := {
1045 app_info_req := {
1046 application_type := app_type,
1047 len := 0, /* overwritten */
1048 data := app_data
1049 }
1050 }
1051}
1052template (present) PCUIF_Message tr_PCUIF_APP_INFO_REQ(template (present) uint8_t bts_nr,
1053 template (present) uint8_t app_type,
1054 template (present) octetstring app_data) := {
1055 msg_type := PCU_IF_MSG_APP_INFO_REQ,
1056 bts_nr := bts_nr,
1057 spare := '0000'O,
1058 u := {
1059 app_info_req := {
1060 application_type := app_type,
1061 len := ?,
1062 data := app_data
1063 }
1064 }
1065}
1066
Harald Welte4bff40a2019-03-21 21:34:10 +01001067
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001068template (value) PCUIF_Message ts_PCUIF_CONTAINER(template (value) uint8_t bts_nr,
1069 template (value) PCUIF_container container) := {
1070 msg_type := PCU_IF_MSG_CONTAINER,
1071 bts_nr := bts_nr,
1072 spare := '0000'O,
1073 u := {
1074 container := container
1075 }
1076}
1077template (present) PCUIF_Message tr_PCUIF_CONTAINER(template (present) uint8_t bts_nr,
1078 template (present) PCUIF_container container) := {
1079 msg_type := PCU_IF_MSG_CONTAINER,
1080 bts_nr := bts_nr,
1081 spare := '0000'O,
1082 u := {
1083 container := container
1084 }
1085}
1086
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001087template (value) PCUIF_container ts_PCUIF_CONT_OTHER(PCUIF_MsgType msg_type, template (value) octetstring payload) := {
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001088 msg_type := msg_type,
1089 spare := '00'O,
1090 len := lengthof(payload),
1091 u := {
1092 other := payload
1093 }
1094}
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001095template (present) PCUIF_container tr_PCUIF_CONT_OTHER(template (present) PCUIF_MsgType msg_type,
Pau Espin Pedrol65d712e2021-06-25 13:55:38 +02001096 template (present) octetstring payload) := {
1097 msg_type := msg_type,
1098 spare := '00'O,
1099 len := ?,
1100 u := {
1101 other := payload
1102 }
1103}
1104
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02001105template (present) PCUIF_container tr_PCUIF_CONT_NEIGH_ADDR_REQ(template (present) uint16_t local_lac := ?,
1106 template (present) uint16_t local_ci := ?,
1107 template (present) uint16_t tgt_arfcn := ?,
1108 template (present) uint8_t tgt_bsic := ?) := {
1109 msg_type := PCU_IF_MSG_NEIGH_ADDR_REQ,
1110 spare := '00'O,
1111 len := ?,
1112 u := {
1113 neigh_addr_req := {
1114 local_lac := local_lac,
1115 local_ci := local_ci,
1116 tgt_arfcn := tgt_arfcn,
1117 tgt_bsic := tgt_bsic
1118 }
1119 }
1120}
1121template (present) PCUIF_Message tr_PCUIF_NEIGH_ADDR_REQ(template (present) uint8_t bts_nr,
1122 template (present) uint16_t local_lac := ?,
1123 template (present) uint16_t local_ci := ?,
1124 template (present) uint16_t tgt_arfcn := ?,
1125 template (present) uint8_t tgt_bsic := ?) := {
1126 msg_type := PCU_IF_MSG_CONTAINER,
1127 bts_nr := bts_nr,
1128 spare := '0000'O,
1129 u := {
1130 container := tr_PCUIF_CONT_NEIGH_ADDR_REQ(local_lac, local_ci, tgt_arfcn, tgt_bsic)
1131 }
1132}
1133
1134template (value) PCUIF_container ts_PCUIF_CONT_NEIGH_ADDR_CNF(template (value) PCUIF_neigh_addr_req orig_req,
1135 template (value) uint8_t error_code := 0,
1136 template (value) uint16_t mcc := 0,
1137 template (value) uint16_t mnc := 0,
1138 template (value) uint8_t mnc_3_digits := 0,
1139 template (value) uint16_t lac := 0,
1140 template (value) uint8_t rac := 0,
1141 template (value) uint16_t cell_identity := 0) := {
1142 msg_type := PCU_IF_MSG_NEIGH_ADDR_CNF,
1143 spare := '00'O,
1144 len := 0, /* overwritten */
1145 u := {
1146 neigh_addr_cnf := {
1147 orig_req := orig_req,
1148 error_code := error_code,
1149 mcc := mcc,
1150 mnc := mnc,
1151 mnc_3_digits := mnc_3_digits,
1152 lac := lac,
1153 rac := rac,
1154 cell_identity := cell_identity
1155 }
1156 }
1157}
1158template (value) PCUIF_Message ts_PCUIF_NEIGH_ADDR_CNF(template (value) uint8_t bts_nr,
1159 template (value) PCUIF_neigh_addr_req orig_req,
1160 template (value) uint8_t error_code := 0,
1161 template (value) uint16_t mcc := 0,
1162 template (value) uint16_t mnc := 0,
1163 template (value) uint8_t mnc_3_digits := 0,
1164 template (value) uint16_t lac := 0,
1165 template (value) uint8_t rac := 0,
1166 template (value) uint16_t cell_identity := 0) := {
1167 msg_type := PCU_IF_MSG_CONTAINER,
1168 bts_nr := bts_nr,
1169 spare := '0000'O,
1170 u := {
1171 container := ts_PCUIF_CONT_NEIGH_ADDR_CNF(orig_req, error_code, mcc, mnc, mnc_3_digits,
1172 lac, rac, cell_identity)
1173 }
1174}
1175
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001176function f_PCUIF_PDCHMask_set(inout PCUIF_info_ind info, BIT8 pdch_mask,
1177 template (present) uint8_t trx_nr := ?)
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07001178{
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001179 for (var integer nr := 0; nr < lengthof(info.trx); nr := nr + 1) {
1180 if (match(nr, trx_nr)) {
1181 info.trx[nr].pdch_mask := pdch_mask;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07001182 }
1183 }
1184}
1185
Alexander Couzense0f7c542020-09-13 17:25:18 +02001186function f_PCUIF_AF2addr_type(AddressFamily address_family)
1187return PCUIF_AddrType {
1188 if (address_family == AF_INET) {
1189 return PCUIF_ADDR_TYPE_IPV4;
1190 } else if (address_family == AF_INET6) {
1191 return PCUIF_ADDR_TYPE_IPV6;
1192 } else {
1193 return PCUIF_ADDR_TYPE_UNSPEC;
1194 }
1195}
1196
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001197/* TODO: second (redundant) NSVC connection is not (yet) supported */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001198function f_PCUIF_RemoteAddr(PCUIF_AddrType addr_type,
1199 charstring addr_str)
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001200return PCUIF_RemoteAddr {
1201 var PCUIF_RemoteAddr remote_addr;
1202
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001203 remote_addr.addr_type[0] := addr_type;
1204 if (addr_type == PCUIF_ADDR_TYPE_IPV4) {
1205 remote_addr.addr[0] := f_inet_addr(addr_str);
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001206 } else {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001207 remote_addr.addr[0] := f_inet6_addr(addr_str);
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001208 }
1209
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01001210 remote_addr.addr_type[1] := PCUIF_ADDR_TYPE_UNSPEC;
1211 remote_addr.addr[1] := f_pad_oct(''O, 16, '00'O);
1212
Alexander Couzens1e5dc482020-07-28 15:38:46 +02001213 return remote_addr;
1214}
1215
Vadim Yanitskiy9e1206c2020-07-19 15:52:31 +07001216
Harald Welte883340c2018-02-28 18:59:29 +01001217} with { encode "RAW" variant "BYTEORDER(first)" };