blob: b7230cd3484236e35841948a2ac5377d9f632d85 [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 *
5 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
6 * All rights reserved.
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
10 */
11
Harald Weltec76f29f2017-11-22 12:46:46 +010012import from General_Types all;
13import from Osmocom_Types all;
Harald Welte72cecfa2017-12-11 19:50:14 +010014import from GSM_Types all;
Harald Weltec76f29f2017-11-22 12:46:46 +010015import from BSSAP_Types all;
16
17type integer BssmapCause;
Philipp Maier34bd80e2018-03-27 14:28:52 +020018type integer SpeechVersion;
19type integer Channel;
20type integer ChannelMode;
21type octetstring oldToNewBSSIEs;
Harald Weltec76f29f2017-11-22 12:46:46 +010022
Harald Welteb69533d2017-12-15 13:55:17 +010023/* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */
24type enumerated myBSSMAP_Cause {
25 /* 000 / 001: Normal event */
26 GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE ('0000000'B),
27 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE ('0000001'B),
28 GSM0808_CAUSE_UPLINK_QUALITY ('0000010'B),
29 GSM0808_CAUSE_UPLINK_STRENGTH ('0000011'B),
30 GSM0808_CAUSE_DOWNLINK_QUALITY ('0000100'B),
31 GSM0808_CAUSE_DOWNLINK_STRENGTH ('0000101'B),
32 GSM0808_CAUSE_DISTANCE ('0000110'B),
33 GSM0808_CAUSE_O_AND_M_INTERVENTION ('0000111'B),
34 GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION ('0001000'B),
35 GSM0808_CAUSE_CALL_CONTROL ('0001001'B),
36 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION ('0001010'B),
37 GSM0808_CAUSE_HANDOVER_SUCCESSFUL ('0001011'B),
38 GSM0808_CAUSE_BETTER_CELL ('0001100'B),
39 GSM0808_CAUSE_DIRECTED_RETRY ('0001101'B),
40 GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL ('0001110'B),
41 GSM0808_CAUSE_TRAFFIC ('0001111'B),
42 GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL ('0010000'B),
43 GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL ('0010001'B),
44 GSM0808_CAUSE_RELOCATION_TRIGGERED ('0010010'B),
45 GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED ('0010100'B),
46 GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED ('0010101'B),
47 GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG ('0010110'B),
48 GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT ('0010111'B),
49 GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE ('0011000'B),
50 /* reserved */
51 /* 010: Resource unavailable */
52 GSM0808_CAUSE_EQUIPMENT_FAILURE ('0100000'B),
53 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE ('0100001'B),
54 GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE ('0100010'B),
55 GSM0808_CAUSE_CCCH_OVERLOAD ('0100011'B),
56 GSM0808_CAUSE_PROCESSOR_OVERLOAD ('0100100'B),
57 GSM0808_CAUSE_BSS_NOT_EQUIPPED ('0100101'B),
58 GSM0808_CAUSE_MS_NOT_EQUIPPED ('0100110'B),
59 GSM0808_CAUSE_INVALID_CELL ('0100111'B),
60 GSM0808_CAUSE_TRAFFIC_LOAD ('0101000'B),
61 GSM0808_CAUSE_PREEMPTION ('0101001'B),
62 GSM0808_CAUSE_DTM_HO_SGSN_FAILURE ('0101010'B),
63 GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE ('0101011'B),
64 /* reserved */
65 /* 011: Service or option not available, but implemented */
66 GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE ('0110000'B),
67 GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH ('0110001'B),
68 GSM0808_CAUSE_SWITCH_CIRCUIT_POOL ('0110010'B),
69 GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE ('0110011'B),
70 GSM0808_CAUSE_LSA_NOT_ALLOWED ('0110100'B),
71 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL ('0110101'B),
72 GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL ('0110110'B),
73 GSM0808_CAUSE_INVALID_CSG_CELL ('0110111'B),
74 /* reserved */
75 /* 100: Service or option not implemented or currently disabled */
76 GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL ('0111111'B),
77 GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED ('1000000'B),
78 GSM0808_CAUSE_GERAN_IU_MODE_FAILURE ('1000001'B),
79 GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE ('1000010'B),
80 GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS ('1000011'B),
81 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP ('1000100'B),
82 GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP ('1000101'B),
83 GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP ('1000110'B),
84 /* reserved */
85 /* 101: Invalid message */
86 GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED ('1010000'B),
87 GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS ('1010001'B),
88 GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING ('1010010'B),
89 GSM0808_CAUSE_INCORRECT_VALUE ('1010011'B),
90 GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE ('1010100'B),
91 GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT ('1010101'B),
92 GSM0808_CAUSE_DTM_HO_INVALID_PS_IND ('1010110'B),
93 GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC ('1010111'B),
94 /* reserved */
95 /* 110: protocol error */
96 GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC ('1100000'B),
97 GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT ('1100001'B),
98 GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY ('1100010'B)
99} with { variant "FIELDLENGTH(7)" };
100
Harald Weltec76f29f2017-11-22 12:46:46 +0100101template PDU_BSSAP ts_BSSAP_BSSMAP := {
102 discriminator := '0'B,
103 spare := '0000000'B,
104 dlci := omit,
105 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +0100106 pdu := {
107 bssmap := ?
108 }
Harald Weltec76f29f2017-11-22 12:46:46 +0100109}
110
111template PDU_BSSAP tr_BSSAP_BSSMAP := {
112 discriminator := '0'B,
113 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100114 dlci := *,
Harald Weltec76f29f2017-11-22 12:46:46 +0100115 lengthIndicator := ?,
116 pdu := {
117 bssmap := ?
118 }
119}
120
Harald Welte0a6835c2018-01-21 13:56:01 +0100121template PDU_BSSAP ts_BSSAP_DTAP(octetstring dtap, template OCT1 dlci := omit) := {
Harald Welteb3414b22017-11-23 18:22:10 +0100122 discriminator := '1'B,
123 spare := '0000000'B,
Harald Welte0a6835c2018-01-21 13:56:01 +0100124 dlci := dlci,
Harald Welteb3414b22017-11-23 18:22:10 +0100125 lengthIndicator := 0, /* overwritten by codec */
126 pdu := {
Harald Welte0a6835c2018-01-21 13:56:01 +0100127 dtap := dtap
Harald Welteb3414b22017-11-23 18:22:10 +0100128 }
129}
130
131template PDU_BSSAP tr_BSSAP_DTAP := {
132 discriminator := '1'B,
133 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100134 dlci := *,
Harald Welteb3414b22017-11-23 18:22:10 +0100135 lengthIndicator := ?,
136 pdu := {
137 dtap := ?
138 }
139}
140
Harald Weltec76f29f2017-11-22 12:46:46 +0100141template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
142 elementIdentifier := '04'O,
143 lengthIndicator := 0,
144 causeValue := int2bit(val, 7),
145 extensionCauseValue := '0'B,
146 spare1 := omit
147}
148
Philipp Maier34bd80e2018-03-27 14:28:52 +0200149template (value) BSSMAP_IE_SpeechVersion ts_BSSMAP_IE_SpeechVersion(SpeechVersion val) := {
150 elementIdentifier := '40'O,
151 speechVersionIdentifier := int2bit(val, 7),
152 spare1_1 := '0'B
153}
154
155template (value) BSSMAP_IE_CurrentChannelType1 ts_BSSMAP_IE_CurrentChannelType1(Channel c, ChannelMode cm) := {
156 elementIdentifier := '31'O,
157 channel := int2bit(c, 4),
158 channelMode := int2bit(cm, 4)
159}
160
161template (value) BSSMAP_IE_OldToNewBSSInfo ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs val) := {
162 elementIdentifier := '3A'O,
163 lengthIndicator := 0, /* overwritten by codec */
164 oldToNewBSSIEs := val
165}
166
Harald Weltec76f29f2017-11-22 12:46:46 +0100167template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
168 pdu := {
169 bssmap := {
170 reset := {
171 messageType := '30'O,
172 cause := ts_BSSMAP_IE_Cause(cause),
173 a_InterfaceSelectorForReset := omit
174 }
175 }
176 }
177}
178
Harald Welte365f4ed2017-11-23 00:00:43 +0100179template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {
180 pdu := {
181 bssmap := {
182 reset := {
183 messageType := '30'O,
184 cause := ?,
185 a_InterfaceSelectorForReset := *
186 }
187 }
188 }
189}
190
Harald Weltec76f29f2017-11-22 12:46:46 +0100191template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
192 pdu := {
193 bssmap := {
194 resetAck := {
195 messageType := '31'O,
196 a_InterfaceSelectorForReset := omit
197 }
198 }
199 }
200}
201
202template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
203 pdu := {
204 bssmap := {
205 resetAck := {
206 messageType := '31'O,
207 a_InterfaceSelectorForReset := *
208 }
209 }
210 }
211}
212
213template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
214 elementIdentifier := '05'O,
215 lengthIndicator := 0,
216 cellIdentifierDiscriminator := '0000'B,
217 spare1_4 := '0000'B,
218 cellIdentification := ?
219}
220
221type uint16_t BssmapLAC;
222type uint16_t BssmapCI;
223
Harald Welteae8ce232018-01-21 13:56:46 +0100224template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100225modifies ts_BSSMAP_IE_CellID := {
226 cellIdentification := {
Harald Welteae8ce232018-01-21 13:56:46 +0100227 cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100228 }
229}
Harald Weltec76f29f2017-11-22 12:46:46 +0100230
231template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
232modifies ts_BSSMAP_IE_CellID := {
233 cellIdentification := {
234 cI_LAC_CI := {
235 lac := int2oct(lac, 2),
236 ci := int2oct(ci, 2)
237 }
238 }
239}
240
241template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
242modifies ts_BSSMAP_IE_CellID := {
243 cellIdentification := {
244 cI_CI := int2oct(ci, 2)
245 }
246}
247
248template BSSMAP_IE_CellIdentifier ts_CellId_none
249modifies ts_BSSMAP_IE_CellID := {
250 cellIdentification := {
251 cI_noCell := ''O
252 }
253}
254
255
256template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
257 elementIdentifier := '17'O,
258 lengthIndicator := 0,
259 layer3info := l3info
260}
261
Harald Weltef8a0bda2017-12-09 00:53:17 +0100262template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
263 elementIdentifier := '17'O,
264 lengthIndicator := ?,
265 layer3info := l3info
266}
267
268
Harald Weltec76f29f2017-11-22 12:46:46 +0100269template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
270modifies ts_BSSAP_BSSMAP := {
271 pdu := {
272 bssmap := {
273 completeLayer3Information := {
274 messageType := '57'O,
275 cellIdentifier := cell_id,
276 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
277 chosenChannel := omit,
278 lSAIdentifier := omit,
279 aPDU := omit,
280 codecList := omit,
281 redirectAttemptFlag := omit,
282 sendSequenceNumber := omit,
283 iMSI := omit
284 }
285 }
286 }
287}
288
Harald Weltef8a0bda2017-12-09 00:53:17 +0100289template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
290 template BSSMAP_IE_CellIdentifier cell_id := ?)
291modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100292 pdu := {
293 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100294 completeLayer3Information := {
295 messageType := '57'O,
296 cellIdentifier := cell_id,
297 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
298 chosenChannel := *,
299 lSAIdentifier := *,
300 aPDU := *,
301 codecList := *,
302 redirectAttemptFlag := *,
303 sendSequenceNumber := *,
304 iMSI := *
305 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100306 }
307 }
308}
309
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200310template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {
Harald Welte28d943e2017-11-25 15:00:50 +0100311 elementIdentifier := '1A'O,
312 lengthIndicator := 0, /* overwritten */
313 cellIdentifierDiscriminator := '0000'B, /* overwritten */
314 spare1_4 := '0000'B,
315 cellIdentificationList := cid_list
316}
Harald Welte365f4ed2017-11-23 00:00:43 +0100317
Harald Welte4bf5fc92017-12-15 13:56:06 +0100318const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100319const OCT1 ChRate_TCHF := '08'O;
320const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100321const OCT1 ChRate_TCHForH_Fpref := '0A'O;
322const OCT1 ChRate_TCHForH_Hpref := '0B'O;
323const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
324const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
325const OCT1 ChRate_TCHForH := '0F'O;
326const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100327
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100328const OCT1 Spdi_TCHF_FR := '01'O;
329const OCT1 Spdi_TCHF_EFR := '11'O;
330const OCT1 Spdi_TCHF_AMR := '21'O;
331const OCT1 Spdi_TCHH_HR := '05'O;
332const OCT1 Spdi_TCHH_AMR := '25'O;
333
Harald Welte365f4ed2017-11-23 00:00:43 +0100334template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
335 elementIdentifier := '0B'O, /* overwritten */
336 lengthIndicator := 0, /* overwritten */
337 speechOrDataIndicator := '0001'B, /* speech */
338 spare1_4 := '0000'B,
339 channelRateAndType := ChRate_TCHF,
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100340 speechId_DataIndicator := Spdi_TCHF_FR
Harald Welte365f4ed2017-11-23 00:00:43 +0100341}
342
Harald Welte4bf5fc92017-12-15 13:56:06 +0100343template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
344 speechOrDataIndicator := '0100'B /* speech + CTM */
345}
346
347template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
348 elementIdentifier := '0B'O, /* overwritten */
349 lengthIndicator := 0, /* overwritten */
350 speechOrDataIndicator := '0010'B, /* data */
351 spare1_4 := '0000'B,
352 channelRateAndType := ChRate_TCHF,
353 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
354}
355
356template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
357 elementIdentifier := '0B'O, /* overwritten */
358 lengthIndicator := 0, /* overwritten */
359 speechOrDataIndicator := '0011'B, /* data */
360 spare1_4 := '0000'B,
361 channelRateAndType := ChRate_ANY,
362 speechId_DataIndicator := '00'O /* spare */
363}
364
365template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
366 elementIdentifier := '0A'O,
367 lengthIndicator := 0, /* overwritten */
368 permittedAlgorithms := algs,
369 key := kc
370}
371
Harald Welte16114282018-01-24 22:41:21 +0100372template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
373 elementIdentifier := '0A'O,
374 lengthIndicator := ?, /* overwritten */
375 permittedAlgorithms := algs,
376 key := kc
377}
378
379
Harald Welte4bf5fc92017-12-15 13:56:06 +0100380
Harald Welte365f4ed2017-11-23 00:00:43 +0100381template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
382 elementIdentifier := '01'O, /* overwritten */
383 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
384 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
385}
386
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100387template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100388 uint16_t udp_port,
389 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100390 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100391 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100392 ipAddress := addr,
393 uDPPortValue := udp_port
394}
Harald Welte235ebf12017-12-15 14:18:16 +0100395template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100396 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100397template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100398 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100399
Harald Welte4bf5fc92017-12-15 13:56:06 +0100400template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
401 elementIdentifier := '83'O,
402 kC128_Value := kc128
403}
404
Harald Weltef1b64e22017-12-15 14:55:14 +0100405/* 3.2.2.103 */
406template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
407 codecType := GSM_FR,
408 tF := '0'B,
409 pT := '0'B,
410 pI := '0'B,
411 fI := '1'B,
412 extendedCodecType := omit,
413 s0_7 := omit,
414 s8_15 := omit
415}
416template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
417 codecType := GSM_FR
418}
419template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
420 codecType := GSM_EFR
421}
422template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
423 codecType := GSM_HR
424}
425template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
426 codecType := FR_AMR,
427 s0_7 := '11111111'B,
428 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
429}
430template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
431 codecType := HR_AMR,
432 s0_7 := '00111111'B,
433 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
434}
435template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
436 elementIdentifier := '7D'O,
437 lengthIndicator := 0, /* overwritten */
438 codecElements := valueof(elem)
439}
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100440template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := {
441 elementIdentifier := '7E'O,
442 lengthIndicator := 0, /* overwritten */
443 codecElements := valueof(elem)
444}
Harald Weltef1b64e22017-12-15 14:55:14 +0100445
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100446template PDU_BSSAP
447ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
448 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100449modifies ts_BSSAP_BSSMAP := {
450 pdu := {
451 bssmap := {
452 assignmentRequest := {
453 messageType :='01'O, /* overwritten */
454 channelType := ts_BSSMAP_IE_ChannelType,
455 layer3HeaderInfo := omit,
456 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100457 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100458 downLinkDTX_Flag := omit,
459 interferenceBandToBeUsed := omit,
460 classmarkInformationType2 := omit,
461 groupCallReference := omit,
462 talkerFlag := omit,
463 configurationEvolutionIndication := omit,
464 lsaAccesControlSuppression := omit,
465 serviceHandover := omit,
466 encryptionInformation := omit,
467 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100468 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100469 codecList := omit,
470 callIdentifier := omit,
471 kC128 := omit,
472 globalCallReference := omit,
473 lCLS_Configuration := omit,
474 lCLS_ConnectionStatusControl := omit,
475 lCLS_CorrelationNotNeeded := omit
476 }
477 }
478 }
479}
Harald Weltec76f29f2017-11-22 12:46:46 +0100480
Harald Weltebe48a7c2018-01-26 21:39:25 +0100481template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
482 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
483modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100484 pdu := {
485 bssmap := {
486 assignmentRequest := {
487 messageType :='01'O, /* overwritten */
488 channelType := ?,
489 layer3HeaderInfo := *,
490 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100491 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100492 downLinkDTX_Flag := *,
493 interferenceBandToBeUsed := *,
494 classmarkInformationType2 := *,
495 groupCallReference := *,
496 talkerFlag := *,
497 configurationEvolutionIndication := *,
498 lsaAccesControlSuppression := *,
499 serviceHandover := *,
500 encryptionInformation := *,
501 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100502 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100503 codecList := *,
504 callIdentifier := *,
505 kC128 := *,
506 globalCallReference := *,
507 lCLS_Configuration := *,
508 lCLS_ConnectionStatusControl := *,
509 lCLS_CorrelationNotNeeded := *
510 }
511 }
512 }
513}
514
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100515template PDU_BSSAP
516ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100517 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
518 template BSSMAP_IE_SpeechCodec speechCodec := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100519modifies ts_BSSAP_BSSMAP := {
520 pdu := {
521 bssmap := {
522 assignmentComplete := {
523 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100524 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100525 circuitIdentityCode := cic,
526 cellIdentifier := omit,
527 chosenChannel := omit,
528 chosenEncryptionAlgorithm := omit,
529 circuitPool := omit,
530 speechVersion := omit,
531 lSAIdentifier := omit,
532 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100533 aoIPTransportLayer := aoip,
Neels Hofmeyr82fd04b2019-02-28 08:43:00 +0100534 speechCodec := speechCodec,
Harald Welteb3414b22017-11-23 18:22:10 +0100535 codecList := omit,
536 lCLS_BSS_Status := omit
537 }
538 }
539 }
540}
541
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100542template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
543 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
544modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100545 pdu := {
546 bssmap := {
547 assignmentComplete := {
548 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100549 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100550 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100551 cellIdentifier := *,
552 chosenChannel := *,
553 chosenEncryptionAlgorithm := *,
554 circuitPool := *,
555 speechVersion := *,
556 lSAIdentifier := *,
557 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100558 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100559 speechCodec := *,
560 codecList := *,
561 lCLS_BSS_Status := *
562 }
563 }
564 }
565}
566
Harald Welte16a4adf2017-12-14 18:54:01 +0100567template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
568 pdu := {
569 bssmap := {
570 assignmentFailure := {
571 messageType := '03'O, /* overwritten */
572 rR_Cause := *,
573 circuitPool := *,
574 circuitPoolList := *,
575 talkerPriority := *,
576 codecList := *
577 }
578 }
579 }
580}
581
582
Harald Welteb3414b22017-11-23 18:22:10 +0100583template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
584modifies ts_BSSAP_BSSMAP := {
585 pdu := {
586 bssmap := {
587 clearCommand := {
588 messageType := '20'O, /* overwritten */
589 layer3HeaderInfo := omit,
590 cause := ts_BSSMAP_IE_Cause(cause),
591 cSFB_Indication := omit
592 }
593 }
594 }
595}
Harald Welte99787102019-02-04 10:41:36 +0100596template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause)
597modifies ts_BSSMAP_ClearCommand := {
598 pdu := {
599 bssmap := {
600 clearCommand := {
601 cSFB_Indication := {
602 elementIdentifier := '8F'O
603 }
604 }
605 }
606 }
607}
Harald Welteb3414b22017-11-23 18:22:10 +0100608
609template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
610 pdu := {
611 bssmap := {
612 clearCommand := {
613 messageType := '20'O, /* overwritten */
614 layer3HeaderInfo := *,
615 cause := ?,
616 cSFB_Indication := *
617 }
618 }
619 }
620}
621
Harald Welte4c422b72019-02-17 16:27:10 +0100622template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := {
623 pdu := {
624 bssmap := {
625 clearCommand := {
626 messageType := '20'O, /* overwritten */
627 layer3HeaderInfo := *,
628 cause := ?,
629 cSFB_Indication := {
630 elementIdentifier := '8F'O
631 }
632 }
633 }
634 }
635}
636
Harald Welteb3414b22017-11-23 18:22:10 +0100637template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
638modifies ts_BSSAP_BSSMAP := {
639 pdu := {
640 bssmap := {
641 clearComplete := {
642 messageType := '21'O /* overwritten */
643 }
644 }
645 }
646}
647
Harald Weltec859df52017-11-24 23:41:41 +0100648template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
649 pdu := {
650 bssmap := {
651 clearComplete := {
652 messageType := '21'O
653 }
654 }
655 }
656}
657
Harald Weltebc881782018-01-23 20:09:15 +0100658template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
659modifies ts_BSSAP_BSSMAP := {
660 pdu := {
661 bssmap := {
662 clearRequest := {
663 messageType := '22'O, /* overwritten */
664 cause := ts_BSSMAP_IE_Cause(cause)
665 }
666 }
667 }
668}
669
Harald Weltecfa79ad2017-12-09 22:33:47 +0100670template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
671 pdu := {
672 bssmap := {
673 clearRequest := {
674 messageType := '22'O, /* overwritten */
675 cause := ?
676 }
677 }
678 }
679}
680
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200681template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,
682 template BSSMAP_FIELD_CellIdentificationList cid_list)
683modifies ts_BSSAP_BSSMAP := {
684 pdu := {
685 bssmap := {
686 handoverRequired := {
687 messageType := '11'O,
688 cause := ts_BSSMAP_IE_Cause(cause),
689 responseRequest := omit,
690 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
691 circuitPoolList := omit,
692 currentChannelType1 := omit,
693 speechVersion := omit,
694 queueingIndicator := omit,
695 oldToNewBSSInfo := omit,
696 sourceToTargetRNCTransparentInfo := omit,
697 sourceToTargetRNCTransparentInfoCDMA := omit,
698 gERANClassmark := omit,
699 talkerPriority := omit,
700 speechCodec := omit,
701 cSG_Identifier := omit
702 }
703 }
704 }
705}
706
707
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100708template PDU_BSSAP tr_BSSMAP_HandoverRequired modifies tr_BSSAP_BSSMAP := {
709 pdu := {
710 bssmap := {
711 handoverRequired := {
712 messageType := '11'O
713 }
714 }
715 }
716}
717
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200718template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {
719 pdu := {
720 bssmap := {
721 handoverRequiredReject := {
722 messageType := '1A'O
723 }
724 }
725 }
726}
727
728template PDU_BSSAP tr_BSSMAP_HandoverCommand
729modifies tr_BSSAP_BSSMAP := {
730 pdu := {
731 bssmap := {
732 handoverCommand := {
733 messageType := '13'O
734 }
735 }
736 }
737}
738
739template PDU_BSSAP tr_BSSMAP_HandoverSucceeded
740modifies tr_BSSAP_BSSMAP := {
741 pdu := {
742 bssmap := {
743 handoverSucceeded := {
744 messageType := '15'O
745 }
746 }
747 }
748}
749
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100750template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)
751modifies ts_BSSAP_BSSMAP := {
752 pdu := {
753 bssmap := {
754 handoverCommand := {
755 messageType := '13'O,
756 layer3Information := {
757 elementIdentifier := '17'O,
758 lengthIndicator := 0,
759 layer3info := layer3info
760 },
761 cellIdentifier := omit,
762 newBSSToOldBSSInfo := omit,
763 talkerPriority := omit
764 }
765 }
766 }
767}
768
Neels Hofmeyr61ebb8b2018-10-09 18:28:06 +0200769template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := {
770 pdu := {
771 bssmap := {
772 handoverFailure := {
773 messageType := '16'O,
774 cause := ?,
775 rR_Cause := *,
776 circuitPool := *,
777 circuitPoolList := *,
778 gERANClassmark := *,
779 newBSSToOldBSSInfo := *,
780 interSystemInformation := *,
781 talkerPriority := *,
782 codecList := *
783 }
784 }
785 }
786}
787
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200788template PDU_BSSAP tr_BSSMAP_HandoverRequest modifies tr_BSSAP_BSSMAP := {
789 pdu := {
790 bssmap := {
791 handoverRequest := {
792 messageType := '10'O
793 }
794 }
795 }
796}
797
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100798template PDU_BSSAP ts_BSSMAP_HandoverRequest(
799 template BSSMAP_IE_CircuitIdentityCode cic := omit,
800 template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,
801 template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0),
802 template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1)
803 )
804modifies ts_BSSAP_BSSMAP := {
805 pdu := {
806 bssmap := {
807 handoverRequest := {
808 messageType := '10'O,
809 channelType := ts_BSSMAP_IE_ChannelType,
810 encryptionInformation :=
811 ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O),
812 classmarkInformationType := {
813 classmarkInformationType1 := {
814 elementIdentifier := '1D'O,
815 rf_PowerCapability := '000'B,
816 a5_1 := '0'B,
817 esind := '0'B,
818 revisionLevel := '10'B,
819 spare1_1 := '0'B
820 }
821 },
822 cellIdentifierSource := cell_id_source,
823 priority := omit,
824 circuitIdentityCode := cic,
825 downLinkDTX_Flag := omit,
826 cellIdentifierTarget := cell_id_target,
827 interferenceBandToBeUsed := omit,
828 cause := omit,
829 classmarkInformationType3 := omit,
830 currentChannelType1 := omit,
831 speechVersion := omit,
832 groupCallReference := omit,
833 talkerFlag := omit,
834 configurationEvolutionIndication := omit,
835 chosenEncryptionAlgorithm := omit,
836 oldToNewBSSInfo := omit,
837 lSAInformation := omit,
838 lSAAccessControlSuppression := omit,
839 serviceHandover := omit,
840 iMSI_bssmap := omit,
841 sourceToTargetRNCTransparentInfo := omit,
842 sourceToTargetRNCTransparentInfoCDMA := omit,
843 sNAAccessInformation := omit,
844 talkerPriority := omit,
845 aoIPTransportLayer := aoip_tla,
846 codecList := omit,
847 callIdentifier := omit,
848 kC128 := omit,
849 globalCallReference := omit,
850 lCLS_Configuration := omit,
851 connectionStatusControl := omit
852 }
853 }
854 }
855}
856
857template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info)
858modifies tr_BSSAP_BSSMAP := {
859 pdu := {
860 bssmap := {
861 handoverRequestAck := {
862 messageType := '12'O,
863 layer3Information := {
864 elementIdentifier := '17'O,
865 lengthIndicator := ?,
866 layer3info := layer3info
867 }
868 }
869 }
870 }
871}
872
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200873template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(
874 template octetstring layer3info,
875 template LIN1 layer3infoLength,
876 template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,
877 template BSSMAP_IE_SpeechCodec speechCodec := omit,
878 template BSSMAP_IE_ChosenChannel chosenChannel := omit,
879 template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)
880modifies ts_BSSAP_BSSMAP := {
881 pdu := {
882 bssmap := {
883 handoverRequestAck := {
884 messageType := '12'O,
885 layer3Information := {
886 elementIdentifier := '17'O,
887 lengthIndicator := layer3infoLength,
888 layer3info := layer3info
889 },
890 chosenChannel := chosenChannel,
891 chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
892 circuitPool := omit,
893 speechVersion := omit,
894 circuitIdentityCode := omit,
895 lSAIdentifier := omit,
896 newBSSToOldBSSInfo := omit,
897 interSystemInformation := omit,
898 talkerPriority := omit,
899 aoIPTransportLayer := aoIPTransportLayer,
900 codecList := omit,
901 speechCodec := speechCodec,
902 lCLS_bSS_Status := omit
903 }
904 }
905 }
906}
907
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100908template PDU_BSSAP tr_BSSMAP_HandoverDetect
909modifies tr_BSSAP_BSSMAP := {
910 pdu := {
911 bssmap := {
912 handoverDetect := {
913 messageType := '1B'O,
914 talkerPriority := *
915 }
916 }
917 }
918}
919
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200920template PDU_BSSAP ts_BSSMAP_HandoverDetect
921modifies ts_BSSAP_BSSMAP := {
922 pdu := {
923 bssmap := {
924 handoverDetect := {
925 messageType := '1B'O,
926 talkerPriority := omit
927 }
928 }
929 }
930}
931
Neels Hofmeyrbd0ef932018-03-19 14:58:46 +0100932template PDU_BSSAP tr_BSSMAP_HandoverComplete
933modifies tr_BSSAP_BSSMAP := {
934 pdu := {
935 bssmap := {
936 handoverComplete := {
937 messageType := '14'O,
938 rR_Cause := *,
939 talkerPriority := *,
940 speechCodec := *,
941 codecList := *,
942 chosenEncryptionAlgorithm := *,
943 chosenChannel := *,
944 lCLS_BSS_Status := *
945 }
946 }
947 }
948}
Harald Weltecfa79ad2017-12-09 22:33:47 +0100949
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200950template PDU_BSSAP ts_BSSMAP_HandoverComplete
951modifies ts_BSSAP_BSSMAP := {
952 pdu := {
953 bssmap := {
954 handoverComplete := {
955 messageType := '14'O,
956 rR_Cause := omit,
957 talkerPriority := omit,
958 speechCodec := omit,
959 codecList := omit,
960 chosenEncryptionAlgorithm := omit,
961 chosenChannel := omit,
962 lCLS_BSS_Status := omit
963 }
964 }
965 }
966}
967
Philipp Maieraee60392018-11-05 17:09:00 +0100968template PDU_BSSAP tr_BSSMAP_HandoverPerformed
969modifies tr_BSSAP_BSSMAP := {
970 pdu := {
971 bssmap := {
972 handoverPerformed := {
973 messageType := '17'O,
974 cause := ?,
975 cellIdentifier := ?,
Philipp Maier8d33a132018-11-12 11:58:55 +0100976 chosenChannel := *,
977 chosenEncryptionAlgorithm := *,
978 speechVersion := *,
979 lSAIdentifier := *,
980 talkerPriority := *,
981 codecList := *,
982 speechCodec := *,
983 lCLS_BSS_Status := *
Philipp Maieraee60392018-11-05 17:09:00 +0100984 }
985 }
986 }
987}
988
Harald Welte28d943e2017-11-25 15:00:50 +0100989template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
990 elementIdentifier := '08'O,
991 lengthIndicator := 0, /* overwritten */
992 typeOfIdentity := '001'B, /* IMSI */
993 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
994 digits := imsi_digits
995}
996
Harald Welte17d21152018-01-27 00:47:11 +0100997template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
998 elementIdentifier := '08'O,
999 lengthIndicator := ?, /* overwritten */
1000 typeOfIdentity := '001'B, /* IMSI */
1001 oddEvenIndicator := ?,
1002 digits := imsi_digits
1003}
1004
Harald Welte72cecfa2017-12-11 19:50:14 +01001005template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
1006 cIl_noCell := ''O
1007}
1008
1009private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte24135bd2018-03-17 19:27:53 +01001010 if (lengthof(mnc) == 2) {
1011 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
Stefan Sperling83348bc2018-03-14 17:44:40 +01001012 } else {
1013 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
1014 }
Harald Welte72cecfa2017-12-11 19:50:14 +01001015}
1016
1017template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
1018 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1019 lac := int2oct(lac, 2),
1020 ci := int2oct(ci, 2)
1021}
1022
1023template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
1024 lac := int2oct(lac, 2),
1025 ci := int2oct(ci, 2)
1026}
1027
1028template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
1029 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1030 lac := int2oct(lac, 2)
1031}
1032
1033template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
1034template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
1035
Harald Welte751d3eb2018-01-31 15:51:06 +01001036template BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
1037ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
1038 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
1039 lac := int2oct(lac, 2),
1040 rncId := int2oct(rnc_id, 2)
1041}
1042
1043template BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
1044 lac := int2oct(lac, 2),
1045 rncId := int2oct(rnc_id, 2)
1046}
1047
Harald Welte72cecfa2017-12-11 19:50:14 +01001048template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
1049 elementIdentifier := '24'O,
1050 channel := chneed,
1051 spare := '000000'B
1052}
1053
1054template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
1055 elementIdentifier := '09'O,
1056 lengthIndicator := 4,
1057 tmsiOctets := tmsi
1058};
1059
Harald Welte17d21152018-01-27 00:47:11 +01001060template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
1061 elementIdentifier := '09'O,
1062 lengthIndicator := 4,
1063 tmsiOctets := tmsi
1064};
1065
Harald Welte72cecfa2017-12-11 19:50:14 +01001066private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
1067 var template BSSMAP_IE_TMSI ret;
1068 if (ispresent(tmsi)) {
1069 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
1070 } else {
1071 ret := omit;
1072 }
1073 return ret;
1074}
1075
1076template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
1077 template BSSMAP_FIELD_CellIdentificationList cid_list,
1078 template OCT4 tmsi := omit,
1079 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +01001080modifies ts_BSSAP_BSSMAP := {
1081 pdu := {
1082 bssmap := {
1083 paging := {
Harald Welte17d21152018-01-27 00:47:11 +01001084 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +01001085 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +01001086 tMSI := f_tmsi_or_omit(tmsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001087 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Welte72cecfa2017-12-11 19:50:14 +01001088 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +01001089 eMLPP_Priority := omit,
1090 pagingInformation := omit /* only VGCS/VBS flag */
1091 }
1092 }
1093 }
1094}
1095
Harald Welte17d21152018-01-27 00:47:11 +01001096template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
1097 template OCT4 tmsi := *,
1098 template BSSMAP_IE_ChannelNeeded chneed := *)
1099modifies tr_BSSAP_BSSMAP := {
1100 pdu := {
1101 bssmap := {
1102 paging := {
1103 messageType := '52'O,
1104 iMSI := tr_BSSMAP_Imsi(imsi_digits),
1105 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
1106 cellIdentifierList := ?,
1107 channelNeeded := chneed,
1108 eMLPP_Priority := omit,
1109 pagingInformation := omit /* only VGCS/VBS flag */
1110 }
1111 }
1112 }
1113}
1114
1115
Harald Welte73cd2712017-12-17 00:44:52 +01001116template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
1117modifies ts_BSSAP_BSSMAP := {
1118 pdu := {
1119 bssmap := {
1120 cipherModeCommand := {
1121 messageType := '53'O,
1122 layer3HeaderInfo := omit,
1123 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1124 cipherResponseMode := omit,
1125 kC128 := omit
1126 }
1127 }
1128 }
1129}
1130
1131template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
1132modifies ts_BSSAP_BSSMAP := {
1133 pdu := {
1134 bssmap := {
1135 cipherModeCommand := {
1136 messageType := '53'O,
1137 layer3HeaderInfo := omit,
1138 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
1139 cipherResponseMode := omit,
1140 kC128 := { '83'O, kc128 }
1141 }
1142 }
1143 }
1144}
1145
Harald Welte16114282018-01-24 22:41:21 +01001146template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)
1147modifies tr_BSSAP_BSSMAP := {
1148 pdu := {
1149 bssmap := {
1150 cipherModeCommand := {
1151 messageType := '53'O,
1152 layer3HeaderInfo := *,
1153 encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),
1154 cipherResponseMode := *,
1155 kC128 := *
1156 }
1157 }
1158 }
1159}
1160
1161template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
1162modifies ts_BSSAP_BSSMAP := {
1163 pdu := {
1164 bssmap := {
1165 cipherModeComplete := {
1166 messageType := '55'O,
1167 layer3MessageContents := omit,
1168 chosenEncryptionAlgorithm := {
1169 elementIdentifier := '2C'O,
1170 algorithmIdentifier := alg
1171 }
1172 }
1173 }
1174 }
1175}
1176
Harald Welte73cd2712017-12-17 00:44:52 +01001177template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
1178 pdu := {
1179 bssmap := {
1180 cipherModeComplete := {
1181 messageType := '55'O,
1182 layer3MessageContents := *,
1183 chosenEncryptionAlgorithm := {
1184 elementIdentifier := '2C'O,
1185 algorithmIdentifier := alg
1186 }
1187 }
1188 }
1189 }
1190}
1191
1192template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
1193 pdu := {
1194 bssmap := {
1195 cipherModeReject := {
1196 messageType := '59'O,
1197 cause := ?
1198 }
1199 }
1200 }
1201}
1202
Daniel Willmann52918e52018-09-20 14:39:09 +02001203template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := {
1204 pdu := {
1205 bssmap := {
1206 classmarkRequest := {
1207 messageType := '58'O,
1208 talkerPriority := *
1209 }
1210 }
1211 }
1212}
1213
Harald Welte5c2622c2018-01-21 20:45:20 +01001214template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
1215 elementIdentifier := '12'O,
1216 lengthIndicator := 0, /* overwritten */
1217 /* CM1 */
1218 rf_PowerCapability := '010'B, /* class3 */
1219 a5_1 := '0'B, /* supported */
1220 esind := '1'B, /* early classmark supported */
1221 revisionLevel := '10'B, /* R99 */
1222 spare1_1 := '0'B,
1223 /* CM2 */
1224 fc := '1'B, /* E-GSM support */
1225 vgcs := '0'B,
1226 vbs := '0'B,
1227 sm_Capability := '1'B,
1228 ss_ScreenIndicator := '00'B,
1229 ps_Capability := '1'B,
1230 spare2_1 := '0'B,
1231 classmarkInformationType2_oct5 := {
1232 a5_2 := '0'B, /* not available */
1233 a5_3 := '1'B, /* available */
1234 cmsp := '0'B, /* not supported */
1235 solsa := '0'B, /* not suported */
1236 ucs2 := '0'B, /* GSM alphabet preferred */
1237 lcsvacap := '0'B, /* not supported */
1238 spare := '0'B,
1239 cm3 := '0'B /* no CM3 */
1240 }
1241}
1242
1243template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
1244 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
1245modifies ts_BSSAP_BSSMAP := {
1246 pdu := {
1247 bssmap := {
1248 classmarkUpdate := {
1249 messageType := '54'O,
1250 classmarkInformationType2 := cm2,
1251 classmarkInformationType3 := cm3,
1252 talkerPriority := omit
1253 }
1254 }
1255 }
1256}
1257
Harald Welte898113b2018-01-31 18:32:21 +01001258template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
1259 template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
1260modifies tr_BSSAP_BSSMAP := {
1261 pdu := {
1262 bssmap := {
1263 classmarkUpdate := {
1264 messageType := '54'O,
1265 classmarkInformationType2 := cm2,
1266 classmarkInformationType3 := cm3,
1267 talkerPriority := *
1268 }
1269 }
1270 }
1271}
1272
Neels Hofmeyr92b12b72018-09-18 14:30:23 +02001273template PDU_BSSAP ts_BSSMAP_ClassmarkRequest
1274modifies ts_BSSAP_BSSMAP := {
1275 pdu := {
1276 bssmap := {
1277 classmarkRequest := {
1278 messageType := '58'O,
1279 talkerPriority := omit
1280 }
1281 }
1282 }
1283}
1284
Harald Welte49518bf2018-02-10 11:39:19 +01001285/* return Layer3 octetstring inside BSSAP PDU */
1286function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
1287 if (ischosen(bssap.pdu.bssmap)) {
1288 var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
1289 if (ischosen(bssmap.completeLayer3Information)) {
1290 return bssmap.completeLayer3Information.layer3Information.layer3info;
1291 } else if (ischosen(bssmap.handoverRequestAck)) {
1292 return bssmap.handoverRequestAck.layer3Information.layer3info;
1293 } else if (ischosen(bssmap.handoverCommand)) {
1294 return bssmap.handoverCommand.layer3Information.layer3info;
1295 } else if (ischosen(bssmap.uplinkRequest)) {
1296 return bssmap.uplinkRequest.layer3Information.layer3info;
1297 } else if (ischosen(bssmap.uplinkRequestConfirmation)) {
1298 return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
1299 } else if (ischosen(bssmap.uplinkApplicationData)) {
1300 return bssmap.uplinkApplicationData.layer3Information.layer3info;
1301 } else if (ischosen(bssmap.rerouteCommand)) {
1302 return bssmap.rerouteCommand.initialLayer3Information.layer3info;
1303 } else {
1304 return omit;
1305 }
1306 } else {
1307 return bssap.pdu.dtap;
1308 }
1309}
1310
Harald Welte0b50aed2018-05-28 22:33:07 +02001311/* TS 29.205 B.2.1.9 */
1312template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := {
1313 networkIDLengthIndicator := 0, /* overwritten */
1314 networkID := net_id,
1315 nodeIDLengthIndicator := 0, /* overwritten */
1316 nodeID := node_id,
1317 callReferenceIDLengthIndicator := 0, /* overwritten */
1318 callReferenceID := cref_id
1319}
1320template GlobalCallReferenceValue tr_GCR(template octetstring net_id,
1321 template OCT2 node_id,
1322 template OCT5 cref_id) := {
1323 networkIDLengthIndicator := ?,
1324 networkID := net_id,
1325 nodeIDLengthIndicator := ?,
1326 nodeID := node_id,
1327 callReferenceIDLengthIndicator := ?,
1328 callReferenceID := cref_id
1329}
1330
1331/* TS 47.008 3.2.2.115 */
1332template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := {
1333 elementIdentifier := '89'O,
1334 lengthIndicator := 0, /* overwritten */
1335 globalCallReferenceValue := gcr
1336}
1337template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := {
1338 elementIdentifier := '89'O,
1339 lengthIndicator := ?,
1340 globalCallReferenceValue := gcr
1341}
1342
1343/* TS 48.008 3.2.2.116 */
1344const BIT4 LCLS_CFG_both_way := '0000'B;
1345const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B;
1346const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B;
1347const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B;
1348const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B;
1349const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B;
1350
1351template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := {
1352 elementIdentifier := '8A'O,
1353 lCLS_ConfigurationValue := cfg_val,
1354 spare := '0000'B
1355}
1356template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := {
1357 elementIdentifier := '8A'O,
1358 lCLS_ConfigurationValue := cfg_val,
1359 spare := '0000'B
1360}
1361
1362/* TS 48.008 3.2.2.117 */
1363const BIT4 LCLS_CSC_connect := '0000'B;
1364const BIT4 LCLS_CSC_do_not_connect := '0001'B;
1365const BIT4 LCLS_CSC_release_lcls := '0010'B;
1366const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B;
1367const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B;
1368
1369template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := {
1370 elementIdentifier := '8B'O,
1371 lCLS_ConnectionStatusControlValue := csc,
1372 spare := '0000'B
1373}
1374template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := {
1375 elementIdentifier := '8B'O,
1376 lCLS_ConnectionStatusControlValue := csc,
1377 spare := '0000'B
1378}
1379
1380/* TS 48.008 3.2.2.119 */
1381const BIT4 LCLS_STS_not_yet_ls := '0000'B;
1382const BIT4 LCLS_STS_not_possible_ls := '0001'B;
1383const BIT4 LCLS_STS_no_longer_ls := '0010'B;
1384const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B;
1385const BIT4 LCLS_STS_locally_switched := '0100'B;
1386
1387template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := {
1388 elementIdentifier := '8D'O,
1389 lCLS_BSS_StatusValue := sts,
1390 spare := '0000'B
1391}
1392template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := {
1393 elementIdentifier := '8D'O,
1394 lCLS_BSS_StatusValue := sts,
1395 spare := '0000'B
1396}
1397
1398/* TS 48.008 3.2.1.91 */
1399template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001400 template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001401 pdu := {
1402 bssmap := {
1403 lCLS_ConnectControl := {
1404 messageType := '74'O,
1405 lCLS_Configuration := cfg,
1406 lCLS_ConnectionStatusControl := csc
1407 }
1408 }
1409 }
1410}
1411template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg,
Harald Welte354722e2018-06-01 13:15:32 +02001412 template BSSMAP_IE_LCLS_ConnectionStatusControl csc)
1413modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001414 pdu := {
1415 bssmap := {
1416 lCLS_ConnectControl := {
1417 messageType := '74'O,
1418 lCLS_Configuration := cfg,
1419 lCLS_ConnectionStatusControl := csc
1420 }
1421 }
1422 }
1423}
1424
1425/* TS 48.008 3.2.1.92 */
Harald Welte354722e2018-06-01 13:15:32 +02001426template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts)
1427modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001428 pdu := {
1429 bssmap := {
1430 lCLS_connectControlAck := {
1431 messageType := '75'O,
1432 lCLS_BSS_Status := sts
1433 }
1434 }
1435 }
1436}
Harald Welte354722e2018-06-01 13:15:32 +02001437template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts)
1438modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001439 pdu := {
1440 bssmap := {
1441 lCLS_connectControlAck := {
1442 messageType := '75'O,
1443 lCLS_BSS_Status := sts
1444 }
1445 }
1446 }
1447}
1448
1449/* TS 48.008 3.2.1.93 */
1450template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001451 template (omit) BSSMAP_IE_LCLS_BreakRequest brq)
1452modifies ts_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001453 pdu := {
1454 bssmap := {
1455 lCLS_Notification := {
1456 messageType := '76'O,
1457 lCLS_BSS_Status := sts,
1458 lCLS_BreakRequest := brq
1459 }
1460 }
1461 }
1462}
1463template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts,
Harald Welte354722e2018-06-01 13:15:32 +02001464 template BSSMAP_IE_LCLS_BreakRequest brq)
1465modifies tr_BSSAP_BSSMAP := {
Harald Welte0b50aed2018-05-28 22:33:07 +02001466 pdu := {
1467 bssmap := {
1468 lCLS_Notification := {
1469 messageType := '76'O,
1470 lCLS_BSS_Status := sts,
1471 lCLS_BreakRequest := brq
1472 }
1473 }
1474 }
1475}
1476
Harald Weltecc0b0142018-05-29 15:19:33 +02001477template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts)
1478modifies tr_BSSAP_BSSMAP := {
1479 pdu := {
1480 bssmap := {
1481 lCLS_Notification := {
1482 messageType := '76'O,
1483 lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts),
1484 lCLS_BreakRequest := omit
1485 }
1486 }
1487 }
1488}
Harald Welte898113b2018-01-31 18:32:21 +01001489
1490
Harald Welte73cd2712017-12-17 00:44:52 +01001491
Harald Weltec859df52017-11-24 23:41:41 +01001492
Harald Welteb69533d2017-12-15 13:55:17 +01001493} with { encode "RAW" };