blob: 0ec563932eac40714c85cc042c449d8a5a67ab0b [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;
26type octetstring oldToNewBSSIEs;
Harald Weltec76f29f2017-11-22 12:46:46 +010027
Harald Welteb69533d2017-12-15 13:55:17 +010028/* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */
29type enumerated myBSSMAP_Cause {
30 /* 000 / 001: Normal event */
31 GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE ('0000000'B),
32 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE ('0000001'B),
33 GSM0808_CAUSE_UPLINK_QUALITY ('0000010'B),
34 GSM0808_CAUSE_UPLINK_STRENGTH ('0000011'B),
35 GSM0808_CAUSE_DOWNLINK_QUALITY ('0000100'B),
36 GSM0808_CAUSE_DOWNLINK_STRENGTH ('0000101'B),
37 GSM0808_CAUSE_DISTANCE ('0000110'B),
38 GSM0808_CAUSE_O_AND_M_INTERVENTION ('0000111'B),
39 GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION ('0001000'B),
40 GSM0808_CAUSE_CALL_CONTROL ('0001001'B),
41 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION ('0001010'B),
42 GSM0808_CAUSE_HANDOVER_SUCCESSFUL ('0001011'B),
43 GSM0808_CAUSE_BETTER_CELL ('0001100'B),
44 GSM0808_CAUSE_DIRECTED_RETRY ('0001101'B),
45 GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL ('0001110'B),
46 GSM0808_CAUSE_TRAFFIC ('0001111'B),
47 GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL ('0010000'B),
48 GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL ('0010001'B),
49 GSM0808_CAUSE_RELOCATION_TRIGGERED ('0010010'B),
50 GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED ('0010100'B),
51 GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED ('0010101'B),
52 GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG ('0010110'B),
53 GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT ('0010111'B),
54 GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE ('0011000'B),
55 /* reserved */
56 /* 010: Resource unavailable */
57 GSM0808_CAUSE_EQUIPMENT_FAILURE ('0100000'B),
58 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE ('0100001'B),
59 GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE ('0100010'B),
60 GSM0808_CAUSE_CCCH_OVERLOAD ('0100011'B),
61 GSM0808_CAUSE_PROCESSOR_OVERLOAD ('0100100'B),
62 GSM0808_CAUSE_BSS_NOT_EQUIPPED ('0100101'B),
63 GSM0808_CAUSE_MS_NOT_EQUIPPED ('0100110'B),
64 GSM0808_CAUSE_INVALID_CELL ('0100111'B),
65 GSM0808_CAUSE_TRAFFIC_LOAD ('0101000'B),
66 GSM0808_CAUSE_PREEMPTION ('0101001'B),
67 GSM0808_CAUSE_DTM_HO_SGSN_FAILURE ('0101010'B),
68 GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE ('0101011'B),
69 /* reserved */
70 /* 011: Service or option not available, but implemented */
71 GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE ('0110000'B),
72 GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH ('0110001'B),
73 GSM0808_CAUSE_SWITCH_CIRCUIT_POOL ('0110010'B),
74 GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE ('0110011'B),
75 GSM0808_CAUSE_LSA_NOT_ALLOWED ('0110100'B),
76 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL ('0110101'B),
77 GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL ('0110110'B),
78 GSM0808_CAUSE_INVALID_CSG_CELL ('0110111'B),
79 /* reserved */
80 /* 100: Service or option not implemented or currently disabled */
81 GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL ('0111111'B),
82 GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED ('1000000'B),
83 GSM0808_CAUSE_GERAN_IU_MODE_FAILURE ('1000001'B),
84 GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE ('1000010'B),
85 GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS ('1000011'B),
86 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP ('1000100'B),
87 GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP ('1000101'B),
88 GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP ('1000110'B),
89 /* reserved */
90 /* 101: Invalid message */
91 GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED ('1010000'B),
92 GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS ('1010001'B),
93 GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING ('1010010'B),
94 GSM0808_CAUSE_INCORRECT_VALUE ('1010011'B),
95 GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE ('1010100'B),
96 GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT ('1010101'B),
97 GSM0808_CAUSE_DTM_HO_INVALID_PS_IND ('1010110'B),
98 GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC ('1010111'B),
99 /* reserved */
100 /* 110: protocol error */
101 GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC ('1100000'B),
102 GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT ('1100001'B),
103 GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY ('1100010'B)
104} with { variant "FIELDLENGTH(7)" };
105
Harald Weltec76f29f2017-11-22 12:46:46 +0100106template PDU_BSSAP ts_BSSAP_BSSMAP := {
107 discriminator := '0'B,
108 spare := '0000000'B,
109 dlci := omit,
110 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +0100111 pdu := {
112 bssmap := ?
113 }
Harald Weltec76f29f2017-11-22 12:46:46 +0100114}
115
116template PDU_BSSAP tr_BSSAP_BSSMAP := {
117 discriminator := '0'B,
118 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100119 dlci := *,
Harald Weltec76f29f2017-11-22 12:46:46 +0100120 lengthIndicator := ?,
121 pdu := {
122 bssmap := ?
123 }
124}
125
Harald Welte0a6835c2018-01-21 13:56:01 +0100126template PDU_BSSAP ts_BSSAP_DTAP(octetstring dtap, template OCT1 dlci := omit) := {
Harald Welteb3414b22017-11-23 18:22:10 +0100127 discriminator := '1'B,
128 spare := '0000000'B,
Harald Welte0a6835c2018-01-21 13:56:01 +0100129 dlci := dlci,
Harald Welteb3414b22017-11-23 18:22:10 +0100130 lengthIndicator := 0, /* overwritten by codec */
131 pdu := {
Harald Welte0a6835c2018-01-21 13:56:01 +0100132 dtap := dtap
Harald Welteb3414b22017-11-23 18:22:10 +0100133 }
134}
135
136template PDU_BSSAP tr_BSSAP_DTAP := {
137 discriminator := '1'B,
138 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100139 dlci := *,
Harald Welteb3414b22017-11-23 18:22:10 +0100140 lengthIndicator := ?,
141 pdu := {
142 dtap := ?
143 }
144}
145
Harald Weltec76f29f2017-11-22 12:46:46 +0100146template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
147 elementIdentifier := '04'O,
148 lengthIndicator := 0,
149 causeValue := int2bit(val, 7),
150 extensionCauseValue := '0'B,
151 spare1 := omit
152}
Vadim Yanitskiy48063962020-08-28 07:49:44 +0700153template BSSMAP_IE_Cause tr_BSSMAP_IE_Cause(template (present) myBSSMAP_Cause val) := {
154 elementIdentifier := '04'O,
155 lengthIndicator := ?,
156 causeValue := f_tr_causeValue(val),
157 extensionCauseValue := ?,
158 spare1 := *
159}
160private function f_tr_causeValue(template (present) myBSSMAP_Cause val)
161return template (present) BIT7 {
162 if (istemplatekind(val, "?")) {
163 return ?;
164 } else {
165 var integer int_val := enum2int(valueof(val));
166 return int2bit(valueof(int_val), 7);
167 }
168}
Harald Weltec76f29f2017-11-22 12:46:46 +0100169
Philipp Maier34bd80e2018-03-27 14:28:52 +0200170template (value) BSSMAP_IE_SpeechVersion ts_BSSMAP_IE_SpeechVersion(SpeechVersion val) := {
171 elementIdentifier := '40'O,
172 speechVersionIdentifier := int2bit(val, 7),
173 spare1_1 := '0'B
174}
175
176template (value) BSSMAP_IE_CurrentChannelType1 ts_BSSMAP_IE_CurrentChannelType1(Channel c, ChannelMode cm) := {
177 elementIdentifier := '31'O,
178 channel := int2bit(c, 4),
179 channelMode := int2bit(cm, 4)
180}
181
182template (value) BSSMAP_IE_OldToNewBSSInfo ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs val) := {
183 elementIdentifier := '3A'O,
184 lengthIndicator := 0, /* overwritten by codec */
185 oldToNewBSSIEs := val
186}
187
Harald Welte420c6b02020-08-21 11:54:30 +0200188template (value) BSSMAP_IE_Osmo_OsmuxSupport tr_BSSMAP_IE_Osmo_OsmuxSupport := {
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200189 elementIdentifier := 'F0'O
190}
191
Harald Welte420c6b02020-08-21 11:54:30 +0200192private function f_enc_osmux_support(boolean osmux_enabled) return template (omit) BSSMAP_IE_Osmo_OsmuxSupport {
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200193 if (osmux_enabled) {
194 return tr_BSSMAP_IE_Osmo_OsmuxSupport;
195 }
196 return omit;
197}
198
199template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause, boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100200 pdu := {
201 bssmap := {
202 reset := {
203 messageType := '30'O,
204 cause := ts_BSSMAP_IE_Cause(cause),
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200205 a_InterfaceSelectorForReset := omit,
206 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100207 }
208 }
209 }
210}
211
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200212template PDU_BSSAP tr_BSSMAP_Reset(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100213 pdu := {
214 bssmap := {
215 reset := {
216 messageType := '30'O,
217 cause := ?,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200218 a_InterfaceSelectorForReset := *,
219 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Welte365f4ed2017-11-23 00:00:43 +0100220 }
221 }
222 }
223}
224
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200225template (value) PDU_BSSAP ts_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100226 pdu := {
227 bssmap := {
228 resetAck := {
229 messageType := '31'O,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200230 a_InterfaceSelectorForReset := omit,
231 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100232 }
233 }
234 }
235}
236
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200237template PDU_BSSAP tr_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
Harald Weltec76f29f2017-11-22 12:46:46 +0100238 pdu := {
239 bssmap := {
240 resetAck := {
241 messageType := '31'O,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200242 a_InterfaceSelectorForReset := *,
243 osmuxSupport := f_enc_osmux_support(osmux_enabled)
Harald Weltec76f29f2017-11-22 12:46:46 +0100244 }
245 }
246 }
247}
248
249template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
250 elementIdentifier := '05'O,
251 lengthIndicator := 0,
252 cellIdentifierDiscriminator := '0000'B,
253 spare1_4 := '0000'B,
254 cellIdentification := ?
255}
256
257type uint16_t BssmapLAC;
258type uint16_t BssmapCI;
259
Harald Welteae8ce232018-01-21 13:56:46 +0100260template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100261modifies ts_BSSMAP_IE_CellID := {
262 cellIdentification := {
Harald Welteae8ce232018-01-21 13:56:46 +0100263 cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100264 }
265}
Harald Weltec76f29f2017-11-22 12:46:46 +0100266
267template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
268modifies ts_BSSMAP_IE_CellID := {
269 cellIdentification := {
270 cI_LAC_CI := {
271 lac := int2oct(lac, 2),
272 ci := int2oct(ci, 2)
273 }
274 }
275}
276
277template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
278modifies ts_BSSMAP_IE_CellID := {
279 cellIdentification := {
280 cI_CI := int2oct(ci, 2)
281 }
282}
283
284template BSSMAP_IE_CellIdentifier ts_CellId_none
285modifies ts_BSSMAP_IE_CellID := {
286 cellIdentification := {
287 cI_noCell := ''O
288 }
289}
290
291
292template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
293 elementIdentifier := '17'O,
294 lengthIndicator := 0,
295 layer3info := l3info
296}
297
Harald Weltef8a0bda2017-12-09 00:53:17 +0100298template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
299 elementIdentifier := '17'O,
300 lengthIndicator := ?,
301 layer3info := l3info
302}
303
304
Harald Weltec76f29f2017-11-22 12:46:46 +0100305template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
306modifies ts_BSSAP_BSSMAP := {
307 pdu := {
308 bssmap := {
309 completeLayer3Information := {
310 messageType := '57'O,
311 cellIdentifier := cell_id,
312 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
313 chosenChannel := omit,
314 lSAIdentifier := omit,
315 aPDU := omit,
316 codecList := omit,
317 redirectAttemptFlag := omit,
318 sendSequenceNumber := omit,
319 iMSI := omit
320 }
321 }
322 }
323}
324
Harald Weltef8a0bda2017-12-09 00:53:17 +0100325template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
326 template BSSMAP_IE_CellIdentifier cell_id := ?)
327modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100328 pdu := {
329 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100330 completeLayer3Information := {
331 messageType := '57'O,
332 cellIdentifier := cell_id,
333 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
334 chosenChannel := *,
335 lSAIdentifier := *,
336 aPDU := *,
337 codecList := *,
338 redirectAttemptFlag := *,
339 sendSequenceNumber := *,
340 iMSI := *
341 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100342 }
343 }
344}
345
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200346template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {
Harald Welte28d943e2017-11-25 15:00:50 +0100347 elementIdentifier := '1A'O,
348 lengthIndicator := 0, /* overwritten */
349 cellIdentifierDiscriminator := '0000'B, /* overwritten */
350 spare1_4 := '0000'B,
351 cellIdentificationList := cid_list
352}
Harald Welte365f4ed2017-11-23 00:00:43 +0100353
Harald Welte4bf5fc92017-12-15 13:56:06 +0100354const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100355const OCT1 ChRate_TCHF := '08'O;
356const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100357const OCT1 ChRate_TCHForH_Fpref := '0A'O;
358const OCT1 ChRate_TCHForH_Hpref := '0B'O;
359const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
360const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
361const OCT1 ChRate_TCHForH := '0F'O;
362const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100363
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100364const OCT1 Spdi_TCHF_FR := '01'O;
365const OCT1 Spdi_TCHF_EFR := '11'O;
366const OCT1 Spdi_TCHF_AMR := '21'O;
367const OCT1 Spdi_TCHH_HR := '05'O;
368const OCT1 Spdi_TCHH_AMR := '25'O;
369
Harald Welte365f4ed2017-11-23 00:00:43 +0100370template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
371 elementIdentifier := '0B'O, /* overwritten */
372 lengthIndicator := 0, /* overwritten */
373 speechOrDataIndicator := '0001'B, /* speech */
374 spare1_4 := '0000'B,
375 channelRateAndType := ChRate_TCHF,
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100376 speechId_DataIndicator := Spdi_TCHF_FR
Harald Welte365f4ed2017-11-23 00:00:43 +0100377}
378
Harald Welte4bf5fc92017-12-15 13:56:06 +0100379template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
380 speechOrDataIndicator := '0100'B /* speech + CTM */
381}
382
383template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
384 elementIdentifier := '0B'O, /* overwritten */
385 lengthIndicator := 0, /* overwritten */
386 speechOrDataIndicator := '0010'B, /* data */
387 spare1_4 := '0000'B,
388 channelRateAndType := ChRate_TCHF,
389 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
390}
391
392template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
393 elementIdentifier := '0B'O, /* overwritten */
394 lengthIndicator := 0, /* overwritten */
395 speechOrDataIndicator := '0011'B, /* data */
396 spare1_4 := '0000'B,
397 channelRateAndType := ChRate_ANY,
398 speechId_DataIndicator := '00'O /* spare */
399}
400
401template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
402 elementIdentifier := '0A'O,
403 lengthIndicator := 0, /* overwritten */
404 permittedAlgorithms := algs,
405 key := kc
406}
407
Harald Welte16114282018-01-24 22:41:21 +0100408template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
409 elementIdentifier := '0A'O,
410 lengthIndicator := ?, /* overwritten */
411 permittedAlgorithms := algs,
412 key := kc
413}
414
415
Harald Welte4bf5fc92017-12-15 13:56:06 +0100416
Harald Welte365f4ed2017-11-23 00:00:43 +0100417template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
418 elementIdentifier := '01'O, /* overwritten */
419 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
420 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
421}
422
Pau Espin Pedrol43021cb2019-06-18 17:32:15 +0200423function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {
424 var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
425 return cic;
426}
427
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100428template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100429 uint16_t udp_port,
430 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100431 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100432 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100433 ipAddress := addr,
434 uDPPortValue := udp_port
435}
Harald Welte235ebf12017-12-15 14:18:16 +0100436template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100437 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100438template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100439 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100440
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200441function f_ts_BSSMAP_IE_AoIP_TLA(charstring addr, uint16_t udp_port)
442 return template (value) BSSMAP_IE_AoIP_TransportLayerAddress {
443 if (f_addr_is_ipv6(addr)) {
444 var OCT16 ip6 := f_inet6_addr(addr);
445 return ts_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
446 } else {
447 var OCT4 ip := f_inet_addr(addr);
448 return ts_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
449 }
450}
451
Neels Hofmeyr3c89a6b2019-10-15 16:54:37 +0200452template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr,
453 template uint16_t udp_port,
454 template integer len := ?) := {
455 elementIdentifier := '7C'O,
456 lengthIndicator := len,
457 ipAddress := addr,
458 uDPPortValue := udp_port
459}
460template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) :=
461 tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
462template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) :=
463 tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
464
Pau Espin Pedrol6a846bc2020-09-04 13:01:22 +0200465function f_tr_BSSMAP_IE_AoIP_TLA(charstring addr, template uint16_t udp_port)
466 return template BSSMAP_IE_AoIP_TransportLayerAddress {
467 if (f_addr_is_ipv6(addr)) {
468 var OCT16 ip6 := f_inet6_addr(addr);
469 return tr_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
470 } else {
471 var OCT4 ip := f_inet_addr(addr);
472 return tr_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
473 }
474}
475
Harald Welte4bf5fc92017-12-15 13:56:06 +0100476template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
477 elementIdentifier := '83'O,
478 kC128_Value := kc128
479}
480
Harald Weltef1b64e22017-12-15 14:55:14 +0100481/* 3.2.2.103 */
482template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
483 codecType := GSM_FR,
484 tF := '0'B,
485 pT := '0'B,
486 pI := '0'B,
487 fI := '1'B,
488 extendedCodecType := omit,
489 s0_7 := omit,
490 s8_15 := omit
491}
492template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
493 codecType := GSM_FR
494}
495template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
496 codecType := GSM_EFR
497}
498template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
499 codecType := GSM_HR
500}
501template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
502 codecType := FR_AMR,
503 s0_7 := '11111111'B,
504 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
505}
506template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
507 codecType := HR_AMR,
508 s0_7 := '00111111'B,
509 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
510}
511template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
512 elementIdentifier := '7D'O,
513 lengthIndicator := 0, /* overwritten */
514 codecElements := valueof(elem)
515}
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100516template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := {
517 elementIdentifier := '7E'O,
518 lengthIndicator := 0, /* overwritten */
519 codecElements := valueof(elem)
520}
Harald Weltef1b64e22017-12-15 14:55:14 +0100521
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200522template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := {
523 elementIdentifier := 'F1'O,
524 osmuxCID := cid
525}
526
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100527template PDU_BSSAP
528ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200529 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
530 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100531modifies ts_BSSAP_BSSMAP := {
532 pdu := {
533 bssmap := {
534 assignmentRequest := {
535 messageType :='01'O, /* overwritten */
536 channelType := ts_BSSMAP_IE_ChannelType,
537 layer3HeaderInfo := omit,
538 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100539 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100540 downLinkDTX_Flag := omit,
541 interferenceBandToBeUsed := omit,
542 classmarkInformationType2 := omit,
543 groupCallReference := omit,
544 talkerFlag := omit,
545 configurationEvolutionIndication := omit,
546 lsaAccesControlSuppression := omit,
547 serviceHandover := omit,
548 encryptionInformation := omit,
549 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100550 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100551 codecList := omit,
552 callIdentifier := omit,
553 kC128 := omit,
554 globalCallReference := omit,
555 lCLS_Configuration := omit,
556 lCLS_ConnectionStatusControl := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200557 lCLS_CorrelationNotNeeded := omit,
558 osmuxCID := osmuxCID
Harald Welte365f4ed2017-11-23 00:00:43 +0100559 }
560 }
561 }
562}
Harald Weltec76f29f2017-11-22 12:46:46 +0100563
Harald Weltebe48a7c2018-01-26 21:39:25 +0100564template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200565 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
566 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltebe48a7c2018-01-26 21:39:25 +0100567modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100568 pdu := {
569 bssmap := {
570 assignmentRequest := {
571 messageType :='01'O, /* overwritten */
572 channelType := ?,
573 layer3HeaderInfo := *,
574 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100575 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100576 downLinkDTX_Flag := *,
577 interferenceBandToBeUsed := *,
578 classmarkInformationType2 := *,
579 groupCallReference := *,
580 talkerFlag := *,
581 configurationEvolutionIndication := *,
582 lsaAccesControlSuppression := *,
583 serviceHandover := *,
584 encryptionInformation := *,
585 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100586 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100587 codecList := *,
588 callIdentifier := *,
589 kC128 := *,
590 globalCallReference := *,
591 lCLS_Configuration := *,
592 lCLS_ConnectionStatusControl := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200593 lCLS_CorrelationNotNeeded := *,
594 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100595 }
596 }
597 }
598}
599
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100600template PDU_BSSAP
601ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100602 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200603 template BSSMAP_IE_SpeechCodec speechCodec := omit,
604 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100605modifies ts_BSSAP_BSSMAP := {
606 pdu := {
607 bssmap := {
608 assignmentComplete := {
609 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100610 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100611 circuitIdentityCode := cic,
612 cellIdentifier := omit,
613 chosenChannel := omit,
614 chosenEncryptionAlgorithm := omit,
615 circuitPool := omit,
616 speechVersion := omit,
617 lSAIdentifier := omit,
618 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100619 aoIPTransportLayer := aoip,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100620 speechCodec := speechCodec,
Harald Welteb3414b22017-11-23 18:22:10 +0100621 codecList := omit,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200622 lCLS_BSS_Status := omit,
623 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100624 }
625 }
626 }
627}
628
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100629template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200630 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
631 template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100632modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100633 pdu := {
634 bssmap := {
635 assignmentComplete := {
636 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100637 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100638 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100639 cellIdentifier := *,
640 chosenChannel := *,
641 chosenEncryptionAlgorithm := *,
642 circuitPool := *,
643 speechVersion := *,
644 lSAIdentifier := *,
645 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100646 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100647 speechCodec := *,
648 codecList := *,
Pau Espin Pedrol5eff9752019-05-23 15:03:54 +0200649 lCLS_BSS_Status := *,
650 osmuxCID := osmuxCID
Harald Welteb3414b22017-11-23 18:22:10 +0100651 }
652 }
653 }
654}
655
Harald Welte16a4adf2017-12-14 18:54:01 +0100656template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
657 pdu := {
658 bssmap := {
659 assignmentFailure := {
660 messageType := '03'O, /* overwritten */
661 rR_Cause := *,
662 circuitPool := *,
663 circuitPoolList := *,
664 talkerPriority := *,
665 codecList := *
666 }
667 }
668 }
669}
670
671
Harald Welteb3414b22017-11-23 18:22:10 +0100672template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
673modifies ts_BSSAP_BSSMAP := {
674 pdu := {
675 bssmap := {
676 clearCommand := {
677 messageType := '20'O, /* overwritten */
678 layer3HeaderInfo := omit,
679 cause := ts_BSSMAP_IE_Cause(cause),
680 cSFB_Indication := omit
681 }
682 }
683 }
684}
Harald Welte99787102019-02-04 10:41:36 +0100685template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause)
686modifies ts_BSSMAP_ClearCommand := {
687 pdu := {
688 bssmap := {
689 clearCommand := {
690 cSFB_Indication := {
691 elementIdentifier := '8F'O
692 }
693 }
694 }
695 }
696}
Harald Welteb3414b22017-11-23 18:22:10 +0100697
698template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
699 pdu := {
700 bssmap := {
701 clearCommand := {
702 messageType := '20'O, /* overwritten */
703 layer3HeaderInfo := *,
704 cause := ?,
705 cSFB_Indication := *
706 }
707 }
708 }
709}
710
Harald Welte4c422b72019-02-17 16:27:10 +0100711template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := {
712 pdu := {
713 bssmap := {
714 clearCommand := {
715 messageType := '20'O, /* overwritten */
716 layer3HeaderInfo := *,
717 cause := ?,
718 cSFB_Indication := {
719 elementIdentifier := '8F'O
720 }
721 }
722 }
723 }
724}
725
Harald Welteb3414b22017-11-23 18:22:10 +0100726template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
727modifies ts_BSSAP_BSSMAP := {
728 pdu := {
729 bssmap := {
730 clearComplete := {
731 messageType := '21'O /* overwritten */
732 }
733 }
734 }
735}
736
Harald Weltec859df52017-11-24 23:41:41 +0100737template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
738 pdu := {
739 bssmap := {
740 clearComplete := {
741 messageType := '21'O
742 }
743 }
744 }
745}
746
Harald Weltebc881782018-01-23 20:09:15 +0100747template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
748modifies ts_BSSAP_BSSMAP := {
749 pdu := {
750 bssmap := {
751 clearRequest := {
752 messageType := '22'O, /* overwritten */
753 cause := ts_BSSMAP_IE_Cause(cause)
754 }
755 }
756 }
757}
758
Harald Weltecfa79ad2017-12-09 22:33:47 +0100759template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
760 pdu := {
761 bssmap := {
762 clearRequest := {
763 messageType := '22'O, /* overwritten */
764 cause := ?
765 }
766 }
767 }
768}
769
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200770template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,
771 template BSSMAP_FIELD_CellIdentificationList cid_list)
772modifies ts_BSSAP_BSSMAP := {
773 pdu := {
774 bssmap := {
775 handoverRequired := {
776 messageType := '11'O,
777 cause := ts_BSSMAP_IE_Cause(cause),
778 responseRequest := omit,
779 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
780 circuitPoolList := omit,
781 currentChannelType1 := omit,
782 speechVersion := omit,
783 queueingIndicator := omit,
784 oldToNewBSSInfo := omit,
785 sourceToTargetRNCTransparentInfo := omit,
786 sourceToTargetRNCTransparentInfoCDMA := omit,
787 gERANClassmark := omit,
788 talkerPriority := omit,
789 speechCodec := omit,
790 cSG_Identifier := omit
791 }
792 }
793 }
794}
795
796
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100797template PDU_BSSAP tr_BSSMAP_HandoverRequired modifies tr_BSSAP_BSSMAP := {
798 pdu := {
799 bssmap := {
800 handoverRequired := {
801 messageType := '11'O
802 }
803 }
804 }
805}
806
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200807template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {
808 pdu := {
809 bssmap := {
810 handoverRequiredReject := {
811 messageType := '1A'O
812 }
813 }
814 }
815}
816
817template PDU_BSSAP tr_BSSMAP_HandoverCommand
818modifies tr_BSSAP_BSSMAP := {
819 pdu := {
820 bssmap := {
821 handoverCommand := {
822 messageType := '13'O
823 }
824 }
825 }
826}
827
828template PDU_BSSAP tr_BSSMAP_HandoverSucceeded
829modifies tr_BSSAP_BSSMAP := {
830 pdu := {
831 bssmap := {
832 handoverSucceeded := {
833 messageType := '15'O
834 }
835 }
836 }
837}
838
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100839template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)
840modifies ts_BSSAP_BSSMAP := {
841 pdu := {
842 bssmap := {
843 handoverCommand := {
844 messageType := '13'O,
845 layer3Information := {
846 elementIdentifier := '17'O,
847 lengthIndicator := 0,
848 layer3info := layer3info
849 },
850 cellIdentifier := omit,
851 newBSSToOldBSSInfo := omit,
852 talkerPriority := omit
853 }
854 }
855 }
856}
857
Neels Hofmeyr61ebb8b2018-10-09 18:28:06 +0200858template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := {
859 pdu := {
860 bssmap := {
861 handoverFailure := {
862 messageType := '16'O,
863 cause := ?,
864 rR_Cause := *,
865 circuitPool := *,
866 circuitPoolList := *,
867 gERANClassmark := *,
868 newBSSToOldBSSInfo := *,
869 interSystemInformation := *,
870 talkerPriority := *,
871 codecList := *
872 }
873 }
874 }
875}
876
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200877template PDU_BSSAP tr_BSSMAP_HandoverRequest modifies tr_BSSAP_BSSMAP := {
878 pdu := {
879 bssmap := {
880 handoverRequest := {
881 messageType := '10'O
882 }
883 }
884 }
885}
886
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100887template PDU_BSSAP ts_BSSMAP_HandoverRequest(
888 template BSSMAP_IE_CircuitIdentityCode cic := omit,
889 template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,
890 template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0),
891 template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1)
892 )
893modifies ts_BSSAP_BSSMAP := {
894 pdu := {
895 bssmap := {
896 handoverRequest := {
897 messageType := '10'O,
898 channelType := ts_BSSMAP_IE_ChannelType,
899 encryptionInformation :=
900 ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O),
901 classmarkInformationType := {
902 classmarkInformationType1 := {
903 elementIdentifier := '1D'O,
904 rf_PowerCapability := '000'B,
905 a5_1 := '0'B,
906 esind := '0'B,
907 revisionLevel := '10'B,
908 spare1_1 := '0'B
909 }
910 },
911 cellIdentifierSource := cell_id_source,
912 priority := omit,
913 circuitIdentityCode := cic,
914 downLinkDTX_Flag := omit,
915 cellIdentifierTarget := cell_id_target,
916 interferenceBandToBeUsed := omit,
917 cause := omit,
918 classmarkInformationType3 := omit,
919 currentChannelType1 := omit,
920 speechVersion := omit,
921 groupCallReference := omit,
922 talkerFlag := omit,
923 configurationEvolutionIndication := omit,
924 chosenEncryptionAlgorithm := omit,
925 oldToNewBSSInfo := omit,
926 lSAInformation := omit,
927 lSAAccessControlSuppression := omit,
928 serviceHandover := omit,
929 iMSI_bssmap := omit,
930 sourceToTargetRNCTransparentInfo := omit,
931 sourceToTargetRNCTransparentInfoCDMA := omit,
932 sNAAccessInformation := omit,
933 talkerPriority := omit,
934 aoIPTransportLayer := aoip_tla,
935 codecList := omit,
936 callIdentifier := omit,
937 kC128 := omit,
938 globalCallReference := omit,
939 lCLS_Configuration := omit,
940 connectionStatusControl := omit
941 }
942 }
943 }
944}
945
946template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info)
947modifies tr_BSSAP_BSSMAP := {
948 pdu := {
949 bssmap := {
950 handoverRequestAck := {
951 messageType := '12'O,
952 layer3Information := {
953 elementIdentifier := '17'O,
954 lengthIndicator := ?,
955 layer3info := layer3info
956 }
957 }
958 }
959 }
960}
961
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200962template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(
963 template octetstring layer3info,
964 template LIN1 layer3infoLength,
965 template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,
966 template BSSMAP_IE_SpeechCodec speechCodec := omit,
967 template BSSMAP_IE_ChosenChannel chosenChannel := omit,
968 template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)
969modifies ts_BSSAP_BSSMAP := {
970 pdu := {
971 bssmap := {
972 handoverRequestAck := {
973 messageType := '12'O,
974 layer3Information := {
975 elementIdentifier := '17'O,
976 lengthIndicator := layer3infoLength,
977 layer3info := layer3info
978 },
979 chosenChannel := chosenChannel,
980 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
981 circuitPool := omit,
982 speechVersion := omit,
983 circuitIdentityCode := omit,
984 lSAIdentifier := omit,
985 newBSSToOldBSSInfo := omit,
986 interSystemInformation := omit,
987 talkerPriority := omit,
988 aoIPTransportLayer := aoIPTransportLayer,
989 codecList := omit,
990 speechCodec := speechCodec,
991 lCLS_bSS_Status := omit
992 }
993 }
994 }
995}
996
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100997template PDU_BSSAP tr_BSSMAP_HandoverDetect
998modifies tr_BSSAP_BSSMAP := {
999 pdu := {
1000 bssmap := {
1001 handoverDetect := {
1002 messageType := '1B'O,
1003 talkerPriority := *
1004 }
1005 }
1006 }
1007}
1008
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001009template PDU_BSSAP ts_BSSMAP_HandoverDetect
1010modifies ts_BSSAP_BSSMAP := {
1011 pdu := {
1012 bssmap := {
1013 handoverDetect := {
1014 messageType := '1B'O,
1015 talkerPriority := omit
1016 }
1017 }
1018 }
1019}
1020
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +01001021template PDU_BSSAP tr_BSSMAP_HandoverComplete
1022modifies tr_BSSAP_BSSMAP := {
1023 pdu := {
1024 bssmap := {
1025 handoverComplete := {
1026 messageType := '14'O,
1027 rR_Cause := *,
1028 talkerPriority := *,
1029 speechCodec := *,
1030 codecList := *,
1031 chosenEncryptionAlgorithm := *,
1032 chosenChannel := *,
1033 lCLS_BSS_Status := *
1034 }
1035 }
1036 }
1037}
Harald Weltecfa79ad2017-12-09 22:33:47 +01001038
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001039template PDU_BSSAP ts_BSSMAP_HandoverComplete
1040modifies ts_BSSAP_BSSMAP := {
1041 pdu := {
1042 bssmap := {
1043 handoverComplete := {
1044 messageType := '14'O,
1045 rR_Cause := omit,
1046 talkerPriority := omit,
1047 speechCodec := omit,
1048 codecList := omit,
1049 chosenEncryptionAlgorithm := omit,
1050 chosenChannel := omit,
1051 lCLS_BSS_Status := omit
1052 }
1053 }
1054 }
1055}
1056
Philipp Maieraee60392018-11-05 17:09:00 +01001057template PDU_BSSAP tr_BSSMAP_HandoverPerformed
1058modifies tr_BSSAP_BSSMAP := {
1059 pdu := {
1060 bssmap := {
1061 handoverPerformed := {
1062 messageType := '17'O,
1063 cause := ?,
1064 cellIdentifier := ?,
Philipp Maier8d33a132018-11-12 11:58:55 +01001065 chosenChannel := *,
1066 chosenEncryptionAlgorithm := *,
1067 speechVersion := *,
1068 lSAIdentifier := *,
1069 talkerPriority := *,
1070 codecList := *,
1071 speechCodec := *,
1072 lCLS_BSS_Status := *
Philipp Maieraee60392018-11-05 17:09:00 +01001073 }
1074 }
1075 }
1076}
1077
Harald Welte28d943e2017-11-25 15:00:50 +01001078template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
1079 elementIdentifier := '08'O,
1080 lengthIndicator := 0, /* overwritten */
1081 typeOfIdentity := '001'B, /* IMSI */
1082 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
1083 digits := imsi_digits
1084}
1085
Harald Welte17d21152018-01-27 00:47:11 +01001086template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
1087 elementIdentifier := '08'O,
1088 lengthIndicator := ?, /* overwritten */
1089 typeOfIdentity := '001'B, /* IMSI */
1090 oddEvenIndicator := ?,
1091 digits := imsi_digits
1092}
1093
Harald Welte72cecfa2017-12-11 19:50:14 +01001094template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
1095 cIl_noCell := ''O
1096}
Harald Welteaba42162019-06-19 18:17:59 +02001097template (value) BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_BSS := {
1098 cIl_allInBSS := ''O
1099}
1100template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_BSS := {
1101 cIl_allInBSS := ''O
1102}
1103
1104template (value) BSSMAP_FIELD_CellIdentificationList
1105 ts_BSSMAP_CIL_CGI(template (value) BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1106 cIl_CGI := cgil
1107}
1108template BSSMAP_FIELD_CellIdentificationList
1109 tr_BSSMAP_CIL_CGI(template BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
1110 cIl_CGI := cgil
1111}
1112
1113template (value) BSSMAP_FIELD_CellIdentificationList
1114 ts_BSSMAP_CIL_LAC_CI(template (value) BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1115 cIl_LAC_CI := lac_cil
1116}
1117template BSSMAP_FIELD_CellIdentificationList
1118 tr_BSSMAP_CIL_LAC_CI(template BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
1119 cIl_LAC_CI := lac_cil
1120}
1121
1122template (value) BSSMAP_FIELD_CellIdentificationList
1123 ts_BSSMAP_CIL_CI(template (value) RecordOfOCT2 cil) := {
1124 cIl_CI := cil
1125}
1126template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_CI(template RecordOfOCT2 cil) := {
1127 cIl_CI := cil
1128}
1129
1130template (value) BSSMAP_FIELD_CellIdentificationList
1131 ts_BSSMAP_CIL_LAI(template (value) BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1132 cIl_LAI := lail
1133}
1134template BSSMAP_FIELD_CellIdentificationList
1135 tr_BSSMAP_CIL_LAI(template BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
1136 cIl_LAI := lail
1137}
1138
1139template (value) BSSMAP_FIELD_CellIdentificationList
1140 ts_BSSMAP_CIL_LAC(template (value) RecordOfOCT2 lacl) := {
1141 cIl_LAC := lacl
1142}
1143template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOfOCT2 lacl) := {
1144 cIl_LAC := lacl
1145}
1146
Harald Welte72cecfa2017-12-11 19:50:14 +01001147
1148private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte24135bd2018-03-17 19:27:53 +01001149 if (lengthof(mnc) == 2) {
1150 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
Stefan Sperling83348bc2018-03-14 17:44:40 +01001151 } else {
1152 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
1153 }
Harald Welte72cecfa2017-12-11 19:50:14 +01001154}
1155
Harald Welteaba42162019-06-19 18:17:59 +02001156template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001157 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1158 lac := int2oct(lac, 2),
1159 ci := int2oct(ci, 2)
1160}
1161
Harald Welteaba42162019-06-19 18:17:59 +02001162template (value) BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001163 lac := int2oct(lac, 2),
1164 ci := int2oct(ci, 2)
1165}
1166
Harald Welteaba42162019-06-19 18:17:59 +02001167template (value) BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
Harald Welte72cecfa2017-12-11 19:50:14 +01001168 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1169 lac := int2oct(lac, 2)
1170}
1171
Harald Welteaba42162019-06-19 18:17:59 +02001172template (value) OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
1173template (value) OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
Harald Welte72cecfa2017-12-11 19:50:14 +01001174
Harald Welteaba42162019-06-19 18:17:59 +02001175template (value) BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
Harald Welte751d3eb2018-01-31 15:51:06 +01001176ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
1177 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1178 lac := int2oct(lac, 2),
1179 rncId := int2oct(rnc_id, 2)
1180}
1181
Harald Welteaba42162019-06-19 18:17:59 +02001182template (value) BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
Harald Welte751d3eb2018-01-31 15:51:06 +01001183 lac := int2oct(lac, 2),
1184 rncId := int2oct(rnc_id, 2)
1185}
1186
Harald Welte72cecfa2017-12-11 19:50:14 +01001187template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
1188 elementIdentifier := '24'O,
1189 channel := chneed,
1190 spare := '000000'B
1191}
1192
1193template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
1194 elementIdentifier := '09'O,
1195 lengthIndicator := 4,
1196 tmsiOctets := tmsi
1197};
1198
Harald Welte17d21152018-01-27 00:47:11 +01001199template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
1200 elementIdentifier := '09'O,
1201 lengthIndicator := 4,
1202 tmsiOctets := tmsi
1203};
1204
Harald Welte72cecfa2017-12-11 19:50:14 +01001205private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
1206 var template BSSMAP_IE_TMSI ret;
1207 if (ispresent(tmsi)) {
1208 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
1209 } else {
1210 ret := omit;
1211 }
1212 return ret;
1213}
1214
1215template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
1216 template BSSMAP_FIELD_CellIdentificationList cid_list,
1217 template OCT4 tmsi := omit,
1218 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +01001219modifies ts_BSSAP_BSSMAP := {
1220 pdu := {
1221 bssmap := {
1222 paging := {
Harald Welte17d21152018-01-27 00:47:11 +01001223 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +01001224 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +01001225 tMSI := f_tmsi_or_omit(tmsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001226 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Welte72cecfa2017-12-11 19:50:14 +01001227 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +01001228 eMLPP_Priority := omit,
1229 pagingInformation := omit /* only VGCS/VBS flag */
1230 }
1231 }
1232 }
1233}
1234
Harald Welte17d21152018-01-27 00:47:11 +01001235template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
1236 template OCT4 tmsi := *,
1237 template BSSMAP_IE_ChannelNeeded chneed := *)
1238modifies tr_BSSAP_BSSMAP := {
1239 pdu := {
1240 bssmap := {
1241 paging := {
1242 messageType := '52'O,
1243 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1244 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
1245 cellIdentifierList := ?,
1246 channelNeeded := chneed,
1247 eMLPP_Priority := omit,
1248 pagingInformation := omit /* only VGCS/VBS flag */
1249 }
1250 }
1251 }
1252}
1253
1254
Harald Welte73cd2712017-12-17 00:44:52 +01001255template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
1256modifies ts_BSSAP_BSSMAP := {
1257 pdu := {
1258 bssmap := {
1259 cipherModeCommand := {
1260 messageType := '53'O,
1261 layer3HeaderInfo := omit,
1262 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1263 cipherResponseMode := omit,
1264 kC128 := omit
1265 }
1266 }
1267 }
1268}
1269
1270template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
1271modifies ts_BSSAP_BSSMAP := {
1272 pdu := {
1273 bssmap := {
1274 cipherModeCommand := {
1275 messageType := '53'O,
1276 layer3HeaderInfo := omit,
1277 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1278 cipherResponseMode := omit,
1279 kC128 := { '83'O, kc128 }
1280 }
1281 }
1282 }
1283}
1284
Harald Welte16114282018-01-24 22:41:21 +01001285template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)
1286modifies tr_BSSAP_BSSMAP := {
1287 pdu := {
1288 bssmap := {
1289 cipherModeCommand := {
1290 messageType := '53'O,
1291 layer3HeaderInfo := *,
1292 encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),
1293 cipherResponseMode := *,
1294 kC128 := *
1295 }
1296 }
1297 }
1298}
1299
1300template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
1301modifies ts_BSSAP_BSSMAP := {
1302 pdu := {
1303 bssmap := {
1304 cipherModeComplete := {
1305 messageType := '55'O,
1306 layer3MessageContents := omit,
1307 chosenEncryptionAlgorithm := {
1308 elementIdentifier := '2C'O,
1309 algorithmIdentifier := alg
1310 }
1311 }
1312 }
1313 }
1314}
1315
Stefan Sperlinga2d59c62018-12-18 16:32:44 +01001316template PDU_BSSAP ts_BSSMAP_CipherModeComplAlg(template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := ?)
1317modifies ts_BSSAP_BSSMAP := {
1318 pdu := {
1319 bssmap := {
1320 cipherModeComplete := {
1321 messageType := '55'O,
1322 layer3MessageContents := omit,
1323 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm
1324 }
1325 }
1326 }
1327}
1328
Harald Welte73cd2712017-12-17 00:44:52 +01001329template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
1330 pdu := {
1331 bssmap := {
1332 cipherModeComplete := {
1333 messageType := '55'O,
1334 layer3MessageContents := *,
1335 chosenEncryptionAlgorithm := {
1336 elementIdentifier := '2C'O,
1337 algorithmIdentifier := alg
1338 }
1339 }
1340 }
1341 }
1342}
1343
1344template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
1345 pdu := {
1346 bssmap := {
1347 cipherModeReject := {
1348 messageType := '59'O,
1349 cause := ?
1350 }
1351 }
1352 }
1353}
1354
Daniel Willmann52918e52018-09-20 14:39:09 +02001355template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := {
1356 pdu := {
1357 bssmap := {
1358 classmarkRequest := {
1359 messageType := '58'O,
1360 talkerPriority := *
1361 }
1362 }
1363 }
1364}
1365
Harald Welte5c2622c2018-01-21 20:45:20 +01001366template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
1367 elementIdentifier := '12'O,
1368 lengthIndicator := 0, /* overwritten */
1369 /* CM1 */
1370 rf_PowerCapability := '010'B, /* class3 */
1371 a5_1 := '0'B, /* supported */
1372 esind := '1'B, /* early classmark supported */
1373 revisionLevel := '10'B, /* R99 */
1374 spare1_1 := '0'B,
1375 /* CM2 */
1376 fc := '1'B, /* E-GSM support */
1377 vgcs := '0'B,
1378 vbs := '0'B,
1379 sm_Capability := '1'B,
1380 ss_ScreenIndicator := '00'B,
1381 ps_Capability := '1'B,
1382 spare2_1 := '0'B,
1383 classmarkInformationType2_oct5 := {
1384 a5_2 := '0'B, /* not available */
1385 a5_3 := '1'B, /* available */
1386 cmsp := '0'B, /* not supported */
1387 solsa := '0'B, /* not suported */
1388 ucs2 := '0'B, /* GSM alphabet preferred */
1389 lcsvacap := '0'B, /* not supported */
1390 spare := '0'B,
1391 cm3 := '0'B /* no CM3 */
1392 }
1393}
1394
1395template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
1396 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
1397modifies ts_BSSAP_BSSMAP := {
1398 pdu := {
1399 bssmap := {
1400 classmarkUpdate := {
1401 messageType := '54'O,
1402 classmarkInformationType2 := cm2,
1403 classmarkInformationType3 := cm3,
1404 talkerPriority := omit
1405 }
1406 }
1407 }
1408}
1409
Harald Welte898113b2018-01-31 18:32:21 +01001410template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
1411 template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
1412modifies tr_BSSAP_BSSMAP := {
1413 pdu := {
1414 bssmap := {
1415 classmarkUpdate := {
1416 messageType := '54'O,
1417 classmarkInformationType2 := cm2,
1418 classmarkInformationType3 := cm3,
1419 talkerPriority := *
1420 }
1421 }
1422 }
1423}
1424
Neels Hofmeyr92b12b72018-09-18 14:30:23 +02001425template PDU_BSSAP ts_BSSMAP_ClassmarkRequest
1426modifies ts_BSSAP_BSSMAP := {
1427 pdu := {
1428 bssmap := {
1429 classmarkRequest := {
1430 messageType := '58'O,
1431 talkerPriority := omit
1432 }
1433 }
1434 }
1435}
1436
Harald Welte49518bf2018-02-10 11:39:19 +01001437/* return Layer3 octetstring inside BSSAP PDU */
1438function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
1439 if (ischosen(bssap.pdu.bssmap)) {
1440 var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
1441 if (ischosen(bssmap.completeLayer3Information)) {
1442 return bssmap.completeLayer3Information.layer3Information.layer3info;
1443 } else if (ischosen(bssmap.handoverRequestAck)) {
1444 return bssmap.handoverRequestAck.layer3Information.layer3info;
1445 } else if (ischosen(bssmap.handoverCommand)) {
1446 return bssmap.handoverCommand.layer3Information.layer3info;
1447 } else if (ischosen(bssmap.uplinkRequest)) {
1448 return bssmap.uplinkRequest.layer3Information.layer3info;
1449 } else if (ischosen(bssmap.uplinkRequestConfirmation)) {
1450 return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
1451 } else if (ischosen(bssmap.uplinkApplicationData)) {
1452 return bssmap.uplinkApplicationData.layer3Information.layer3info;
1453 } else if (ischosen(bssmap.rerouteCommand)) {
1454 return bssmap.rerouteCommand.initialLayer3Information.layer3info;
1455 } else {
1456 return omit;
1457 }
1458 } else {
1459 return bssap.pdu.dtap;
1460 }
1461}
1462
Harald Welte0b50aed2018-05-28 22:33:07 +02001463/* TS 29.205 B.2.1.9 */
1464template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := {
1465 networkIDLengthIndicator := 0, /* overwritten */
1466 networkID := net_id,
1467 nodeIDLengthIndicator := 0, /* overwritten */
1468 nodeID := node_id,
1469 callReferenceIDLengthIndicator := 0, /* overwritten */
1470 callReferenceID := cref_id
1471}
1472template GlobalCallReferenceValue tr_GCR(template octetstring net_id,
1473 template OCT2 node_id,
1474 template OCT5 cref_id) := {
1475 networkIDLengthIndicator := ?,
1476 networkID := net_id,
1477 nodeIDLengthIndicator := ?,
1478 nodeID := node_id,
1479 callReferenceIDLengthIndicator := ?,
1480 callReferenceID := cref_id
1481}
1482
1483/* TS 47.008 3.2.2.115 */
1484template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := {
1485 elementIdentifier := '89'O,
1486 lengthIndicator := 0, /* overwritten */
1487 globalCallReferenceValue := gcr
1488}
1489template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := {
1490 elementIdentifier := '89'O,
1491 lengthIndicator := ?,
1492 globalCallReferenceValue := gcr
1493}
1494
1495/* TS 48.008 3.2.2.116 */
1496const BIT4 LCLS_CFG_both_way := '0000'B;
1497const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B;
1498const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B;
1499const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B;
1500const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B;
1501const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B;
1502
1503template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := {
1504 elementIdentifier := '8A'O,
1505 lCLS_ConfigurationValue := cfg_val,
1506 spare := '0000'B
1507}
1508template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := {
1509 elementIdentifier := '8A'O,
1510 lCLS_ConfigurationValue := cfg_val,
1511 spare := '0000'B
1512}
1513
1514/* TS 48.008 3.2.2.117 */
1515const BIT4 LCLS_CSC_connect := '0000'B;
1516const BIT4 LCLS_CSC_do_not_connect := '0001'B;
1517const BIT4 LCLS_CSC_release_lcls := '0010'B;
1518const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B;
1519const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B;
1520
1521template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := {
1522 elementIdentifier := '8B'O,
1523 lCLS_ConnectionStatusControlValue := csc,
1524 spare := '0000'B
1525}
1526template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := {
1527 elementIdentifier := '8B'O,
1528 lCLS_ConnectionStatusControlValue := csc,
1529 spare := '0000'B
1530}
1531
1532/* TS 48.008 3.2.2.119 */
1533const BIT4 LCLS_STS_not_yet_ls := '0000'B;
1534const BIT4 LCLS_STS_not_possible_ls := '0001'B;
1535const BIT4 LCLS_STS_no_longer_ls := '0010'B;
1536const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B;
1537const BIT4 LCLS_STS_locally_switched := '0100'B;
1538
1539template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := {
1540 elementIdentifier := '8D'O,
1541 lCLS_BSS_StatusValue := sts,
1542 spare := '0000'B
1543}
1544template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := {
1545 elementIdentifier := '8D'O,
1546 lCLS_BSS_StatusValue := sts,
1547 spare := '0000'B
1548}
1549
1550/* TS 48.008 3.2.1.91 */
1551template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001552 template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001553 pdu := {
1554 bssmap := {
1555 lCLS_ConnectControl := {
1556 messageType := '74'O,
1557 lCLS_Configuration := cfg,
1558 lCLS_ConnectionStatusControl := csc
1559 }
1560 }
1561 }
1562}
1563template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001564 template BSSMAP_IE_LCLS_ConnectionStatusControl csc)
1565modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001566 pdu := {
1567 bssmap := {
1568 lCLS_ConnectControl := {
1569 messageType := '74'O,
1570 lCLS_Configuration := cfg,
1571 lCLS_ConnectionStatusControl := csc
1572 }
1573 }
1574 }
1575}
1576
1577/* TS 48.008 3.2.1.92 */
Harald Welte354722e2018-06-01 13:15:32 +02001578template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts)
1579modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001580 pdu := {
1581 bssmap := {
1582 lCLS_connectControlAck := {
1583 messageType := '75'O,
1584 lCLS_BSS_Status := sts
1585 }
1586 }
1587 }
1588}
Harald Welte354722e2018-06-01 13:15:32 +02001589template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts)
1590modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001591 pdu := {
1592 bssmap := {
1593 lCLS_connectControlAck := {
1594 messageType := '75'O,
1595 lCLS_BSS_Status := sts
1596 }
1597 }
1598 }
1599}
1600
1601/* TS 48.008 3.2.1.93 */
1602template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001603 template (omit) BSSMAP_IE_LCLS_BreakRequest brq)
1604modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001605 pdu := {
1606 bssmap := {
1607 lCLS_Notification := {
1608 messageType := '76'O,
1609 lCLS_BSS_Status := sts,
1610 lCLS_BreakRequest := brq
1611 }
1612 }
1613 }
1614}
1615template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001616 template BSSMAP_IE_LCLS_BreakRequest brq)
1617modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001618 pdu := {
1619 bssmap := {
1620 lCLS_Notification := {
1621 messageType := '76'O,
1622 lCLS_BSS_Status := sts,
1623 lCLS_BreakRequest := brq
1624 }
1625 }
1626 }
1627}
1628
Harald Weltecc0b0142018-05-29 15:19:33 +02001629template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts)
1630modifies tr_BSSAP_BSSMAP := {
1631 pdu := {
1632 bssmap := {
1633 lCLS_Notification := {
1634 messageType := '76'O,
1635 lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts),
1636 lCLS_BreakRequest := omit
1637 }
1638 }
1639 }
1640}
Harald Welte898113b2018-01-31 18:32:21 +01001641
Harald Welteeddf0e92020-06-21 19:42:15 +02001642template PDU_BSSAP ts_BSSMAP_CommonId(hexstring imsi_digits)
1643modifies ts_BSSAP_BSSMAP := {
1644 pdu := {
1645 bssmap := {
1646 commonID := {
1647 messageType := '2F'O,
1648 iMSI := ts_BSSMAP_Imsi(imsi_digits),
1649 sNAAccessInformation := omit
1650 }
1651 }
1652 }
1653}
1654
1655template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits)
1656modifies tr_BSSAP_BSSMAP := {
1657 pdu := {
1658 bssmap := {
1659 commonID := {
1660 messageType := '2F'O,
1661 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1662 sNAAccessInformation := *
1663 }
1664 }
1665 }
1666}
Harald Welte898113b2018-01-31 18:32:21 +01001667
Vadim Yanitskiy48063962020-08-28 07:49:44 +07001668template PDU_BSSAP tr_BSSMAP_SAPInReject(template (present) GsmSapi sapi := ?,
1669 template BSSMAP_IE_Cause cause := ?)
1670modifies tr_BSSAP_BSSMAP := {
1671 pdu := {
1672 bssmap := {
1673 sAPInReject := {
1674 messageType := '25'O,
1675 dLCI := {
1676 elementIdentifier := '18'O,
1677 sapiValue := f_tr_SAPI(sapi),
1678 spare := ?,
1679 c1 := ?, c2 := ?
1680 },
1681 cause := cause
1682 }
1683 }
1684 }
1685}
1686
1687private function f_tr_SAPI(template (present) GsmSapi sapi)
1688return template (present) BIT3 {
1689 if (istemplatekind(sapi, "?")) {
1690 return ?;
1691 } else {
1692 return int2bit(valueof(sapi), 3);
1693 }
1694}
1695
Harald Welte73cd2712017-12-17 00:44:52 +01001696
Harald Weltec859df52017-11-24 23:41:41 +01001697
Harald Welteb69533d2017-12-15 13:55:17 +01001698} with { encode "RAW" };