blob: bb1b537274cfb36773a1c119ab76eb085419e0b6 [file] [log] [blame]
Harald Weltec76f29f2017-11-22 12:46:46 +01001module BSSMAP_Templates {
2
3import from General_Types all;
4import from Osmocom_Types all;
Harald Welte72cecfa2017-12-11 19:50:14 +01005import from GSM_Types all;
Harald Weltec76f29f2017-11-22 12:46:46 +01006import from BSSAP_Types all;
7
8type integer BssmapCause;
9
Harald Welteb69533d2017-12-15 13:55:17 +010010/* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */
11type enumerated myBSSMAP_Cause {
12 /* 000 / 001: Normal event */
13 GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE ('0000000'B),
14 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE ('0000001'B),
15 GSM0808_CAUSE_UPLINK_QUALITY ('0000010'B),
16 GSM0808_CAUSE_UPLINK_STRENGTH ('0000011'B),
17 GSM0808_CAUSE_DOWNLINK_QUALITY ('0000100'B),
18 GSM0808_CAUSE_DOWNLINK_STRENGTH ('0000101'B),
19 GSM0808_CAUSE_DISTANCE ('0000110'B),
20 GSM0808_CAUSE_O_AND_M_INTERVENTION ('0000111'B),
21 GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION ('0001000'B),
22 GSM0808_CAUSE_CALL_CONTROL ('0001001'B),
23 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION ('0001010'B),
24 GSM0808_CAUSE_HANDOVER_SUCCESSFUL ('0001011'B),
25 GSM0808_CAUSE_BETTER_CELL ('0001100'B),
26 GSM0808_CAUSE_DIRECTED_RETRY ('0001101'B),
27 GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL ('0001110'B),
28 GSM0808_CAUSE_TRAFFIC ('0001111'B),
29 GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL ('0010000'B),
30 GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL ('0010001'B),
31 GSM0808_CAUSE_RELOCATION_TRIGGERED ('0010010'B),
32 GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED ('0010100'B),
33 GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED ('0010101'B),
34 GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG ('0010110'B),
35 GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT ('0010111'B),
36 GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE ('0011000'B),
37 /* reserved */
38 /* 010: Resource unavailable */
39 GSM0808_CAUSE_EQUIPMENT_FAILURE ('0100000'B),
40 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE ('0100001'B),
41 GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE ('0100010'B),
42 GSM0808_CAUSE_CCCH_OVERLOAD ('0100011'B),
43 GSM0808_CAUSE_PROCESSOR_OVERLOAD ('0100100'B),
44 GSM0808_CAUSE_BSS_NOT_EQUIPPED ('0100101'B),
45 GSM0808_CAUSE_MS_NOT_EQUIPPED ('0100110'B),
46 GSM0808_CAUSE_INVALID_CELL ('0100111'B),
47 GSM0808_CAUSE_TRAFFIC_LOAD ('0101000'B),
48 GSM0808_CAUSE_PREEMPTION ('0101001'B),
49 GSM0808_CAUSE_DTM_HO_SGSN_FAILURE ('0101010'B),
50 GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE ('0101011'B),
51 /* reserved */
52 /* 011: Service or option not available, but implemented */
53 GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE ('0110000'B),
54 GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH ('0110001'B),
55 GSM0808_CAUSE_SWITCH_CIRCUIT_POOL ('0110010'B),
56 GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE ('0110011'B),
57 GSM0808_CAUSE_LSA_NOT_ALLOWED ('0110100'B),
58 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL ('0110101'B),
59 GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL ('0110110'B),
60 GSM0808_CAUSE_INVALID_CSG_CELL ('0110111'B),
61 /* reserved */
62 /* 100: Service or option not implemented or currently disabled */
63 GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL ('0111111'B),
64 GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED ('1000000'B),
65 GSM0808_CAUSE_GERAN_IU_MODE_FAILURE ('1000001'B),
66 GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE ('1000010'B),
67 GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS ('1000011'B),
68 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP ('1000100'B),
69 GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP ('1000101'B),
70 GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP ('1000110'B),
71 /* reserved */
72 /* 101: Invalid message */
73 GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED ('1010000'B),
74 GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS ('1010001'B),
75 GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING ('1010010'B),
76 GSM0808_CAUSE_INCORRECT_VALUE ('1010011'B),
77 GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE ('1010100'B),
78 GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT ('1010101'B),
79 GSM0808_CAUSE_DTM_HO_INVALID_PS_IND ('1010110'B),
80 GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC ('1010111'B),
81 /* reserved */
82 /* 110: protocol error */
83 GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC ('1100000'B),
84 GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT ('1100001'B),
85 GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY ('1100010'B)
86} with { variant "FIELDLENGTH(7)" };
87
Harald Weltec76f29f2017-11-22 12:46:46 +010088template PDU_BSSAP ts_BSSAP_BSSMAP := {
89 discriminator := '0'B,
90 spare := '0000000'B,
91 dlci := omit,
92 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +010093 pdu := {
94 bssmap := ?
95 }
Harald Weltec76f29f2017-11-22 12:46:46 +010096}
97
98template PDU_BSSAP tr_BSSAP_BSSMAP := {
99 discriminator := '0'B,
100 spare := '0000000'B,
101 dlci := omit,
102 lengthIndicator := ?,
103 pdu := {
104 bssmap := ?
105 }
106}
107
Harald Welteb3414b22017-11-23 18:22:10 +0100108template PDU_BSSAP ts_BSSAP_DTAP := {
109 discriminator := '1'B,
110 spare := '0000000'B,
111 dlci := omit,
112 lengthIndicator := 0, /* overwritten by codec */
113 pdu := {
114 dtap := ?
115 }
116}
117
118template PDU_BSSAP tr_BSSAP_DTAP := {
119 discriminator := '1'B,
120 spare := '0000000'B,
121 dlci := omit,
122 lengthIndicator := ?,
123 pdu := {
124 dtap := ?
125 }
126}
127
128
Harald Weltec76f29f2017-11-22 12:46:46 +0100129template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
130 elementIdentifier := '04'O,
131 lengthIndicator := 0,
132 causeValue := int2bit(val, 7),
133 extensionCauseValue := '0'B,
134 spare1 := omit
135}
136
137template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
138 pdu := {
139 bssmap := {
140 reset := {
141 messageType := '30'O,
142 cause := ts_BSSMAP_IE_Cause(cause),
143 a_InterfaceSelectorForReset := omit
144 }
145 }
146 }
147}
148
Harald Welte365f4ed2017-11-23 00:00:43 +0100149template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {
150 pdu := {
151 bssmap := {
152 reset := {
153 messageType := '30'O,
154 cause := ?,
155 a_InterfaceSelectorForReset := *
156 }
157 }
158 }
159}
160
Harald Weltec76f29f2017-11-22 12:46:46 +0100161template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
162 pdu := {
163 bssmap := {
164 resetAck := {
165 messageType := '31'O,
166 a_InterfaceSelectorForReset := omit
167 }
168 }
169 }
170}
171
172template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
173 pdu := {
174 bssmap := {
175 resetAck := {
176 messageType := '31'O,
177 a_InterfaceSelectorForReset := *
178 }
179 }
180 }
181}
182
183template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
184 elementIdentifier := '05'O,
185 lengthIndicator := 0,
186 cellIdentifierDiscriminator := '0000'B,
187 spare1_4 := '0000'B,
188 cellIdentification := ?
189}
190
191type uint16_t BssmapLAC;
192type uint16_t BssmapCI;
193
194/*
195template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
196modifies ts_BSSMAP_IE_CellID := {
197 cellIdentification := {
198 cI_LAC_CGI := {
199 mnc_mcc := FIXME,
200 lac := int2oct(lac, 2),
201 ci := int2oct(ci, 2)
202 }
203 }
204}
205*/
206
207template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
208modifies ts_BSSMAP_IE_CellID := {
209 cellIdentification := {
210 cI_LAC_CI := {
211 lac := int2oct(lac, 2),
212 ci := int2oct(ci, 2)
213 }
214 }
215}
216
217template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
218modifies ts_BSSMAP_IE_CellID := {
219 cellIdentification := {
220 cI_CI := int2oct(ci, 2)
221 }
222}
223
224template BSSMAP_IE_CellIdentifier ts_CellId_none
225modifies ts_BSSMAP_IE_CellID := {
226 cellIdentification := {
227 cI_noCell := ''O
228 }
229}
230
231
232template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
233 elementIdentifier := '17'O,
234 lengthIndicator := 0,
235 layer3info := l3info
236}
237
Harald Weltef8a0bda2017-12-09 00:53:17 +0100238template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
239 elementIdentifier := '17'O,
240 lengthIndicator := ?,
241 layer3info := l3info
242}
243
244
Harald Weltec76f29f2017-11-22 12:46:46 +0100245template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
246modifies ts_BSSAP_BSSMAP := {
247 pdu := {
248 bssmap := {
249 completeLayer3Information := {
250 messageType := '57'O,
251 cellIdentifier := cell_id,
252 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
253 chosenChannel := omit,
254 lSAIdentifier := omit,
255 aPDU := omit,
256 codecList := omit,
257 redirectAttemptFlag := omit,
258 sendSequenceNumber := omit,
259 iMSI := omit
260 }
261 }
262 }
263}
264
Harald Weltef8a0bda2017-12-09 00:53:17 +0100265template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
266 template BSSMAP_IE_CellIdentifier cell_id := ?)
267modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100268 pdu := {
269 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100270 completeLayer3Information := {
271 messageType := '57'O,
272 cellIdentifier := cell_id,
273 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
274 chosenChannel := *,
275 lSAIdentifier := *,
276 aPDU := *,
277 codecList := *,
278 redirectAttemptFlag := *,
279 sendSequenceNumber := *,
280 iMSI := *
281 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100282 }
283 }
284}
285
Harald Welte28d943e2017-11-25 15:00:50 +0100286template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(BSSMAP_FIELD_CellIdentificationList cid_list) := {
287 elementIdentifier := '1A'O,
288 lengthIndicator := 0, /* overwritten */
289 cellIdentifierDiscriminator := '0000'B, /* overwritten */
290 spare1_4 := '0000'B,
291 cellIdentificationList := cid_list
292}
Harald Welte365f4ed2017-11-23 00:00:43 +0100293
Harald Welte28d943e2017-11-25 15:00:50 +0100294template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_FIELD_CellIdentificationList cid_list)
Harald Weltec76f29f2017-11-22 12:46:46 +0100295modifies ts_BSSAP_BSSMAP := {
296 pdu := {
297 bssmap := {
298 handoverRequired := {
299 messageType := '11'O,
300 cause := ts_BSSMAP_IE_Cause(cause),
301 responseRequest := omit,
Harald Welte28d943e2017-11-25 15:00:50 +0100302 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Weltec76f29f2017-11-22 12:46:46 +0100303 circuitPoolList := omit,
304 currentChannelType1 := omit,
305 speechVersion := omit,
306 queueingIndicator := omit,
307 oldToNewBSSInfo := omit,
308 sourceToTargetRNCTransparentInfo := omit,
309 sourceToTargetRNCTransparentInfoCDMA := omit,
310 gERANClassmark := omit,
311 talkerPriority := omit,
312 speechCodec := omit,
313 cSG_Identifier := omit
314 }
315 }
316 }
317}
318
Harald Welte4bf5fc92017-12-15 13:56:06 +0100319const OCT1 ChRate_ANY := '00'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100320const OCT1 ChRate_TCHF := '08'O;
321const OCT1 ChRate_TCHH := '09'O;
Harald Welte4bf5fc92017-12-15 13:56:06 +0100322const OCT1 ChRate_TCHForH_Fpref := '0A'O;
323const OCT1 ChRate_TCHForH_Hpref := '0B'O;
324const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
325const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
326const OCT1 ChRate_TCHForH := '0F'O;
327const OCT1 ChRate_TCHForH_nochg := '1F'O;
Harald Welte365f4ed2017-11-23 00:00:43 +0100328
329template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
330 elementIdentifier := '0B'O, /* overwritten */
331 lengthIndicator := 0, /* overwritten */
332 speechOrDataIndicator := '0001'B, /* speech */
333 spare1_4 := '0000'B,
334 channelRateAndType := ChRate_TCHF,
335 speechId_DataIndicator := '01'O /* FRv1 */
336}
337
Harald Welte4bf5fc92017-12-15 13:56:06 +0100338template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
339 speechOrDataIndicator := '0100'B /* speech + CTM */
340}
341
342template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
343 elementIdentifier := '0B'O, /* overwritten */
344 lengthIndicator := 0, /* overwritten */
345 speechOrDataIndicator := '0010'B, /* data */
346 spare1_4 := '0000'B,
347 channelRateAndType := ChRate_TCHF,
348 speechId_DataIndicator := '10'O /* 9600 bps / transparent */
349}
350
351template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
352 elementIdentifier := '0B'O, /* overwritten */
353 lengthIndicator := 0, /* overwritten */
354 speechOrDataIndicator := '0011'B, /* data */
355 spare1_4 := '0000'B,
356 channelRateAndType := ChRate_ANY,
357 speechId_DataIndicator := '00'O /* spare */
358}
359
360template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
361 elementIdentifier := '0A'O,
362 lengthIndicator := 0, /* overwritten */
363 permittedAlgorithms := algs,
364 key := kc
365}
366
367
Harald Welte365f4ed2017-11-23 00:00:43 +0100368template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
369 elementIdentifier := '01'O, /* overwritten */
370 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
371 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
372}
373
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100374template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
375 uint16_t udp_port) := {
376 elementIdentifier := '7C'O,
377 lengthIndicator := 0, /* overwritten */
378 ipAddress := addr,
379 uDPPortValue := udp_port
380}
Harald Welte235ebf12017-12-15 14:18:16 +0100381template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
382 ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt);
383template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
384 ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt);
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100385
Harald Welte4bf5fc92017-12-15 13:56:06 +0100386template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
387 elementIdentifier := '83'O,
388 kC128_Value := kc128
389}
390
Harald Weltef1b64e22017-12-15 14:55:14 +0100391/* 3.2.2.103 */
392template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
393 codecType := GSM_FR,
394 tF := '0'B,
395 pT := '0'B,
396 pI := '0'B,
397 fI := '1'B,
398 extendedCodecType := omit,
399 s0_7 := omit,
400 s8_15 := omit
401}
402template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
403 codecType := GSM_FR
404}
405template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
406 codecType := GSM_EFR
407}
408template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
409 codecType := GSM_HR
410}
411template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
412 codecType := FR_AMR,
413 s0_7 := '11111111'B,
414 s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */
415}
416template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
417 codecType := HR_AMR,
418 s0_7 := '00111111'B,
419 s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
420}
421template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
422 elementIdentifier := '7D'O,
423 lengthIndicator := 0, /* overwritten */
424 codecElements := valueof(elem)
425}
426
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100427template PDU_BSSAP
428ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
429 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100430modifies ts_BSSAP_BSSMAP := {
431 pdu := {
432 bssmap := {
433 assignmentRequest := {
434 messageType :='01'O, /* overwritten */
435 channelType := ts_BSSMAP_IE_ChannelType,
436 layer3HeaderInfo := omit,
437 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100438 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100439 downLinkDTX_Flag := omit,
440 interferenceBandToBeUsed := omit,
441 classmarkInformationType2 := omit,
442 groupCallReference := omit,
443 talkerFlag := omit,
444 configurationEvolutionIndication := omit,
445 lsaAccesControlSuppression := omit,
446 serviceHandover := omit,
447 encryptionInformation := omit,
448 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100449 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100450 codecList := omit,
451 callIdentifier := omit,
452 kC128 := omit,
453 globalCallReference := omit,
454 lCLS_Configuration := omit,
455 lCLS_ConnectionStatusControl := omit,
456 lCLS_CorrelationNotNeeded := omit
457 }
458 }
459 }
460}
Harald Weltec76f29f2017-11-22 12:46:46 +0100461
Harald Welteab05d6c2017-11-23 18:50:52 +0100462template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100463 pdu := {
464 bssmap := {
465 assignmentRequest := {
466 messageType :='01'O, /* overwritten */
467 channelType := ?,
468 layer3HeaderInfo := *,
469 priority := *,
470 circuitIdentityCode := ?,
471 downLinkDTX_Flag := *,
472 interferenceBandToBeUsed := *,
473 classmarkInformationType2 := *,
474 groupCallReference := *,
475 talkerFlag := *,
476 configurationEvolutionIndication := *,
477 lsaAccesControlSuppression := *,
478 serviceHandover := *,
479 encryptionInformation := *,
480 talkerPriority := *,
481 aoIPTransportLayer := *,
482 codecList := *,
483 callIdentifier := *,
484 kC128 := *,
485 globalCallReference := *,
486 lCLS_Configuration := *,
487 lCLS_ConnectionStatusControl := *,
488 lCLS_CorrelationNotNeeded := *
489 }
490 }
491 }
492}
493
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100494template PDU_BSSAP
495ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
496 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100497modifies ts_BSSAP_BSSMAP := {
498 pdu := {
499 bssmap := {
500 assignmentComplete := {
501 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100502 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100503 circuitIdentityCode := cic,
504 cellIdentifier := omit,
505 chosenChannel := omit,
506 chosenEncryptionAlgorithm := omit,
507 circuitPool := omit,
508 speechVersion := omit,
509 lSAIdentifier := omit,
510 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100511 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100512 speechCodec := omit,
513 codecList := omit,
514 lCLS_BSS_Status := omit
515 }
516 }
517 }
518}
519
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100520template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
521 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
522modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100523 pdu := {
524 bssmap := {
525 assignmentComplete := {
526 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100527 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100528 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100529 cellIdentifier := *,
530 chosenChannel := *,
531 chosenEncryptionAlgorithm := *,
532 circuitPool := *,
533 speechVersion := *,
534 lSAIdentifier := *,
535 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100536 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100537 speechCodec := *,
538 codecList := *,
539 lCLS_BSS_Status := *
540 }
541 }
542 }
543}
544
Harald Welte16a4adf2017-12-14 18:54:01 +0100545template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
546 pdu := {
547 bssmap := {
548 assignmentFailure := {
549 messageType := '03'O, /* overwritten */
550 rR_Cause := *,
551 circuitPool := *,
552 circuitPoolList := *,
553 talkerPriority := *,
554 codecList := *
555 }
556 }
557 }
558}
559
560
Harald Welteb3414b22017-11-23 18:22:10 +0100561template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
562modifies ts_BSSAP_BSSMAP := {
563 pdu := {
564 bssmap := {
565 clearCommand := {
566 messageType := '20'O, /* overwritten */
567 layer3HeaderInfo := omit,
568 cause := ts_BSSMAP_IE_Cause(cause),
569 cSFB_Indication := omit
570 }
571 }
572 }
573}
574
575template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
576 pdu := {
577 bssmap := {
578 clearCommand := {
579 messageType := '20'O, /* overwritten */
580 layer3HeaderInfo := *,
581 cause := ?,
582 cSFB_Indication := *
583 }
584 }
585 }
586}
587
588template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
589modifies ts_BSSAP_BSSMAP := {
590 pdu := {
591 bssmap := {
592 clearComplete := {
593 messageType := '21'O /* overwritten */
594 }
595 }
596 }
597}
598
Harald Weltec859df52017-11-24 23:41:41 +0100599template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
600 pdu := {
601 bssmap := {
602 clearComplete := {
603 messageType := '21'O
604 }
605 }
606 }
607}
608
Harald Weltecfa79ad2017-12-09 22:33:47 +0100609template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
610 pdu := {
611 bssmap := {
612 clearRequest := {
613 messageType := '22'O, /* overwritten */
614 cause := ?
615 }
616 }
617 }
618}
619
620
Harald Welte28d943e2017-11-25 15:00:50 +0100621function f_hex_is_odd_length(hexstring digits) return bitstring {
622 if (lengthof(digits) rem 2 == 1) {
623 return '1'B;
624 } else {
625 return '0'B;
626 }
627}
628
629template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
630 elementIdentifier := '08'O,
631 lengthIndicator := 0, /* overwritten */
632 typeOfIdentity := '001'B, /* IMSI */
633 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
634 digits := imsi_digits
635}
636
Harald Welte72cecfa2017-12-11 19:50:14 +0100637template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
638 cIl_noCell := ''O
639}
640
641private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte5d1a2202017-12-13 19:51:29 +0100642 return hex2oct(mcc[1] & mcc[0] & mnc[0] & mnc[2] & mnc[1]);
Harald Welte72cecfa2017-12-11 19:50:14 +0100643}
644
645template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
646 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
647 lac := int2oct(lac, 2),
648 ci := int2oct(ci, 2)
649}
650
651template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
652 lac := int2oct(lac, 2),
653 ci := int2oct(ci, 2)
654}
655
656template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
657 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
658 lac := int2oct(lac, 2)
659}
660
661template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
662template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
663
664template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
665 elementIdentifier := '24'O,
666 channel := chneed,
667 spare := '000000'B
668}
669
670template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
671 elementIdentifier := '09'O,
672 lengthIndicator := 4,
673 tmsiOctets := tmsi
674};
675
676private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
677 var template BSSMAP_IE_TMSI ret;
678 if (ispresent(tmsi)) {
679 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
680 } else {
681 ret := omit;
682 }
683 return ret;
684}
685
686template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
687 template BSSMAP_FIELD_CellIdentificationList cid_list,
688 template OCT4 tmsi := omit,
689 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100690modifies ts_BSSAP_BSSMAP := {
691 pdu := {
692 bssmap := {
693 paging := {
694 messageType := '51'O,
695 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100696 tMSI := f_tmsi_or_omit(tmsi),
697 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
698 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100699 eMLPP_Priority := omit,
700 pagingInformation := omit /* only VGCS/VBS flag */
701 }
702 }
703 }
704}
705
Harald Welte73cd2712017-12-17 00:44:52 +0100706template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
707modifies ts_BSSAP_BSSMAP := {
708 pdu := {
709 bssmap := {
710 cipherModeCommand := {
711 messageType := '53'O,
712 layer3HeaderInfo := omit,
713 encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
714 cipherResponseMode := omit,
715 kC128 := omit
716 }
717 }
718 }
719}
720
721template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
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 := { '83'O, kc128 }
731 }
732 }
733 }
734}
735
736template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
737 pdu := {
738 bssmap := {
739 cipherModeComplete := {
740 messageType := '55'O,
741 layer3MessageContents := *,
742 chosenEncryptionAlgorithm := {
743 elementIdentifier := '2C'O,
744 algorithmIdentifier := alg
745 }
746 }
747 }
748 }
749}
750
751template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
752 pdu := {
753 bssmap := {
754 cipherModeReject := {
755 messageType := '59'O,
756 cause := ?
757 }
758 }
759 }
760}
761
762
Harald Weltec859df52017-11-24 23:41:41 +0100763
Harald Welteb69533d2017-12-15 13:55:17 +0100764} with { encode "RAW" };