blob: 8049bb01e051ebe1ff7e38a0794c0f1e0c8141b8 [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
Harald Welte420c6b02020-08-21 11:54:30 +0200235template (value) BSSMAP_IE_Osmo_OsmuxSupport tr_BSSMAP_IE_Osmo_OsmuxSupport := {
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200236 elementIdentifier := 'F0'O
237}
238
Harald Welte420c6b02020-08-21 11:54:30 +0200239private function f_enc_osmux_support(boolean osmux_enabled) return template (omit) BSSMAP_IE_Osmo_OsmuxSupport {
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200240 if (osmux_enabled) {
241 return tr_BSSMAP_IE_Osmo_OsmuxSupport;
242 }
243 return omit;
244}
245
246template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause, boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100247 pdu := {
248 bssmap := {
249 reset := {
250 messageType := '30'O,
251 cause := ts_BSSMAP_IE_Cause(cause),
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200252 a_InterfaceSelectorForReset := omit,
253 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100254 }
255 }
256 }
257}
258
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200259template PDU_BSSAP tr_BSSMAP_Reset(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100260 pdu := {
261 bssmap := {
262 reset := {
263 messageType := '30'O,
264 cause := ?,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200265 a_InterfaceSelectorForReset := *,
266 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Welte365f4ed2017-11-23 00:00:43 +0100267 }
268 }
269 }
270}
271
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200272template (value) PDU_BSSAP ts_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100273 pdu := {
274 bssmap := {
275 resetAck := {
276 messageType := '31'O,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200277 a_InterfaceSelectorForReset := omit,
278 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100279 }
280 }
281 }
282}
283
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200284template PDU_BSSAP tr_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100285 pdu := {
286 bssmap := {
287 resetAck := {
288 messageType := '31'O,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200289 a_InterfaceSelectorForReset := *,
290 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100291 }
292 }
293 }
294}
295
296template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
297 elementIdentifier := '05'O,
298 lengthIndicator := 0,
299 cellIdentifierDiscriminator := '0000'B,
300 spare1_4 := '0000'B,
301 cellIdentification := ?
302}
303
304type uint16_t BssmapLAC;
305type uint16_t BssmapCI;
306
Harald Welteae8ce232018-01-21 13:56:46 +0100307template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100308modifies ts_BSSMAP_IE_CellID := {
309 cellIdentification := {
Harald Welteae8ce232018-01-21 13:56:46 +0100310 cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100311 }
312}
Harald Weltec76f29f2017-11-22 12:46:46 +0100313
314template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
315modifies ts_BSSMAP_IE_CellID := {
316 cellIdentification := {
317 cI_LAC_CI := {
318 lac := int2oct(lac, 2),
319 ci := int2oct(ci, 2)
320 }
321 }
322}
323
324template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
325modifies ts_BSSMAP_IE_CellID := {
326 cellIdentification := {
327 cI_CI := int2oct(ci, 2)
328 }
329}
330
331template BSSMAP_IE_CellIdentifier ts_CellId_none
332modifies ts_BSSMAP_IE_CellID := {
333 cellIdentification := {
334 cI_noCell := ''O
335 }
336}
337
338
339template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
340 elementIdentifier := '17'O,
341 lengthIndicator := 0,
342 layer3info := l3info
343}
344
Harald Weltef8a0bda2017-12-09 00:53:17 +0100345template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
346 elementIdentifier := '17'O,
347 lengthIndicator := ?,
348 layer3info := l3info
349}
350
351
Harald Weltec76f29f2017-11-22 12:46:46 +0100352template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
353modifies ts_BSSAP_BSSMAP := {
354 pdu := {
355 bssmap := {
356 completeLayer3Information := {
357 messageType := '57'O,
358 cellIdentifier := cell_id,
359 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
360 chosenChannel := omit,
361 lSAIdentifier := omit,
362 aPDU := omit,
363 codecList := omit,
364 redirectAttemptFlag := omit,
365 sendSequenceNumber := omit,
366 iMSI := omit
367 }
368 }
369 }
370}
371
Harald Weltef8a0bda2017-12-09 00:53:17 +0100372template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
373 template BSSMAP_IE_CellIdentifier cell_id := ?)
374modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100375 pdu := {
376 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100377 completeLayer3Information := {
378 messageType := '57'O,
379 cellIdentifier := cell_id,
380 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
381 chosenChannel := *,
382 lSAIdentifier := *,
383 aPDU := *,
384 codecList := *,
385 redirectAttemptFlag := *,
386 sendSequenceNumber := *,
387 iMSI := *
388 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100389 }
390 }
391}
392
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200393template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {
Harald Welte28d943e2017-11-25 15:00:50 +0100394 elementIdentifier := '1A'O,
395 lengthIndicator := 0, /* overwritten */
396 cellIdentifierDiscriminator := '0000'B, /* overwritten */
397 spare1_4 := '0000'B,
398 cellIdentificationList := cid_list
399}
Harald Welte365f4ed2017-11-23 00:00:43 +0100400
Harald Welte4bf5fc92017-12-15 13:56:06 +0100401const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100402const OCT1 ChRate_TCHF := '08'O;
403const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100404const OCT1 ChRate_TCHForH_Fpref := '0A'O;
405const OCT1 ChRate_TCHForH_Hpref := '0B'O;
406const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
407const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
408const OCT1 ChRate_TCHForH := '0F'O;
409const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100410
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100411const OCT1 Spdi_TCHF_FR := '01'O;
412const OCT1 Spdi_TCHF_EFR := '11'O;
413const OCT1 Spdi_TCHF_AMR := '21'O;
414const OCT1 Spdi_TCHH_HR := '05'O;
415const OCT1 Spdi_TCHH_AMR := '25'O;
416
Harald Welte365f4ed2017-11-23 00:00:43 +0100417template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
418 elementIdentifier := '0B'O, /* overwritten */
419 lengthIndicator := 0, /* overwritten */
420 speechOrDataIndicator := '0001'B, /* speech */
421 spare1_4 := '0000'B,
422 channelRateAndType := ChRate_TCHF,
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100423 speechId_DataIndicator := Spdi_TCHF_FR
Harald Welte365f4ed2017-11-23 00:00:43 +0100424}
425
Harald Welte4bf5fc92017-12-15 13:56:06 +0100426template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
427 speechOrDataIndicator := '0100'B /* speech + CTM */
428}
429
430template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
431 elementIdentifier := '0B'O, /* overwritten */
432 lengthIndicator := 0, /* overwritten */
433 speechOrDataIndicator := '0010'B, /* data */
434 spare1_4 := '0000'B,
435 channelRateAndType := ChRate_TCHF,
436 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
437}
438
439template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
440 elementIdentifier := '0B'O, /* overwritten */
441 lengthIndicator := 0, /* overwritten */
442 speechOrDataIndicator := '0011'B, /* data */
443 spare1_4 := '0000'B,
444 channelRateAndType := ChRate_ANY,
445 speechId_DataIndicator := '00'O /* spare */
446}
447
448template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
449 elementIdentifier := '0A'O,
450 lengthIndicator := 0, /* overwritten */
451 permittedAlgorithms := algs,
452 key := kc
453}
454
Harald Welte16114282018-01-24 22:41:21 +0100455template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
456 elementIdentifier := '0A'O,
457 lengthIndicator := ?, /* overwritten */
458 permittedAlgorithms := algs,
459 key := kc
460}
461
462
Harald Welte4bf5fc92017-12-15 13:56:06 +0100463
Harald Welte365f4ed2017-11-23 00:00:43 +0100464template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
465 elementIdentifier := '01'O, /* overwritten */
466 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
467 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
468}
469
Pau Espin Pedrol43021cb2019-06-18 17:32:15 +0200470function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {
471 var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
472 return cic;
473}
474
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100475template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100476 uint16_t udp_port,
477 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100478 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100479 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100480 ipAddress := addr,
481 uDPPortValue := udp_port
482}
Harald Welte235ebf12017-12-15 14:18:16 +0100483template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100484 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100485template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100486 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100487
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200488function f_ts_BSSMAP_IE_AoIP_TLA(charstring addr, uint16_t udp_port)
489 return template (value) BSSMAP_IE_AoIP_TransportLayerAddress {
490 if (f_addr_is_ipv6(addr)) {
491 var OCT16 ip6 := f_inet6_addr(addr);
492 return ts_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
493 } else {
494 var OCT4 ip := f_inet_addr(addr);
495 return ts_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
496 }
497}
498
Neels Hofmeyr3c89a6b2019-10-15 16:54:37 +0200499template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr,
500 template uint16_t udp_port,
501 template integer len := ?) := {
502 elementIdentifier := '7C'O,
503 lengthIndicator := len,
504 ipAddress := addr,
505 uDPPortValue := udp_port
506}
507template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) :=
508 tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
509template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) :=
510 tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
511
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200512function f_tr_BSSMAP_IE_AoIP_TLA(charstring addr, template uint16_t udp_port)
513 return template BSSMAP_IE_AoIP_TransportLayerAddress {
514 if (f_addr_is_ipv6(addr)) {
515 var OCT16 ip6 := f_inet6_addr(addr);
516 return tr_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
517 } else {
518 var OCT4 ip := f_inet_addr(addr);
519 return tr_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
520 }
521}
522
Harald Welte4bf5fc92017-12-15 13:56:06 +0100523template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
524 elementIdentifier := '83'O,
525 kC128_Value := kc128
526}
527
Harald Weltef1b64e22017-12-15 14:55:14 +0100528/* 3.2.2.103 */
529template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
530 codecType := GSM_FR,
531 tF := '0'B,
532 pT := '0'B,
533 pI := '0'B,
534 fI := '1'B,
535 extendedCodecType := omit,
536 s0_7 := omit,
537 s8_15 := omit
538}
539template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
540 codecType := GSM_FR
541}
542template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
543 codecType := GSM_EFR
544}
545template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
546 codecType := GSM_HR
547}
548template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
549 codecType := FR_AMR,
550 s0_7 := '11111111'B,
551 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
552}
553template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
554 codecType := HR_AMR,
555 s0_7 := '00111111'B,
556 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
557}
558template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
559 elementIdentifier := '7D'O,
560 lengthIndicator := 0, /* overwritten */
561 codecElements := valueof(elem)
562}
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100563template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := {
564 elementIdentifier := '7E'O,
565 lengthIndicator := 0, /* overwritten */
566 codecElements := valueof(elem)
567}
Harald Weltef1b64e22017-12-15 14:55:14 +0100568
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200569template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := {
570 elementIdentifier := 'F1'O,
571 osmuxCID := cid
572}
573
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100574template PDU_BSSAP
575ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200576 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
577 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100578modifies ts_BSSAP_BSSMAP := {
579 pdu := {
580 bssmap := {
581 assignmentRequest := {
582 messageType :='01'O, /* overwritten */
583 channelType := ts_BSSMAP_IE_ChannelType,
584 layer3HeaderInfo := omit,
585 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100586 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100587 downLinkDTX_Flag := omit,
588 interferenceBandToBeUsed := omit,
589 classmarkInformationType2 := omit,
590 groupCallReference := omit,
591 talkerFlag := omit,
592 configurationEvolutionIndication := omit,
593 lsaAccesControlSuppression := omit,
594 serviceHandover := omit,
595 encryptionInformation := omit,
596 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100597 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100598 codecList := omit,
599 callIdentifier := omit,
600 kC128 := omit,
601 globalCallReference := omit,
602 lCLS_Configuration := omit,
603 lCLS_ConnectionStatusControl := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200604 lCLS_CorrelationNotNeeded := omit,
605 osmuxCID := osmuxCID
Harald Welte365f4ed2017-11-23 00:00:43 +0100606 }
607 }
608 }
609}
Harald Weltec76f29f2017-11-22 12:46:46 +0100610
Harald Weltebe48a7c2018-01-26 21:39:25 +0100611template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200612 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
613 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltebe48a7c2018-01-26 21:39:25 +0100614modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100615 pdu := {
616 bssmap := {
617 assignmentRequest := {
618 messageType :='01'O, /* overwritten */
619 channelType := ?,
620 layer3HeaderInfo := *,
621 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100622 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100623 downLinkDTX_Flag := *,
624 interferenceBandToBeUsed := *,
625 classmarkInformationType2 := *,
626 groupCallReference := *,
627 talkerFlag := *,
628 configurationEvolutionIndication := *,
629 lsaAccesControlSuppression := *,
630 serviceHandover := *,
631 encryptionInformation := *,
632 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100633 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100634 codecList := *,
635 callIdentifier := *,
636 kC128 := *,
637 globalCallReference := *,
638 lCLS_Configuration := *,
639 lCLS_ConnectionStatusControl := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200640 lCLS_CorrelationNotNeeded := *,
641 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100642 }
643 }
644 }
645}
646
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100647template PDU_BSSAP
648ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100649 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200650 template BSSMAP_IE_SpeechCodec speechCodec := omit,
651 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100652modifies ts_BSSAP_BSSMAP := {
653 pdu := {
654 bssmap := {
655 assignmentComplete := {
656 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100657 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100658 circuitIdentityCode := cic,
659 cellIdentifier := omit,
660 chosenChannel := omit,
661 chosenEncryptionAlgorithm := omit,
662 circuitPool := omit,
663 speechVersion := omit,
664 lSAIdentifier := omit,
665 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100666 aoIPTransportLayer := aoip,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100667 speechCodec := speechCodec,
Harald Welteb3414b22017-11-23 18:22:10 +0100668 codecList := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200669 lCLS_BSS_Status := omit,
670 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100671 }
672 }
673 }
674}
675
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100676template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200677 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
678 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100679modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100680 pdu := {
681 bssmap := {
682 assignmentComplete := {
683 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100684 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100685 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100686 cellIdentifier := *,
687 chosenChannel := *,
688 chosenEncryptionAlgorithm := *,
689 circuitPool := *,
690 speechVersion := *,
691 lSAIdentifier := *,
692 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100693 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100694 speechCodec := *,
695 codecList := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200696 lCLS_BSS_Status := *,
697 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100698 }
699 }
700 }
701}
702
Harald Welte16a4adf2017-12-14 18:54:01 +0100703template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
704 pdu := {
705 bssmap := {
706 assignmentFailure := {
707 messageType := '03'O, /* overwritten */
708 rR_Cause := *,
709 circuitPool := *,
710 circuitPoolList := *,
711 talkerPriority := *,
712 codecList := *
713 }
714 }
715 }
716}
717
718
Harald Welteb3414b22017-11-23 18:22:10 +0100719template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
720modifies ts_BSSAP_BSSMAP := {
721 pdu := {
722 bssmap := {
723 clearCommand := {
724 messageType := '20'O, /* overwritten */
725 layer3HeaderInfo := omit,
726 cause := ts_BSSMAP_IE_Cause(cause),
727 cSFB_Indication := omit
728 }
729 }
730 }
731}
Harald Welte99787102019-02-04 10:41:36 +0100732template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause)
733modifies ts_BSSMAP_ClearCommand := {
734 pdu := {
735 bssmap := {
736 clearCommand := {
737 cSFB_Indication := {
738 elementIdentifier := '8F'O
739 }
740 }
741 }
742 }
743}
Harald Welteb3414b22017-11-23 18:22:10 +0100744
745template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
746 pdu := {
747 bssmap := {
748 clearCommand := {
749 messageType := '20'O, /* overwritten */
750 layer3HeaderInfo := *,
751 cause := ?,
752 cSFB_Indication := *
753 }
754 }
755 }
756}
757
Harald Welte4c422b72019-02-17 16:27:10 +0100758template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := {
759 pdu := {
760 bssmap := {
761 clearCommand := {
762 messageType := '20'O, /* overwritten */
763 layer3HeaderInfo := *,
764 cause := ?,
765 cSFB_Indication := {
766 elementIdentifier := '8F'O
767 }
768 }
769 }
770 }
771}
772
Harald Welteb3414b22017-11-23 18:22:10 +0100773template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
774modifies ts_BSSAP_BSSMAP := {
775 pdu := {
776 bssmap := {
777 clearComplete := {
778 messageType := '21'O /* overwritten */
779 }
780 }
781 }
782}
783
Harald Weltec859df52017-11-24 23:41:41 +0100784template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
785 pdu := {
786 bssmap := {
787 clearComplete := {
788 messageType := '21'O
789 }
790 }
791 }
792}
793
Harald Weltebc881782018-01-23 20:09:15 +0100794template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
795modifies ts_BSSAP_BSSMAP := {
796 pdu := {
797 bssmap := {
798 clearRequest := {
799 messageType := '22'O, /* overwritten */
800 cause := ts_BSSMAP_IE_Cause(cause)
801 }
802 }
803 }
804}
805
Harald Weltecfa79ad2017-12-09 22:33:47 +0100806template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
807 pdu := {
808 bssmap := {
809 clearRequest := {
810 messageType := '22'O, /* overwritten */
811 cause := ?
812 }
813 }
814 }
815}
816
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200817template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,
818 template BSSMAP_FIELD_CellIdentificationList cid_list)
819modifies ts_BSSAP_BSSMAP := {
820 pdu := {
821 bssmap := {
822 handoverRequired := {
823 messageType := '11'O,
824 cause := ts_BSSMAP_IE_Cause(cause),
825 responseRequest := omit,
826 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
827 circuitPoolList := omit,
828 currentChannelType1 := omit,
829 speechVersion := omit,
830 queueingIndicator := omit,
831 oldToNewBSSInfo := omit,
832 sourceToTargetRNCTransparentInfo := omit,
833 sourceToTargetRNCTransparentInfoCDMA := omit,
834 gERANClassmark := omit,
835 talkerPriority := omit,
836 speechCodec := omit,
837 cSG_Identifier := omit
838 }
839 }
840 }
841}
842
843
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100844template PDU_BSSAP tr_BSSMAP_HandoverRequired modifies tr_BSSAP_BSSMAP := {
845 pdu := {
846 bssmap := {
847 handoverRequired := {
848 messageType := '11'O
849 }
850 }
851 }
852}
853
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200854template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {
855 pdu := {
856 bssmap := {
857 handoverRequiredReject := {
858 messageType := '1A'O
859 }
860 }
861 }
862}
863
864template PDU_BSSAP tr_BSSMAP_HandoverCommand
865modifies tr_BSSAP_BSSMAP := {
866 pdu := {
867 bssmap := {
868 handoverCommand := {
869 messageType := '13'O
870 }
871 }
872 }
873}
874
875template PDU_BSSAP tr_BSSMAP_HandoverSucceeded
876modifies tr_BSSAP_BSSMAP := {
877 pdu := {
878 bssmap := {
879 handoverSucceeded := {
880 messageType := '15'O
881 }
882 }
883 }
884}
885
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100886template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)
887modifies ts_BSSAP_BSSMAP := {
888 pdu := {
889 bssmap := {
890 handoverCommand := {
891 messageType := '13'O,
892 layer3Information := {
893 elementIdentifier := '17'O,
894 lengthIndicator := 0,
895 layer3info := layer3info
896 },
897 cellIdentifier := omit,
898 newBSSToOldBSSInfo := omit,
899 talkerPriority := omit
900 }
901 }
902 }
903}
904
Neels Hofmeyr61ebb8b2018-10-09 18:28:06 +0200905template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := {
906 pdu := {
907 bssmap := {
908 handoverFailure := {
909 messageType := '16'O,
910 cause := ?,
911 rR_Cause := *,
912 circuitPool := *,
913 circuitPoolList := *,
914 gERANClassmark := *,
915 newBSSToOldBSSInfo := *,
916 interSystemInformation := *,
917 talkerPriority := *,
918 codecList := *
919 }
920 }
921 }
922}
923
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200924template PDU_BSSAP tr_BSSMAP_HandoverRequest modifies tr_BSSAP_BSSMAP := {
925 pdu := {
926 bssmap := {
927 handoverRequest := {
928 messageType := '10'O
929 }
930 }
931 }
932}
933
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100934template PDU_BSSAP ts_BSSMAP_HandoverRequest(
935 template BSSMAP_IE_CircuitIdentityCode cic := omit,
936 template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,
937 template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0),
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +0200938 template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1),
939 template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100940 )
941modifies ts_BSSAP_BSSMAP := {
942 pdu := {
943 bssmap := {
944 handoverRequest := {
945 messageType := '10'O,
946 channelType := ts_BSSMAP_IE_ChannelType,
947 encryptionInformation :=
948 ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O),
949 classmarkInformationType := {
950 classmarkInformationType1 := {
951 elementIdentifier := '1D'O,
952 rf_PowerCapability := '000'B,
953 a5_1 := '0'B,
954 esind := '0'B,
955 revisionLevel := '10'B,
956 spare1_1 := '0'B
957 }
958 },
959 cellIdentifierSource := cell_id_source,
960 priority := omit,
961 circuitIdentityCode := cic,
962 downLinkDTX_Flag := omit,
963 cellIdentifierTarget := cell_id_target,
964 interferenceBandToBeUsed := omit,
965 cause := omit,
966 classmarkInformationType3 := omit,
967 currentChannelType1 := omit,
968 speechVersion := omit,
969 groupCallReference := omit,
970 talkerFlag := omit,
971 configurationEvolutionIndication := omit,
972 chosenEncryptionAlgorithm := omit,
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +0200973 oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100974 lSAInformation := omit,
975 lSAAccessControlSuppression := omit,
976 serviceHandover := omit,
977 iMSI_bssmap := omit,
978 sourceToTargetRNCTransparentInfo := omit,
979 sourceToTargetRNCTransparentInfoCDMA := omit,
980 sNAAccessInformation := omit,
981 talkerPriority := omit,
982 aoIPTransportLayer := aoip_tla,
983 codecList := omit,
984 callIdentifier := omit,
985 kC128 := omit,
986 globalCallReference := omit,
987 lCLS_Configuration := omit,
988 connectionStatusControl := omit
989 }
990 }
991 }
992}
993
994template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info)
995modifies tr_BSSAP_BSSMAP := {
996 pdu := {
997 bssmap := {
998 handoverRequestAck := {
999 messageType := '12'O,
1000 layer3Information := {
1001 elementIdentifier := '17'O,
1002 lengthIndicator := ?,
1003 layer3info := layer3info
1004 }
1005 }
1006 }
1007 }
1008}
1009
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001010template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(
1011 template octetstring layer3info,
1012 template LIN1 layer3infoLength,
1013 template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,
1014 template BSSMAP_IE_SpeechCodec speechCodec := omit,
1015 template BSSMAP_IE_ChosenChannel chosenChannel := omit,
1016 template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)
1017modifies ts_BSSAP_BSSMAP := {
1018 pdu := {
1019 bssmap := {
1020 handoverRequestAck := {
1021 messageType := '12'O,
1022 layer3Information := {
1023 elementIdentifier := '17'O,
1024 lengthIndicator := layer3infoLength,
1025 layer3info := layer3info
1026 },
1027 chosenChannel := chosenChannel,
1028 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
1029 circuitPool := omit,
1030 speechVersion := omit,
1031 circuitIdentityCode := omit,
1032 lSAIdentifier := omit,
1033 newBSSToOldBSSInfo := omit,
1034 interSystemInformation := omit,
1035 talkerPriority := omit,
1036 aoIPTransportLayer := aoIPTransportLayer,
1037 codecList := omit,
1038 speechCodec := speechCodec,
1039 lCLS_bSS_Status := omit
1040 }
1041 }
1042 }
1043}
1044
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001045template PDU_BSSAP tr_BSSMAP_HandoverDetect
1046modifies tr_BSSAP_BSSMAP := {
1047 pdu := {
1048 bssmap := {
1049 handoverDetect := {
1050 messageType := '1B'O,
1051 talkerPriority := *
1052 }
1053 }
1054 }
1055}
1056
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001057template PDU_BSSAP ts_BSSMAP_HandoverDetect
1058modifies ts_BSSAP_BSSMAP := {
1059 pdu := {
1060 bssmap := {
1061 handoverDetect := {
1062 messageType := '1B'O,
1063 talkerPriority := omit
1064 }
1065 }
1066 }
1067}
1068
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001069template PDU_BSSAP tr_BSSMAP_HandoverComplete
1070modifies tr_BSSAP_BSSMAP := {
1071 pdu := {
1072 bssmap := {
1073 handoverComplete := {
1074 messageType := '14'O,
1075 rR_Cause := *,
1076 talkerPriority := *,
1077 speechCodec := *,
1078 codecList := *,
1079 chosenEncryptionAlgorithm := *,
1080 chosenChannel := *,
1081 lCLS_BSS_Status := *
1082 }
1083 }
1084 }
1085}
Harald Weltecfa79ad2017-12-09 22:33:47 +01001086
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001087template PDU_BSSAP ts_BSSMAP_HandoverComplete
1088modifies ts_BSSAP_BSSMAP := {
1089 pdu := {
1090 bssmap := {
1091 handoverComplete := {
1092 messageType := '14'O,
1093 rR_Cause := omit,
1094 talkerPriority := omit,
1095 speechCodec := omit,
1096 codecList := omit,
1097 chosenEncryptionAlgorithm := omit,
1098 chosenChannel := omit,
1099 lCLS_BSS_Status := omit
1100 }
1101 }
1102 }
1103}
1104
Philipp Maieraee60392018-11-05 17:09:00 +01001105template PDU_BSSAP tr_BSSMAP_HandoverPerformed
1106modifies tr_BSSAP_BSSMAP := {
1107 pdu := {
1108 bssmap := {
1109 handoverPerformed := {
1110 messageType := '17'O,
1111 cause := ?,
1112 cellIdentifier := ?,
Philipp Maier8d33a132018-11-12 11:58:55 +01001113 chosenChannel := *,
1114 chosenEncryptionAlgorithm := *,
1115 speechVersion := *,
1116 lSAIdentifier := *,
1117 talkerPriority := *,
1118 codecList := *,
1119 speechCodec := *,
1120 lCLS_BSS_Status := *
Philipp Maieraee60392018-11-05 17:09:00 +01001121 }
1122 }
1123 }
1124}
1125
Harald Welte28d943e2017-11-25 15:00:50 +01001126template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
1127 elementIdentifier := '08'O,
1128 lengthIndicator := 0, /* overwritten */
1129 typeOfIdentity := '001'B, /* IMSI */
1130 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
1131 digits := imsi_digits
1132}
1133
Harald Welte17d21152018-01-27 00:47:11 +01001134template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
1135 elementIdentifier := '08'O,
1136 lengthIndicator := ?, /* overwritten */
1137 typeOfIdentity := '001'B, /* IMSI */
1138 oddEvenIndicator := ?,
1139 digits := imsi_digits
1140}
1141
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001142template (value) BSSAMAP_IE_LastUsedEUTRANPLMNId ts_BSSMAP_LastUsedEUTRANPLMNId(OCT3 mcc_mnc) := {
1143 elementIdentifier := '95'O,
1144 mcc_mnc := mcc_mnc
1145}
1146
1147function f_ts_BSSMAP_LastUsedEUTRANPLMNId(template (omit) OCT3 mcc_mnc)
1148 return template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId {
1149 if (not istemplatekind(mcc_mnc, "omit")) {
1150 return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
1151 } else {
1152 return omit;
1153 }
1154}
1155
Harald Welte72cecfa2017-12-11 19:50:14 +01001156template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
1157 cIl_noCell := ''O
1158}
Harald Welteaba42162019-06-19 18:17:59 +02001159template (value) BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_BSS := {
1160 cIl_allInBSS := ''O
1161}
1162template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_BSS := {
1163 cIl_allInBSS := ''O
1164}
1165
1166template (value) BSSMAP_FIELD_CellIdentificationList
1167 ts_BSSMAP_CIL_CGI(template (value) BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1168 cIl_CGI := cgil
1169}
1170template BSSMAP_FIELD_CellIdentificationList
1171 tr_BSSMAP_CIL_CGI(template BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1172 cIl_CGI := cgil
1173}
1174
1175template (value) BSSMAP_FIELD_CellIdentificationList
1176 ts_BSSMAP_CIL_LAC_CI(template (value) BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1177 cIl_LAC_CI := lac_cil
1178}
1179template BSSMAP_FIELD_CellIdentificationList
1180 tr_BSSMAP_CIL_LAC_CI(template BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1181 cIl_LAC_CI := lac_cil
1182}
1183
1184template (value) BSSMAP_FIELD_CellIdentificationList
1185 ts_BSSMAP_CIL_CI(template (value) RecordOfOCT2 cil) := {
1186 cIl_CI := cil
1187}
1188template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_CI(template RecordOfOCT2 cil) := {
1189 cIl_CI := cil
1190}
1191
1192template (value) BSSMAP_FIELD_CellIdentificationList
1193 ts_BSSMAP_CIL_LAI(template (value) BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1194 cIl_LAI := lail
1195}
1196template BSSMAP_FIELD_CellIdentificationList
1197 tr_BSSMAP_CIL_LAI(template BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1198 cIl_LAI := lail
1199}
1200
1201template (value) BSSMAP_FIELD_CellIdentificationList
1202 ts_BSSMAP_CIL_LAC(template (value) RecordOfOCT2 lacl) := {
1203 cIl_LAC := lacl
1204}
1205template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOfOCT2 lacl) := {
1206 cIl_LAC := lacl
1207}
1208
Harald Welte72cecfa2017-12-11 19:50:14 +01001209
1210private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte24135bd2018-03-17 19:27:53 +01001211 if (lengthof(mnc) == 2) {
1212 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
Stefan Sperling83348bc2018-03-14 17:44:40 +01001213 } else {
1214 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
1215 }
Harald Welte72cecfa2017-12-11 19:50:14 +01001216}
1217
Harald Welteaba42162019-06-19 18:17:59 +02001218template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001219 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1220 lac := int2oct(lac, 2),
1221 ci := int2oct(ci, 2)
1222}
1223
Harald Welteaba42162019-06-19 18:17:59 +02001224template (value) BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001225 lac := int2oct(lac, 2),
1226 ci := int2oct(ci, 2)
1227}
1228
Harald Welteaba42162019-06-19 18:17:59 +02001229template (value) BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001230 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1231 lac := int2oct(lac, 2)
1232}
1233
Harald Welteaba42162019-06-19 18:17:59 +02001234template (value) OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
1235template (value) OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
Harald Welte72cecfa2017-12-11 19:50:14 +01001236
Harald Welteaba42162019-06-19 18:17:59 +02001237template (value) BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
Harald Welte751d3eb2018-01-31 15:51:06 +01001238ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
1239 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1240 lac := int2oct(lac, 2),
1241 rncId := int2oct(rnc_id, 2)
1242}
1243
Harald Welteaba42162019-06-19 18:17:59 +02001244template (value) BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
Harald Welte751d3eb2018-01-31 15:51:06 +01001245 lac := int2oct(lac, 2),
1246 rncId := int2oct(rnc_id, 2)
1247}
1248
Harald Welte72cecfa2017-12-11 19:50:14 +01001249template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
1250 elementIdentifier := '24'O,
1251 channel := chneed,
1252 spare := '000000'B
1253}
1254
1255template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
1256 elementIdentifier := '09'O,
1257 lengthIndicator := 4,
1258 tmsiOctets := tmsi
1259};
1260
Harald Welte17d21152018-01-27 00:47:11 +01001261template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
1262 elementIdentifier := '09'O,
1263 lengthIndicator := 4,
1264 tmsiOctets := tmsi
1265};
1266
Harald Welte72cecfa2017-12-11 19:50:14 +01001267private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
1268 var template BSSMAP_IE_TMSI ret;
1269 if (ispresent(tmsi)) {
1270 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
1271 } else {
1272 ret := omit;
1273 }
1274 return ret;
1275}
1276
1277template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
1278 template BSSMAP_FIELD_CellIdentificationList cid_list,
1279 template OCT4 tmsi := omit,
1280 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +01001281modifies ts_BSSAP_BSSMAP := {
1282 pdu := {
1283 bssmap := {
1284 paging := {
Harald Welte17d21152018-01-27 00:47:11 +01001285 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +01001286 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +01001287 tMSI := f_tmsi_or_omit(tmsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001288 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Welte72cecfa2017-12-11 19:50:14 +01001289 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +01001290 eMLPP_Priority := omit,
1291 pagingInformation := omit /* only VGCS/VBS flag */
1292 }
1293 }
1294 }
1295}
1296
Harald Welte17d21152018-01-27 00:47:11 +01001297template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
1298 template OCT4 tmsi := *,
1299 template BSSMAP_IE_ChannelNeeded chneed := *)
1300modifies tr_BSSAP_BSSMAP := {
1301 pdu := {
1302 bssmap := {
1303 paging := {
1304 messageType := '52'O,
1305 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1306 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
1307 cellIdentifierList := ?,
1308 channelNeeded := chneed,
1309 eMLPP_Priority := omit,
1310 pagingInformation := omit /* only VGCS/VBS flag */
1311 }
1312 }
1313 }
1314}
1315
1316
Harald Welte73cd2712017-12-17 00:44:52 +01001317template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
1318modifies ts_BSSAP_BSSMAP := {
1319 pdu := {
1320 bssmap := {
1321 cipherModeCommand := {
1322 messageType := '53'O,
1323 layer3HeaderInfo := omit,
1324 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1325 cipherResponseMode := omit,
1326 kC128 := omit
1327 }
1328 }
1329 }
1330}
1331
1332template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
1333modifies ts_BSSAP_BSSMAP := {
1334 pdu := {
1335 bssmap := {
1336 cipherModeCommand := {
1337 messageType := '53'O,
1338 layer3HeaderInfo := omit,
1339 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1340 cipherResponseMode := omit,
1341 kC128 := { '83'O, kc128 }
1342 }
1343 }
1344 }
1345}
1346
Harald Welte16114282018-01-24 22:41:21 +01001347template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)
1348modifies tr_BSSAP_BSSMAP := {
1349 pdu := {
1350 bssmap := {
1351 cipherModeCommand := {
1352 messageType := '53'O,
1353 layer3HeaderInfo := *,
1354 encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),
1355 cipherResponseMode := *,
1356 kC128 := *
1357 }
1358 }
1359 }
1360}
1361
1362template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
1363modifies ts_BSSAP_BSSMAP := {
1364 pdu := {
1365 bssmap := {
1366 cipherModeComplete := {
1367 messageType := '55'O,
1368 layer3MessageContents := omit,
1369 chosenEncryptionAlgorithm := {
1370 elementIdentifier := '2C'O,
1371 algorithmIdentifier := alg
1372 }
1373 }
1374 }
1375 }
1376}
1377
Stefan Sperlinga2d59c62018-12-18 16:32:44 +01001378template PDU_BSSAP ts_BSSMAP_CipherModeComplAlg(template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := ?)
1379modifies ts_BSSAP_BSSMAP := {
1380 pdu := {
1381 bssmap := {
1382 cipherModeComplete := {
1383 messageType := '55'O,
1384 layer3MessageContents := omit,
1385 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm
1386 }
1387 }
1388 }
1389}
1390
Harald Welte73cd2712017-12-17 00:44:52 +01001391template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
1392 pdu := {
1393 bssmap := {
1394 cipherModeComplete := {
1395 messageType := '55'O,
1396 layer3MessageContents := *,
1397 chosenEncryptionAlgorithm := {
1398 elementIdentifier := '2C'O,
1399 algorithmIdentifier := alg
1400 }
1401 }
1402 }
1403 }
1404}
1405
1406template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
1407 pdu := {
1408 bssmap := {
1409 cipherModeReject := {
1410 messageType := '59'O,
1411 cause := ?
1412 }
1413 }
1414 }
1415}
1416
Daniel Willmann52918e52018-09-20 14:39:09 +02001417template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := {
1418 pdu := {
1419 bssmap := {
1420 classmarkRequest := {
1421 messageType := '58'O,
1422 talkerPriority := *
1423 }
1424 }
1425 }
1426}
1427
Harald Welte5c2622c2018-01-21 20:45:20 +01001428template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
1429 elementIdentifier := '12'O,
1430 lengthIndicator := 0, /* overwritten */
1431 /* CM1 */
1432 rf_PowerCapability := '010'B, /* class3 */
1433 a5_1 := '0'B, /* supported */
1434 esind := '1'B, /* early classmark supported */
1435 revisionLevel := '10'B, /* R99 */
1436 spare1_1 := '0'B,
1437 /* CM2 */
1438 fc := '1'B, /* E-GSM support */
1439 vgcs := '0'B,
1440 vbs := '0'B,
1441 sm_Capability := '1'B,
1442 ss_ScreenIndicator := '00'B,
1443 ps_Capability := '1'B,
1444 spare2_1 := '0'B,
1445 classmarkInformationType2_oct5 := {
1446 a5_2 := '0'B, /* not available */
1447 a5_3 := '1'B, /* available */
1448 cmsp := '0'B, /* not supported */
1449 solsa := '0'B, /* not suported */
1450 ucs2 := '0'B, /* GSM alphabet preferred */
1451 lcsvacap := '0'B, /* not supported */
1452 spare := '0'B,
1453 cm3 := '0'B /* no CM3 */
1454 }
1455}
1456
1457template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
1458 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
1459modifies ts_BSSAP_BSSMAP := {
1460 pdu := {
1461 bssmap := {
1462 classmarkUpdate := {
1463 messageType := '54'O,
1464 classmarkInformationType2 := cm2,
1465 classmarkInformationType3 := cm3,
1466 talkerPriority := omit
1467 }
1468 }
1469 }
1470}
1471
Harald Welte898113b2018-01-31 18:32:21 +01001472template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
1473 template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
1474modifies tr_BSSAP_BSSMAP := {
1475 pdu := {
1476 bssmap := {
1477 classmarkUpdate := {
1478 messageType := '54'O,
1479 classmarkInformationType2 := cm2,
1480 classmarkInformationType3 := cm3,
1481 talkerPriority := *
1482 }
1483 }
1484 }
1485}
1486
Neels Hofmeyr92b12b72018-09-18 14:30:23 +02001487template PDU_BSSAP ts_BSSMAP_ClassmarkRequest
1488modifies ts_BSSAP_BSSMAP := {
1489 pdu := {
1490 bssmap := {
1491 classmarkRequest := {
1492 messageType := '58'O,
1493 talkerPriority := omit
1494 }
1495 }
1496 }
1497}
1498
Harald Welte49518bf2018-02-10 11:39:19 +01001499/* return Layer3 octetstring inside BSSAP PDU */
1500function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
1501 if (ischosen(bssap.pdu.bssmap)) {
1502 var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
1503 if (ischosen(bssmap.completeLayer3Information)) {
1504 return bssmap.completeLayer3Information.layer3Information.layer3info;
1505 } else if (ischosen(bssmap.handoverRequestAck)) {
1506 return bssmap.handoverRequestAck.layer3Information.layer3info;
1507 } else if (ischosen(bssmap.handoverCommand)) {
1508 return bssmap.handoverCommand.layer3Information.layer3info;
1509 } else if (ischosen(bssmap.uplinkRequest)) {
1510 return bssmap.uplinkRequest.layer3Information.layer3info;
1511 } else if (ischosen(bssmap.uplinkRequestConfirmation)) {
1512 return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
1513 } else if (ischosen(bssmap.uplinkApplicationData)) {
1514 return bssmap.uplinkApplicationData.layer3Information.layer3info;
1515 } else if (ischosen(bssmap.rerouteCommand)) {
1516 return bssmap.rerouteCommand.initialLayer3Information.layer3info;
1517 } else {
1518 return omit;
1519 }
1520 } else {
1521 return bssap.pdu.dtap;
1522 }
1523}
1524
Harald Welte0b50aed2018-05-28 22:33:07 +02001525/* TS 29.205 B.2.1.9 */
1526template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := {
1527 networkIDLengthIndicator := 0, /* overwritten */
1528 networkID := net_id,
1529 nodeIDLengthIndicator := 0, /* overwritten */
1530 nodeID := node_id,
1531 callReferenceIDLengthIndicator := 0, /* overwritten */
1532 callReferenceID := cref_id
1533}
1534template GlobalCallReferenceValue tr_GCR(template octetstring net_id,
1535 template OCT2 node_id,
1536 template OCT5 cref_id) := {
1537 networkIDLengthIndicator := ?,
1538 networkID := net_id,
1539 nodeIDLengthIndicator := ?,
1540 nodeID := node_id,
1541 callReferenceIDLengthIndicator := ?,
1542 callReferenceID := cref_id
1543}
1544
1545/* TS 47.008 3.2.2.115 */
1546template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := {
1547 elementIdentifier := '89'O,
1548 lengthIndicator := 0, /* overwritten */
1549 globalCallReferenceValue := gcr
1550}
1551template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := {
1552 elementIdentifier := '89'O,
1553 lengthIndicator := ?,
1554 globalCallReferenceValue := gcr
1555}
1556
1557/* TS 48.008 3.2.2.116 */
1558const BIT4 LCLS_CFG_both_way := '0000'B;
1559const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B;
1560const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B;
1561const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B;
1562const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B;
1563const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B;
1564
1565template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := {
1566 elementIdentifier := '8A'O,
1567 lCLS_ConfigurationValue := cfg_val,
1568 spare := '0000'B
1569}
1570template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := {
1571 elementIdentifier := '8A'O,
1572 lCLS_ConfigurationValue := cfg_val,
1573 spare := '0000'B
1574}
1575
1576/* TS 48.008 3.2.2.117 */
1577const BIT4 LCLS_CSC_connect := '0000'B;
1578const BIT4 LCLS_CSC_do_not_connect := '0001'B;
1579const BIT4 LCLS_CSC_release_lcls := '0010'B;
1580const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B;
1581const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B;
1582
1583template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := {
1584 elementIdentifier := '8B'O,
1585 lCLS_ConnectionStatusControlValue := csc,
1586 spare := '0000'B
1587}
1588template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := {
1589 elementIdentifier := '8B'O,
1590 lCLS_ConnectionStatusControlValue := csc,
1591 spare := '0000'B
1592}
1593
1594/* TS 48.008 3.2.2.119 */
1595const BIT4 LCLS_STS_not_yet_ls := '0000'B;
1596const BIT4 LCLS_STS_not_possible_ls := '0001'B;
1597const BIT4 LCLS_STS_no_longer_ls := '0010'B;
1598const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B;
1599const BIT4 LCLS_STS_locally_switched := '0100'B;
1600
1601template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := {
1602 elementIdentifier := '8D'O,
1603 lCLS_BSS_StatusValue := sts,
1604 spare := '0000'B
1605}
1606template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := {
1607 elementIdentifier := '8D'O,
1608 lCLS_BSS_StatusValue := sts,
1609 spare := '0000'B
1610}
1611
1612/* TS 48.008 3.2.1.91 */
1613template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001614 template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001615 pdu := {
1616 bssmap := {
1617 lCLS_ConnectControl := {
1618 messageType := '74'O,
1619 lCLS_Configuration := cfg,
1620 lCLS_ConnectionStatusControl := csc
1621 }
1622 }
1623 }
1624}
1625template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001626 template BSSMAP_IE_LCLS_ConnectionStatusControl csc)
1627modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001628 pdu := {
1629 bssmap := {
1630 lCLS_ConnectControl := {
1631 messageType := '74'O,
1632 lCLS_Configuration := cfg,
1633 lCLS_ConnectionStatusControl := csc
1634 }
1635 }
1636 }
1637}
1638
1639/* TS 48.008 3.2.1.92 */
Harald Welte354722e2018-06-01 13:15:32 +02001640template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts)
1641modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001642 pdu := {
1643 bssmap := {
1644 lCLS_connectControlAck := {
1645 messageType := '75'O,
1646 lCLS_BSS_Status := sts
1647 }
1648 }
1649 }
1650}
Harald Welte354722e2018-06-01 13:15:32 +02001651template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts)
1652modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001653 pdu := {
1654 bssmap := {
1655 lCLS_connectControlAck := {
1656 messageType := '75'O,
1657 lCLS_BSS_Status := sts
1658 }
1659 }
1660 }
1661}
1662
1663/* TS 48.008 3.2.1.93 */
1664template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001665 template (omit) BSSMAP_IE_LCLS_BreakRequest brq)
1666modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001667 pdu := {
1668 bssmap := {
1669 lCLS_Notification := {
1670 messageType := '76'O,
1671 lCLS_BSS_Status := sts,
1672 lCLS_BreakRequest := brq
1673 }
1674 }
1675 }
1676}
1677template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001678 template BSSMAP_IE_LCLS_BreakRequest brq)
1679modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001680 pdu := {
1681 bssmap := {
1682 lCLS_Notification := {
1683 messageType := '76'O,
1684 lCLS_BSS_Status := sts,
1685 lCLS_BreakRequest := brq
1686 }
1687 }
1688 }
1689}
1690
Harald Weltecc0b0142018-05-29 15:19:33 +02001691template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts)
1692modifies tr_BSSAP_BSSMAP := {
1693 pdu := {
1694 bssmap := {
1695 lCLS_Notification := {
1696 messageType := '76'O,
1697 lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts),
1698 lCLS_BreakRequest := omit
1699 }
1700 }
1701 }
1702}
Harald Welte898113b2018-01-31 18:32:21 +01001703
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001704template PDU_BSSAP ts_BSSMAP_CommonId(hexstring imsi_digits,
1705 template (omit) OCT3 last_eutran_plmn := omit)
Harald Welteeddf0e92020-06-21 19:42:15 +02001706modifies ts_BSSAP_BSSMAP := {
1707 pdu := {
1708 bssmap := {
1709 commonID := {
1710 messageType := '2F'O,
1711 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Pau Espin Pedrold5ba6ce2021-04-15 14:18:13 +02001712 sNAAccessInformation := omit,
1713 selectedPLMNId := omit,
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001714 lastUsedEUTRANPLMNId := f_ts_BSSMAP_LastUsedEUTRANPLMNId(last_eutran_plmn)
Harald Welteeddf0e92020-06-21 19:42:15 +02001715 }
1716 }
1717 }
1718}
1719
1720template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits)
1721modifies tr_BSSAP_BSSMAP := {
1722 pdu := {
1723 bssmap := {
1724 commonID := {
1725 messageType := '2F'O,
1726 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1727 sNAAccessInformation := *
1728 }
1729 }
1730 }
1731}
Harald Welte898113b2018-01-31 18:32:21 +01001732
Vadim Yanitskiy48063962020-08-28 07:49:44 +07001733template PDU_BSSAP tr_BSSMAP_SAPInReject(template (present) GsmSapi sapi := ?,
1734 template BSSMAP_IE_Cause cause := ?)
1735modifies tr_BSSAP_BSSMAP := {
1736 pdu := {
1737 bssmap := {
1738 sAPInReject := {
1739 messageType := '25'O,
1740 dLCI := {
1741 elementIdentifier := '18'O,
1742 sapiValue := f_tr_SAPI(sapi),
1743 spare := ?,
1744 c1 := ?, c2 := ?
1745 },
1746 cause := cause
1747 }
1748 }
1749 }
1750}
1751
1752private function f_tr_SAPI(template (present) GsmSapi sapi)
1753return template (present) BIT3 {
1754 if (istemplatekind(sapi, "?")) {
1755 return ?;
1756 } else {
1757 return int2bit(valueof(sapi), 3);
1758 }
1759}
1760
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001761template (value) BSSMAP_IE_LocationType ts_BSSMAP_IE_LocationType
1762:= {
1763 elementIdentifier := '44'O,
1764 lengthIndicator := 1,
1765 locationInformation := '00'O,
1766 positioningMethod := omit
1767}
Harald Welte73cd2712017-12-17 00:44:52 +01001768
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001769template (value) PDU_BSSAP ts_BSSMAP_Perform_Location_Request(template (omit) BSSMAP_IE_IMSI imsi,
1770 template (omit) BSSMAP_IE_CellIdentifier cellIdentifier := omit
1771 )
1772modifies ts_BSSAP_BSSMAP := {
1773 pdu := {
1774 bssmap := {
1775 performLocationRequest := {
1776 messageType := '2B'O,
1777 locationType := ts_BSSMAP_IE_LocationType,
1778 cellIdentifier := cellIdentifier,
1779 classmarkInformationType3 := omit,
1780 lCS_ClientType := omit,
1781 chosenChannel := omit,
1782 lCS_Priority := omit,
1783 lCS_QOS := omit,
1784 gPS_AssistanceData := omit,
1785 aPDU := omit,
1786 iMSI := imsi,
1787 iMEI := omit,
1788 gANSS_LocationType := omit,
1789 gANSS_AssistanceData := omit
1790 }
1791 }
1792 }
1793}
1794
1795template (present) BSSMAP_IE_LocationEstimate tr_BSSMAP_IE_LocationEstimate(template (present) octetstring geo_loc := ?)
1796:= {
1797 elementIdentifier := '45'O,
1798 lengthIndicator := ?,
1799 geographicLocation := geo_loc
1800}
1801
1802function tr_BSSMAP_LcsCause(template (present) BSSMAP_LcsCause cause)
1803return template (omit) BSSMAP_IE_LCSCause {
1804 if (istemplatekind(cause, "omit")) {
1805 return omit;
1806 }
1807 var template BSSMAP_IE_LCSCause ie := {
1808 elementIdentifier := '47'O,
1809 lengthIndicator := 1,
1810 causeValue := int2bit(enum2int(valueof(cause)), 8),
1811 diagnosticValue := omit
1812 }
1813 return ie;
1814}
1815
1816template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Response(
1817 template BSSMAP_IE_LocationEstimate locationEstimate := *,
1818 template BSSMAP_IE_PositioningData positioningData := *,
1819 template BSSMAP_IE_LCSCause lCS_Cause := *
1820 )
1821modifies tr_BSSAP_BSSMAP := {
1822 pdu := {
1823 bssmap := {
1824 performLocationResponse := {
1825 messageType := '2D'O,
1826 locationEstimate := locationEstimate,
1827 positioningData := positioningData,
1828 decipheringKeys := *,
1829 lCS_Cause := lCS_Cause,
1830 velocityEstimate := *,
1831 gANSS_PositioningData := *
1832 }
1833 }
1834 }
1835}
1836
1837template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Abort(template (present) BSSMAP_IE_LCSCause lCS_Cause := ?)
1838modifies tr_BSSAP_BSSMAP := {
1839 pdu := {
1840 bssmap := {
1841 performLocationAbort := {
1842 messageType := '2E'O,
1843 lCS_Cause := lCS_Cause
1844 }
1845 }
1846 }
1847}
Harald Weltec859df52017-11-24 23:41:41 +01001848
Harald Welteb69533d2017-12-15 13:55:17 +01001849} with { encode "RAW" };