blob: c98f5eb0d5361b287dfff3f9c50aa4e5df06f1b8 [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
332template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
333 elementIdentifier := '0B'O, /* overwritten */
334 lengthIndicator := 0, /* overwritten */
335 speechOrDataIndicator := '0001'B, /* speech */
336 spare1_4 := '0000'B,
337 channelRateAndType := ChRate_TCHF,
338 speechId_DataIndicator := '01'O /* FRv1 */
339}
340
Harald Welte4bf5fc92017-12-15 13:56:06 +0100341template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
342 speechOrDataIndicator := '0100'B /* speech + CTM */
343}
344
345template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
346 elementIdentifier := '0B'O, /* overwritten */
347 lengthIndicator := 0, /* overwritten */
348 speechOrDataIndicator := '0010'B, /* data */
349 spare1_4 := '0000'B,
350 channelRateAndType := ChRate_TCHF,
351 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
352}
353
354template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
355 elementIdentifier := '0B'O, /* overwritten */
356 lengthIndicator := 0, /* overwritten */
357 speechOrDataIndicator := '0011'B, /* data */
358 spare1_4 := '0000'B,
359 channelRateAndType := ChRate_ANY,
360 speechId_DataIndicator := '00'O /* spare */
361}
362
363template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
364 elementIdentifier := '0A'O,
365 lengthIndicator := 0, /* overwritten */
366 permittedAlgorithms := algs,
367 key := kc
368}
369
Harald Welte16114282018-01-24 22:41:21 +0100370template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
371 elementIdentifier := '0A'O,
372 lengthIndicator := ?, /* overwritten */
373 permittedAlgorithms := algs,
374 key := kc
375}
376
377
Harald Welte4bf5fc92017-12-15 13:56:06 +0100378
Harald Welte365f4ed2017-11-23 00:00:43 +0100379template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
380 elementIdentifier := '01'O, /* overwritten */
381 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
382 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
383}
384
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100385template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100386 uint16_t udp_port,
387 integer len) := {
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100388 elementIdentifier := '7C'O,
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100389 lengthIndicator := len, /* overwritten */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100390 ipAddress := addr,
391 uDPPortValue := udp_port
392}
Harald Welte235ebf12017-12-15 14:18:16 +0100393template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100394 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
Harald Welte235ebf12017-12-15 14:18:16 +0100395template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
Harald Welteb6e1d7e2018-01-26 21:38:59 +0100396 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100397
Harald Welte4bf5fc92017-12-15 13:56:06 +0100398template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
399 elementIdentifier := '83'O,
400 kC128_Value := kc128
401}
402
Harald Weltef1b64e22017-12-15 14:55:14 +0100403/* 3.2.2.103 */
404template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
405 codecType := GSM_FR,
406 tF := '0'B,
407 pT := '0'B,
408 pI := '0'B,
409 fI := '1'B,
410 extendedCodecType := omit,
411 s0_7 := omit,
412 s8_15 := omit
413}
414template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
415 codecType := GSM_FR
416}
417template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
418 codecType := GSM_EFR
419}
420template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
421 codecType := GSM_HR
422}
423template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
424 codecType := FR_AMR,
425 s0_7 := '11111111'B,
426 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
427}
428template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
429 codecType := HR_AMR,
430 s0_7 := '00111111'B,
431 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
432}
433template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
434 elementIdentifier := '7D'O,
435 lengthIndicator := 0, /* overwritten */
436 codecElements := valueof(elem)
437}
438
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100439template PDU_BSSAP
440ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
441 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100442modifies ts_BSSAP_BSSMAP := {
443 pdu := {
444 bssmap := {
445 assignmentRequest := {
446 messageType :='01'O, /* overwritten */
447 channelType := ts_BSSMAP_IE_ChannelType,
448 layer3HeaderInfo := omit,
449 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100450 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100451 downLinkDTX_Flag := omit,
452 interferenceBandToBeUsed := omit,
453 classmarkInformationType2 := omit,
454 groupCallReference := omit,
455 talkerFlag := omit,
456 configurationEvolutionIndication := omit,
457 lsaAccesControlSuppression := omit,
458 serviceHandover := omit,
459 encryptionInformation := omit,
460 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100461 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100462 codecList := omit,
463 callIdentifier := omit,
464 kC128 := omit,
465 globalCallReference := omit,
466 lCLS_Configuration := omit,
467 lCLS_ConnectionStatusControl := omit,
468 lCLS_CorrelationNotNeeded := omit
469 }
470 }
471 }
472}
Harald Weltec76f29f2017-11-22 12:46:46 +0100473
Harald Weltebe48a7c2018-01-26 21:39:25 +0100474template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
475 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
476modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100477 pdu := {
478 bssmap := {
479 assignmentRequest := {
480 messageType :='01'O, /* overwritten */
481 channelType := ?,
482 layer3HeaderInfo := *,
483 priority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100484 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100485 downLinkDTX_Flag := *,
486 interferenceBandToBeUsed := *,
487 classmarkInformationType2 := *,
488 groupCallReference := *,
489 talkerFlag := *,
490 configurationEvolutionIndication := *,
491 lsaAccesControlSuppression := *,
492 serviceHandover := *,
493 encryptionInformation := *,
494 talkerPriority := *,
Harald Weltebe48a7c2018-01-26 21:39:25 +0100495 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100496 codecList := *,
497 callIdentifier := *,
498 kC128 := *,
499 globalCallReference := *,
500 lCLS_Configuration := *,
501 lCLS_ConnectionStatusControl := *,
502 lCLS_CorrelationNotNeeded := *
503 }
504 }
505 }
506}
507
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100508template PDU_BSSAP
509ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
510 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100511modifies ts_BSSAP_BSSMAP := {
512 pdu := {
513 bssmap := {
514 assignmentComplete := {
515 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100516 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100517 circuitIdentityCode := cic,
518 cellIdentifier := omit,
519 chosenChannel := omit,
520 chosenEncryptionAlgorithm := omit,
521 circuitPool := omit,
522 speechVersion := omit,
523 lSAIdentifier := omit,
524 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100525 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100526 speechCodec := omit,
527 codecList := omit,
528 lCLS_BSS_Status := omit
529 }
530 }
531 }
532}
533
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100534template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
535 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
536modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100537 pdu := {
538 bssmap := {
539 assignmentComplete := {
540 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100541 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100542 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100543 cellIdentifier := *,
544 chosenChannel := *,
545 chosenEncryptionAlgorithm := *,
546 circuitPool := *,
547 speechVersion := *,
548 lSAIdentifier := *,
549 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100550 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100551 speechCodec := *,
552 codecList := *,
553 lCLS_BSS_Status := *
554 }
555 }
556 }
557}
558
Harald Welte16a4adf2017-12-14 18:54:01 +0100559template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
560 pdu := {
561 bssmap := {
562 assignmentFailure := {
563 messageType := '03'O, /* overwritten */
564 rR_Cause := *,
565 circuitPool := *,
566 circuitPoolList := *,
567 talkerPriority := *,
568 codecList := *
569 }
570 }
571 }
572}
573
574
Harald Welteb3414b22017-11-23 18:22:10 +0100575template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
576modifies ts_BSSAP_BSSMAP := {
577 pdu := {
578 bssmap := {
579 clearCommand := {
580 messageType := '20'O, /* overwritten */
581 layer3HeaderInfo := omit,
582 cause := ts_BSSMAP_IE_Cause(cause),
583 cSFB_Indication := omit
584 }
585 }
586 }
587}
588
589template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
590 pdu := {
591 bssmap := {
592 clearCommand := {
593 messageType := '20'O, /* overwritten */
594 layer3HeaderInfo := *,
595 cause := ?,
596 cSFB_Indication := *
597 }
598 }
599 }
600}
601
602template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
603modifies ts_BSSAP_BSSMAP := {
604 pdu := {
605 bssmap := {
606 clearComplete := {
607 messageType := '21'O /* overwritten */
608 }
609 }
610 }
611}
612
Harald Weltec859df52017-11-24 23:41:41 +0100613template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
614 pdu := {
615 bssmap := {
616 clearComplete := {
617 messageType := '21'O
618 }
619 }
620 }
621}
622
Harald Weltebc881782018-01-23 20:09:15 +0100623template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
624modifies ts_BSSAP_BSSMAP := {
625 pdu := {
626 bssmap := {
627 clearRequest := {
628 messageType := '22'O, /* overwritten */
629 cause := ts_BSSMAP_IE_Cause(cause)
630 }
631 }
632 }
633}
634
Harald Weltecfa79ad2017-12-09 22:33:47 +0100635template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
636 pdu := {
637 bssmap := {
638 clearRequest := {
639 messageType := '22'O, /* overwritten */
640 cause := ?
641 }
642 }
643 }
644}
645
646
Harald Welte28d943e2017-11-25 15:00:50 +0100647function f_hex_is_odd_length(hexstring digits) return bitstring {
648 if (lengthof(digits) rem 2 == 1) {
649 return '1'B;
650 } else {
651 return '0'B;
652 }
653}
654
655template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
656 elementIdentifier := '08'O,
657 lengthIndicator := 0, /* overwritten */
658 typeOfIdentity := '001'B, /* IMSI */
659 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
660 digits := imsi_digits
661}
662
Harald Welte17d21152018-01-27 00:47:11 +0100663template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
664 elementIdentifier := '08'O,
665 lengthIndicator := ?, /* overwritten */
666 typeOfIdentity := '001'B, /* IMSI */
667 oddEvenIndicator := ?,
668 digits := imsi_digits
669}
670
Harald Welte72cecfa2017-12-11 19:50:14 +0100671template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
672 cIl_noCell := ''O
673}
674
675private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Stefan Sperling6d9309b2018-01-08 15:17:18 +0100676 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
Harald Welte72cecfa2017-12-11 19:50:14 +0100677}
678
679template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
680 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
681 lac := int2oct(lac, 2),
682 ci := int2oct(ci, 2)
683}
684
685template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
686 lac := int2oct(lac, 2),
687 ci := int2oct(ci, 2)
688}
689
690template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
691 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
692 lac := int2oct(lac, 2)
693}
694
695template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
696template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
697
698template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
699 elementIdentifier := '24'O,
700 channel := chneed,
701 spare := '000000'B
702}
703
704template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
705 elementIdentifier := '09'O,
706 lengthIndicator := 4,
707 tmsiOctets := tmsi
708};
709
Harald Welte17d21152018-01-27 00:47:11 +0100710template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
711 elementIdentifier := '09'O,
712 lengthIndicator := 4,
713 tmsiOctets := tmsi
714};
715
Harald Welte72cecfa2017-12-11 19:50:14 +0100716private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
717 var template BSSMAP_IE_TMSI ret;
718 if (ispresent(tmsi)) {
719 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
720 } else {
721 ret := omit;
722 }
723 return ret;
724}
725
726template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
727 template BSSMAP_FIELD_CellIdentificationList cid_list,
728 template OCT4 tmsi := omit,
729 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100730modifies ts_BSSAP_BSSMAP := {
731 pdu := {
732 bssmap := {
733 paging := {
Harald Welte17d21152018-01-27 00:47:11 +0100734 messageType := '52'O,
Harald Welte28d943e2017-11-25 15:00:50 +0100735 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100736 tMSI := f_tmsi_or_omit(tmsi),
737 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
738 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100739 eMLPP_Priority := omit,
740 pagingInformation := omit /* only VGCS/VBS flag */
741 }
742 }
743 }
744}
745
Harald Welte17d21152018-01-27 00:47:11 +0100746template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
747 template OCT4 tmsi := *,
748 template BSSMAP_IE_ChannelNeeded chneed := *)
749modifies tr_BSSAP_BSSMAP := {
750 pdu := {
751 bssmap := {
752 paging := {
753 messageType := '52'O,
754 iMSI := tr_BSSMAP_Imsi(imsi_digits),
755 tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
756 cellIdentifierList := ?,
757 channelNeeded := chneed,
758 eMLPP_Priority := omit,
759 pagingInformation := omit /* only VGCS/VBS flag */
760 }
761 }
762 }
763}
764
765
Harald Welte73cd2712017-12-17 00:44:52 +0100766template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
767modifies ts_BSSAP_BSSMAP := {
768 pdu := {
769 bssmap := {
770 cipherModeCommand := {
771 messageType := '53'O,
772 layer3HeaderInfo := omit,
773 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
774 cipherResponseMode := omit,
775 kC128 := omit
776 }
777 }
778 }
779}
780
781template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
782modifies ts_BSSAP_BSSMAP := {
783 pdu := {
784 bssmap := {
785 cipherModeCommand := {
786 messageType := '53'O,
787 layer3HeaderInfo := omit,
788 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
789 cipherResponseMode := omit,
790 kC128 := { '83'O, kc128 }
791 }
792 }
793 }
794}
795
Harald Welte16114282018-01-24 22:41:21 +0100796template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)
797modifies tr_BSSAP_BSSMAP := {
798 pdu := {
799 bssmap := {
800 cipherModeCommand := {
801 messageType := '53'O,
802 layer3HeaderInfo := *,
803 encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),
804 cipherResponseMode := *,
805 kC128 := *
806 }
807 }
808 }
809}
810
811template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
812modifies ts_BSSAP_BSSMAP := {
813 pdu := {
814 bssmap := {
815 cipherModeComplete := {
816 messageType := '55'O,
817 layer3MessageContents := omit,
818 chosenEncryptionAlgorithm := {
819 elementIdentifier := '2C'O,
820 algorithmIdentifier := alg
821 }
822 }
823 }
824 }
825}
826
Harald Welte73cd2712017-12-17 00:44:52 +0100827template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
828 pdu := {
829 bssmap := {
830 cipherModeComplete := {
831 messageType := '55'O,
832 layer3MessageContents := *,
833 chosenEncryptionAlgorithm := {
834 elementIdentifier := '2C'O,
835 algorithmIdentifier := alg
836 }
837 }
838 }
839 }
840}
841
842template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
843 pdu := {
844 bssmap := {
845 cipherModeReject := {
846 messageType := '59'O,
847 cause := ?
848 }
849 }
850 }
851}
852
Harald Welte5c2622c2018-01-21 20:45:20 +0100853template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
854 elementIdentifier := '12'O,
855 lengthIndicator := 0, /* overwritten */
856 /* CM1 */
857 rf_PowerCapability := '010'B, /* class3 */
858 a5_1 := '0'B, /* supported */
859 esind := '1'B, /* early classmark supported */
860 revisionLevel := '10'B, /* R99 */
861 spare1_1 := '0'B,
862 /* CM2 */
863 fc := '1'B, /* E-GSM support */
864 vgcs := '0'B,
865 vbs := '0'B,
866 sm_Capability := '1'B,
867 ss_ScreenIndicator := '00'B,
868 ps_Capability := '1'B,
869 spare2_1 := '0'B,
870 classmarkInformationType2_oct5 := {
871 a5_2 := '0'B, /* not available */
872 a5_3 := '1'B, /* available */
873 cmsp := '0'B, /* not supported */
874 solsa := '0'B, /* not suported */
875 ucs2 := '0'B, /* GSM alphabet preferred */
876 lcsvacap := '0'B, /* not supported */
877 spare := '0'B,
878 cm3 := '0'B /* no CM3 */
879 }
880}
881
882template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
883 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
884modifies ts_BSSAP_BSSMAP := {
885 pdu := {
886 bssmap := {
887 classmarkUpdate := {
888 messageType := '54'O,
889 classmarkInformationType2 := cm2,
890 classmarkInformationType3 := cm3,
891 talkerPriority := omit
892 }
893 }
894 }
895}
896
Harald Welte73cd2712017-12-17 00:44:52 +0100897
Harald Weltec859df52017-11-24 23:41:41 +0100898
Harald Welteb69533d2017-12-15 13:55:17 +0100899} with { encode "RAW" };