blob: 8156ca8f9f8598ab3d962f9e4c26c282aa08170c [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;
18
Harald Welteb69533d2017-12-15 13:55:17 +010019/* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */
20type enumerated myBSSMAP_Cause {
21 /* 000 / 001: Normal event */
22 GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE ('0000000'B),
23 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE ('0000001'B),
24 GSM0808_CAUSE_UPLINK_QUALITY ('0000010'B),
25 GSM0808_CAUSE_UPLINK_STRENGTH ('0000011'B),
26 GSM0808_CAUSE_DOWNLINK_QUALITY ('0000100'B),
27 GSM0808_CAUSE_DOWNLINK_STRENGTH ('0000101'B),
28 GSM0808_CAUSE_DISTANCE ('0000110'B),
29 GSM0808_CAUSE_O_AND_M_INTERVENTION ('0000111'B),
30 GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION ('0001000'B),
31 GSM0808_CAUSE_CALL_CONTROL ('0001001'B),
32 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION ('0001010'B),
33 GSM0808_CAUSE_HANDOVER_SUCCESSFUL ('0001011'B),
34 GSM0808_CAUSE_BETTER_CELL ('0001100'B),
35 GSM0808_CAUSE_DIRECTED_RETRY ('0001101'B),
36 GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL ('0001110'B),
37 GSM0808_CAUSE_TRAFFIC ('0001111'B),
38 GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL ('0010000'B),
39 GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL ('0010001'B),
40 GSM0808_CAUSE_RELOCATION_TRIGGERED ('0010010'B),
41 GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED ('0010100'B),
42 GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED ('0010101'B),
43 GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG ('0010110'B),
44 GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT ('0010111'B),
45 GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE ('0011000'B),
46 /* reserved */
47 /* 010: Resource unavailable */
48 GSM0808_CAUSE_EQUIPMENT_FAILURE ('0100000'B),
49 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE ('0100001'B),
50 GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE ('0100010'B),
51 GSM0808_CAUSE_CCCH_OVERLOAD ('0100011'B),
52 GSM0808_CAUSE_PROCESSOR_OVERLOAD ('0100100'B),
53 GSM0808_CAUSE_BSS_NOT_EQUIPPED ('0100101'B),
54 GSM0808_CAUSE_MS_NOT_EQUIPPED ('0100110'B),
55 GSM0808_CAUSE_INVALID_CELL ('0100111'B),
56 GSM0808_CAUSE_TRAFFIC_LOAD ('0101000'B),
57 GSM0808_CAUSE_PREEMPTION ('0101001'B),
58 GSM0808_CAUSE_DTM_HO_SGSN_FAILURE ('0101010'B),
59 GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE ('0101011'B),
60 /* reserved */
61 /* 011: Service or option not available, but implemented */
62 GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE ('0110000'B),
63 GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH ('0110001'B),
64 GSM0808_CAUSE_SWITCH_CIRCUIT_POOL ('0110010'B),
65 GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE ('0110011'B),
66 GSM0808_CAUSE_LSA_NOT_ALLOWED ('0110100'B),
67 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL ('0110101'B),
68 GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL ('0110110'B),
69 GSM0808_CAUSE_INVALID_CSG_CELL ('0110111'B),
70 /* reserved */
71 /* 100: Service or option not implemented or currently disabled */
72 GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL ('0111111'B),
73 GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED ('1000000'B),
74 GSM0808_CAUSE_GERAN_IU_MODE_FAILURE ('1000001'B),
75 GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE ('1000010'B),
76 GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS ('1000011'B),
77 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP ('1000100'B),
78 GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP ('1000101'B),
79 GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP ('1000110'B),
80 /* reserved */
81 /* 101: Invalid message */
82 GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED ('1010000'B),
83 GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS ('1010001'B),
84 GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING ('1010010'B),
85 GSM0808_CAUSE_INCORRECT_VALUE ('1010011'B),
86 GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE ('1010100'B),
87 GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT ('1010101'B),
88 GSM0808_CAUSE_DTM_HO_INVALID_PS_IND ('1010110'B),
89 GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC ('1010111'B),
90 /* reserved */
91 /* 110: protocol error */
92 GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC ('1100000'B),
93 GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT ('1100001'B),
94 GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY ('1100010'B)
95} with { variant "FIELDLENGTH(7)" };
96
Harald Weltec76f29f2017-11-22 12:46:46 +010097template PDU_BSSAP ts_BSSAP_BSSMAP := {
98 discriminator := '0'B,
99 spare := '0000000'B,
100 dlci := omit,
101 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +0100102 pdu := {
103 bssmap := ?
104 }
Harald Weltec76f29f2017-11-22 12:46:46 +0100105}
106
107template PDU_BSSAP tr_BSSAP_BSSMAP := {
108 discriminator := '0'B,
109 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100110 dlci := *,
Harald Weltec76f29f2017-11-22 12:46:46 +0100111 lengthIndicator := ?,
112 pdu := {
113 bssmap := ?
114 }
115}
116
Harald Welte0a6835c2018-01-21 13:56:01 +0100117template PDU_BSSAP ts_BSSAP_DTAP(octetstring dtap, template OCT1 dlci := omit) := {
Harald Welteb3414b22017-11-23 18:22:10 +0100118 discriminator := '1'B,
119 spare := '0000000'B,
Harald Welte0a6835c2018-01-21 13:56:01 +0100120 dlci := dlci,
Harald Welteb3414b22017-11-23 18:22:10 +0100121 lengthIndicator := 0, /* overwritten by codec */
122 pdu := {
Harald Welte0a6835c2018-01-21 13:56:01 +0100123 dtap := dtap
Harald Welteb3414b22017-11-23 18:22:10 +0100124 }
125}
126
127template PDU_BSSAP tr_BSSAP_DTAP := {
128 discriminator := '1'B,
129 spare := '0000000'B,
Harald Welte049ca642018-01-21 13:54:34 +0100130 dlci := *,
Harald Welteb3414b22017-11-23 18:22:10 +0100131 lengthIndicator := ?,
132 pdu := {
133 dtap := ?
134 }
135}
136
137
Harald Weltec76f29f2017-11-22 12:46:46 +0100138template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
139 elementIdentifier := '04'O,
140 lengthIndicator := 0,
141 causeValue := int2bit(val, 7),
142 extensionCauseValue := '0'B,
143 spare1 := omit
144}
145
146template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
147 pdu := {
148 bssmap := {
149 reset := {
150 messageType := '30'O,
151 cause := ts_BSSMAP_IE_Cause(cause),
152 a_InterfaceSelectorForReset := omit
153 }
154 }
155 }
156}
157
Harald Welte365f4ed2017-11-23 00:00:43 +0100158template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {
159 pdu := {
160 bssmap := {
161 reset := {
162 messageType := '30'O,
163 cause := ?,
164 a_InterfaceSelectorForReset := *
165 }
166 }
167 }
168}
169
Harald Weltec76f29f2017-11-22 12:46:46 +0100170template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
171 pdu := {
172 bssmap := {
173 resetAck := {
174 messageType := '31'O,
175 a_InterfaceSelectorForReset := omit
176 }
177 }
178 }
179}
180
181template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
182 pdu := {
183 bssmap := {
184 resetAck := {
185 messageType := '31'O,
186 a_InterfaceSelectorForReset := *
187 }
188 }
189 }
190}
191
192template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
193 elementIdentifier := '05'O,
194 lengthIndicator := 0,
195 cellIdentifierDiscriminator := '0000'B,
196 spare1_4 := '0000'B,
197 cellIdentification := ?
198}
199
200type uint16_t BssmapLAC;
201type uint16_t BssmapCI;
202
Harald Welteae8ce232018-01-21 13:56:46 +0100203template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100204modifies ts_BSSMAP_IE_CellID := {
205 cellIdentification := {
Harald Welteae8ce232018-01-21 13:56:46 +0100206 cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
Harald Weltec76f29f2017-11-22 12:46:46 +0100207 }
208}
Harald Weltec76f29f2017-11-22 12:46:46 +0100209
210template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
211modifies ts_BSSMAP_IE_CellID := {
212 cellIdentification := {
213 cI_LAC_CI := {
214 lac := int2oct(lac, 2),
215 ci := int2oct(ci, 2)
216 }
217 }
218}
219
220template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
221modifies ts_BSSMAP_IE_CellID := {
222 cellIdentification := {
223 cI_CI := int2oct(ci, 2)
224 }
225}
226
227template BSSMAP_IE_CellIdentifier ts_CellId_none
228modifies ts_BSSMAP_IE_CellID := {
229 cellIdentification := {
230 cI_noCell := ''O
231 }
232}
233
234
235template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
236 elementIdentifier := '17'O,
237 lengthIndicator := 0,
238 layer3info := l3info
239}
240
Harald Weltef8a0bda2017-12-09 00:53:17 +0100241template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
242 elementIdentifier := '17'O,
243 lengthIndicator := ?,
244 layer3info := l3info
245}
246
247
Harald Weltec76f29f2017-11-22 12:46:46 +0100248template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
249modifies ts_BSSAP_BSSMAP := {
250 pdu := {
251 bssmap := {
252 completeLayer3Information := {
253 messageType := '57'O,
254 cellIdentifier := cell_id,
255 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
256 chosenChannel := omit,
257 lSAIdentifier := omit,
258 aPDU := omit,
259 codecList := omit,
260 redirectAttemptFlag := omit,
261 sendSequenceNumber := omit,
262 iMSI := omit
263 }
264 }
265 }
266}
267
Harald Weltef8a0bda2017-12-09 00:53:17 +0100268template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
269 template BSSMAP_IE_CellIdentifier cell_id := ?)
270modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100271 pdu := {
272 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100273 completeLayer3Information := {
274 messageType := '57'O,
275 cellIdentifier := cell_id,
276 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
277 chosenChannel := *,
278 lSAIdentifier := *,
279 aPDU := *,
280 codecList := *,
281 redirectAttemptFlag := *,
282 sendSequenceNumber := *,
283 iMSI := *
284 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100285 }
286 }
287}
288
Harald Welte28d943e2017-11-25 15:00:50 +0100289template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(BSSMAP_FIELD_CellIdentificationList cid_list) := {
290 elementIdentifier := '1A'O,
291 lengthIndicator := 0, /* overwritten */
292 cellIdentifierDiscriminator := '0000'B, /* overwritten */
293 spare1_4 := '0000'B,
294 cellIdentificationList := cid_list
295}
Harald Welte365f4ed2017-11-23 00:00:43 +0100296
Harald Welte28d943e2017-11-25 15:00:50 +0100297template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_FIELD_CellIdentificationList cid_list)
Harald Weltec76f29f2017-11-22 12:46:46 +0100298modifies ts_BSSAP_BSSMAP := {
299 pdu := {
300 bssmap := {
301 handoverRequired := {
302 messageType := '11'O,
303 cause := ts_BSSMAP_IE_Cause(cause),
304 responseRequest := omit,
Harald Welte28d943e2017-11-25 15:00:50 +0100305 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Weltec76f29f2017-11-22 12:46:46 +0100306 circuitPoolList := omit,
307 currentChannelType1 := omit,
308 speechVersion := omit,
309 queueingIndicator := omit,
310 oldToNewBSSInfo := omit,
311 sourceToTargetRNCTransparentInfo := omit,
312 sourceToTargetRNCTransparentInfoCDMA := omit,
313 gERANClassmark := omit,
314 talkerPriority := omit,
315 speechCodec := omit,
316 cSG_Identifier := omit
317 }
318 }
319 }
320}
321
Harald Welte4bf5fc92017-12-15 13:56:06 +0100322const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100323const OCT1 ChRate_TCHF := '08'O;
324const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100325const OCT1 ChRate_TCHForH_Fpref := '0A'O;
326const OCT1 ChRate_TCHForH_Hpref := '0B'O;
327const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
328const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
329const OCT1 ChRate_TCHForH := '0F'O;
330const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100331
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100332const OCT1 Spdi_TCHF_FR := '01'O;
333const OCT1 Spdi_TCHF_EFR := '11'O;
334const OCT1 Spdi_TCHF_AMR := '21'O;
335const OCT1 Spdi_TCHH_HR := '05'O;
336const OCT1 Spdi_TCHH_AMR := '25'O;
337
Harald Welte365f4ed2017-11-23 00:00:43 +0100338template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
339 elementIdentifier := '0B'O, /* overwritten */
340 lengthIndicator := 0, /* overwritten */
341 speechOrDataIndicator := '0001'B, /* speech */
342 spare1_4 := '0000'B,
343 channelRateAndType := ChRate_TCHF,
Harald Weltedbd6b3f2018-03-21 18:45:02 +0100344 speechId_DataIndicator := Spdi_TCHF_FR
Harald Welte365f4ed2017-11-23 00:00:43 +0100345}
346
Harald Welte4bf5fc92017-12-15 13:56:06 +0100347template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
348 speechOrDataIndicator := '0100'B /* speech + CTM */
349}
350
351template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
352 elementIdentifier := '0B'O, /* overwritten */
353 lengthIndicator := 0, /* overwritten */
354 speechOrDataIndicator := '0010'B, /* data */
355 spare1_4 := '0000'B,
356 channelRateAndType := ChRate_TCHF,
357 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
358}
359
360template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
361 elementIdentifier := '0B'O, /* overwritten */
362 lengthIndicator := 0, /* overwritten */
363 speechOrDataIndicator := '0011'B, /* data */
364 spare1_4 := '0000'B,
365 channelRateAndType := ChRate_ANY,
366 speechId_DataIndicator := '00'O /* spare */
367}
368
369template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
370 elementIdentifier := '0A'O,
371 lengthIndicator := 0, /* overwritten */
372 permittedAlgorithms := algs,
373 key := kc
374}
375
Harald Welte16114282018-01-24 22:41:21 +0100376template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
377 elementIdentifier := '0A'O,
378 lengthIndicator := ?, /* overwritten */
379 permittedAlgorithms := algs,
380 key := kc
381}
382
383
Harald Welte4bf5fc92017-12-15 13:56:06 +0100384
Harald Welte365f4ed2017-11-23 00:00:43 +0100385template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
386 elementIdentifier := '01'O, /* overwritten */
387 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
388 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
389}
390
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100391template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100392 uint16_t udp_port,
393 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100394 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100395 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100396 ipAddress := addr,
397 uDPPortValue := udp_port
398}
Harald Welte235ebf12017-12-15 14:18:16 +0100399template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100400 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100401template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100402 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100403
Harald Welte4bf5fc92017-12-15 13:56:06 +0100404template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
405 elementIdentifier := '83'O,
406 kC128_Value := kc128
407}
408
Harald Weltef1b64e22017-12-15 14:55:14 +0100409/* 3.2.2.103 */
410template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
411 codecType := GSM_FR,
412 tF := '0'B,
413 pT := '0'B,
414 pI := '0'B,
415 fI := '1'B,
416 extendedCodecType := omit,
417 s0_7 := omit,
418 s8_15 := omit
419}
420template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
421 codecType := GSM_FR
422}
423template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
424 codecType := GSM_EFR
425}
426template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
427 codecType := GSM_HR
428}
429template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
430 codecType := FR_AMR,
431 s0_7 := '11111111'B,
432 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
433}
434template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
435 codecType := HR_AMR,
436 s0_7 := '00111111'B,
437 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
438}
439template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
440 elementIdentifier := '7D'O,
441 lengthIndicator := 0, /* overwritten */
442 codecElements := valueof(elem)
443}
444
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100445template PDU_BSSAP
446ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
447 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100448modifies ts_BSSAP_BSSMAP := {
449 pdu := {
450 bssmap := {
451 assignmentRequest := {
452 messageType :='01'O, /* overwritten */
453 channelType := ts_BSSMAP_IE_ChannelType,
454 layer3HeaderInfo := omit,
455 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100456 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100457 downLinkDTX_Flag := omit,
458 interferenceBandToBeUsed := omit,
459 classmarkInformationType2 := omit,
460 groupCallReference := omit,
461 talkerFlag := omit,
462 configurationEvolutionIndication := omit,
463 lsaAccesControlSuppression := omit,
464 serviceHandover := omit,
465 encryptionInformation := omit,
466 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100467 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100468 codecList := omit,
469 callIdentifier := omit,
470 kC128 := omit,
471 globalCallReference := omit,
472 lCLS_Configuration := omit,
473 lCLS_ConnectionStatusControl := omit,
474 lCLS_CorrelationNotNeeded := omit
475 }
476 }
477 }
478}
Harald Weltec76f29f2017-11-22 12:46:46 +0100479
Harald Weltebe48a7c2018-01-26 21:39:25 +0100480template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
481 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
482modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100483 pdu := {
484 bssmap := {
485 assignmentRequest := {
486 messageType :='01'O, /* overwritten */
487 channelType := ?,
488 layer3HeaderInfo := *,
489 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100490 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100491 downLinkDTX_Flag := *,
492 interferenceBandToBeUsed := *,
493 classmarkInformationType2 := *,
494 groupCallReference := *,
495 talkerFlag := *,
496 configurationEvolutionIndication := *,
497 lsaAccesControlSuppression := *,
498 serviceHandover := *,
499 encryptionInformation := *,
500 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100501 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100502 codecList := *,
503 callIdentifier := *,
504 kC128 := *,
505 globalCallReference := *,
506 lCLS_Configuration := *,
507 lCLS_ConnectionStatusControl := *,
508 lCLS_CorrelationNotNeeded := *
509 }
510 }
511 }
512}
513
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100514template PDU_BSSAP
515ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
516 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100517modifies ts_BSSAP_BSSMAP := {
518 pdu := {
519 bssmap := {
520 assignmentComplete := {
521 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100522 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100523 circuitIdentityCode := cic,
524 cellIdentifier := omit,
525 chosenChannel := omit,
526 chosenEncryptionAlgorithm := omit,
527 circuitPool := omit,
528 speechVersion := omit,
529 lSAIdentifier := omit,
530 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100531 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100532 speechCodec := omit,
533 codecList := omit,
534 lCLS_BSS_Status := omit
535 }
536 }
537 }
538}
539
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100540template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
541 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
542modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100543 pdu := {
544 bssmap := {
545 assignmentComplete := {
546 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100547 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100548 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100549 cellIdentifier := *,
550 chosenChannel := *,
551 chosenEncryptionAlgorithm := *,
552 circuitPool := *,
553 speechVersion := *,
554 lSAIdentifier := *,
555 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100556 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100557 speechCodec := *,
558 codecList := *,
559 lCLS_BSS_Status := *
560 }
561 }
562 }
563}
564
Harald Welte16a4adf2017-12-14 18:54:01 +0100565template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
566 pdu := {
567 bssmap := {
568 assignmentFailure := {
569 messageType := '03'O, /* overwritten */
570 rR_Cause := *,
571 circuitPool := *,
572 circuitPoolList := *,
573 talkerPriority := *,
574 codecList := *
575 }
576 }
577 }
578}
579
580
Harald Welteb3414b22017-11-23 18:22:10 +0100581template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
582modifies ts_BSSAP_BSSMAP := {
583 pdu := {
584 bssmap := {
585 clearCommand := {
586 messageType := '20'O, /* overwritten */
587 layer3HeaderInfo := omit,
588 cause := ts_BSSMAP_IE_Cause(cause),
589 cSFB_Indication := omit
590 }
591 }
592 }
593}
594
595template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
596 pdu := {
597 bssmap := {
598 clearCommand := {
599 messageType := '20'O, /* overwritten */
600 layer3HeaderInfo := *,
601 cause := ?,
602 cSFB_Indication := *
603 }
604 }
605 }
606}
607
608template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
609modifies ts_BSSAP_BSSMAP := {
610 pdu := {
611 bssmap := {
612 clearComplete := {
613 messageType := '21'O /* overwritten */
614 }
615 }
616 }
617}
618
Harald Weltec859df52017-11-24 23:41:41 +0100619template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
620 pdu := {
621 bssmap := {
622 clearComplete := {
623 messageType := '21'O
624 }
625 }
626 }
627}
628
Harald Weltebc881782018-01-23 20:09:15 +0100629template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
630modifies ts_BSSAP_BSSMAP := {
631 pdu := {
632 bssmap := {
633 clearRequest := {
634 messageType := '22'O, /* overwritten */
635 cause := ts_BSSMAP_IE_Cause(cause)
636 }
637 }
638 }
639}
640
Harald Weltecfa79ad2017-12-09 22:33:47 +0100641template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
642 pdu := {
643 bssmap := {
644 clearRequest := {
645 messageType := '22'O, /* overwritten */
646 cause := ?
647 }
648 }
649 }
650}
651
652
Harald Welte28d943e2017-11-25 15:00:50 +0100653template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
654 elementIdentifier := '08'O,
655 lengthIndicator := 0, /* overwritten */
656 typeOfIdentity := '001'B, /* IMSI */
657 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
658 digits := imsi_digits
659}
660
Harald Welte17d21152018-01-27 00:47:11 +0100661template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
662 elementIdentifier := '08'O,
663 lengthIndicator := ?, /* overwritten */
664 typeOfIdentity := '001'B, /* IMSI */
665 oddEvenIndicator := ?,
666 digits := imsi_digits
667}
668
Harald Welte72cecfa2017-12-11 19:50:14 +0100669template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
670 cIl_noCell := ''O
671}
672
673private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte24135bd2018-03-17 19:27:53 +0100674 if (lengthof(mnc) == 2) {
675 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
Stefan Sperling83348bc2018-03-14 17:44:40 +0100676 } else {
677 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
678 }
Harald Welte72cecfa2017-12-11 19:50:14 +0100679}
680
681template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
682 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
683 lac := int2oct(lac, 2),
684 ci := int2oct(ci, 2)
685}
686
687template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
688 lac := int2oct(lac, 2),
689 ci := int2oct(ci, 2)
690}
691
692template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
693 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
694 lac := int2oct(lac, 2)
695}
696
697template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
698template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
699
Harald Welte751d3eb2018-01-31 15:51:06 +0100700template BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
701ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
702 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
703 lac := int2oct(lac, 2),
704 rncId := int2oct(rnc_id, 2)
705}
706
707template BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
708 lac := int2oct(lac, 2),
709 rncId := int2oct(rnc_id, 2)
710}
711
Harald Welte72cecfa2017-12-11 19:50:14 +0100712template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
713 elementIdentifier := '24'O,
714 channel := chneed,
715 spare := '000000'B
716}
717
718template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
719 elementIdentifier := '09'O,
720 lengthIndicator := 4,
721 tmsiOctets := tmsi
722};
723
Harald Welte17d21152018-01-27 00:47:11 +0100724template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
725 elementIdentifier := '09'O,
726 lengthIndicator := 4,
727 tmsiOctets := tmsi
728};
729
Harald Welte72cecfa2017-12-11 19:50:14 +0100730private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
731 var template BSSMAP_IE_TMSI ret;
732 if (ispresent(tmsi)) {
733 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
734 } else {
735 ret := omit;
736 }
737 return ret;
738}
739
740template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
741 template BSSMAP_FIELD_CellIdentificationList cid_list,
742 template OCT4 tmsi := omit,
743 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100744modifies ts_BSSAP_BSSMAP := {
745 pdu := {
746 bssmap := {
747 paging := {
Harald Welte17d21152018-01-27 00:47:11 +0100748 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +0100749 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100750 tMSI := f_tmsi_or_omit(tmsi),
751 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
752 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100753 eMLPP_Priority := omit,
754 pagingInformation := omit /* only VGCS/VBS flag */
755 }
756 }
757 }
758}
759
Harald Welte17d21152018-01-27 00:47:11 +0100760template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
761 template OCT4 tmsi := *,
762 template BSSMAP_IE_ChannelNeeded chneed := *)
763modifies tr_BSSAP_BSSMAP := {
764 pdu := {
765 bssmap := {
766 paging := {
767 messageType := '52'O,
768 iMSI := tr_BSSMAP_Imsi(imsi_digits),
769 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
770 cellIdentifierList := ?,
771 channelNeeded := chneed,
772 eMLPP_Priority := omit,
773 pagingInformation := omit /* only VGCS/VBS flag */
774 }
775 }
776 }
777}
778
779
Harald Welte73cd2712017-12-17 00:44:52 +0100780template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
781modifies ts_BSSAP_BSSMAP := {
782 pdu := {
783 bssmap := {
784 cipherModeCommand := {
785 messageType := '53'O,
786 layer3HeaderInfo := omit,
787 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
788 cipherResponseMode := omit,
789 kC128 := omit
790 }
791 }
792 }
793}
794
795template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
796modifies ts_BSSAP_BSSMAP := {
797 pdu := {
798 bssmap := {
799 cipherModeCommand := {
800 messageType := '53'O,
801 layer3HeaderInfo := omit,
802 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
803 cipherResponseMode := omit,
804 kC128 := { '83'O, kc128 }
805 }
806 }
807 }
808}
809
Harald Welte16114282018-01-24 22:41:21 +0100810template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)
811modifies tr_BSSAP_BSSMAP := {
812 pdu := {
813 bssmap := {
814 cipherModeCommand := {
815 messageType := '53'O,
816 layer3HeaderInfo := *,
817 encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),
818 cipherResponseMode := *,
819 kC128 := *
820 }
821 }
822 }
823}
824
825template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
826modifies ts_BSSAP_BSSMAP := {
827 pdu := {
828 bssmap := {
829 cipherModeComplete := {
830 messageType := '55'O,
831 layer3MessageContents := omit,
832 chosenEncryptionAlgorithm := {
833 elementIdentifier := '2C'O,
834 algorithmIdentifier := alg
835 }
836 }
837 }
838 }
839}
840
Harald Welte73cd2712017-12-17 00:44:52 +0100841template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
842 pdu := {
843 bssmap := {
844 cipherModeComplete := {
845 messageType := '55'O,
846 layer3MessageContents := *,
847 chosenEncryptionAlgorithm := {
848 elementIdentifier := '2C'O,
849 algorithmIdentifier := alg
850 }
851 }
852 }
853 }
854}
855
856template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
857 pdu := {
858 bssmap := {
859 cipherModeReject := {
860 messageType := '59'O,
861 cause := ?
862 }
863 }
864 }
865}
866
Harald Welte5c2622c2018-01-21 20:45:20 +0100867template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
868 elementIdentifier := '12'O,
869 lengthIndicator := 0, /* overwritten */
870 /* CM1 */
871 rf_PowerCapability := '010'B, /* class3 */
872 a5_1 := '0'B, /* supported */
873 esind := '1'B, /* early classmark supported */
874 revisionLevel := '10'B, /* R99 */
875 spare1_1 := '0'B,
876 /* CM2 */
877 fc := '1'B, /* E-GSM support */
878 vgcs := '0'B,
879 vbs := '0'B,
880 sm_Capability := '1'B,
881 ss_ScreenIndicator := '00'B,
882 ps_Capability := '1'B,
883 spare2_1 := '0'B,
884 classmarkInformationType2_oct5 := {
885 a5_2 := '0'B, /* not available */
886 a5_3 := '1'B, /* available */
887 cmsp := '0'B, /* not supported */
888 solsa := '0'B, /* not suported */
889 ucs2 := '0'B, /* GSM alphabet preferred */
890 lcsvacap := '0'B, /* not supported */
891 spare := '0'B,
892 cm3 := '0'B /* no CM3 */
893 }
894}
895
896template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
897 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
898modifies ts_BSSAP_BSSMAP := {
899 pdu := {
900 bssmap := {
901 classmarkUpdate := {
902 messageType := '54'O,
903 classmarkInformationType2 := cm2,
904 classmarkInformationType3 := cm3,
905 talkerPriority := omit
906 }
907 }
908 }
909}
910
Harald Welte898113b2018-01-31 18:32:21 +0100911template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
912 template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
913modifies tr_BSSAP_BSSMAP := {
914 pdu := {
915 bssmap := {
916 classmarkUpdate := {
917 messageType := '54'O,
918 classmarkInformationType2 := cm2,
919 classmarkInformationType3 := cm3,
920 talkerPriority := *
921 }
922 }
923 }
924}
925
Harald Welte49518bf2018-02-10 11:39:19 +0100926/* return Layer3 octetstring inside BSSAP PDU */
927function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
928 if (ischosen(bssap.pdu.bssmap)) {
929 var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
930 if (ischosen(bssmap.completeLayer3Information)) {
931 return bssmap.completeLayer3Information.layer3Information.layer3info;
932 } else if (ischosen(bssmap.handoverRequestAck)) {
933 return bssmap.handoverRequestAck.layer3Information.layer3info;
934 } else if (ischosen(bssmap.handoverCommand)) {
935 return bssmap.handoverCommand.layer3Information.layer3info;
936 } else if (ischosen(bssmap.uplinkRequest)) {
937 return bssmap.uplinkRequest.layer3Information.layer3info;
938 } else if (ischosen(bssmap.uplinkRequestConfirmation)) {
939 return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
940 } else if (ischosen(bssmap.uplinkApplicationData)) {
941 return bssmap.uplinkApplicationData.layer3Information.layer3info;
942 } else if (ischosen(bssmap.rerouteCommand)) {
943 return bssmap.rerouteCommand.initialLayer3Information.layer3info;
944 } else {
945 return omit;
946 }
947 } else {
948 return bssap.pdu.dtap;
949 }
950}
951
Harald Welte898113b2018-01-31 18:32:21 +0100952
953
Harald Welte73cd2712017-12-17 00:44:52 +0100954
Harald Weltec859df52017-11-24 23:41:41 +0100955
Harald Welteb69533d2017-12-15 13:55:17 +0100956} with { encode "RAW" };