blob: cb6dde8c8c002739922bf2e351aa47cce6412810 [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,
110 dlci := omit,
111 lengthIndicator := ?,
112 pdu := {
113 bssmap := ?
114 }
115}
116
Harald Welteb3414b22017-11-23 18:22:10 +0100117template PDU_BSSAP ts_BSSAP_DTAP := {
118 discriminator := '1'B,
119 spare := '0000000'B,
120 dlci := omit,
121 lengthIndicator := 0, /* overwritten by codec */
122 pdu := {
123 dtap := ?
124 }
125}
126
127template PDU_BSSAP tr_BSSAP_DTAP := {
128 discriminator := '1'B,
129 spare := '0000000'B,
130 dlci := omit,
131 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
203/*
204template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
205modifies ts_BSSMAP_IE_CellID := {
206 cellIdentification := {
207 cI_LAC_CGI := {
208 mnc_mcc := FIXME,
209 lac := int2oct(lac, 2),
210 ci := int2oct(ci, 2)
211 }
212 }
213}
214*/
215
216template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
217modifies ts_BSSMAP_IE_CellID := {
218 cellIdentification := {
219 cI_LAC_CI := {
220 lac := int2oct(lac, 2),
221 ci := int2oct(ci, 2)
222 }
223 }
224}
225
226template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
227modifies ts_BSSMAP_IE_CellID := {
228 cellIdentification := {
229 cI_CI := int2oct(ci, 2)
230 }
231}
232
233template BSSMAP_IE_CellIdentifier ts_CellId_none
234modifies ts_BSSMAP_IE_CellID := {
235 cellIdentification := {
236 cI_noCell := ''O
237 }
238}
239
240
241template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
242 elementIdentifier := '17'O,
243 lengthIndicator := 0,
244 layer3info := l3info
245}
246
Harald Weltef8a0bda2017-12-09 00:53:17 +0100247template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
248 elementIdentifier := '17'O,
249 lengthIndicator := ?,
250 layer3info := l3info
251}
252
253
Harald Weltec76f29f2017-11-22 12:46:46 +0100254template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
255modifies ts_BSSAP_BSSMAP := {
256 pdu := {
257 bssmap := {
258 completeLayer3Information := {
259 messageType := '57'O,
260 cellIdentifier := cell_id,
261 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
262 chosenChannel := omit,
263 lSAIdentifier := omit,
264 aPDU := omit,
265 codecList := omit,
266 redirectAttemptFlag := omit,
267 sendSequenceNumber := omit,
268 iMSI := omit
269 }
270 }
271 }
272}
273
Harald Weltef8a0bda2017-12-09 00:53:17 +0100274template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
275 template BSSMAP_IE_CellIdentifier cell_id := ?)
276modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100277 pdu := {
278 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100279 completeLayer3Information := {
280 messageType := '57'O,
281 cellIdentifier := cell_id,
282 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
283 chosenChannel := *,
284 lSAIdentifier := *,
285 aPDU := *,
286 codecList := *,
287 redirectAttemptFlag := *,
288 sendSequenceNumber := *,
289 iMSI := *
290 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100291 }
292 }
293}
294
Harald Welte28d943e2017-11-25 15:00:50 +0100295template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(BSSMAP_FIELD_CellIdentificationList cid_list) := {
296 elementIdentifier := '1A'O,
297 lengthIndicator := 0, /* overwritten */
298 cellIdentifierDiscriminator := '0000'B, /* overwritten */
299 spare1_4 := '0000'B,
300 cellIdentificationList := cid_list
301}
Harald Welte365f4ed2017-11-23 00:00:43 +0100302
Harald Welte28d943e2017-11-25 15:00:50 +0100303template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_FIELD_CellIdentificationList cid_list)
Harald Weltec76f29f2017-11-22 12:46:46 +0100304modifies ts_BSSAP_BSSMAP := {
305 pdu := {
306 bssmap := {
307 handoverRequired := {
308 messageType := '11'O,
309 cause := ts_BSSMAP_IE_Cause(cause),
310 responseRequest := omit,
Harald Welte28d943e2017-11-25 15:00:50 +0100311 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Weltec76f29f2017-11-22 12:46:46 +0100312 circuitPoolList := omit,
313 currentChannelType1 := omit,
314 speechVersion := omit,
315 queueingIndicator := omit,
316 oldToNewBSSInfo := omit,
317 sourceToTargetRNCTransparentInfo := omit,
318 sourceToTargetRNCTransparentInfoCDMA := omit,
319 gERANClassmark := omit,
320 talkerPriority := omit,
321 speechCodec := omit,
322 cSG_Identifier := omit
323 }
324 }
325 }
326}
327
Harald Welte4bf5fc92017-12-15 13:56:06 +0100328const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100329const OCT1 ChRate_TCHF := '08'O;
330const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100331const OCT1 ChRate_TCHForH_Fpref := '0A'O;
332const OCT1 ChRate_TCHForH_Hpref := '0B'O;
333const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
334const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
335const OCT1 ChRate_TCHForH := '0F'O;
336const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100337
338template (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,
344 speechId_DataIndicator := '01'O /* FRv1 */
345}
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
376
Harald Welte365f4ed2017-11-23 00:00:43 +0100377template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
378 elementIdentifier := '01'O, /* overwritten */
379 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
380 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
381}
382
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100383template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
384 uint16_t udp_port) := {
385 elementIdentifier := '7C'O,
386 lengthIndicator := 0, /* overwritten */
387 ipAddress := addr,
388 uDPPortValue := udp_port
389}
Harald Welte235ebf12017-12-15 14:18:16 +0100390template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
391 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt);
392template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
393 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100394
Harald Welte4bf5fc92017-12-15 13:56:06 +0100395template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
396 elementIdentifier := '83'O,
397 kC128_Value := kc128
398}
399
Harald Weltef1b64e22017-12-15 14:55:14 +0100400/* 3.2.2.103 */
401template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
402 codecType := GSM_FR,
403 tF := '0'B,
404 pT := '0'B,
405 pI := '0'B,
406 fI := '1'B,
407 extendedCodecType := omit,
408 s0_7 := omit,
409 s8_15 := omit
410}
411template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
412 codecType := GSM_FR
413}
414template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
415 codecType := GSM_EFR
416}
417template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
418 codecType := GSM_HR
419}
420template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
421 codecType := FR_AMR,
422 s0_7 := '11111111'B,
423 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
424}
425template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
426 codecType := HR_AMR,
427 s0_7 := '00111111'B,
428 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
429}
430template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
431 elementIdentifier := '7D'O,
432 lengthIndicator := 0, /* overwritten */
433 codecElements := valueof(elem)
434}
435
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100436template PDU_BSSAP
437ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
438 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100439modifies ts_BSSAP_BSSMAP := {
440 pdu := {
441 bssmap := {
442 assignmentRequest := {
443 messageType :='01'O, /* overwritten */
444 channelType := ts_BSSMAP_IE_ChannelType,
445 layer3HeaderInfo := omit,
446 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100447 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100448 downLinkDTX_Flag := omit,
449 interferenceBandToBeUsed := omit,
450 classmarkInformationType2 := omit,
451 groupCallReference := omit,
452 talkerFlag := omit,
453 configurationEvolutionIndication := omit,
454 lsaAccesControlSuppression := omit,
455 serviceHandover := omit,
456 encryptionInformation := omit,
457 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100458 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100459 codecList := omit,
460 callIdentifier := omit,
461 kC128 := omit,
462 globalCallReference := omit,
463 lCLS_Configuration := omit,
464 lCLS_ConnectionStatusControl := omit,
465 lCLS_CorrelationNotNeeded := omit
466 }
467 }
468 }
469}
Harald Weltec76f29f2017-11-22 12:46:46 +0100470
Harald Welteab05d6c2017-11-23 18:50:52 +0100471template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100472 pdu := {
473 bssmap := {
474 assignmentRequest := {
475 messageType :='01'O, /* overwritten */
476 channelType := ?,
477 layer3HeaderInfo := *,
478 priority := *,
479 circuitIdentityCode := ?,
480 downLinkDTX_Flag := *,
481 interferenceBandToBeUsed := *,
482 classmarkInformationType2 := *,
483 groupCallReference := *,
484 talkerFlag := *,
485 configurationEvolutionIndication := *,
486 lsaAccesControlSuppression := *,
487 serviceHandover := *,
488 encryptionInformation := *,
489 talkerPriority := *,
490 aoIPTransportLayer := *,
491 codecList := *,
492 callIdentifier := *,
493 kC128 := *,
494 globalCallReference := *,
495 lCLS_Configuration := *,
496 lCLS_ConnectionStatusControl := *,
497 lCLS_CorrelationNotNeeded := *
498 }
499 }
500 }
501}
502
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100503template PDU_BSSAP
504ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
505 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100506modifies ts_BSSAP_BSSMAP := {
507 pdu := {
508 bssmap := {
509 assignmentComplete := {
510 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100511 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100512 circuitIdentityCode := cic,
513 cellIdentifier := omit,
514 chosenChannel := omit,
515 chosenEncryptionAlgorithm := omit,
516 circuitPool := omit,
517 speechVersion := omit,
518 lSAIdentifier := omit,
519 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100520 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100521 speechCodec := omit,
522 codecList := omit,
523 lCLS_BSS_Status := omit
524 }
525 }
526 }
527}
528
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100529template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
530 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
531modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100532 pdu := {
533 bssmap := {
534 assignmentComplete := {
535 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100536 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100537 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100538 cellIdentifier := *,
539 chosenChannel := *,
540 chosenEncryptionAlgorithm := *,
541 circuitPool := *,
542 speechVersion := *,
543 lSAIdentifier := *,
544 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100545 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100546 speechCodec := *,
547 codecList := *,
548 lCLS_BSS_Status := *
549 }
550 }
551 }
552}
553
Harald Welte16a4adf2017-12-14 18:54:01 +0100554template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
555 pdu := {
556 bssmap := {
557 assignmentFailure := {
558 messageType := '03'O, /* overwritten */
559 rR_Cause := *,
560 circuitPool := *,
561 circuitPoolList := *,
562 talkerPriority := *,
563 codecList := *
564 }
565 }
566 }
567}
568
569
Harald Welteb3414b22017-11-23 18:22:10 +0100570template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
571modifies ts_BSSAP_BSSMAP := {
572 pdu := {
573 bssmap := {
574 clearCommand := {
575 messageType := '20'O, /* overwritten */
576 layer3HeaderInfo := omit,
577 cause := ts_BSSMAP_IE_Cause(cause),
578 cSFB_Indication := omit
579 }
580 }
581 }
582}
583
584template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
585 pdu := {
586 bssmap := {
587 clearCommand := {
588 messageType := '20'O, /* overwritten */
589 layer3HeaderInfo := *,
590 cause := ?,
591 cSFB_Indication := *
592 }
593 }
594 }
595}
596
597template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
598modifies ts_BSSAP_BSSMAP := {
599 pdu := {
600 bssmap := {
601 clearComplete := {
602 messageType := '21'O /* overwritten */
603 }
604 }
605 }
606}
607
Harald Weltec859df52017-11-24 23:41:41 +0100608template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
609 pdu := {
610 bssmap := {
611 clearComplete := {
612 messageType := '21'O
613 }
614 }
615 }
616}
617
Harald Weltecfa79ad2017-12-09 22:33:47 +0100618template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
619 pdu := {
620 bssmap := {
621 clearRequest := {
622 messageType := '22'O, /* overwritten */
623 cause := ?
624 }
625 }
626 }
627}
628
629
Harald Welte28d943e2017-11-25 15:00:50 +0100630function f_hex_is_odd_length(hexstring digits) return bitstring {
631 if (lengthof(digits) rem 2 == 1) {
632 return '1'B;
633 } else {
634 return '0'B;
635 }
636}
637
638template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
639 elementIdentifier := '08'O,
640 lengthIndicator := 0, /* overwritten */
641 typeOfIdentity := '001'B, /* IMSI */
642 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
643 digits := imsi_digits
644}
645
Harald Welte72cecfa2017-12-11 19:50:14 +0100646template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
647 cIl_noCell := ''O
648}
649
650private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte5d1a2202017-12-13 19:51:29 +0100651 return hex2oct(mcc[1] & mcc[0] & mnc[0] & mnc[2] & mnc[1]);
Harald Welte72cecfa2017-12-11 19:50:14 +0100652}
653
654template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
655 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
656 lac := int2oct(lac, 2),
657 ci := int2oct(ci, 2)
658}
659
660template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
661 lac := int2oct(lac, 2),
662 ci := int2oct(ci, 2)
663}
664
665template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
666 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
667 lac := int2oct(lac, 2)
668}
669
670template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
671template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
672
673template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
674 elementIdentifier := '24'O,
675 channel := chneed,
676 spare := '000000'B
677}
678
679template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
680 elementIdentifier := '09'O,
681 lengthIndicator := 4,
682 tmsiOctets := tmsi
683};
684
685private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
686 var template BSSMAP_IE_TMSI ret;
687 if (ispresent(tmsi)) {
688 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
689 } else {
690 ret := omit;
691 }
692 return ret;
693}
694
695template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
696 template BSSMAP_FIELD_CellIdentificationList cid_list,
697 template OCT4 tmsi := omit,
698 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100699modifies ts_BSSAP_BSSMAP := {
700 pdu := {
701 bssmap := {
702 paging := {
703 messageType := '51'O,
704 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100705 tMSI := f_tmsi_or_omit(tmsi),
706 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
707 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100708 eMLPP_Priority := omit,
709 pagingInformation := omit /* only VGCS/VBS flag */
710 }
711 }
712 }
713}
714
Harald Welte73cd2712017-12-17 00:44:52 +0100715template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
716modifies ts_BSSAP_BSSMAP := {
717 pdu := {
718 bssmap := {
719 cipherModeCommand := {
720 messageType := '53'O,
721 layer3HeaderInfo := omit,
722 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
723 cipherResponseMode := omit,
724 kC128 := omit
725 }
726 }
727 }
728}
729
730template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
731modifies ts_BSSAP_BSSMAP := {
732 pdu := {
733 bssmap := {
734 cipherModeCommand := {
735 messageType := '53'O,
736 layer3HeaderInfo := omit,
737 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
738 cipherResponseMode := omit,
739 kC128 := { '83'O, kc128 }
740 }
741 }
742 }
743}
744
745template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
746 pdu := {
747 bssmap := {
748 cipherModeComplete := {
749 messageType := '55'O,
750 layer3MessageContents := *,
751 chosenEncryptionAlgorithm := {
752 elementIdentifier := '2C'O,
753 algorithmIdentifier := alg
754 }
755 }
756 }
757 }
758}
759
760template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
761 pdu := {
762 bssmap := {
763 cipherModeReject := {
764 messageType := '59'O,
765 cause := ?
766 }
767 }
768 }
769}
770
771
Harald Weltec859df52017-11-24 23:41:41 +0100772
Harald Welteb69533d2017-12-15 13:55:17 +0100773} with { encode "RAW" };