blob: 53315054f5ab0971ec9745674c1e419b9ba60e08 [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
370
Harald Welte365f4ed2017-11-23 00:00:43 +0100371template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
372 elementIdentifier := '01'O, /* overwritten */
373 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
374 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
375}
376
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100377template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
378 uint16_t udp_port) := {
379 elementIdentifier := '7C'O,
380 lengthIndicator := 0, /* overwritten */
381 ipAddress := addr,
382 uDPPortValue := udp_port
383}
Harald Welte235ebf12017-12-15 14:18:16 +0100384template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
385 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt);
386template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
387 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100388
Harald Welte4bf5fc92017-12-15 13:56:06 +0100389template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
390 elementIdentifier := '83'O,
391 kC128_Value := kc128
392}
393
Harald Weltef1b64e22017-12-15 14:55:14 +0100394/* 3.2.2.103 */
395template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
396 codecType := GSM_FR,
397 tF := '0'B,
398 pT := '0'B,
399 pI := '0'B,
400 fI := '1'B,
401 extendedCodecType := omit,
402 s0_7 := omit,
403 s8_15 := omit
404}
405template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
406 codecType := GSM_FR
407}
408template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
409 codecType := GSM_EFR
410}
411template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
412 codecType := GSM_HR
413}
414template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
415 codecType := FR_AMR,
416 s0_7 := '11111111'B,
417 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
418}
419template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
420 codecType := HR_AMR,
421 s0_7 := '00111111'B,
422 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
423}
424template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
425 elementIdentifier := '7D'O,
426 lengthIndicator := 0, /* overwritten */
427 codecElements := valueof(elem)
428}
429
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100430template PDU_BSSAP
431ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
432 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100433modifies ts_BSSAP_BSSMAP := {
434 pdu := {
435 bssmap := {
436 assignmentRequest := {
437 messageType :='01'O, /* overwritten */
438 channelType := ts_BSSMAP_IE_ChannelType,
439 layer3HeaderInfo := omit,
440 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100441 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100442 downLinkDTX_Flag := omit,
443 interferenceBandToBeUsed := omit,
444 classmarkInformationType2 := omit,
445 groupCallReference := omit,
446 talkerFlag := omit,
447 configurationEvolutionIndication := omit,
448 lsaAccesControlSuppression := omit,
449 serviceHandover := omit,
450 encryptionInformation := omit,
451 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100452 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100453 codecList := omit,
454 callIdentifier := omit,
455 kC128 := omit,
456 globalCallReference := omit,
457 lCLS_Configuration := omit,
458 lCLS_ConnectionStatusControl := omit,
459 lCLS_CorrelationNotNeeded := omit
460 }
461 }
462 }
463}
Harald Weltec76f29f2017-11-22 12:46:46 +0100464
Harald Welteab05d6c2017-11-23 18:50:52 +0100465template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100466 pdu := {
467 bssmap := {
468 assignmentRequest := {
469 messageType :='01'O, /* overwritten */
470 channelType := ?,
471 layer3HeaderInfo := *,
472 priority := *,
473 circuitIdentityCode := ?,
474 downLinkDTX_Flag := *,
475 interferenceBandToBeUsed := *,
476 classmarkInformationType2 := *,
477 groupCallReference := *,
478 talkerFlag := *,
479 configurationEvolutionIndication := *,
480 lsaAccesControlSuppression := *,
481 serviceHandover := *,
482 encryptionInformation := *,
483 talkerPriority := *,
484 aoIPTransportLayer := *,
485 codecList := *,
486 callIdentifier := *,
487 kC128 := *,
488 globalCallReference := *,
489 lCLS_Configuration := *,
490 lCLS_ConnectionStatusControl := *,
491 lCLS_CorrelationNotNeeded := *
492 }
493 }
494 }
495}
496
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100497template PDU_BSSAP
498ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
499 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100500modifies ts_BSSAP_BSSMAP := {
501 pdu := {
502 bssmap := {
503 assignmentComplete := {
504 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100505 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100506 circuitIdentityCode := cic,
507 cellIdentifier := omit,
508 chosenChannel := omit,
509 chosenEncryptionAlgorithm := omit,
510 circuitPool := omit,
511 speechVersion := omit,
512 lSAIdentifier := omit,
513 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100514 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100515 speechCodec := omit,
516 codecList := omit,
517 lCLS_BSS_Status := omit
518 }
519 }
520 }
521}
522
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100523template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
524 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
525modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100526 pdu := {
527 bssmap := {
528 assignmentComplete := {
529 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100530 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100531 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100532 cellIdentifier := *,
533 chosenChannel := *,
534 chosenEncryptionAlgorithm := *,
535 circuitPool := *,
536 speechVersion := *,
537 lSAIdentifier := *,
538 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100539 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100540 speechCodec := *,
541 codecList := *,
542 lCLS_BSS_Status := *
543 }
544 }
545 }
546}
547
Harald Welte16a4adf2017-12-14 18:54:01 +0100548template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
549 pdu := {
550 bssmap := {
551 assignmentFailure := {
552 messageType := '03'O, /* overwritten */
553 rR_Cause := *,
554 circuitPool := *,
555 circuitPoolList := *,
556 talkerPriority := *,
557 codecList := *
558 }
559 }
560 }
561}
562
563
Harald Welteb3414b22017-11-23 18:22:10 +0100564template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
565modifies ts_BSSAP_BSSMAP := {
566 pdu := {
567 bssmap := {
568 clearCommand := {
569 messageType := '20'O, /* overwritten */
570 layer3HeaderInfo := omit,
571 cause := ts_BSSMAP_IE_Cause(cause),
572 cSFB_Indication := omit
573 }
574 }
575 }
576}
577
578template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
579 pdu := {
580 bssmap := {
581 clearCommand := {
582 messageType := '20'O, /* overwritten */
583 layer3HeaderInfo := *,
584 cause := ?,
585 cSFB_Indication := *
586 }
587 }
588 }
589}
590
591template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
592modifies ts_BSSAP_BSSMAP := {
593 pdu := {
594 bssmap := {
595 clearComplete := {
596 messageType := '21'O /* overwritten */
597 }
598 }
599 }
600}
601
Harald Weltec859df52017-11-24 23:41:41 +0100602template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
603 pdu := {
604 bssmap := {
605 clearComplete := {
606 messageType := '21'O
607 }
608 }
609 }
610}
611
Harald Weltebc881782018-01-23 20:09:15 +0100612template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
613modifies ts_BSSAP_BSSMAP := {
614 pdu := {
615 bssmap := {
616 clearRequest := {
617 messageType := '22'O, /* overwritten */
618 cause := ts_BSSMAP_IE_Cause(cause)
619 }
620 }
621 }
622}
623
Harald Weltecfa79ad2017-12-09 22:33:47 +0100624template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
625 pdu := {
626 bssmap := {
627 clearRequest := {
628 messageType := '22'O, /* overwritten */
629 cause := ?
630 }
631 }
632 }
633}
634
635
Harald Welte28d943e2017-11-25 15:00:50 +0100636function f_hex_is_odd_length(hexstring digits) return bitstring {
637 if (lengthof(digits) rem 2 == 1) {
638 return '1'B;
639 } else {
640 return '0'B;
641 }
642}
643
644template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
645 elementIdentifier := '08'O,
646 lengthIndicator := 0, /* overwritten */
647 typeOfIdentity := '001'B, /* IMSI */
648 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
649 digits := imsi_digits
650}
651
Harald Welte72cecfa2017-12-11 19:50:14 +0100652template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
653 cIl_noCell := ''O
654}
655
656private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Stefan Sperling6d9309b2018-01-08 15:17:18 +0100657 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
Harald Welte72cecfa2017-12-11 19:50:14 +0100658}
659
660template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
661 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
662 lac := int2oct(lac, 2),
663 ci := int2oct(ci, 2)
664}
665
666template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
667 lac := int2oct(lac, 2),
668 ci := int2oct(ci, 2)
669}
670
671template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
672 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
673 lac := int2oct(lac, 2)
674}
675
676template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
677template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
678
679template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
680 elementIdentifier := '24'O,
681 channel := chneed,
682 spare := '000000'B
683}
684
685template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
686 elementIdentifier := '09'O,
687 lengthIndicator := 4,
688 tmsiOctets := tmsi
689};
690
691private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
692 var template BSSMAP_IE_TMSI ret;
693 if (ispresent(tmsi)) {
694 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
695 } else {
696 ret := omit;
697 }
698 return ret;
699}
700
701template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
702 template BSSMAP_FIELD_CellIdentificationList cid_list,
703 template OCT4 tmsi := omit,
704 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100705modifies ts_BSSAP_BSSMAP := {
706 pdu := {
707 bssmap := {
708 paging := {
709 messageType := '51'O,
710 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100711 tMSI := f_tmsi_or_omit(tmsi),
712 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
713 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100714 eMLPP_Priority := omit,
715 pagingInformation := omit /* only VGCS/VBS flag */
716 }
717 }
718 }
719}
720
Harald Welte73cd2712017-12-17 00:44:52 +0100721template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
722modifies ts_BSSAP_BSSMAP := {
723 pdu := {
724 bssmap := {
725 cipherModeCommand := {
726 messageType := '53'O,
727 layer3HeaderInfo := omit,
728 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
729 cipherResponseMode := omit,
730 kC128 := omit
731 }
732 }
733 }
734}
735
736template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
737modifies ts_BSSAP_BSSMAP := {
738 pdu := {
739 bssmap := {
740 cipherModeCommand := {
741 messageType := '53'O,
742 layer3HeaderInfo := omit,
743 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
744 cipherResponseMode := omit,
745 kC128 := { '83'O, kc128 }
746 }
747 }
748 }
749}
750
751template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
752 pdu := {
753 bssmap := {
754 cipherModeComplete := {
755 messageType := '55'O,
756 layer3MessageContents := *,
757 chosenEncryptionAlgorithm := {
758 elementIdentifier := '2C'O,
759 algorithmIdentifier := alg
760 }
761 }
762 }
763 }
764}
765
766template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
767 pdu := {
768 bssmap := {
769 cipherModeReject := {
770 messageType := '59'O,
771 cause := ?
772 }
773 }
774 }
775}
776
Harald Welte5c2622c2018-01-21 20:45:20 +0100777template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
778 elementIdentifier := '12'O,
779 lengthIndicator := 0, /* overwritten */
780 /* CM1 */
781 rf_PowerCapability := '010'B, /* class3 */
782 a5_1 := '0'B, /* supported */
783 esind := '1'B, /* early classmark supported */
784 revisionLevel := '10'B, /* R99 */
785 spare1_1 := '0'B,
786 /* CM2 */
787 fc := '1'B, /* E-GSM support */
788 vgcs := '0'B,
789 vbs := '0'B,
790 sm_Capability := '1'B,
791 ss_ScreenIndicator := '00'B,
792 ps_Capability := '1'B,
793 spare2_1 := '0'B,
794 classmarkInformationType2_oct5 := {
795 a5_2 := '0'B, /* not available */
796 a5_3 := '1'B, /* available */
797 cmsp := '0'B, /* not supported */
798 solsa := '0'B, /* not suported */
799 ucs2 := '0'B, /* GSM alphabet preferred */
800 lcsvacap := '0'B, /* not supported */
801 spare := '0'B,
802 cm3 := '0'B /* no CM3 */
803 }
804}
805
806template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
807 template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
808modifies ts_BSSAP_BSSMAP := {
809 pdu := {
810 bssmap := {
811 classmarkUpdate := {
812 messageType := '54'O,
813 classmarkInformationType2 := cm2,
814 classmarkInformationType3 := cm3,
815 talkerPriority := omit
816 }
817 }
818 }
819}
820
Harald Welte73cd2712017-12-17 00:44:52 +0100821
Harald Weltec859df52017-11-24 23:41:41 +0100822
Harald Welteb69533d2017-12-15 13:55:17 +0100823} with { encode "RAW" };