blob: 1dcbef19981fa931422dd5c10262a01248a84919 [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;
324
Harald Welteae8ce232018-01-21 13:56:46 +0100325template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100326modifies ts_BSSMAP_IE_CellID := {
327 cellIdentification := {
Harald Welteae8ce232018-01-21 13:56:46 +0100328 cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100329 }
330}
Harald Weltec76f29f2017-11-22 12:46:46 +0100331
332template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
333modifies ts_BSSMAP_IE_CellID := {
334 cellIdentification := {
335 cI_LAC_CI := {
336 lac := int2oct(lac, 2),
337 ci := int2oct(ci, 2)
338 }
339 }
340}
341
342template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
343modifies ts_BSSMAP_IE_CellID := {
344 cellIdentification := {
345 cI_CI := int2oct(ci, 2)
346 }
347}
348
349template BSSMAP_IE_CellIdentifier ts_CellId_none
350modifies ts_BSSMAP_IE_CellID := {
351 cellIdentification := {
352 cI_noCell := ''O
353 }
354}
355
356
357template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
358 elementIdentifier := '17'O,
359 lengthIndicator := 0,
360 layer3info := l3info
361}
362
Harald Weltef8a0bda2017-12-09 00:53:17 +0100363template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
364 elementIdentifier := '17'O,
365 lengthIndicator := ?,
366 layer3info := l3info
367}
368
369
Harald Weltec76f29f2017-11-22 12:46:46 +0100370template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
371modifies ts_BSSAP_BSSMAP := {
372 pdu := {
373 bssmap := {
374 completeLayer3Information := {
375 messageType := '57'O,
376 cellIdentifier := cell_id,
377 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
378 chosenChannel := omit,
379 lSAIdentifier := omit,
380 aPDU := omit,
381 codecList := omit,
382 redirectAttemptFlag := omit,
383 sendSequenceNumber := omit,
384 iMSI := omit
385 }
386 }
387 }
388}
389
Harald Weltef8a0bda2017-12-09 00:53:17 +0100390template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
391 template BSSMAP_IE_CellIdentifier cell_id := ?)
392modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100393 pdu := {
394 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100395 completeLayer3Information := {
396 messageType := '57'O,
397 cellIdentifier := cell_id,
398 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
399 chosenChannel := *,
400 lSAIdentifier := *,
401 aPDU := *,
402 codecList := *,
403 redirectAttemptFlag := *,
404 sendSequenceNumber := *,
405 iMSI := *
406 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100407 }
408 }
409}
410
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200411template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {
Harald Welte28d943e2017-11-25 15:00:50 +0100412 elementIdentifier := '1A'O,
413 lengthIndicator := 0, /* overwritten */
414 cellIdentifierDiscriminator := '0000'B, /* overwritten */
415 spare1_4 := '0000'B,
416 cellIdentificationList := cid_list
417}
Harald Welte365f4ed2017-11-23 00:00:43 +0100418
Harald Welte4bf5fc92017-12-15 13:56:06 +0100419const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100420const OCT1 ChRate_TCHF := '08'O;
421const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100422const OCT1 ChRate_TCHForH_Fpref := '0A'O;
423const OCT1 ChRate_TCHForH_Hpref := '0B'O;
424const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
425const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
426const OCT1 ChRate_TCHForH := '0F'O;
427const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100428
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100429const OCT1 Spdi_TCHF_FR := '01'O;
430const OCT1 Spdi_TCHF_EFR := '11'O;
431const OCT1 Spdi_TCHF_AMR := '21'O;
432const OCT1 Spdi_TCHH_HR := '05'O;
433const OCT1 Spdi_TCHH_AMR := '25'O;
434
Harald Welte365f4ed2017-11-23 00:00:43 +0100435template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
436 elementIdentifier := '0B'O, /* overwritten */
437 lengthIndicator := 0, /* overwritten */
438 speechOrDataIndicator := '0001'B, /* speech */
439 spare1_4 := '0000'B,
440 channelRateAndType := ChRate_TCHF,
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100441 speechId_DataIndicator := Spdi_TCHF_FR
Harald Welte365f4ed2017-11-23 00:00:43 +0100442}
443
Harald Welte4bf5fc92017-12-15 13:56:06 +0100444template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
445 speechOrDataIndicator := '0100'B /* speech + CTM */
446}
447
448template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
449 elementIdentifier := '0B'O, /* overwritten */
450 lengthIndicator := 0, /* overwritten */
451 speechOrDataIndicator := '0010'B, /* data */
452 spare1_4 := '0000'B,
453 channelRateAndType := ChRate_TCHF,
454 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
455}
456
457template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
458 elementIdentifier := '0B'O, /* overwritten */
459 lengthIndicator := 0, /* overwritten */
460 speechOrDataIndicator := '0011'B, /* data */
461 spare1_4 := '0000'B,
462 channelRateAndType := ChRate_ANY,
463 speechId_DataIndicator := '00'O /* spare */
464}
465
466template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
467 elementIdentifier := '0A'O,
468 lengthIndicator := 0, /* overwritten */
469 permittedAlgorithms := algs,
470 key := kc
471}
472
Harald Welte16114282018-01-24 22:41:21 +0100473template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
474 elementIdentifier := '0A'O,
475 lengthIndicator := ?, /* overwritten */
476 permittedAlgorithms := algs,
477 key := kc
478}
479
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +0200480template BSSMAP_IE_ChosenEncryptionAlgorithm ts_BSSMAP_IE_ChosenEncryptionAlgorithm(OCT1 algorithmIdentifier) := {
481 elementIdentifier := '2C'O,
482 algorithmIdentifier := algorithmIdentifier
483}
Harald Welte16114282018-01-24 22:41:21 +0100484
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +0200485template BSSMAP_IE_ChosenEncryptionAlgorithm tr_BSSMAP_IE_ChosenEncryptionAlgorithm(template OCT1 algorithmIdentifier := ?) := {
486 elementIdentifier := '2C'O,
487 algorithmIdentifier := algorithmIdentifier
488}
Harald Welte4bf5fc92017-12-15 13:56:06 +0100489
Harald Welte365f4ed2017-11-23 00:00:43 +0100490template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
491 elementIdentifier := '01'O, /* overwritten */
492 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
493 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
494}
495
Pau Espin Pedrol43021cb2019-06-18 17:32:15 +0200496function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {
497 var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
498 return cic;
499}
500
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100501template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100502 uint16_t udp_port,
503 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100504 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100505 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100506 ipAddress := addr,
507 uDPPortValue := udp_port
508}
Harald Welte235ebf12017-12-15 14:18:16 +0100509template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100510 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100511template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100512 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100513
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200514function f_ts_BSSMAP_IE_AoIP_TLA(charstring addr, uint16_t udp_port)
515 return template (value) BSSMAP_IE_AoIP_TransportLayerAddress {
516 if (f_addr_is_ipv6(addr)) {
517 var OCT16 ip6 := f_inet6_addr(addr);
518 return ts_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
519 } else {
520 var OCT4 ip := f_inet_addr(addr);
521 return ts_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
522 }
523}
524
Neels Hofmeyr3c89a6b2019-10-15 16:54:37 +0200525template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr,
526 template uint16_t udp_port,
527 template integer len := ?) := {
528 elementIdentifier := '7C'O,
529 lengthIndicator := len,
530 ipAddress := addr,
531 uDPPortValue := udp_port
532}
533template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) :=
534 tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
535template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) :=
536 tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
537
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200538function f_tr_BSSMAP_IE_AoIP_TLA(charstring addr, template uint16_t udp_port)
539 return template BSSMAP_IE_AoIP_TransportLayerAddress {
540 if (f_addr_is_ipv6(addr)) {
541 var OCT16 ip6 := f_inet6_addr(addr);
542 return tr_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
543 } else {
544 var OCT4 ip := f_inet_addr(addr);
545 return tr_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
546 }
547}
548
Harald Welte4bf5fc92017-12-15 13:56:06 +0100549template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
550 elementIdentifier := '83'O,
551 kC128_Value := kc128
552}
553
Harald Weltef1b64e22017-12-15 14:55:14 +0100554/* 3.2.2.103 */
555template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
556 codecType := GSM_FR,
557 tF := '0'B,
558 pT := '0'B,
559 pI := '0'B,
560 fI := '1'B,
561 extendedCodecType := omit,
562 s0_7 := omit,
563 s8_15 := omit
564}
565template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
566 codecType := GSM_FR
567}
568template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
569 codecType := GSM_EFR
570}
571template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
572 codecType := GSM_HR
573}
574template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
575 codecType := FR_AMR,
576 s0_7 := '11111111'B,
577 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
578}
579template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
580 codecType := HR_AMR,
581 s0_7 := '00111111'B,
582 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
583}
584template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
585 elementIdentifier := '7D'O,
586 lengthIndicator := 0, /* overwritten */
587 codecElements := valueof(elem)
588}
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100589template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := {
590 elementIdentifier := '7E'O,
591 lengthIndicator := 0, /* overwritten */
592 codecElements := valueof(elem)
593}
Harald Weltef1b64e22017-12-15 14:55:14 +0100594
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200595template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := {
596 elementIdentifier := 'F1'O,
597 osmuxCID := cid
598}
599
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100600template PDU_BSSAP
601ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200602 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
603 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100604modifies ts_BSSAP_BSSMAP := {
605 pdu := {
606 bssmap := {
607 assignmentRequest := {
608 messageType :='01'O, /* overwritten */
609 channelType := ts_BSSMAP_IE_ChannelType,
610 layer3HeaderInfo := omit,
611 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100612 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100613 downLinkDTX_Flag := omit,
614 interferenceBandToBeUsed := omit,
615 classmarkInformationType2 := omit,
616 groupCallReference := omit,
617 talkerFlag := omit,
618 configurationEvolutionIndication := omit,
619 lsaAccesControlSuppression := omit,
620 serviceHandover := omit,
621 encryptionInformation := omit,
622 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100623 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100624 codecList := omit,
625 callIdentifier := omit,
626 kC128 := omit,
627 globalCallReference := omit,
628 lCLS_Configuration := omit,
629 lCLS_ConnectionStatusControl := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200630 lCLS_CorrelationNotNeeded := omit,
631 osmuxCID := osmuxCID
Harald Welte365f4ed2017-11-23 00:00:43 +0100632 }
633 }
634 }
635}
Harald Weltec76f29f2017-11-22 12:46:46 +0100636
Harald Weltebe48a7c2018-01-26 21:39:25 +0100637template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200638 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
639 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltebe48a7c2018-01-26 21:39:25 +0100640modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100641 pdu := {
642 bssmap := {
643 assignmentRequest := {
644 messageType :='01'O, /* overwritten */
645 channelType := ?,
646 layer3HeaderInfo := *,
647 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100648 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100649 downLinkDTX_Flag := *,
650 interferenceBandToBeUsed := *,
651 classmarkInformationType2 := *,
652 groupCallReference := *,
653 talkerFlag := *,
654 configurationEvolutionIndication := *,
655 lsaAccesControlSuppression := *,
656 serviceHandover := *,
657 encryptionInformation := *,
658 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100659 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100660 codecList := *,
661 callIdentifier := *,
662 kC128 := *,
663 globalCallReference := *,
664 lCLS_Configuration := *,
665 lCLS_ConnectionStatusControl := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200666 lCLS_CorrelationNotNeeded := *,
667 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100668 }
669 }
670 }
671}
672
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100673template PDU_BSSAP
674ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100675 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200676 template BSSMAP_IE_SpeechCodec speechCodec := omit,
677 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100678modifies ts_BSSAP_BSSMAP := {
679 pdu := {
680 bssmap := {
681 assignmentComplete := {
682 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100683 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100684 circuitIdentityCode := cic,
685 cellIdentifier := omit,
686 chosenChannel := omit,
687 chosenEncryptionAlgorithm := omit,
688 circuitPool := omit,
689 speechVersion := omit,
690 lSAIdentifier := omit,
691 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100692 aoIPTransportLayer := aoip,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100693 speechCodec := speechCodec,
Harald Welteb3414b22017-11-23 18:22:10 +0100694 codecList := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200695 lCLS_BSS_Status := omit,
696 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100697 }
698 }
699 }
700}
701
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100702template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200703 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
704 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100705modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100706 pdu := {
707 bssmap := {
708 assignmentComplete := {
709 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100710 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100711 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100712 cellIdentifier := *,
713 chosenChannel := *,
714 chosenEncryptionAlgorithm := *,
715 circuitPool := *,
716 speechVersion := *,
717 lSAIdentifier := *,
718 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100719 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100720 speechCodec := *,
721 codecList := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200722 lCLS_BSS_Status := *,
723 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100724 }
725 }
726 }
727}
728
Harald Welte16a4adf2017-12-14 18:54:01 +0100729template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
730 pdu := {
731 bssmap := {
732 assignmentFailure := {
733 messageType := '03'O, /* overwritten */
734 rR_Cause := *,
735 circuitPool := *,
736 circuitPoolList := *,
737 talkerPriority := *,
738 codecList := *
739 }
740 }
741 }
742}
743
744
Harald Welteb3414b22017-11-23 18:22:10 +0100745template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
746modifies ts_BSSAP_BSSMAP := {
747 pdu := {
748 bssmap := {
749 clearCommand := {
750 messageType := '20'O, /* overwritten */
751 layer3HeaderInfo := omit,
752 cause := ts_BSSMAP_IE_Cause(cause),
753 cSFB_Indication := omit
754 }
755 }
756 }
757}
Harald Welte99787102019-02-04 10:41:36 +0100758template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause)
759modifies ts_BSSMAP_ClearCommand := {
760 pdu := {
761 bssmap := {
762 clearCommand := {
763 cSFB_Indication := {
764 elementIdentifier := '8F'O
765 }
766 }
767 }
768 }
769}
Harald Welteb3414b22017-11-23 18:22:10 +0100770
771template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
772 pdu := {
773 bssmap := {
774 clearCommand := {
775 messageType := '20'O, /* overwritten */
776 layer3HeaderInfo := *,
777 cause := ?,
778 cSFB_Indication := *
779 }
780 }
781 }
782}
783
Harald Welte4c422b72019-02-17 16:27:10 +0100784template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := {
785 pdu := {
786 bssmap := {
787 clearCommand := {
788 messageType := '20'O, /* overwritten */
789 layer3HeaderInfo := *,
790 cause := ?,
791 cSFB_Indication := {
792 elementIdentifier := '8F'O
793 }
794 }
795 }
796 }
797}
798
Harald Welteb3414b22017-11-23 18:22:10 +0100799template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
800modifies ts_BSSAP_BSSMAP := {
801 pdu := {
802 bssmap := {
803 clearComplete := {
804 messageType := '21'O /* overwritten */
805 }
806 }
807 }
808}
809
Harald Weltec859df52017-11-24 23:41:41 +0100810template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
811 pdu := {
812 bssmap := {
813 clearComplete := {
814 messageType := '21'O
815 }
816 }
817 }
818}
819
Harald Weltebc881782018-01-23 20:09:15 +0100820template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
821modifies ts_BSSAP_BSSMAP := {
822 pdu := {
823 bssmap := {
824 clearRequest := {
825 messageType := '22'O, /* overwritten */
826 cause := ts_BSSMAP_IE_Cause(cause)
827 }
828 }
829 }
830}
831
Harald Weltecfa79ad2017-12-09 22:33:47 +0100832template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
833 pdu := {
834 bssmap := {
835 clearRequest := {
836 messageType := '22'O, /* overwritten */
837 cause := ?
838 }
839 }
840 }
841}
842
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200843template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200844 template BSSMAP_FIELD_CellIdentificationList cid_list,
845 template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit)
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200846modifies ts_BSSAP_BSSMAP := {
847 pdu := {
848 bssmap := {
849 handoverRequired := {
850 messageType := '11'O,
851 cause := ts_BSSMAP_IE_Cause(cause),
852 responseRequest := omit,
853 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
854 circuitPoolList := omit,
855 currentChannelType1 := omit,
856 speechVersion := omit,
857 queueingIndicator := omit,
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200858 oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200859 sourceToTargetRNCTransparentInfo := omit,
860 sourceToTargetRNCTransparentInfoCDMA := omit,
861 gERANClassmark := omit,
862 talkerPriority := omit,
863 speechCodec := omit,
864 cSG_Identifier := omit
865 }
866 }
867 }
868}
869
870
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200871template PDU_BSSAP tr_BSSMAP_HandoverRequired(template BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := *) modifies tr_BSSAP_BSSMAP := {
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100872 pdu := {
873 bssmap := {
874 handoverRequired := {
Pau Espin Pedrol35801c32021-04-19 13:03:20 +0200875 messageType := '11'O,
876 oldToNewBSSInfo := f_tr_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs)
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100877 }
878 }
879 }
880}
881
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200882template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {
883 pdu := {
884 bssmap := {
885 handoverRequiredReject := {
886 messageType := '1A'O
887 }
888 }
889 }
890}
891
892template PDU_BSSAP tr_BSSMAP_HandoverCommand
893modifies tr_BSSAP_BSSMAP := {
894 pdu := {
895 bssmap := {
896 handoverCommand := {
897 messageType := '13'O
898 }
899 }
900 }
901}
902
903template PDU_BSSAP tr_BSSMAP_HandoverSucceeded
904modifies tr_BSSAP_BSSMAP := {
905 pdu := {
906 bssmap := {
907 handoverSucceeded := {
908 messageType := '15'O
909 }
910 }
911 }
912}
913
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100914template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)
915modifies ts_BSSAP_BSSMAP := {
916 pdu := {
917 bssmap := {
918 handoverCommand := {
919 messageType := '13'O,
920 layer3Information := {
921 elementIdentifier := '17'O,
922 lengthIndicator := 0,
923 layer3info := layer3info
924 },
925 cellIdentifier := omit,
926 newBSSToOldBSSInfo := omit,
927 talkerPriority := omit
928 }
929 }
930 }
931}
932
Neels Hofmeyr61ebb8b2018-10-09 18:28:06 +0200933template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := {
934 pdu := {
935 bssmap := {
936 handoverFailure := {
937 messageType := '16'O,
938 cause := ?,
939 rR_Cause := *,
940 circuitPool := *,
941 circuitPoolList := *,
942 gERANClassmark := *,
943 newBSSToOldBSSInfo := *,
944 interSystemInformation := *,
945 talkerPriority := *,
946 codecList := *
947 }
948 }
949 }
950}
951
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200952template PDU_BSSAP tr_BSSMAP_HandoverRequest modifies tr_BSSAP_BSSMAP := {
953 pdu := {
954 bssmap := {
955 handoverRequest := {
956 messageType := '10'O
957 }
958 }
959 }
960}
961
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100962template PDU_BSSAP ts_BSSMAP_HandoverRequest(
963 template BSSMAP_IE_CircuitIdentityCode cic := omit,
964 template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,
965 template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0),
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +0200966 template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1),
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +0200967 template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit,
968 template BSSMAP_IE_EncryptionInformation encryptionInformation := ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O),
969 template (omit) BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit,
970 template (omit) BSSMAP_IE_KC128 kC128 := omit
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100971 )
972modifies ts_BSSAP_BSSMAP := {
973 pdu := {
974 bssmap := {
975 handoverRequest := {
976 messageType := '10'O,
977 channelType := ts_BSSMAP_IE_ChannelType,
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +0200978 encryptionInformation := encryptionInformation,
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100979 classmarkInformationType := {
980 classmarkInformationType1 := {
981 elementIdentifier := '1D'O,
982 rf_PowerCapability := '000'B,
983 a5_1 := '0'B,
984 esind := '0'B,
985 revisionLevel := '10'B,
986 spare1_1 := '0'B
987 }
988 },
989 cellIdentifierSource := cell_id_source,
990 priority := omit,
991 circuitIdentityCode := cic,
992 downLinkDTX_Flag := omit,
993 cellIdentifierTarget := cell_id_target,
994 interferenceBandToBeUsed := omit,
995 cause := omit,
996 classmarkInformationType3 := omit,
997 currentChannelType1 := omit,
998 speechVersion := omit,
999 groupCallReference := omit,
1000 talkerFlag := omit,
1001 configurationEvolutionIndication := omit,
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +02001002 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
Pau Espin Pedrolc08d5522021-04-16 15:40:38 +02001003 oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001004 lSAInformation := omit,
1005 lSAAccessControlSuppression := omit,
1006 serviceHandover := omit,
1007 iMSI_bssmap := omit,
1008 sourceToTargetRNCTransparentInfo := omit,
1009 sourceToTargetRNCTransparentInfoCDMA := omit,
1010 sNAAccessInformation := omit,
1011 talkerPriority := omit,
1012 aoIPTransportLayer := aoip_tla,
1013 codecList := omit,
1014 callIdentifier := omit,
Neels Hofmeyr1d8dece2021-06-21 05:25:46 +02001015 kC128 := kC128,
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001016 globalCallReference := omit,
1017 lCLS_Configuration := omit,
1018 connectionStatusControl := omit
1019 }
1020 }
1021 }
1022}
1023
1024template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info)
1025modifies tr_BSSAP_BSSMAP := {
1026 pdu := {
1027 bssmap := {
1028 handoverRequestAck := {
1029 messageType := '12'O,
1030 layer3Information := {
1031 elementIdentifier := '17'O,
1032 lengthIndicator := ?,
1033 layer3info := layer3info
1034 }
1035 }
1036 }
1037 }
1038}
1039
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001040template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(
1041 template octetstring layer3info,
1042 template LIN1 layer3infoLength,
1043 template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,
1044 template BSSMAP_IE_SpeechCodec speechCodec := omit,
1045 template BSSMAP_IE_ChosenChannel chosenChannel := omit,
1046 template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)
1047modifies ts_BSSAP_BSSMAP := {
1048 pdu := {
1049 bssmap := {
1050 handoverRequestAck := {
1051 messageType := '12'O,
1052 layer3Information := {
1053 elementIdentifier := '17'O,
1054 lengthIndicator := layer3infoLength,
1055 layer3info := layer3info
1056 },
1057 chosenChannel := chosenChannel,
1058 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
1059 circuitPool := omit,
1060 speechVersion := omit,
1061 circuitIdentityCode := omit,
1062 lSAIdentifier := omit,
1063 newBSSToOldBSSInfo := omit,
1064 interSystemInformation := omit,
1065 talkerPriority := omit,
1066 aoIPTransportLayer := aoIPTransportLayer,
1067 codecList := omit,
1068 speechCodec := speechCodec,
1069 lCLS_bSS_Status := omit
1070 }
1071 }
1072 }
1073}
1074
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001075template PDU_BSSAP tr_BSSMAP_HandoverDetect
1076modifies tr_BSSAP_BSSMAP := {
1077 pdu := {
1078 bssmap := {
1079 handoverDetect := {
1080 messageType := '1B'O,
1081 talkerPriority := *
1082 }
1083 }
1084 }
1085}
1086
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001087template PDU_BSSAP ts_BSSMAP_HandoverDetect
1088modifies ts_BSSAP_BSSMAP := {
1089 pdu := {
1090 bssmap := {
1091 handoverDetect := {
1092 messageType := '1B'O,
1093 talkerPriority := omit
1094 }
1095 }
1096 }
1097}
1098
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001099template PDU_BSSAP tr_BSSMAP_HandoverComplete
1100modifies tr_BSSAP_BSSMAP := {
1101 pdu := {
1102 bssmap := {
1103 handoverComplete := {
1104 messageType := '14'O,
1105 rR_Cause := *,
1106 talkerPriority := *,
1107 speechCodec := *,
1108 codecList := *,
1109 chosenEncryptionAlgorithm := *,
1110 chosenChannel := *,
1111 lCLS_BSS_Status := *
1112 }
1113 }
1114 }
1115}
Harald Weltecfa79ad2017-12-09 22:33:47 +01001116
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001117template PDU_BSSAP ts_BSSMAP_HandoverComplete
1118modifies ts_BSSAP_BSSMAP := {
1119 pdu := {
1120 bssmap := {
1121 handoverComplete := {
1122 messageType := '14'O,
1123 rR_Cause := omit,
1124 talkerPriority := omit,
1125 speechCodec := omit,
1126 codecList := omit,
1127 chosenEncryptionAlgorithm := omit,
1128 chosenChannel := omit,
1129 lCLS_BSS_Status := omit
1130 }
1131 }
1132 }
1133}
1134
Philipp Maieraee60392018-11-05 17:09:00 +01001135template PDU_BSSAP tr_BSSMAP_HandoverPerformed
1136modifies tr_BSSAP_BSSMAP := {
1137 pdu := {
1138 bssmap := {
1139 handoverPerformed := {
1140 messageType := '17'O,
1141 cause := ?,
1142 cellIdentifier := ?,
Philipp Maier8d33a132018-11-12 11:58:55 +01001143 chosenChannel := *,
1144 chosenEncryptionAlgorithm := *,
1145 speechVersion := *,
1146 lSAIdentifier := *,
1147 talkerPriority := *,
1148 codecList := *,
1149 speechCodec := *,
1150 lCLS_BSS_Status := *
Philipp Maieraee60392018-11-05 17:09:00 +01001151 }
1152 }
1153 }
1154}
1155
Harald Welte28d943e2017-11-25 15:00:50 +01001156template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
1157 elementIdentifier := '08'O,
1158 lengthIndicator := 0, /* overwritten */
1159 typeOfIdentity := '001'B, /* IMSI */
1160 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
1161 digits := imsi_digits
1162}
1163
Harald Welte17d21152018-01-27 00:47:11 +01001164template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
1165 elementIdentifier := '08'O,
1166 lengthIndicator := ?, /* overwritten */
1167 typeOfIdentity := '001'B, /* IMSI */
1168 oddEvenIndicator := ?,
1169 digits := imsi_digits
1170}
1171
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001172template (value) BSSAMAP_IE_LastUsedEUTRANPLMNId ts_BSSMAP_LastUsedEUTRANPLMNId(OCT3 mcc_mnc) := {
1173 elementIdentifier := '95'O,
1174 mcc_mnc := mcc_mnc
1175}
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001176template BSSAMAP_IE_LastUsedEUTRANPLMNId tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc) := {
1177 elementIdentifier := '95'O,
1178 mcc_mnc := mcc_mnc
1179}
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001180function f_ts_BSSMAP_LastUsedEUTRANPLMNId(template (omit) OCT3 mcc_mnc)
1181 return template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId {
1182 if (not istemplatekind(mcc_mnc, "omit")) {
1183 return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
1184 } else {
1185 return omit;
1186 }
1187}
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001188function f_tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc)
1189return template BSSAMAP_IE_LastUsedEUTRANPLMNId {
1190 if (istemplatekind(mcc_mnc, "*")) {
1191 return *;
1192 } else if (istemplatekind(mcc_mnc, "?")) {
1193 return ?;
1194 } else if (istemplatekind(mcc_mnc, "omit")) {
1195 return omit;
1196 } else {
1197 return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
1198 }
1199}
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001200
Harald Welte72cecfa2017-12-11 19:50:14 +01001201template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
1202 cIl_noCell := ''O
1203}
Harald Welteaba42162019-06-19 18:17:59 +02001204template (value) BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_BSS := {
1205 cIl_allInBSS := ''O
1206}
1207template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_BSS := {
1208 cIl_allInBSS := ''O
1209}
1210
1211template (value) BSSMAP_FIELD_CellIdentificationList
1212 ts_BSSMAP_CIL_CGI(template (value) BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1213 cIl_CGI := cgil
1214}
1215template BSSMAP_FIELD_CellIdentificationList
1216 tr_BSSMAP_CIL_CGI(template BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1217 cIl_CGI := cgil
1218}
1219
1220template (value) BSSMAP_FIELD_CellIdentificationList
1221 ts_BSSMAP_CIL_LAC_CI(template (value) BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1222 cIl_LAC_CI := lac_cil
1223}
1224template BSSMAP_FIELD_CellIdentificationList
1225 tr_BSSMAP_CIL_LAC_CI(template BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1226 cIl_LAC_CI := lac_cil
1227}
1228
1229template (value) BSSMAP_FIELD_CellIdentificationList
1230 ts_BSSMAP_CIL_CI(template (value) RecordOfOCT2 cil) := {
1231 cIl_CI := cil
1232}
1233template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_CI(template RecordOfOCT2 cil) := {
1234 cIl_CI := cil
1235}
1236
1237template (value) BSSMAP_FIELD_CellIdentificationList
1238 ts_BSSMAP_CIL_LAI(template (value) BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1239 cIl_LAI := lail
1240}
1241template BSSMAP_FIELD_CellIdentificationList
1242 tr_BSSMAP_CIL_LAI(template BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1243 cIl_LAI := lail
1244}
1245
1246template (value) BSSMAP_FIELD_CellIdentificationList
1247 ts_BSSMAP_CIL_LAC(template (value) RecordOfOCT2 lacl) := {
1248 cIl_LAC := lacl
1249}
1250template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOfOCT2 lacl) := {
1251 cIl_LAC := lacl
1252}
1253
Harald Welte72cecfa2017-12-11 19:50:14 +01001254
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001255function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte24135bd2018-03-17 19:27:53 +01001256 if (lengthof(mnc) == 2) {
1257 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
Stefan Sperling83348bc2018-03-14 17:44:40 +01001258 } else {
1259 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
1260 }
Harald Welte72cecfa2017-12-11 19:50:14 +01001261}
1262
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001263function f_dec_mcc_mnc(in OCT3 mcc_mnc, out GsmMcc mcc, out GsmMnc mnc) {
1264 var hexstring hs := oct2hex(mcc_mnc);
1265 mcc := hs[1] & hs[0] & hs[3];
1266 mnc := hs[5] & hs[4];
1267 if (hs[2] == 'F'H) {
1268 mnc := mnc & hs[2];
1269 }
1270}
1271
Harald Welteaba42162019-06-19 18:17:59 +02001272template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001273 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1274 lac := int2oct(lac, 2),
1275 ci := int2oct(ci, 2)
1276}
1277
Harald Welteaba42162019-06-19 18:17:59 +02001278template (value) BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001279 lac := int2oct(lac, 2),
1280 ci := int2oct(ci, 2)
1281}
1282
Harald Welteaba42162019-06-19 18:17:59 +02001283template (value) BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001284 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1285 lac := int2oct(lac, 2)
1286}
1287
Harald Welteaba42162019-06-19 18:17:59 +02001288template (value) OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
1289template (value) OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
Harald Welte72cecfa2017-12-11 19:50:14 +01001290
Harald Welteaba42162019-06-19 18:17:59 +02001291template (value) BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
Harald Welte751d3eb2018-01-31 15:51:06 +01001292ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
1293 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1294 lac := int2oct(lac, 2),
1295 rncId := int2oct(rnc_id, 2)
1296}
1297
Harald Welteaba42162019-06-19 18:17:59 +02001298template (value) BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
Harald Welte751d3eb2018-01-31 15:51:06 +01001299 lac := int2oct(lac, 2),
1300 rncId := int2oct(rnc_id, 2)
1301}
1302
Harald Welte72cecfa2017-12-11 19:50:14 +01001303template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
1304 elementIdentifier := '24'O,
1305 channel := chneed,
1306 spare := '000000'B
1307}
1308
1309template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
1310 elementIdentifier := '09'O,
1311 lengthIndicator := 4,
1312 tmsiOctets := tmsi
1313};
1314
Harald Welte17d21152018-01-27 00:47:11 +01001315template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
1316 elementIdentifier := '09'O,
1317 lengthIndicator := 4,
1318 tmsiOctets := tmsi
1319};
1320
Harald Welte72cecfa2017-12-11 19:50:14 +01001321private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
1322 var template BSSMAP_IE_TMSI ret;
1323 if (ispresent(tmsi)) {
1324 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
1325 } else {
1326 ret := omit;
1327 }
1328 return ret;
1329}
1330
1331template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
1332 template BSSMAP_FIELD_CellIdentificationList cid_list,
1333 template OCT4 tmsi := omit,
1334 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +01001335modifies ts_BSSAP_BSSMAP := {
1336 pdu := {
1337 bssmap := {
1338 paging := {
Harald Welte17d21152018-01-27 00:47:11 +01001339 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +01001340 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +01001341 tMSI := f_tmsi_or_omit(tmsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001342 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Welte72cecfa2017-12-11 19:50:14 +01001343 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +01001344 eMLPP_Priority := omit,
1345 pagingInformation := omit /* only VGCS/VBS flag */
1346 }
1347 }
1348 }
1349}
1350
Harald Welte17d21152018-01-27 00:47:11 +01001351template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
1352 template OCT4 tmsi := *,
1353 template BSSMAP_IE_ChannelNeeded chneed := *)
1354modifies tr_BSSAP_BSSMAP := {
1355 pdu := {
1356 bssmap := {
1357 paging := {
1358 messageType := '52'O,
1359 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1360 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
1361 cellIdentifierList := ?,
1362 channelNeeded := chneed,
1363 eMLPP_Priority := omit,
1364 pagingInformation := omit /* only VGCS/VBS flag */
1365 }
1366 }
1367 }
1368}
1369
1370
Harald Welte73cd2712017-12-17 00:44:52 +01001371template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
1372modifies ts_BSSAP_BSSMAP := {
1373 pdu := {
1374 bssmap := {
1375 cipherModeCommand := {
1376 messageType := '53'O,
1377 layer3HeaderInfo := omit,
1378 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1379 cipherResponseMode := omit,
1380 kC128 := omit
1381 }
1382 }
1383 }
1384}
1385
1386template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
1387modifies ts_BSSAP_BSSMAP := {
1388 pdu := {
1389 bssmap := {
1390 cipherModeCommand := {
1391 messageType := '53'O,
1392 layer3HeaderInfo := omit,
1393 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1394 cipherResponseMode := omit,
1395 kC128 := { '83'O, kc128 }
1396 }
1397 }
1398 }
1399}
1400
Harald Welte16114282018-01-24 22:41:21 +01001401template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)
1402modifies tr_BSSAP_BSSMAP := {
1403 pdu := {
1404 bssmap := {
1405 cipherModeCommand := {
1406 messageType := '53'O,
1407 layer3HeaderInfo := *,
1408 encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),
1409 cipherResponseMode := *,
1410 kC128 := *
1411 }
1412 }
1413 }
1414}
1415
1416template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
1417modifies ts_BSSAP_BSSMAP := {
1418 pdu := {
1419 bssmap := {
1420 cipherModeComplete := {
1421 messageType := '55'O,
1422 layer3MessageContents := omit,
1423 chosenEncryptionAlgorithm := {
1424 elementIdentifier := '2C'O,
1425 algorithmIdentifier := alg
1426 }
1427 }
1428 }
1429 }
1430}
1431
Stefan Sperlinga2d59c62018-12-18 16:32:44 +01001432template PDU_BSSAP ts_BSSMAP_CipherModeComplAlg(template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := ?)
1433modifies ts_BSSAP_BSSMAP := {
1434 pdu := {
1435 bssmap := {
1436 cipherModeComplete := {
1437 messageType := '55'O,
1438 layer3MessageContents := omit,
1439 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm
1440 }
1441 }
1442 }
1443}
1444
Harald Welte73cd2712017-12-17 00:44:52 +01001445template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
1446 pdu := {
1447 bssmap := {
1448 cipherModeComplete := {
1449 messageType := '55'O,
1450 layer3MessageContents := *,
1451 chosenEncryptionAlgorithm := {
1452 elementIdentifier := '2C'O,
1453 algorithmIdentifier := alg
1454 }
1455 }
1456 }
1457 }
1458}
1459
1460template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
1461 pdu := {
1462 bssmap := {
1463 cipherModeReject := {
1464 messageType := '59'O,
1465 cause := ?
1466 }
1467 }
1468 }
1469}
1470
Daniel Willmann52918e52018-09-20 14:39:09 +02001471template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := {
1472 pdu := {
1473 bssmap := {
1474 classmarkRequest := {
1475 messageType := '58'O,
1476 talkerPriority := *
1477 }
1478 }
1479 }
1480}
1481
Harald Welte5c2622c2018-01-21 20:45:20 +01001482template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
1483 elementIdentifier := '12'O,
1484 lengthIndicator := 0, /* overwritten */
1485 /* CM1 */
1486 rf_PowerCapability := '010'B, /* class3 */
1487 a5_1 := '0'B, /* supported */
1488 esind := '1'B, /* early classmark supported */
1489 revisionLevel := '10'B, /* R99 */
1490 spare1_1 := '0'B,
1491 /* CM2 */
1492 fc := '1'B, /* E-GSM support */
1493 vgcs := '0'B,
1494 vbs := '0'B,
1495 sm_Capability := '1'B,
1496 ss_ScreenIndicator := '00'B,
1497 ps_Capability := '1'B,
1498 spare2_1 := '0'B,
1499 classmarkInformationType2_oct5 := {
1500 a5_2 := '0'B, /* not available */
1501 a5_3 := '1'B, /* available */
1502 cmsp := '0'B, /* not supported */
1503 solsa := '0'B, /* not suported */
1504 ucs2 := '0'B, /* GSM alphabet preferred */
1505 lcsvacap := '0'B, /* not supported */
1506 spare := '0'B,
1507 cm3 := '0'B /* no CM3 */
1508 }
1509}
1510
Eric Wild26f4a622021-05-17 15:27:05 +02001511
1512template BSSMAP_IE_ClassmarkInformationType3 ts_CM3_default := {
1513 elementIdentifier := '13'O,
1514 lengthIndicator := 0, /* overwritten */
1515 classmark3ValuePart := '01'O /* A5/4 supported */
1516}
1517
Harald Welte5c2622c2018-01-21 20:45:20 +01001518template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
1519 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
1520modifies ts_BSSAP_BSSMAP := {
1521 pdu := {
1522 bssmap := {
1523 classmarkUpdate := {
1524 messageType := '54'O,
1525 classmarkInformationType2 := cm2,
1526 classmarkInformationType3 := cm3,
1527 talkerPriority := omit
1528 }
1529 }
1530 }
1531}
1532
Harald Welte898113b2018-01-31 18:32:21 +01001533template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
1534 template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
1535modifies tr_BSSAP_BSSMAP := {
1536 pdu := {
1537 bssmap := {
1538 classmarkUpdate := {
1539 messageType := '54'O,
1540 classmarkInformationType2 := cm2,
1541 classmarkInformationType3 := cm3,
1542 talkerPriority := *
1543 }
1544 }
1545 }
1546}
1547
Neels Hofmeyr92b12b72018-09-18 14:30:23 +02001548template PDU_BSSAP ts_BSSMAP_ClassmarkRequest
1549modifies ts_BSSAP_BSSMAP := {
1550 pdu := {
1551 bssmap := {
1552 classmarkRequest := {
1553 messageType := '58'O,
1554 talkerPriority := omit
1555 }
1556 }
1557 }
1558}
1559
Eric Wild26f4a622021-05-17 15:27:05 +02001560template PDU_BSSAP tr_BSSMAP_ClassmarkRequest
1561modifies tr_BSSAP_BSSMAP := {
1562 pdu := {
1563 bssmap := {
1564 classmarkRequest := {
1565 messageType := '58'O,
1566 talkerPriority := *
1567 }
1568 }
1569 }
1570}
1571
Harald Welte49518bf2018-02-10 11:39:19 +01001572/* return Layer3 octetstring inside BSSAP PDU */
1573function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
1574 if (ischosen(bssap.pdu.bssmap)) {
1575 var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
1576 if (ischosen(bssmap.completeLayer3Information)) {
1577 return bssmap.completeLayer3Information.layer3Information.layer3info;
1578 } else if (ischosen(bssmap.handoverRequestAck)) {
1579 return bssmap.handoverRequestAck.layer3Information.layer3info;
1580 } else if (ischosen(bssmap.handoverCommand)) {
1581 return bssmap.handoverCommand.layer3Information.layer3info;
1582 } else if (ischosen(bssmap.uplinkRequest)) {
1583 return bssmap.uplinkRequest.layer3Information.layer3info;
1584 } else if (ischosen(bssmap.uplinkRequestConfirmation)) {
1585 return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
1586 } else if (ischosen(bssmap.uplinkApplicationData)) {
1587 return bssmap.uplinkApplicationData.layer3Information.layer3info;
1588 } else if (ischosen(bssmap.rerouteCommand)) {
1589 return bssmap.rerouteCommand.initialLayer3Information.layer3info;
1590 } else {
1591 return omit;
1592 }
1593 } else {
1594 return bssap.pdu.dtap;
1595 }
1596}
1597
Harald Welte0b50aed2018-05-28 22:33:07 +02001598/* TS 29.205 B.2.1.9 */
1599template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := {
1600 networkIDLengthIndicator := 0, /* overwritten */
1601 networkID := net_id,
1602 nodeIDLengthIndicator := 0, /* overwritten */
1603 nodeID := node_id,
1604 callReferenceIDLengthIndicator := 0, /* overwritten */
1605 callReferenceID := cref_id
1606}
1607template GlobalCallReferenceValue tr_GCR(template octetstring net_id,
1608 template OCT2 node_id,
1609 template OCT5 cref_id) := {
1610 networkIDLengthIndicator := ?,
1611 networkID := net_id,
1612 nodeIDLengthIndicator := ?,
1613 nodeID := node_id,
1614 callReferenceIDLengthIndicator := ?,
1615 callReferenceID := cref_id
1616}
1617
1618/* TS 47.008 3.2.2.115 */
1619template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := {
1620 elementIdentifier := '89'O,
1621 lengthIndicator := 0, /* overwritten */
1622 globalCallReferenceValue := gcr
1623}
1624template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := {
1625 elementIdentifier := '89'O,
1626 lengthIndicator := ?,
1627 globalCallReferenceValue := gcr
1628}
1629
1630/* TS 48.008 3.2.2.116 */
1631const BIT4 LCLS_CFG_both_way := '0000'B;
1632const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B;
1633const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B;
1634const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B;
1635const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B;
1636const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B;
1637
1638template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := {
1639 elementIdentifier := '8A'O,
1640 lCLS_ConfigurationValue := cfg_val,
1641 spare := '0000'B
1642}
1643template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := {
1644 elementIdentifier := '8A'O,
1645 lCLS_ConfigurationValue := cfg_val,
1646 spare := '0000'B
1647}
1648
1649/* TS 48.008 3.2.2.117 */
1650const BIT4 LCLS_CSC_connect := '0000'B;
1651const BIT4 LCLS_CSC_do_not_connect := '0001'B;
1652const BIT4 LCLS_CSC_release_lcls := '0010'B;
1653const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B;
1654const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B;
1655
1656template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := {
1657 elementIdentifier := '8B'O,
1658 lCLS_ConnectionStatusControlValue := csc,
1659 spare := '0000'B
1660}
1661template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := {
1662 elementIdentifier := '8B'O,
1663 lCLS_ConnectionStatusControlValue := csc,
1664 spare := '0000'B
1665}
1666
1667/* TS 48.008 3.2.2.119 */
1668const BIT4 LCLS_STS_not_yet_ls := '0000'B;
1669const BIT4 LCLS_STS_not_possible_ls := '0001'B;
1670const BIT4 LCLS_STS_no_longer_ls := '0010'B;
1671const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B;
1672const BIT4 LCLS_STS_locally_switched := '0100'B;
1673
1674template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := {
1675 elementIdentifier := '8D'O,
1676 lCLS_BSS_StatusValue := sts,
1677 spare := '0000'B
1678}
1679template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := {
1680 elementIdentifier := '8D'O,
1681 lCLS_BSS_StatusValue := sts,
1682 spare := '0000'B
1683}
1684
1685/* TS 48.008 3.2.1.91 */
1686template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001687 template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001688 pdu := {
1689 bssmap := {
1690 lCLS_ConnectControl := {
1691 messageType := '74'O,
1692 lCLS_Configuration := cfg,
1693 lCLS_ConnectionStatusControl := csc
1694 }
1695 }
1696 }
1697}
1698template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001699 template BSSMAP_IE_LCLS_ConnectionStatusControl csc)
1700modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001701 pdu := {
1702 bssmap := {
1703 lCLS_ConnectControl := {
1704 messageType := '74'O,
1705 lCLS_Configuration := cfg,
1706 lCLS_ConnectionStatusControl := csc
1707 }
1708 }
1709 }
1710}
1711
1712/* TS 48.008 3.2.1.92 */
Harald Welte354722e2018-06-01 13:15:32 +02001713template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts)
1714modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001715 pdu := {
1716 bssmap := {
1717 lCLS_connectControlAck := {
1718 messageType := '75'O,
1719 lCLS_BSS_Status := sts
1720 }
1721 }
1722 }
1723}
Harald Welte354722e2018-06-01 13:15:32 +02001724template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts)
1725modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001726 pdu := {
1727 bssmap := {
1728 lCLS_connectControlAck := {
1729 messageType := '75'O,
1730 lCLS_BSS_Status := sts
1731 }
1732 }
1733 }
1734}
1735
1736/* TS 48.008 3.2.1.93 */
1737template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001738 template (omit) BSSMAP_IE_LCLS_BreakRequest brq)
1739modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001740 pdu := {
1741 bssmap := {
1742 lCLS_Notification := {
1743 messageType := '76'O,
1744 lCLS_BSS_Status := sts,
1745 lCLS_BreakRequest := brq
1746 }
1747 }
1748 }
1749}
1750template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001751 template BSSMAP_IE_LCLS_BreakRequest brq)
1752modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001753 pdu := {
1754 bssmap := {
1755 lCLS_Notification := {
1756 messageType := '76'O,
1757 lCLS_BSS_Status := sts,
1758 lCLS_BreakRequest := brq
1759 }
1760 }
1761 }
1762}
1763
Harald Weltecc0b0142018-05-29 15:19:33 +02001764template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts)
1765modifies tr_BSSAP_BSSMAP := {
1766 pdu := {
1767 bssmap := {
1768 lCLS_Notification := {
1769 messageType := '76'O,
1770 lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts),
1771 lCLS_BreakRequest := omit
1772 }
1773 }
1774 }
1775}
Harald Welte898113b2018-01-31 18:32:21 +01001776
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001777template PDU_BSSAP ts_BSSMAP_CommonId(hexstring imsi_digits,
1778 template (omit) OCT3 last_eutran_plmn := omit)
Harald Welteeddf0e92020-06-21 19:42:15 +02001779modifies ts_BSSAP_BSSMAP := {
1780 pdu := {
1781 bssmap := {
1782 commonID := {
1783 messageType := '2F'O,
1784 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Pau Espin Pedrold5ba6ce2021-04-15 14:18:13 +02001785 sNAAccessInformation := omit,
1786 selectedPLMNId := omit,
Pau Espin Pedrolee8cec82021-04-15 14:39:05 +02001787 lastUsedEUTRANPLMNId := f_ts_BSSMAP_LastUsedEUTRANPLMNId(last_eutran_plmn)
Harald Welteeddf0e92020-06-21 19:42:15 +02001788 }
1789 }
1790 }
1791}
1792
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001793template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits,
1794 template BSSAMAP_IE_LastUsedEUTRANPLMNId lastUsedEUTRANPLMNId := *)
Harald Welteeddf0e92020-06-21 19:42:15 +02001795modifies tr_BSSAP_BSSMAP := {
1796 pdu := {
1797 bssmap := {
1798 commonID := {
1799 messageType := '2F'O,
1800 iMSI := tr_BSSMAP_Imsi(imsi_digits),
Pau Espin Pedrole979c402021-04-28 17:29:54 +02001801 sNAAccessInformation := *,
1802 selectedPLMNId := *,
1803 lastUsedEUTRANPLMNId := lastUsedEUTRANPLMNId
Harald Welteeddf0e92020-06-21 19:42:15 +02001804 }
1805 }
1806 }
1807}
Harald Welte898113b2018-01-31 18:32:21 +01001808
Vadim Yanitskiy48063962020-08-28 07:49:44 +07001809template PDU_BSSAP tr_BSSMAP_SAPInReject(template (present) GsmSapi sapi := ?,
1810 template BSSMAP_IE_Cause cause := ?)
1811modifies tr_BSSAP_BSSMAP := {
1812 pdu := {
1813 bssmap := {
1814 sAPInReject := {
1815 messageType := '25'O,
1816 dLCI := {
1817 elementIdentifier := '18'O,
1818 sapiValue := f_tr_SAPI(sapi),
1819 spare := ?,
1820 c1 := ?, c2 := ?
1821 },
1822 cause := cause
1823 }
1824 }
1825 }
1826}
1827
1828private function f_tr_SAPI(template (present) GsmSapi sapi)
1829return template (present) BIT3 {
1830 if (istemplatekind(sapi, "?")) {
1831 return ?;
1832 } else {
1833 return int2bit(valueof(sapi), 3);
1834 }
1835}
1836
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001837template (value) BSSMAP_IE_LocationType ts_BSSMAP_IE_LocationType
1838:= {
1839 elementIdentifier := '44'O,
1840 lengthIndicator := 1,
1841 locationInformation := '00'O,
1842 positioningMethod := omit
1843}
Harald Welte73cd2712017-12-17 00:44:52 +01001844
Neels Hofmeyre52bc2d2020-10-01 06:39:10 +02001845template (value) PDU_BSSAP ts_BSSMAP_Perform_Location_Request(template (omit) BSSMAP_IE_IMSI imsi,
1846 template (omit) BSSMAP_IE_CellIdentifier cellIdentifier := omit
1847 )
1848modifies ts_BSSAP_BSSMAP := {
1849 pdu := {
1850 bssmap := {
1851 performLocationRequest := {
1852 messageType := '2B'O,
1853 locationType := ts_BSSMAP_IE_LocationType,
1854 cellIdentifier := cellIdentifier,
1855 classmarkInformationType3 := omit,
1856 lCS_ClientType := omit,
1857 chosenChannel := omit,
1858 lCS_Priority := omit,
1859 lCS_QOS := omit,
1860 gPS_AssistanceData := omit,
1861 aPDU := omit,
1862 iMSI := imsi,
1863 iMEI := omit,
1864 gANSS_LocationType := omit,
1865 gANSS_AssistanceData := omit
1866 }
1867 }
1868 }
1869}
1870
1871template (present) BSSMAP_IE_LocationEstimate tr_BSSMAP_IE_LocationEstimate(template (present) octetstring geo_loc := ?)
1872:= {
1873 elementIdentifier := '45'O,
1874 lengthIndicator := ?,
1875 geographicLocation := geo_loc
1876}
1877
1878function tr_BSSMAP_LcsCause(template (present) BSSMAP_LcsCause cause)
1879return template (omit) BSSMAP_IE_LCSCause {
1880 if (istemplatekind(cause, "omit")) {
1881 return omit;
1882 }
1883 var template BSSMAP_IE_LCSCause ie := {
1884 elementIdentifier := '47'O,
1885 lengthIndicator := 1,
1886 causeValue := int2bit(enum2int(valueof(cause)), 8),
1887 diagnosticValue := omit
1888 }
1889 return ie;
1890}
1891
1892template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Response(
1893 template BSSMAP_IE_LocationEstimate locationEstimate := *,
1894 template BSSMAP_IE_PositioningData positioningData := *,
1895 template BSSMAP_IE_LCSCause lCS_Cause := *
1896 )
1897modifies tr_BSSAP_BSSMAP := {
1898 pdu := {
1899 bssmap := {
1900 performLocationResponse := {
1901 messageType := '2D'O,
1902 locationEstimate := locationEstimate,
1903 positioningData := positioningData,
1904 decipheringKeys := *,
1905 lCS_Cause := lCS_Cause,
1906 velocityEstimate := *,
1907 gANSS_PositioningData := *
1908 }
1909 }
1910 }
1911}
1912
1913template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Abort(template (present) BSSMAP_IE_LCSCause lCS_Cause := ?)
1914modifies tr_BSSAP_BSSMAP := {
1915 pdu := {
1916 bssmap := {
1917 performLocationAbort := {
1918 messageType := '2E'O,
1919 lCS_Cause := lCS_Cause
1920 }
1921 }
1922 }
1923}
Harald Weltec859df52017-11-24 23:41:41 +01001924
Harald Welteb69533d2017-12-15 13:55:17 +01001925} with { encode "RAW" };