blob: 1eebb02a6fc13de717caf1156b5dc031ebd863b2 [file] [log] [blame]
Harald Weltec76f29f2017-11-22 12:46:46 +01001module BSSMAP_Templates {
2
Harald Welte35bb7162018-01-03 21:07:52 +01003/* BSSMAP Templates, building on top of BSSAP_Types from Ericsson.
4 *
Harald Welte34b5a952019-05-27 11:54:11 +02005 * (C) 2017-2019 by Harald Welte <laforge@gnumonks.org>
6 * contributions by sysmocom - s.f.m.c. GmbH
Harald Welte35bb7162018-01-03 21:07:52 +01007 * All rights reserved.
8 *
9 * Released under the terms of GNU General Public License, Version 2 or
10 * (at your option) any later version.
Harald Welte34b5a952019-05-27 11:54:11 +020011 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
Harald Welte35bb7162018-01-03 21:07:52 +010013 */
14
Harald Weltec76f29f2017-11-22 12:46:46 +010015import from General_Types all;
16import from Osmocom_Types all;
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +020017import from Native_Functions all;
18import from Misc_Helpers all;
Harald Welte72cecfa2017-12-11 19:50:14 +010019import from GSM_Types all;
Harald Weltec76f29f2017-11-22 12:46:46 +010020import from BSSAP_Types all;
21
22type integer BssmapCause;
Philipp Maier34bd80e2018-03-27 14:28:52 +020023type integer SpeechVersion;
24type integer Channel;
25type integer ChannelMode;
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +020026//type octetstring BSSMAP_oldToNewBSSIEs;
27
28// Old BSS to New BSS Information - 48.008 subclause 3.2.2.58
29type record BSSMAP_oldToNewBSSIEs
30{
31 BSSAMAP_IE_LastUsedEUTRANPLMNId LastUsedEUTRANPLMNId optional
32 /* TODO: add other FIELDS here from specs */
33}
34external function enc_BSSMAP_oldToNewBSSIEs(in BSSMAP_oldToNewBSSIEs val) return octetstring
35 with { extension "prototype(convert) encode(RAW)" };
Harald Weltec76f29f2017-11-22 12:46:46 +010036
Harald Welteb69533d2017-12-15 13:55:17 +010037/* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */
38type enumerated myBSSMAP_Cause {
39 /* 000 / 001: Normal event */
40 GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE ('0000000'B),
41 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE ('0000001'B),
42 GSM0808_CAUSE_UPLINK_QUALITY ('0000010'B),
43 GSM0808_CAUSE_UPLINK_STRENGTH ('0000011'B),
44 GSM0808_CAUSE_DOWNLINK_QUALITY ('0000100'B),
45 GSM0808_CAUSE_DOWNLINK_STRENGTH ('0000101'B),
46 GSM0808_CAUSE_DISTANCE ('0000110'B),
47 GSM0808_CAUSE_O_AND_M_INTERVENTION ('0000111'B),
48 GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION ('0001000'B),
49 GSM0808_CAUSE_CALL_CONTROL ('0001001'B),
50 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION ('0001010'B),
51 GSM0808_CAUSE_HANDOVER_SUCCESSFUL ('0001011'B),
52 GSM0808_CAUSE_BETTER_CELL ('0001100'B),
53 GSM0808_CAUSE_DIRECTED_RETRY ('0001101'B),
54 GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL ('0001110'B),
55 GSM0808_CAUSE_TRAFFIC ('0001111'B),
56 GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL ('0010000'B),
57 GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL ('0010001'B),
58 GSM0808_CAUSE_RELOCATION_TRIGGERED ('0010010'B),
59 GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED ('0010100'B),
60 GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED ('0010101'B),
61 GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG ('0010110'B),
62 GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT ('0010111'B),
63 GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE ('0011000'B),
64 /* reserved */
65 /* 010: Resource unavailable */
66 GSM0808_CAUSE_EQUIPMENT_FAILURE ('0100000'B),
67 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE ('0100001'B),
68 GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE ('0100010'B),
69 GSM0808_CAUSE_CCCH_OVERLOAD ('0100011'B),
70 GSM0808_CAUSE_PROCESSOR_OVERLOAD ('0100100'B),
71 GSM0808_CAUSE_BSS_NOT_EQUIPPED ('0100101'B),
72 GSM0808_CAUSE_MS_NOT_EQUIPPED ('0100110'B),
73 GSM0808_CAUSE_INVALID_CELL ('0100111'B),
74 GSM0808_CAUSE_TRAFFIC_LOAD ('0101000'B),
75 GSM0808_CAUSE_PREEMPTION ('0101001'B),
76 GSM0808_CAUSE_DTM_HO_SGSN_FAILURE ('0101010'B),
77 GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE ('0101011'B),
78 /* reserved */
79 /* 011: Service or option not available, but implemented */
80 GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE ('0110000'B),
81 GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH ('0110001'B),
82 GSM0808_CAUSE_SWITCH_CIRCUIT_POOL ('0110010'B),
83 GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE ('0110011'B),
84 GSM0808_CAUSE_LSA_NOT_ALLOWED ('0110100'B),
85 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL ('0110101'B),
86 GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL ('0110110'B),
87 GSM0808_CAUSE_INVALID_CSG_CELL ('0110111'B),
88 /* reserved */
89 /* 100: Service or option not implemented or currently disabled */
90 GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL ('0111111'B),
91 GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED ('1000000'B),
92 GSM0808_CAUSE_GERAN_IU_MODE_FAILURE ('1000001'B),
93 GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE ('1000010'B),
94 GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS ('1000011'B),
95 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP ('1000100'B),
96 GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP ('1000101'B),
97 GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP ('1000110'B),
98 /* reserved */
99 /* 101: Invalid message */
100 GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED ('1010000'B),
101 GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS ('1010001'B),
102 GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING ('1010010'B),
103 GSM0808_CAUSE_INCORRECT_VALUE ('1010011'B),
104 GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE ('1010100'B),
105 GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT ('1010101'B),
106 GSM0808_CAUSE_DTM_HO_INVALID_PS_IND ('1010110'B),
107 GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC ('1010111'B),
108 /* reserved */
109 /* 110: protocol error */
110 GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC ('1100000'B),
111 GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT ('1100001'B),
112 GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY ('1100010'B)
113} with { variant "FIELDLENGTH(7)" };
114
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +0200115type enumerated BSSMAP_LcsCause {
116 BSSMAP_LCS_CAUSE_UNSPECIFIED ('00000000'B),
117 BSSMAP_LCS_CAUSE_SYSTEM_FAILURE ('00000001'B),
118 BSSMAP_LCS_CAUSE_PROTOCOL_ERROR ('00000010'B),
119 BSSMAP_LCS_CAUSE_DATA_MISSING_IN_REQ ('00000011'B),
120 BSSMAP_LCS_CAUSE_UNEXP_DATA_IN_REQ ('00000100'B),
121 BSSMAP_LCS_CAUSE_POS_METH_FAILURE ('00000101'B),
122 BSSMAP_LCS_CAUSE_TGT_MS_UNREACHABLE ('00000110'B),
123 BSSMAP_LCS_CAUSE_REQUEST_ABORTED ('00000111'B),
124 BSSMAP_LCS_CAUSE_FACILITY_NOTSUPP ('00001000'B),
125 BSSMAP_LCS_CAUSE_INTER_BSC_HO ('00001001'B),
126 BSSMAP_LCS_CAUSE_INTRA_BSC_HO ('00001010'B),
127 BSSMAP_LCS_CAUSE_CONGESTION ('00001011'B),
128 BSSMAP_LCS_CAUSE_INTER_NSE_CHG ('00001100'B),
129 BSSMAP_LCS_CAUSE_RA_UPDAT ('00001101'B),
130 BSSMAP_LCS_CAUSE_PTMSI_REALLOC ('00001110'B),
131 BSSMAP_LCS_CAUSE_GPRS_SUSPENSION ('00001111'B)
132} with { variant "FIELDLENGTH(8)" };
133
Harald Weltec76f29f2017-11-22 12:46:46 +0100134template PDU_BSSAP ts_BSSAP_BSSMAP := {
135 discriminator := '0'B,
136 spare := '0000000'B,
137 dlci := omit,
138 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +0100139 pdu := {
140 bssmap := ?
141 }
Harald Weltec76f29f2017-11-22 12:46:46 +0100142}
143
144template PDU_BSSAP tr_BSSAP_BSSMAP := {
145 discriminator := '0'B,
146 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100147 dlci := *,
Harald Weltec76f29f2017-11-22 12:46:46 +0100148 lengthIndicator := ?,
149 pdu := {
150 bssmap := ?
151 }
152}
153
Harald Welte0a6835c2018-01-21 13:56:01 +0100154template PDU_BSSAP ts_BSSAP_DTAP(octetstring dtap, template OCT1 dlci := omit) := {
Harald Welteb3414b22017-11-23 18:22:10 +0100155 discriminator := '1'B,
156 spare := '0000000'B,
Harald Welte0a6835c2018-01-21 13:56:01 +0100157 dlci := dlci,
Harald Welteb3414b22017-11-23 18:22:10 +0100158 lengthIndicator := 0, /* overwritten by codec */
159 pdu := {
Harald Welte0a6835c2018-01-21 13:56:01 +0100160 dtap := dtap
Harald Welteb3414b22017-11-23 18:22:10 +0100161 }
162}
163
164template PDU_BSSAP tr_BSSAP_DTAP := {
165 discriminator := '1'B,
166 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100167 dlci := *,
Harald Welteb3414b22017-11-23 18:22:10 +0100168 lengthIndicator := ?,
169 pdu := {
170 dtap := ?
171 }
172}
173
Harald Weltec76f29f2017-11-22 12:46:46 +0100174template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
175 elementIdentifier := '04'O,
176 lengthIndicator := 0,
177 causeValue := int2bit(val, 7),
178 extensionCauseValue := '0'B,
179 spare1 := omit
180}
Vadim Yanitskiy48063962020-08-28 07:49:44 +0700181template BSSMAP_IE_Cause tr_BSSMAP_IE_Cause(template (present) myBSSMAP_Cause val) := {
182 elementIdentifier := '04'O,
183 lengthIndicator := ?,
184 causeValue := f_tr_causeValue(val),
185 extensionCauseValue := ?,
186 spare1 := *
187}
188private function f_tr_causeValue(template (present) myBSSMAP_Cause val)
189return template (present) BIT7 {
190 if (istemplatekind(val, "?")) {
191 return ?;
192 } else {
193 var integer int_val := enum2int(valueof(val));
194 return int2bit(valueof(int_val), 7);
195 }
196}
Harald Weltec76f29f2017-11-22 12:46:46 +0100197
Philipp Maier34bd80e2018-03-27 14:28:52 +0200198template (value) BSSMAP_IE_SpeechVersion ts_BSSMAP_IE_SpeechVersion(SpeechVersion val) := {
199 elementIdentifier := '40'O,
200 speechVersionIdentifier := int2bit(val, 7),
201 spare1_1 := '0'B
202}
203
204template (value) BSSMAP_IE_CurrentChannelType1 ts_BSSMAP_IE_CurrentChannelType1(Channel c, ChannelMode cm) := {
205 elementIdentifier := '31'O,
206 channel := int2bit(c, 4),
207 channelMode := int2bit(cm, 4)
208}
209
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +0200210template (value) BSSMAP_oldToNewBSSIEs ts_BSSMAP_oldToNewBSSIEs(template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId last_used_eutran_plmn) := {
211 LastUsedEUTRANPLMNId := last_used_eutran_plmn
212}
213function f_ts_BSSMAP_oldToNewBSSIEs(template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId last_used_eutran_plmn)
214 return template (omit) BSSMAP_oldToNewBSSIEs {
215 if (istemplatekind(last_used_eutran_plmn, "omit")) {
216 return omit;
217 } else {
218 return ts_BSSMAP_oldToNewBSSIEs(last_used_eutran_plmn);
219 }
220}
221template (value) BSSMAP_IE_OldToNewBSSInfo ts_BSSMAP_IE_OldToNewBSSInfo(template (value) BSSMAP_oldToNewBSSIEs val) := {
Philipp Maier34bd80e2018-03-27 14:28:52 +0200222 elementIdentifier := '3A'O,
223 lengthIndicator := 0, /* overwritten by codec */
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +0200224 oldToNewBSSIEs := enc_BSSMAP_oldToNewBSSIEs(valueof(val))
225}
226function f_ts_BSSMAP_IE_OldToNewBSSInfo(template (omit) BSSMAP_oldToNewBSSIEs val)
227 return template (omit) BSSMAP_IE_OldToNewBSSInfo {
228 if (istemplatekind(val, "omit")) {
229 return omit;
230 } else {
231 return ts_BSSMAP_IE_OldToNewBSSInfo(val);
232 }
Philipp Maier34bd80e2018-03-27 14:28:52 +0200233}
234
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200235template BSSMAP_IE_OldToNewBSSInfo tr_BSSMAP_IE_OldToNewBSSInfo(template (value) BSSMAP_oldToNewBSSIEs val) := {
236 elementIdentifier := '3A'O,
237 lengthIndicator := ?, /* overwritten by codec */
238 oldToNewBSSIEs := enc_BSSMAP_oldToNewBSSIEs(valueof(val))
239}
240function f_tr_BSSMAP_IE_OldToNewBSSInfo(template BSSMAP_oldToNewBSSIEs val := *)
241 return template BSSMAP_IE_OldToNewBSSInfo {
242 if (istemplatekind(val, "*")) {
243 return *;
244 } else if (istemplatekind(val, "?")) {
245 return ?;
246 } else if (istemplatekind(val, "omit")) {
247 return omit;
248 } else {
249 return tr_BSSMAP_IE_OldToNewBSSInfo(val);
250 }
251}
252
Harald Welte420c6b02020-08-21 11:54:30 +0200253template (value) BSSMAP_IE_Osmo_OsmuxSupport tr_BSSMAP_IE_Osmo_OsmuxSupport := {
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200254 elementIdentifier := 'F0'O
255}
256
Harald Welte420c6b02020-08-21 11:54:30 +0200257private function f_enc_osmux_support(boolean osmux_enabled) return template (omit) BSSMAP_IE_Osmo_OsmuxSupport {
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200258 if (osmux_enabled) {
259 return tr_BSSMAP_IE_Osmo_OsmuxSupport;
260 }
261 return omit;
262}
263
264template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause, boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100265 pdu := {
266 bssmap := {
267 reset := {
268 messageType := '30'O,
269 cause := ts_BSSMAP_IE_Cause(cause),
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200270 a_InterfaceSelectorForReset := omit,
271 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100272 }
273 }
274 }
275}
276
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200277template PDU_BSSAP tr_BSSMAP_Reset(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100278 pdu := {
279 bssmap := {
280 reset := {
281 messageType := '30'O,
282 cause := ?,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200283 a_InterfaceSelectorForReset := *,
284 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Welte365f4ed2017-11-23 00:00:43 +0100285 }
286 }
287 }
288}
289
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200290template (value) PDU_BSSAP ts_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100291 pdu := {
292 bssmap := {
293 resetAck := {
294 messageType := '31'O,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200295 a_InterfaceSelectorForReset := omit,
296 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100297 }
298 }
299 }
300}
301
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200302template PDU_BSSAP tr_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100303 pdu := {
304 bssmap := {
305 resetAck := {
306 messageType := '31'O,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200307 a_InterfaceSelectorForReset := *,
308 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100309 }
310 }
311 }
312}
313
314template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
315 elementIdentifier := '05'O,
316 lengthIndicator := 0,
317 cellIdentifierDiscriminator := '0000'B,
318 spare1_4 := '0000'B,
319 cellIdentification := ?
320}
321
322type uint16_t BssmapLAC;
323type uint16_t BssmapCI;
Pau Espin Pedrola8ef3be2022-02-16 16:21:17 +0100324type uint16_t BssmapSAC;
Harald Weltec76f29f2017-11-22 12:46:46 +0100325
Harald Welteae8ce232018-01-21 13:56:46 +0100326template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100327modifies ts_BSSMAP_IE_CellID := {
328 cellIdentification := {
Harald Welteae8ce232018-01-21 13:56:46 +0100329 cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100330 }
331}
Harald Weltec76f29f2017-11-22 12:46:46 +0100332
Pau Espin Pedrola8ef3be2022-02-16 16:21:17 +0100333template (value) BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100334modifies ts_BSSMAP_IE_CellID := {
335 cellIdentification := {
336 cI_LAC_CI := {
337 lac := int2oct(lac, 2),
338 ci := int2oct(ci, 2)
339 }
340 }
341}
342
343template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
344modifies ts_BSSMAP_IE_CellID := {
345 cellIdentification := {
346 cI_CI := int2oct(ci, 2)
347 }
348}
349
350template BSSMAP_IE_CellIdentifier ts_CellId_none
351modifies ts_BSSMAP_IE_CellID := {
352 cellIdentification := {
353 cI_noCell := ''O
354 }
355}
356
Pau Espin Pedrola8ef3be2022-02-16 16:21:17 +0100357template (value) BSSMAP_IE_CellIdentifier ts_CellID_SAI(OCT3 mcc_mnc, BssmapLAC lac, BssmapSAC sac)
358modifies ts_BSSMAP_IE_CellID := {
359 cellIdentification := {
360 cI_SAI := {
361 mcc_mnc := mcc_mnc,
362 lac := int2oct(lac, 2),
363 sac := int2oct(sac, 2)
364 }
365 }
366}
367
Harald Weltec76f29f2017-11-22 12:46:46 +0100368
369template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
370 elementIdentifier := '17'O,
371 lengthIndicator := 0,
372 layer3info := l3info
373}
374
Harald Weltef8a0bda2017-12-09 00:53:17 +0100375template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
376 elementIdentifier := '17'O,
377 lengthIndicator := ?,
378 layer3info := l3info
379}
380
381
Harald Weltec76f29f2017-11-22 12:46:46 +0100382template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
383modifies ts_BSSAP_BSSMAP := {
384 pdu := {
385 bssmap := {
386 completeLayer3Information := {
387 messageType := '57'O,
388 cellIdentifier := cell_id,
389 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
390 chosenChannel := omit,
391 lSAIdentifier := omit,
392 aPDU := omit,
393 codecList := omit,
394 redirectAttemptFlag := omit,
395 sendSequenceNumber := omit,
396 iMSI := omit
397 }
398 }
399 }
400}
401
Harald Weltef8a0bda2017-12-09 00:53:17 +0100402template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
Vadim Yanitskiya47cd4e2021-12-04 20:05:04 +0300403 template BSSMAP_IE_CellIdentifier cell_id := ?,
404 template BSSMAP_IE_SpeechCodecList codec_list := *)
Harald Weltef8a0bda2017-12-09 00:53:17 +0100405modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100406 pdu := {
407 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100408 completeLayer3Information := {
409 messageType := '57'O,
410 cellIdentifier := cell_id,
411 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
412 chosenChannel := *,
413 lSAIdentifier := *,
414 aPDU := *,
Vadim Yanitskiya47cd4e2021-12-04 20:05:04 +0300415 codecList := codec_list,
Harald Weltef8a0bda2017-12-09 00:53:17 +0100416 redirectAttemptFlag := *,
417 sendSequenceNumber := *,
418 iMSI := *
419 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100420 }
421 }
422}
423
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200424template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {
Harald Welte28d943e2017-11-25 15:00:50 +0100425 elementIdentifier := '1A'O,
426 lengthIndicator := 0, /* overwritten */
427 cellIdentifierDiscriminator := '0000'B, /* overwritten */
428 spare1_4 := '0000'B,
429 cellIdentificationList := cid_list
430}
Harald Welte365f4ed2017-11-23 00:00:43 +0100431
Harald Welte4bf5fc92017-12-15 13:56:06 +0100432const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100433const OCT1 ChRate_TCHF := '08'O;
434const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100435const OCT1 ChRate_TCHForH_Fpref := '0A'O;
436const OCT1 ChRate_TCHForH_Hpref := '0B'O;
437const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
438const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
439const OCT1 ChRate_TCHForH := '0F'O;
440const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100441
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100442const OCT1 Spdi_TCHF_FR := '01'O;
443const OCT1 Spdi_TCHF_EFR := '11'O;
444const OCT1 Spdi_TCHF_AMR := '21'O;
445const OCT1 Spdi_TCHH_HR := '05'O;
446const OCT1 Spdi_TCHH_AMR := '25'O;
447
Harald Welte365f4ed2017-11-23 00:00:43 +0100448template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
449 elementIdentifier := '0B'O, /* overwritten */
450 lengthIndicator := 0, /* overwritten */
451 speechOrDataIndicator := '0001'B, /* speech */
452 spare1_4 := '0000'B,
453 channelRateAndType := ChRate_TCHF,
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100454 speechId_DataIndicator := Spdi_TCHF_FR
Harald Welte365f4ed2017-11-23 00:00:43 +0100455}
456
Harald Welte4bf5fc92017-12-15 13:56:06 +0100457template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
458 speechOrDataIndicator := '0100'B /* speech + CTM */
459}
460
461template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
462 elementIdentifier := '0B'O, /* overwritten */
463 lengthIndicator := 0, /* overwritten */
464 speechOrDataIndicator := '0010'B, /* data */
465 spare1_4 := '0000'B,
466 channelRateAndType := ChRate_TCHF,
467 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
468}
469
470template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
471 elementIdentifier := '0B'O, /* overwritten */
472 lengthIndicator := 0, /* overwritten */
473 speechOrDataIndicator := '0011'B, /* data */
474 spare1_4 := '0000'B,
475 channelRateAndType := ChRate_ANY,
476 speechId_DataIndicator := '00'O /* spare */
477}
478
479template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
480 elementIdentifier := '0A'O,
481 lengthIndicator := 0, /* overwritten */
482 permittedAlgorithms := algs,
483 key := kc
484}
485
Harald Welte16114282018-01-24 22:41:21 +0100486template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
487 elementIdentifier := '0A'O,
488 lengthIndicator := ?, /* overwritten */
489 permittedAlgorithms := algs,
490 key := kc
491}
492
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +0200493template BSSMAP_IE_ChosenEncryptionAlgorithm ts_BSSMAP_IE_ChosenEncryptionAlgorithm(OCT1 algorithmIdentifier) := {
494 elementIdentifier := '2C'O,
495 algorithmIdentifier := algorithmIdentifier
496}
Harald Welte16114282018-01-24 22:41:21 +0100497
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +0200498template BSSMAP_IE_ChosenEncryptionAlgorithm tr_BSSMAP_IE_ChosenEncryptionAlgorithm(template OCT1 algorithmIdentifier := ?) := {
499 elementIdentifier := '2C'O,
500 algorithmIdentifier := algorithmIdentifier
501}
Harald Welte4bf5fc92017-12-15 13:56:06 +0100502
Harald Welte365f4ed2017-11-23 00:00:43 +0100503template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
504 elementIdentifier := '01'O, /* overwritten */
505 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
506 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
507}
508
Pau Espin Pedrol43021cb2019-06-18 17:32:15 +0200509function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {
510 var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
511 return cic;
512}
513
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100514template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100515 uint16_t udp_port,
516 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100517 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100518 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100519 ipAddress := addr,
520 uDPPortValue := udp_port
521}
Harald Welte235ebf12017-12-15 14:18:16 +0100522template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100523 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100524template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100525 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100526
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200527function f_ts_BSSMAP_IE_AoIP_TLA(charstring addr, uint16_t udp_port)
528 return template (value) BSSMAP_IE_AoIP_TransportLayerAddress {
529 if (f_addr_is_ipv6(addr)) {
530 var OCT16 ip6 := f_inet6_addr(addr);
531 return ts_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
532 } else {
533 var OCT4 ip := f_inet_addr(addr);
534 return ts_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
535 }
536}
537
Neels Hofmeyr3c89a6b2019-10-15 16:54:37 +0200538template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr,
539 template uint16_t udp_port,
540 template integer len := ?) := {
541 elementIdentifier := '7C'O,
542 lengthIndicator := len,
543 ipAddress := addr,
544 uDPPortValue := udp_port
545}
546template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) :=
547 tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
548template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) :=
549 tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
550
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200551function f_tr_BSSMAP_IE_AoIP_TLA(charstring addr, template uint16_t udp_port)
552 return template BSSMAP_IE_AoIP_TransportLayerAddress {
553 if (f_addr_is_ipv6(addr)) {
554 var OCT16 ip6 := f_inet6_addr(addr);
555 return tr_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
556 } else {
557 var OCT4 ip := f_inet_addr(addr);
558 return tr_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
559 }
560}
561
Neels Hofmeyrf7831cb2021-06-23 20:04:58 +0200562template (present) BSSMAP_IE_KC128 tr_BSSMAP_IE_Kc128(template (present) OCT16 kc128) := {
563 elementIdentifier := '83'O,
564 kC128_Value := kc128
565}
566
Harald Welte4bf5fc92017-12-15 13:56:06 +0100567template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
568 elementIdentifier := '83'O,
569 kC128_Value := kc128
570}
571
Harald Weltef1b64e22017-12-15 14:55:14 +0100572/* 3.2.2.103 */
573template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
574 codecType := GSM_FR,
575 tF := '0'B,
576 pT := '0'B,
577 pI := '0'B,
578 fI := '1'B,
579 extendedCodecType := omit,
580 s0_7 := omit,
581 s8_15 := omit
582}
583template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
584 codecType := GSM_FR
585}
586template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
587 codecType := GSM_EFR
588}
589template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
590 codecType := GSM_HR
591}
592template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
593 codecType := FR_AMR,
594 s0_7 := '11111111'B,
595 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
596}
597template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
598 codecType := HR_AMR,
599 s0_7 := '00111111'B,
600 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
601}
Neels Hofmeyra47a8c62022-04-07 00:31:19 +0200602template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_WB modifies ts_CodecBase := {
603 codecType := FR_AMR_WB,
604 s0_7 := '00000001'B
605}
Harald Weltef1b64e22017-12-15 14:55:14 +0100606template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
607 elementIdentifier := '7D'O,
608 lengthIndicator := 0, /* overwritten */
609 codecElements := valueof(elem)
610}
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100611template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := {
612 elementIdentifier := '7E'O,
613 lengthIndicator := 0, /* overwritten */
614 codecElements := valueof(elem)
615}
Harald Weltef1b64e22017-12-15 14:55:14 +0100616
Pau Espin Pedrol29c6dfb2022-08-08 18:37:56 +0200617template (present) BSSMAP_IE_Osmo_OsmuxCID tr_OsmuxCID(template (present) INT1 cid := ?) := {
618 elementIdentifier := 'F1'O,
619 osmuxCID := cid
620}
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200621template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := {
622 elementIdentifier := 'F1'O,
623 osmuxCID := cid
624}
625
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100626template PDU_BSSAP
627ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200628 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
629 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100630modifies ts_BSSAP_BSSMAP := {
631 pdu := {
632 bssmap := {
633 assignmentRequest := {
634 messageType :='01'O, /* overwritten */
635 channelType := ts_BSSMAP_IE_ChannelType,
636 layer3HeaderInfo := omit,
637 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100638 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100639 downLinkDTX_Flag := omit,
640 interferenceBandToBeUsed := omit,
641 classmarkInformationType2 := omit,
642 groupCallReference := omit,
643 talkerFlag := omit,
644 configurationEvolutionIndication := omit,
645 lsaAccesControlSuppression := omit,
646 serviceHandover := omit,
647 encryptionInformation := omit,
648 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100649 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100650 codecList := omit,
651 callIdentifier := omit,
652 kC128 := omit,
653 globalCallReference := omit,
654 lCLS_Configuration := omit,
655 lCLS_ConnectionStatusControl := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200656 lCLS_CorrelationNotNeeded := omit,
657 osmuxCID := osmuxCID
Harald Welte365f4ed2017-11-23 00:00:43 +0100658 }
659 }
660 }
661}
Harald Weltec76f29f2017-11-22 12:46:46 +0100662
Harald Weltebe48a7c2018-01-26 21:39:25 +0100663template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200664 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
665 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltebe48a7c2018-01-26 21:39:25 +0100666modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100667 pdu := {
668 bssmap := {
669 assignmentRequest := {
670 messageType :='01'O, /* overwritten */
671 channelType := ?,
672 layer3HeaderInfo := *,
673 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100674 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100675 downLinkDTX_Flag := *,
676 interferenceBandToBeUsed := *,
677 classmarkInformationType2 := *,
678 groupCallReference := *,
679 talkerFlag := *,
680 configurationEvolutionIndication := *,
681 lsaAccesControlSuppression := *,
682 serviceHandover := *,
683 encryptionInformation := *,
684 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100685 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100686 codecList := *,
687 callIdentifier := *,
688 kC128 := *,
689 globalCallReference := *,
690 lCLS_Configuration := *,
691 lCLS_ConnectionStatusControl := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200692 lCLS_CorrelationNotNeeded := *,
693 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100694 }
695 }
696 }
697}
698
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100699template PDU_BSSAP
700ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100701 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200702 template BSSMAP_IE_SpeechCodec speechCodec := omit,
703 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100704modifies ts_BSSAP_BSSMAP := {
705 pdu := {
706 bssmap := {
707 assignmentComplete := {
708 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100709 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100710 circuitIdentityCode := cic,
711 cellIdentifier := omit,
712 chosenChannel := omit,
713 chosenEncryptionAlgorithm := omit,
714 circuitPool := omit,
715 speechVersion := omit,
716 lSAIdentifier := omit,
717 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100718 aoIPTransportLayer := aoip,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100719 speechCodec := speechCodec,
Harald Welteb3414b22017-11-23 18:22:10 +0100720 codecList := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200721 lCLS_BSS_Status := omit,
722 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100723 }
724 }
725 }
726}
727
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100728template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200729 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
730 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100731modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100732 pdu := {
733 bssmap := {
734 assignmentComplete := {
735 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100736 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100737 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100738 cellIdentifier := *,
739 chosenChannel := *,
740 chosenEncryptionAlgorithm := *,
741 circuitPool := *,
742 speechVersion := *,
743 lSAIdentifier := *,
744 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100745 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100746 speechCodec := *,
747 codecList := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200748 lCLS_BSS_Status := *,
749 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100750 }
751 }
752 }
753}
754
Harald Welte16a4adf2017-12-14 18:54:01 +0100755template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
756 pdu := {
757 bssmap := {
758 assignmentFailure := {
759 messageType := '03'O, /* overwritten */
760 rR_Cause := *,
761 circuitPool := *,
762 circuitPoolList := *,
763 talkerPriority := *,
764 codecList := *
765 }
766 }
767 }
768}
769
770
Harald Welteb3414b22017-11-23 18:22:10 +0100771template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
772modifies ts_BSSAP_BSSMAP := {
773 pdu := {
774 bssmap := {
775 clearCommand := {
776 messageType := '20'O, /* overwritten */
777 layer3HeaderInfo := omit,
778 cause := ts_BSSMAP_IE_Cause(cause),
779 cSFB_Indication := omit
780 }
781 }
782 }
783}
Harald Welte99787102019-02-04 10:41:36 +0100784template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause)
785modifies ts_BSSMAP_ClearCommand := {
786 pdu := {
787 bssmap := {
788 clearCommand := {
789 cSFB_Indication := {
790 elementIdentifier := '8F'O
791 }
792 }
793 }
794 }
795}
Harald Welteb3414b22017-11-23 18:22:10 +0100796
797template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
798 pdu := {
799 bssmap := {
800 clearCommand := {
801 messageType := '20'O, /* overwritten */
802 layer3HeaderInfo := *,
803 cause := ?,
804 cSFB_Indication := *
805 }
806 }
807 }
808}
809
Harald Welte4c422b72019-02-17 16:27:10 +0100810template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := {
811 pdu := {
812 bssmap := {
813 clearCommand := {
814 messageType := '20'O, /* overwritten */
815 layer3HeaderInfo := *,
816 cause := ?,
817 cSFB_Indication := {
818 elementIdentifier := '8F'O
819 }
820 }
821 }
822 }
823}
824
Harald Welteb3414b22017-11-23 18:22:10 +0100825template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
826modifies ts_BSSAP_BSSMAP := {
827 pdu := {
828 bssmap := {
829 clearComplete := {
830 messageType := '21'O /* overwritten */
831 }
832 }
833 }
834}
835
Harald Weltec859df52017-11-24 23:41:41 +0100836template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
837 pdu := {
838 bssmap := {
839 clearComplete := {
840 messageType := '21'O
841 }
842 }
843 }
844}
845
Harald Weltebc881782018-01-23 20:09:15 +0100846template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
847modifies ts_BSSAP_BSSMAP := {
848 pdu := {
849 bssmap := {
850 clearRequest := {
851 messageType := '22'O, /* overwritten */
852 cause := ts_BSSMAP_IE_Cause(cause)
853 }
854 }
855 }
856}
857
Harald Weltecfa79ad2017-12-09 22:33:47 +0100858template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
859 pdu := {
860 bssmap := {
861 clearRequest := {
862 messageType := '22'O, /* overwritten */
863 cause := ?
864 }
865 }
866 }
867}
868
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200869template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200870 template BSSMAP_FIELD_CellIdentificationList cid_list,
871 template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit)
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200872modifies ts_BSSAP_BSSMAP := {
873 pdu := {
874 bssmap := {
875 handoverRequired := {
876 messageType := '11'O,
877 cause := ts_BSSMAP_IE_Cause(cause),
878 responseRequest := omit,
879 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
880 circuitPoolList := omit,
881 currentChannelType1 := omit,
882 speechVersion := omit,
883 queueingIndicator := omit,
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200884 oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200885 sourceToTargetRNCTransparentInfo := omit,
886 sourceToTargetRNCTransparentInfoCDMA := omit,
887 gERANClassmark := omit,
888 talkerPriority := omit,
889 speechCodec := omit,
890 cSG_Identifier := omit
891 }
892 }
893 }
894}
895
896
Oliver Smithc9a5f532022-10-21 11:32:23 +0200897template PDU_BSSAP tr_BSSMAP_HandoverRequired(template BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := *,
898 template (present) BSSMAP_FIELD_CellIdentificationList cid_list := ?)
899modifies tr_BSSAP_BSSMAP := {
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100900 pdu := {
901 bssmap := {
902 handoverRequired := {
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200903 messageType := '11'O,
Oliver Smithc9a5f532022-10-21 11:32:23 +0200904 cellIdentifierList := {
905 cellIdentificationList := cid_list
906 },
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200907 oldToNewBSSInfo := f_tr_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs)
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100908 }
909 }
910 }
911}
912
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200913template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {
914 pdu := {
915 bssmap := {
916 handoverRequiredReject := {
917 messageType := '1A'O
918 }
919 }
920 }
921}
922
923template PDU_BSSAP tr_BSSMAP_HandoverCommand
924modifies tr_BSSAP_BSSMAP := {
925 pdu := {
926 bssmap := {
927 handoverCommand := {
928 messageType := '13'O
929 }
930 }
931 }
932}
933
934template PDU_BSSAP tr_BSSMAP_HandoverSucceeded
935modifies tr_BSSAP_BSSMAP := {
936 pdu := {
937 bssmap := {
938 handoverSucceeded := {
939 messageType := '15'O
940 }
941 }
942 }
943}
944
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100945template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)
946modifies ts_BSSAP_BSSMAP := {
947 pdu := {
948 bssmap := {
949 handoverCommand := {
950 messageType := '13'O,
951 layer3Information := {
952 elementIdentifier := '17'O,
953 lengthIndicator := 0,
954 layer3info := layer3info
955 },
956 cellIdentifier := omit,
957 newBSSToOldBSSInfo := omit,
958 talkerPriority := omit
959 }
960 }
961 }
962}
963
Neels Hofmeyr61ebb8b2018-10-09 18:28:06 +0200964template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := {
965 pdu := {
966 bssmap := {
967 handoverFailure := {
968 messageType := '16'O,
969 cause := ?,
970 rR_Cause := *,
971 circuitPool := *,
972 circuitPoolList := *,
973 gERANClassmark := *,
974 newBSSToOldBSSInfo := *,
975 interSystemInformation := *,
976 talkerPriority := *,
977 codecList := *
978 }
979 }
980 }
981}
982
Neels Hofmeyr0d841d92021-06-21 22:27:21 +0200983template PDU_BSSAP tr_BSSMAP_HandoverRequest(template BSSMAP_IE_EncryptionInformation encryptionInformation := *,
984 template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := *,
Vadim Yanitskiy6fe5d4e2022-08-04 04:04:54 +0700985 template BSSMAP_IE_KC128 kC128 := *,
986 template BSSMAP_IE_SpeechCodecList codecList := *
Neels Hofmeyr0d841d92021-06-21 22:27:21 +0200987 )
988 modifies tr_BSSAP_BSSMAP := {
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200989 pdu := {
990 bssmap := {
991 handoverRequest := {
Neels Hofmeyr0d841d92021-06-21 22:27:21 +0200992 messageType := '10'O,
993 encryptionInformation := encryptionInformation,
994 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
Vadim Yanitskiy6fe5d4e2022-08-04 04:04:54 +0700995 codecList := codecList,
Neels Hofmeyr0d841d92021-06-21 22:27:21 +0200996 kC128 := kC128
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200997 }
998 }
999 }
1000}
1001
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001002template PDU_BSSAP ts_BSSMAP_HandoverRequest(
1003 template BSSMAP_IE_CircuitIdentityCode cic := omit,
1004 template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,
1005 template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0),
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +02001006 template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1),
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +02001007 template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit,
1008 template BSSMAP_IE_EncryptionInformation encryptionInformation := ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O),
1009 template (omit) BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit,
Neels Hofmeyr9fe13202022-03-04 00:05:43 +01001010 template (omit) BSSMAP_IE_KC128 kC128 := omit,
1011 template (omit) BSSMAP_IE_SpeechCodecList codecList := omit
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001012 )
1013modifies ts_BSSAP_BSSMAP := {
1014 pdu := {
1015 bssmap := {
1016 handoverRequest := {
1017 messageType := '10'O,
1018 channelType := ts_BSSMAP_IE_ChannelType,
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +02001019 encryptionInformation := encryptionInformation,
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001020 classmarkInformationType := {
1021 classmarkInformationType1 := {
1022 elementIdentifier := '1D'O,
1023 rf_PowerCapability := '000'B,
1024 a5_1 := '0'B,
1025 esind := '0'B,
1026 revisionLevel := '10'B,
1027 spare1_1 := '0'B
1028 }
1029 },
1030 cellIdentifierSource := cell_id_source,
1031 priority := omit,
1032 circuitIdentityCode := cic,
1033 downLinkDTX_Flag := omit,
1034 cellIdentifierTarget := cell_id_target,
1035 interferenceBandToBeUsed := omit,
1036 cause := omit,
1037 classmarkInformationType3 := omit,
1038 currentChannelType1 := omit,
1039 speechVersion := omit,
1040 groupCallReference := omit,
1041 talkerFlag := omit,
1042 configurationEvolutionIndication := omit,
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +02001043 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +02001044 oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001045 lSAInformation := omit,
1046 lSAAccessControlSuppression := omit,
1047 serviceHandover := omit,
1048 iMSI_bssmap := omit,
1049 sourceToTargetRNCTransparentInfo := omit,
1050 sourceToTargetRNCTransparentInfoCDMA := omit,
1051 sNAAccessInformation := omit,
1052 talkerPriority := omit,
1053 aoIPTransportLayer := aoip_tla,
Neels Hofmeyr9fe13202022-03-04 00:05:43 +01001054 codecList := codecList,
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001055 callIdentifier := omit,
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +02001056 kC128 := kC128,
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001057 globalCallReference := omit,
1058 lCLS_Configuration := omit,
1059 connectionStatusControl := omit
1060 }
1061 }
1062 }
1063}
1064
1065template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info)
1066modifies tr_BSSAP_BSSMAP := {
1067 pdu := {
1068 bssmap := {
1069 handoverRequestAck := {
1070 messageType := '12'O,
1071 layer3Information := {
1072 elementIdentifier := '17'O,
1073 lengthIndicator := ?,
1074 layer3info := layer3info
1075 }
1076 }
1077 }
1078 }
1079}
1080
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001081template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(
1082 template octetstring layer3info,
1083 template LIN1 layer3infoLength,
1084 template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,
1085 template BSSMAP_IE_SpeechCodec speechCodec := omit,
1086 template BSSMAP_IE_ChosenChannel chosenChannel := omit,
1087 template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)
1088modifies ts_BSSAP_BSSMAP := {
1089 pdu := {
1090 bssmap := {
1091 handoverRequestAck := {
1092 messageType := '12'O,
1093 layer3Information := {
1094 elementIdentifier := '17'O,
1095 lengthIndicator := layer3infoLength,
1096 layer3info := layer3info
1097 },
1098 chosenChannel := chosenChannel,
1099 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
1100 circuitPool := omit,
1101 speechVersion := omit,
1102 circuitIdentityCode := omit,
1103 lSAIdentifier := omit,
1104 newBSSToOldBSSInfo := omit,
1105 interSystemInformation := omit,
1106 talkerPriority := omit,
1107 aoIPTransportLayer := aoIPTransportLayer,
1108 codecList := omit,
1109 speechCodec := speechCodec,
1110 lCLS_bSS_Status := omit
1111 }
1112 }
1113 }
1114}
1115
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001116template PDU_BSSAP tr_BSSMAP_HandoverDetect
1117modifies tr_BSSAP_BSSMAP := {
1118 pdu := {
1119 bssmap := {
1120 handoverDetect := {
1121 messageType := '1B'O,
1122 talkerPriority := *
1123 }
1124 }
1125 }
1126}
1127
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001128template PDU_BSSAP ts_BSSMAP_HandoverDetect
1129modifies ts_BSSAP_BSSMAP := {
1130 pdu := {
1131 bssmap := {
1132 handoverDetect := {
1133 messageType := '1B'O,
1134 talkerPriority := omit
1135 }
1136 }
1137 }
1138}
1139
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001140template PDU_BSSAP tr_BSSMAP_HandoverComplete
1141modifies tr_BSSAP_BSSMAP := {
1142 pdu := {
1143 bssmap := {
1144 handoverComplete := {
1145 messageType := '14'O,
1146 rR_Cause := *,
1147 talkerPriority := *,
1148 speechCodec := *,
1149 codecList := *,
1150 chosenEncryptionAlgorithm := *,
1151 chosenChannel := *,
1152 lCLS_BSS_Status := *
1153 }
1154 }
1155 }
1156}
Harald Weltecfa79ad2017-12-09 22:33:47 +01001157
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001158template PDU_BSSAP ts_BSSMAP_HandoverComplete
1159modifies ts_BSSAP_BSSMAP := {
1160 pdu := {
1161 bssmap := {
1162 handoverComplete := {
1163 messageType := '14'O,
1164 rR_Cause := omit,
1165 talkerPriority := omit,
1166 speechCodec := omit,
1167 codecList := omit,
1168 chosenEncryptionAlgorithm := omit,
1169 chosenChannel := omit,
1170 lCLS_BSS_Status := omit
1171 }
1172 }
1173 }
1174}
1175
Philipp Maieraee60392018-11-05 17:09:00 +01001176template PDU_BSSAP tr_BSSMAP_HandoverPerformed
1177modifies tr_BSSAP_BSSMAP := {
1178 pdu := {
1179 bssmap := {
1180 handoverPerformed := {
1181 messageType := '17'O,
1182 cause := ?,
1183 cellIdentifier := ?,
Philipp Maier8d33a132018-11-12 11:58:55 +01001184 chosenChannel := *,
1185 chosenEncryptionAlgorithm := *,
1186 speechVersion := *,
1187 lSAIdentifier := *,
1188 talkerPriority := *,
1189 codecList := *,
1190 speechCodec := *,
1191 lCLS_BSS_Status := *
Philipp Maieraee60392018-11-05 17:09:00 +01001192 }
1193 }
1194 }
1195}
1196
Harald Welte28d943e2017-11-25 15:00:50 +01001197template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
1198 elementIdentifier := '08'O,
1199 lengthIndicator := 0, /* overwritten */
1200 typeOfIdentity := '001'B, /* IMSI */
1201 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
1202 digits := imsi_digits
1203}
1204
Harald Welte17d21152018-01-27 00:47:11 +01001205template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
1206 elementIdentifier := '08'O,
1207 lengthIndicator := ?, /* overwritten */
1208 typeOfIdentity := '001'B, /* IMSI */
1209 oddEvenIndicator := ?,
1210 digits := imsi_digits
1211}
1212
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001213template (value) BSSAMAP_IE_LastUsedEUTRANPLMNId ts_BSSMAP_LastUsedEUTRANPLMNId(OCT3 mcc_mnc) := {
1214 elementIdentifier := '95'O,
1215 mcc_mnc := mcc_mnc
1216}
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001217template BSSAMAP_IE_LastUsedEUTRANPLMNId tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc) := {
1218 elementIdentifier := '95'O,
1219 mcc_mnc := mcc_mnc
1220}
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001221function f_ts_BSSMAP_LastUsedEUTRANPLMNId(template (omit) OCT3 mcc_mnc)
1222 return template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId {
1223 if (not istemplatekind(mcc_mnc, "omit")) {
1224 return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
1225 } else {
1226 return omit;
1227 }
1228}
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001229function f_tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc)
1230return template BSSAMAP_IE_LastUsedEUTRANPLMNId {
1231 if (istemplatekind(mcc_mnc, "*")) {
1232 return *;
1233 } else if (istemplatekind(mcc_mnc, "?")) {
1234 return ?;
1235 } else if (istemplatekind(mcc_mnc, "omit")) {
1236 return omit;
1237 } else {
1238 return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
1239 }
1240}
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001241
Harald Welte72cecfa2017-12-11 19:50:14 +01001242template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
1243 cIl_noCell := ''O
1244}
Harald Welteaba42162019-06-19 18:17:59 +02001245template (value) BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_BSS := {
1246 cIl_allInBSS := ''O
1247}
1248template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_BSS := {
1249 cIl_allInBSS := ''O
1250}
1251
1252template (value) BSSMAP_FIELD_CellIdentificationList
1253 ts_BSSMAP_CIL_CGI(template (value) BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1254 cIl_CGI := cgil
1255}
1256template BSSMAP_FIELD_CellIdentificationList
1257 tr_BSSMAP_CIL_CGI(template BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1258 cIl_CGI := cgil
1259}
1260
1261template (value) BSSMAP_FIELD_CellIdentificationList
1262 ts_BSSMAP_CIL_LAC_CI(template (value) BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1263 cIl_LAC_CI := lac_cil
1264}
1265template BSSMAP_FIELD_CellIdentificationList
1266 tr_BSSMAP_CIL_LAC_CI(template BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1267 cIl_LAC_CI := lac_cil
1268}
1269
1270template (value) BSSMAP_FIELD_CellIdentificationList
1271 ts_BSSMAP_CIL_CI(template (value) RecordOfOCT2 cil) := {
1272 cIl_CI := cil
1273}
1274template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_CI(template RecordOfOCT2 cil) := {
1275 cIl_CI := cil
1276}
1277
1278template (value) BSSMAP_FIELD_CellIdentificationList
1279 ts_BSSMAP_CIL_LAI(template (value) BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1280 cIl_LAI := lail
1281}
1282template BSSMAP_FIELD_CellIdentificationList
1283 tr_BSSMAP_CIL_LAI(template BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1284 cIl_LAI := lail
1285}
1286
1287template (value) BSSMAP_FIELD_CellIdentificationList
1288 ts_BSSMAP_CIL_LAC(template (value) RecordOfOCT2 lacl) := {
1289 cIl_LAC := lacl
1290}
1291template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOfOCT2 lacl) := {
1292 cIl_LAC := lacl
1293}
1294
Harald Welte72cecfa2017-12-11 19:50:14 +01001295
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001296function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte24135bd2018-03-17 19:27:53 +01001297 if (lengthof(mnc) == 2) {
1298 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
Stefan Sperling83348bc2018-03-14 17:44:40 +01001299 } else {
1300 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
1301 }
Harald Welte72cecfa2017-12-11 19:50:14 +01001302}
1303
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001304function f_dec_mcc_mnc(in OCT3 mcc_mnc, out GsmMcc mcc, out GsmMnc mnc) {
1305 var hexstring hs := oct2hex(mcc_mnc);
1306 mcc := hs[1] & hs[0] & hs[3];
1307 mnc := hs[5] & hs[4];
1308 if (hs[2] == 'F'H) {
1309 mnc := mnc & hs[2];
1310 }
1311}
1312
Harald Welteaba42162019-06-19 18:17:59 +02001313template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001314 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1315 lac := int2oct(lac, 2),
1316 ci := int2oct(ci, 2)
1317}
1318
Harald Welteaba42162019-06-19 18:17:59 +02001319template (value) BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001320 lac := int2oct(lac, 2),
1321 ci := int2oct(ci, 2)
1322}
1323
Harald Welteaba42162019-06-19 18:17:59 +02001324template (value) BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001325 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1326 lac := int2oct(lac, 2)
1327}
1328
Harald Welteaba42162019-06-19 18:17:59 +02001329template (value) OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
1330template (value) OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
Harald Welte72cecfa2017-12-11 19:50:14 +01001331
Harald Welteaba42162019-06-19 18:17:59 +02001332template (value) BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
Harald Welte751d3eb2018-01-31 15:51:06 +01001333ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
1334 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1335 lac := int2oct(lac, 2),
1336 rncId := int2oct(rnc_id, 2)
1337}
1338
Harald Welteaba42162019-06-19 18:17:59 +02001339template (value) BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
Harald Welte751d3eb2018-01-31 15:51:06 +01001340 lac := int2oct(lac, 2),
1341 rncId := int2oct(rnc_id, 2)
1342}
1343
Harald Welte72cecfa2017-12-11 19:50:14 +01001344template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
1345 elementIdentifier := '24'O,
1346 channel := chneed,
1347 spare := '000000'B
1348}
1349
1350template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
1351 elementIdentifier := '09'O,
1352 lengthIndicator := 4,
1353 tmsiOctets := tmsi
1354};
1355
Harald Welte17d21152018-01-27 00:47:11 +01001356template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
1357 elementIdentifier := '09'O,
1358 lengthIndicator := 4,
1359 tmsiOctets := tmsi
1360};
1361
Harald Welte72cecfa2017-12-11 19:50:14 +01001362private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
1363 var template BSSMAP_IE_TMSI ret;
1364 if (ispresent(tmsi)) {
1365 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
1366 } else {
1367 ret := omit;
1368 }
1369 return ret;
1370}
1371
1372template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
1373 template BSSMAP_FIELD_CellIdentificationList cid_list,
1374 template OCT4 tmsi := omit,
1375 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +01001376modifies ts_BSSAP_BSSMAP := {
1377 pdu := {
1378 bssmap := {
1379 paging := {
Harald Welte17d21152018-01-27 00:47:11 +01001380 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +01001381 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +01001382 tMSI := f_tmsi_or_omit(tmsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001383 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Welte72cecfa2017-12-11 19:50:14 +01001384 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +01001385 eMLPP_Priority := omit,
1386 pagingInformation := omit /* only VGCS/VBS flag */
1387 }
1388 }
1389 }
1390}
1391
Harald Welte17d21152018-01-27 00:47:11 +01001392template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
1393 template OCT4 tmsi := *,
1394 template BSSMAP_IE_ChannelNeeded chneed := *)
1395modifies tr_BSSAP_BSSMAP := {
1396 pdu := {
1397 bssmap := {
1398 paging := {
1399 messageType := '52'O,
1400 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1401 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
1402 cellIdentifierList := ?,
1403 channelNeeded := chneed,
1404 eMLPP_Priority := omit,
1405 pagingInformation := omit /* only VGCS/VBS flag */
1406 }
1407 }
1408 }
1409}
1410
1411
Harald Welte73cd2712017-12-17 00:44:52 +01001412template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
1413modifies ts_BSSAP_BSSMAP := {
1414 pdu := {
1415 bssmap := {
1416 cipherModeCommand := {
1417 messageType := '53'O,
1418 layer3HeaderInfo := omit,
1419 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1420 cipherResponseMode := omit,
1421 kC128 := omit
1422 }
1423 }
1424 }
1425}
1426
1427template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
1428modifies ts_BSSAP_BSSMAP := {
1429 pdu := {
1430 bssmap := {
1431 cipherModeCommand := {
1432 messageType := '53'O,
1433 layer3HeaderInfo := omit,
1434 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1435 cipherResponseMode := omit,
1436 kC128 := { '83'O, kc128 }
1437 }
1438 }
1439 }
1440}
1441
Neels Hofmeyrf7831cb2021-06-23 20:04:58 +02001442template PDU_BSSAP tr_BSSMAP_CipherModeCmd2(template BSSMAP_IE_EncryptionInformation encryptionInformation := *,
1443 template BSSMAP_IE_KC128 kC128 := *)
Harald Welte16114282018-01-24 22:41:21 +01001444modifies tr_BSSAP_BSSMAP := {
1445 pdu := {
1446 bssmap := {
1447 cipherModeCommand := {
1448 messageType := '53'O,
1449 layer3HeaderInfo := *,
Neels Hofmeyrf7831cb2021-06-23 20:04:58 +02001450 encryptionInformation := encryptionInformation,
Harald Welte16114282018-01-24 22:41:21 +01001451 cipherResponseMode := *,
Neels Hofmeyrf7831cb2021-06-23 20:04:58 +02001452 kC128 := kC128
Harald Welte16114282018-01-24 22:41:21 +01001453 }
1454 }
1455 }
1456}
1457
Neels Hofmeyrf7831cb2021-06-23 20:04:58 +02001458template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key, template BSSMAP_IE_KC128 kC128 := omit)
1459 := tr_BSSMAP_CipherModeCmd2(tr_BSSMAP_IE_EncrInfo(key, alg), kC128);
1460
Harald Welte16114282018-01-24 22:41:21 +01001461template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
1462modifies ts_BSSAP_BSSMAP := {
1463 pdu := {
1464 bssmap := {
1465 cipherModeComplete := {
1466 messageType := '55'O,
1467 layer3MessageContents := omit,
1468 chosenEncryptionAlgorithm := {
1469 elementIdentifier := '2C'O,
1470 algorithmIdentifier := alg
1471 }
1472 }
1473 }
1474 }
1475}
1476
Stefan Sperlinga2d59c62018-12-18 16:32:44 +01001477template PDU_BSSAP ts_BSSMAP_CipherModeComplAlg(template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := ?)
1478modifies ts_BSSAP_BSSMAP := {
1479 pdu := {
1480 bssmap := {
1481 cipherModeComplete := {
1482 messageType := '55'O,
1483 layer3MessageContents := omit,
1484 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm
1485 }
1486 }
1487 }
1488}
1489
Harald Welte73cd2712017-12-17 00:44:52 +01001490template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
1491 pdu := {
1492 bssmap := {
1493 cipherModeComplete := {
1494 messageType := '55'O,
1495 layer3MessageContents := *,
1496 chosenEncryptionAlgorithm := {
1497 elementIdentifier := '2C'O,
1498 algorithmIdentifier := alg
1499 }
1500 }
1501 }
1502 }
1503}
1504
1505template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
1506 pdu := {
1507 bssmap := {
1508 cipherModeReject := {
1509 messageType := '59'O,
1510 cause := ?
1511 }
1512 }
1513 }
1514}
1515
Daniel Willmann52918e52018-09-20 14:39:09 +02001516template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := {
1517 pdu := {
1518 bssmap := {
1519 classmarkRequest := {
1520 messageType := '58'O,
1521 talkerPriority := *
1522 }
1523 }
1524 }
1525}
1526
Harald Welte5c2622c2018-01-21 20:45:20 +01001527template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
1528 elementIdentifier := '12'O,
1529 lengthIndicator := 0, /* overwritten */
1530 /* CM1 */
1531 rf_PowerCapability := '010'B, /* class3 */
1532 a5_1 := '0'B, /* supported */
1533 esind := '1'B, /* early classmark supported */
1534 revisionLevel := '10'B, /* R99 */
1535 spare1_1 := '0'B,
1536 /* CM2 */
1537 fc := '1'B, /* E-GSM support */
1538 vgcs := '0'B,
1539 vbs := '0'B,
1540 sm_Capability := '1'B,
1541 ss_ScreenIndicator := '00'B,
1542 ps_Capability := '1'B,
1543 spare2_1 := '0'B,
1544 classmarkInformationType2_oct5 := {
1545 a5_2 := '0'B, /* not available */
1546 a5_3 := '1'B, /* available */
1547 cmsp := '0'B, /* not supported */
1548 solsa := '0'B, /* not suported */
1549 ucs2 := '0'B, /* GSM alphabet preferred */
1550 lcsvacap := '0'B, /* not supported */
1551 spare := '0'B,
1552 cm3 := '0'B /* no CM3 */
1553 }
1554}
1555
Eric Wild26f4a622021-05-17 15:27:05 +02001556
1557template BSSMAP_IE_ClassmarkInformationType3 ts_CM3_default := {
1558 elementIdentifier := '13'O,
1559 lengthIndicator := 0, /* overwritten */
1560 classmark3ValuePart := '01'O /* A5/4 supported */
1561}
1562
Harald Welte5c2622c2018-01-21 20:45:20 +01001563template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
1564 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
1565modifies ts_BSSAP_BSSMAP := {
1566 pdu := {
1567 bssmap := {
1568 classmarkUpdate := {
1569 messageType := '54'O,
1570 classmarkInformationType2 := cm2,
1571 classmarkInformationType3 := cm3,
1572 talkerPriority := omit
1573 }
1574 }
1575 }
1576}
1577
Harald Welte898113b2018-01-31 18:32:21 +01001578template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
1579 template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
1580modifies tr_BSSAP_BSSMAP := {
1581 pdu := {
1582 bssmap := {
1583 classmarkUpdate := {
1584 messageType := '54'O,
1585 classmarkInformationType2 := cm2,
1586 classmarkInformationType3 := cm3,
1587 talkerPriority := *
1588 }
1589 }
1590 }
1591}
1592
Neels Hofmeyr92b12b72018-09-18 14:30:23 +02001593template PDU_BSSAP ts_BSSMAP_ClassmarkRequest
1594modifies ts_BSSAP_BSSMAP := {
1595 pdu := {
1596 bssmap := {
1597 classmarkRequest := {
1598 messageType := '58'O,
1599 talkerPriority := omit
1600 }
1601 }
1602 }
1603}
1604
Eric Wild26f4a622021-05-17 15:27:05 +02001605template PDU_BSSAP tr_BSSMAP_ClassmarkRequest
1606modifies tr_BSSAP_BSSMAP := {
1607 pdu := {
1608 bssmap := {
1609 classmarkRequest := {
1610 messageType := '58'O,
1611 talkerPriority := *
1612 }
1613 }
1614 }
1615}
1616
Harald Welte49518bf2018-02-10 11:39:19 +01001617/* return Layer3 octetstring inside BSSAP PDU */
1618function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
1619 if (ischosen(bssap.pdu.bssmap)) {
1620 var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
1621 if (ischosen(bssmap.completeLayer3Information)) {
1622 return bssmap.completeLayer3Information.layer3Information.layer3info;
1623 } else if (ischosen(bssmap.handoverRequestAck)) {
1624 return bssmap.handoverRequestAck.layer3Information.layer3info;
1625 } else if (ischosen(bssmap.handoverCommand)) {
1626 return bssmap.handoverCommand.layer3Information.layer3info;
1627 } else if (ischosen(bssmap.uplinkRequest)) {
1628 return bssmap.uplinkRequest.layer3Information.layer3info;
1629 } else if (ischosen(bssmap.uplinkRequestConfirmation)) {
1630 return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
1631 } else if (ischosen(bssmap.uplinkApplicationData)) {
1632 return bssmap.uplinkApplicationData.layer3Information.layer3info;
1633 } else if (ischosen(bssmap.rerouteCommand)) {
1634 return bssmap.rerouteCommand.initialLayer3Information.layer3info;
1635 } else {
1636 return omit;
1637 }
1638 } else {
1639 return bssap.pdu.dtap;
1640 }
1641}
1642
Harald Welte0b50aed2018-05-28 22:33:07 +02001643/* TS 29.205 B.2.1.9 */
1644template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := {
1645 networkIDLengthIndicator := 0, /* overwritten */
1646 networkID := net_id,
1647 nodeIDLengthIndicator := 0, /* overwritten */
1648 nodeID := node_id,
1649 callReferenceIDLengthIndicator := 0, /* overwritten */
1650 callReferenceID := cref_id
1651}
1652template GlobalCallReferenceValue tr_GCR(template octetstring net_id,
1653 template OCT2 node_id,
1654 template OCT5 cref_id) := {
1655 networkIDLengthIndicator := ?,
1656 networkID := net_id,
1657 nodeIDLengthIndicator := ?,
1658 nodeID := node_id,
1659 callReferenceIDLengthIndicator := ?,
1660 callReferenceID := cref_id
1661}
1662
1663/* TS 47.008 3.2.2.115 */
1664template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := {
1665 elementIdentifier := '89'O,
1666 lengthIndicator := 0, /* overwritten */
1667 globalCallReferenceValue := gcr
1668}
1669template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := {
1670 elementIdentifier := '89'O,
1671 lengthIndicator := ?,
1672 globalCallReferenceValue := gcr
1673}
1674
1675/* TS 48.008 3.2.2.116 */
1676const BIT4 LCLS_CFG_both_way := '0000'B;
1677const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B;
1678const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B;
1679const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B;
1680const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B;
1681const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B;
1682
1683template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := {
1684 elementIdentifier := '8A'O,
1685 lCLS_ConfigurationValue := cfg_val,
1686 spare := '0000'B
1687}
1688template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := {
1689 elementIdentifier := '8A'O,
1690 lCLS_ConfigurationValue := cfg_val,
1691 spare := '0000'B
1692}
1693
1694/* TS 48.008 3.2.2.117 */
1695const BIT4 LCLS_CSC_connect := '0000'B;
1696const BIT4 LCLS_CSC_do_not_connect := '0001'B;
1697const BIT4 LCLS_CSC_release_lcls := '0010'B;
1698const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B;
1699const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B;
1700
1701template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := {
1702 elementIdentifier := '8B'O,
1703 lCLS_ConnectionStatusControlValue := csc,
1704 spare := '0000'B
1705}
1706template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := {
1707 elementIdentifier := '8B'O,
1708 lCLS_ConnectionStatusControlValue := csc,
1709 spare := '0000'B
1710}
1711
1712/* TS 48.008 3.2.2.119 */
1713const BIT4 LCLS_STS_not_yet_ls := '0000'B;
1714const BIT4 LCLS_STS_not_possible_ls := '0001'B;
1715const BIT4 LCLS_STS_no_longer_ls := '0010'B;
1716const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B;
1717const BIT4 LCLS_STS_locally_switched := '0100'B;
1718
1719template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := {
1720 elementIdentifier := '8D'O,
1721 lCLS_BSS_StatusValue := sts,
1722 spare := '0000'B
1723}
1724template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := {
1725 elementIdentifier := '8D'O,
1726 lCLS_BSS_StatusValue := sts,
1727 spare := '0000'B
1728}
1729
1730/* TS 48.008 3.2.1.91 */
1731template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001732 template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001733 pdu := {
1734 bssmap := {
1735 lCLS_ConnectControl := {
1736 messageType := '74'O,
1737 lCLS_Configuration := cfg,
1738 lCLS_ConnectionStatusControl := csc
1739 }
1740 }
1741 }
1742}
1743template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001744 template BSSMAP_IE_LCLS_ConnectionStatusControl csc)
1745modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001746 pdu := {
1747 bssmap := {
1748 lCLS_ConnectControl := {
1749 messageType := '74'O,
1750 lCLS_Configuration := cfg,
1751 lCLS_ConnectionStatusControl := csc
1752 }
1753 }
1754 }
1755}
1756
1757/* TS 48.008 3.2.1.92 */
Harald Welte354722e2018-06-01 13:15:32 +02001758template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts)
1759modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001760 pdu := {
1761 bssmap := {
1762 lCLS_connectControlAck := {
1763 messageType := '75'O,
1764 lCLS_BSS_Status := sts
1765 }
1766 }
1767 }
1768}
Harald Welte354722e2018-06-01 13:15:32 +02001769template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts)
1770modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001771 pdu := {
1772 bssmap := {
1773 lCLS_connectControlAck := {
1774 messageType := '75'O,
1775 lCLS_BSS_Status := sts
1776 }
1777 }
1778 }
1779}
1780
1781/* TS 48.008 3.2.1.93 */
1782template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001783 template (omit) BSSMAP_IE_LCLS_BreakRequest brq)
1784modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001785 pdu := {
1786 bssmap := {
1787 lCLS_Notification := {
1788 messageType := '76'O,
1789 lCLS_BSS_Status := sts,
1790 lCLS_BreakRequest := brq
1791 }
1792 }
1793 }
1794}
1795template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001796 template BSSMAP_IE_LCLS_BreakRequest brq)
1797modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001798 pdu := {
1799 bssmap := {
1800 lCLS_Notification := {
1801 messageType := '76'O,
1802 lCLS_BSS_Status := sts,
1803 lCLS_BreakRequest := brq
1804 }
1805 }
1806 }
1807}
1808
Harald Weltecc0b0142018-05-29 15:19:33 +02001809template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts)
1810modifies tr_BSSAP_BSSMAP := {
1811 pdu := {
1812 bssmap := {
1813 lCLS_Notification := {
1814 messageType := '76'O,
1815 lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts),
1816 lCLS_BreakRequest := omit
1817 }
1818 }
1819 }
1820}
Harald Welte898113b2018-01-31 18:32:21 +01001821
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001822template PDU_BSSAP ts_BSSMAP_CommonId(hexstring imsi_digits,
1823 template (omit) OCT3 last_eutran_plmn := omit)
Harald Welteeddf0e92020-06-21 19:42:15 +02001824modifies ts_BSSAP_BSSMAP := {
1825 pdu := {
1826 bssmap := {
1827 commonID := {
1828 messageType := '2F'O,
1829 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Pau Espin Pedrold5ba6ce2021-04-15 14:18:13 +02001830 sNAAccessInformation := omit,
1831 selectedPLMNId := omit,
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001832 lastUsedEUTRANPLMNId := f_ts_BSSMAP_LastUsedEUTRANPLMNId(last_eutran_plmn)
Harald Welteeddf0e92020-06-21 19:42:15 +02001833 }
1834 }
1835 }
1836}
1837
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001838template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits,
1839 template BSSAMAP_IE_LastUsedEUTRANPLMNId lastUsedEUTRANPLMNId := *)
Harald Welteeddf0e92020-06-21 19:42:15 +02001840modifies tr_BSSAP_BSSMAP := {
1841 pdu := {
1842 bssmap := {
1843 commonID := {
1844 messageType := '2F'O,
1845 iMSI := tr_BSSMAP_Imsi(imsi_digits),
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001846 sNAAccessInformation := *,
1847 selectedPLMNId := *,
1848 lastUsedEUTRANPLMNId := lastUsedEUTRANPLMNId
Harald Welteeddf0e92020-06-21 19:42:15 +02001849 }
1850 }
1851 }
1852}
Harald Welte898113b2018-01-31 18:32:21 +01001853
Vadim Yanitskiy48063962020-08-28 07:49:44 +07001854template PDU_BSSAP tr_BSSMAP_SAPInReject(template (present) GsmSapi sapi := ?,
1855 template BSSMAP_IE_Cause cause := ?)
1856modifies tr_BSSAP_BSSMAP := {
1857 pdu := {
1858 bssmap := {
1859 sAPInReject := {
1860 messageType := '25'O,
1861 dLCI := {
1862 elementIdentifier := '18'O,
1863 sapiValue := f_tr_SAPI(sapi),
1864 spare := ?,
1865 c1 := ?, c2 := ?
1866 },
1867 cause := cause
1868 }
1869 }
1870 }
1871}
1872
1873private function f_tr_SAPI(template (present) GsmSapi sapi)
1874return template (present) BIT3 {
1875 if (istemplatekind(sapi, "?")) {
1876 return ?;
1877 } else {
1878 return int2bit(valueof(sapi), 3);
1879 }
1880}
1881
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001882template (value) BSSMAP_IE_LocationType ts_BSSMAP_IE_LocationType
1883:= {
1884 elementIdentifier := '44'O,
1885 lengthIndicator := 1,
1886 locationInformation := '00'O,
1887 positioningMethod := omit
1888}
Harald Welte73cd2712017-12-17 00:44:52 +01001889
Vadim Yanitskiy2ae269b2022-03-23 14:51:27 +03001890template (value) BSSMAP_IE_LCSClientType
1891ts_BSSMAP_IE_LCSClientType(template (value) BIT4 category := '0010'B,
1892 template (value) BIT4 subtype := '0000'B) := {
1893 elementIdentifier := '48'O,
1894 lengthIndicator := 0, /* overwritten */
1895 subtype := subtype,
1896 category := category
1897}
1898
Vadim Yanitskiydcbdb822022-03-23 15:11:45 +03001899template (value) BSSMAP_IE_LCSPriority
1900ts_BSSMAP_IE_LCSPriority(template (value) OCT1 priority := '00'O) := {
1901 elementIdentifier := '43'O,
1902 lengthIndicator := 0, /* overwritten */
1903 priority := priority
1904}
1905
1906template (value) BSSMAP_IE_LCSQOS
1907ts_BSSMAP_IE_LCSQOS(template (value) BIT1 vCI := '0'B,
1908 template (value) BIT1 vEL := '0'B,
1909 template (value) BIT1 hAI := '1'B,
1910 template (value) BIT7 hAV := '0010010'B,
1911 template (value) BIT1 vAI := '0'B,
1912 template (value) BIT7 vAV := '0000000'B) := {
1913 elementIdentifier := '3E'O,
1914 lengthIndicator := 0, /* overwritten */
1915 vCI := vCI, /* Vertical Coordinate Indicator: VC requested ('1'B) or not ('0'B) */
1916 vEL := vEL, /* report velocity if available (1) or not(0) */
1917 spare_1_6 := '000000'B,
1918 horizontalAccuracy := hAV, /* Accuracy Horizontal (HA) */
1919 hAI := hAI, /* Horizontal Accuracy Indicator HA is specified (1) or not (0) */
1920 verticalAccuracy := vAV, /* Accuracy Vertical (VA) */
1921 vAI := vAI, /* Vertical Accuracy Indicator VA is specified (1) or not (0) */
1922 spare_2_6 := '000000'B,
1923 rTC := '00'B /* Response Time is not specified */
1924}
1925
Vadim Yanitskiy2ae269b2022-03-23 14:51:27 +03001926template (value) PDU_BSSAP
1927ts_BSSMAP_Perform_Location_Request(template (omit) BSSMAP_IE_IMSI imsi,
1928 template (omit) BSSMAP_IE_CellIdentifier cellIdentifier := omit,
Vadim Yanitskiydcbdb822022-03-23 15:11:45 +03001929 template (omit) BSSMAP_IE_LCSClientType clientType := ts_BSSMAP_IE_LCSClientType,
1930 template (omit) BSSMAP_IE_LCSPriority priority := ts_BSSMAP_IE_LCSPriority,
1931 template (omit) BSSMAP_IE_LCSQOS qos := ts_BSSMAP_IE_LCSQOS)
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001932modifies ts_BSSAP_BSSMAP := {
1933 pdu := {
1934 bssmap := {
1935 performLocationRequest := {
1936 messageType := '2B'O,
1937 locationType := ts_BSSMAP_IE_LocationType,
1938 cellIdentifier := cellIdentifier,
1939 classmarkInformationType3 := omit,
Vadim Yanitskiy2ae269b2022-03-23 14:51:27 +03001940 lCS_ClientType := clientType,
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001941 chosenChannel := omit,
Vadim Yanitskiydcbdb822022-03-23 15:11:45 +03001942 lCS_Priority := priority,
1943 lCS_QOS := qos,
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001944 gPS_AssistanceData := omit,
1945 aPDU := omit,
1946 iMSI := imsi,
1947 iMEI := omit,
1948 gANSS_LocationType := omit,
1949 gANSS_AssistanceData := omit
1950 }
1951 }
1952 }
1953}
1954
1955template (present) BSSMAP_IE_LocationEstimate tr_BSSMAP_IE_LocationEstimate(template (present) octetstring geo_loc := ?)
1956:= {
1957 elementIdentifier := '45'O,
1958 lengthIndicator := ?,
1959 geographicLocation := geo_loc
1960}
1961
1962function tr_BSSMAP_LcsCause(template (present) BSSMAP_LcsCause cause)
1963return template (omit) BSSMAP_IE_LCSCause {
1964 if (istemplatekind(cause, "omit")) {
1965 return omit;
1966 }
1967 var template BSSMAP_IE_LCSCause ie := {
1968 elementIdentifier := '47'O,
1969 lengthIndicator := 1,
1970 causeValue := int2bit(enum2int(valueof(cause)), 8),
1971 diagnosticValue := omit
1972 }
1973 return ie;
1974}
1975
1976template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Response(
1977 template BSSMAP_IE_LocationEstimate locationEstimate := *,
1978 template BSSMAP_IE_PositioningData positioningData := *,
1979 template BSSMAP_IE_LCSCause lCS_Cause := *
1980 )
1981modifies tr_BSSAP_BSSMAP := {
1982 pdu := {
1983 bssmap := {
1984 performLocationResponse := {
1985 messageType := '2D'O,
1986 locationEstimate := locationEstimate,
1987 positioningData := positioningData,
1988 decipheringKeys := *,
1989 lCS_Cause := lCS_Cause,
1990 velocityEstimate := *,
1991 gANSS_PositioningData := *
1992 }
1993 }
1994 }
1995}
1996
1997template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Abort(template (present) BSSMAP_IE_LCSCause lCS_Cause := ?)
1998modifies tr_BSSAP_BSSMAP := {
1999 pdu := {
2000 bssmap := {
2001 performLocationAbort := {
2002 messageType := '2E'O,
2003 lCS_Cause := lCS_Cause
2004 }
2005 }
2006 }
2007}
Harald Weltec859df52017-11-24 23:41:41 +01002008
Harald Welteb69533d2017-12-15 13:55:17 +01002009} with { encode "RAW" };