blob: 071c66d5962a6e094099e3a275bd4bf8697c1be7 [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}
381
Harald Welte4bf5fc92017-12-15 13:56:06 +0100382template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
383 elementIdentifier := '83'O,
384 kC128_Value := kc128
385}
386
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100387template PDU_BSSAP
388ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
389 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100390modifies ts_BSSAP_BSSMAP := {
391 pdu := {
392 bssmap := {
393 assignmentRequest := {
394 messageType :='01'O, /* overwritten */
395 channelType := ts_BSSMAP_IE_ChannelType,
396 layer3HeaderInfo := omit,
397 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100398 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100399 downLinkDTX_Flag := omit,
400 interferenceBandToBeUsed := omit,
401 classmarkInformationType2 := omit,
402 groupCallReference := omit,
403 talkerFlag := omit,
404 configurationEvolutionIndication := omit,
405 lsaAccesControlSuppression := omit,
406 serviceHandover := omit,
407 encryptionInformation := omit,
408 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100409 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100410 codecList := omit,
411 callIdentifier := omit,
412 kC128 := omit,
413 globalCallReference := omit,
414 lCLS_Configuration := omit,
415 lCLS_ConnectionStatusControl := omit,
416 lCLS_CorrelationNotNeeded := omit
417 }
418 }
419 }
420}
Harald Weltec76f29f2017-11-22 12:46:46 +0100421
Harald Welteab05d6c2017-11-23 18:50:52 +0100422template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100423 pdu := {
424 bssmap := {
425 assignmentRequest := {
426 messageType :='01'O, /* overwritten */
427 channelType := ?,
428 layer3HeaderInfo := *,
429 priority := *,
430 circuitIdentityCode := ?,
431 downLinkDTX_Flag := *,
432 interferenceBandToBeUsed := *,
433 classmarkInformationType2 := *,
434 groupCallReference := *,
435 talkerFlag := *,
436 configurationEvolutionIndication := *,
437 lsaAccesControlSuppression := *,
438 serviceHandover := *,
439 encryptionInformation := *,
440 talkerPriority := *,
441 aoIPTransportLayer := *,
442 codecList := *,
443 callIdentifier := *,
444 kC128 := *,
445 globalCallReference := *,
446 lCLS_Configuration := *,
447 lCLS_ConnectionStatusControl := *,
448 lCLS_CorrelationNotNeeded := *
449 }
450 }
451 }
452}
453
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100454template PDU_BSSAP
455ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
456 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100457modifies ts_BSSAP_BSSMAP := {
458 pdu := {
459 bssmap := {
460 assignmentComplete := {
461 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100462 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100463 circuitIdentityCode := cic,
464 cellIdentifier := omit,
465 chosenChannel := omit,
466 chosenEncryptionAlgorithm := omit,
467 circuitPool := omit,
468 speechVersion := omit,
469 lSAIdentifier := omit,
470 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100471 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100472 speechCodec := omit,
473 codecList := omit,
474 lCLS_BSS_Status := omit
475 }
476 }
477 }
478}
479
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100480template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
481 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
482modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100483 pdu := {
484 bssmap := {
485 assignmentComplete := {
486 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100487 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100488 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100489 cellIdentifier := *,
490 chosenChannel := *,
491 chosenEncryptionAlgorithm := *,
492 circuitPool := *,
493 speechVersion := *,
494 lSAIdentifier := *,
495 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100496 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100497 speechCodec := *,
498 codecList := *,
499 lCLS_BSS_Status := *
500 }
501 }
502 }
503}
504
Harald Welte16a4adf2017-12-14 18:54:01 +0100505template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
506 pdu := {
507 bssmap := {
508 assignmentFailure := {
509 messageType := '03'O, /* overwritten */
510 rR_Cause := *,
511 circuitPool := *,
512 circuitPoolList := *,
513 talkerPriority := *,
514 codecList := *
515 }
516 }
517 }
518}
519
520
Harald Welteb3414b22017-11-23 18:22:10 +0100521template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
522modifies ts_BSSAP_BSSMAP := {
523 pdu := {
524 bssmap := {
525 clearCommand := {
526 messageType := '20'O, /* overwritten */
527 layer3HeaderInfo := omit,
528 cause := ts_BSSMAP_IE_Cause(cause),
529 cSFB_Indication := omit
530 }
531 }
532 }
533}
534
535template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
536 pdu := {
537 bssmap := {
538 clearCommand := {
539 messageType := '20'O, /* overwritten */
540 layer3HeaderInfo := *,
541 cause := ?,
542 cSFB_Indication := *
543 }
544 }
545 }
546}
547
548template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
549modifies ts_BSSAP_BSSMAP := {
550 pdu := {
551 bssmap := {
552 clearComplete := {
553 messageType := '21'O /* overwritten */
554 }
555 }
556 }
557}
558
Harald Weltec859df52017-11-24 23:41:41 +0100559template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
560 pdu := {
561 bssmap := {
562 clearComplete := {
563 messageType := '21'O
564 }
565 }
566 }
567}
568
Harald Weltecfa79ad2017-12-09 22:33:47 +0100569template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
570 pdu := {
571 bssmap := {
572 clearRequest := {
573 messageType := '22'O, /* overwritten */
574 cause := ?
575 }
576 }
577 }
578}
579
580
Harald Welte28d943e2017-11-25 15:00:50 +0100581function f_hex_is_odd_length(hexstring digits) return bitstring {
582 if (lengthof(digits) rem 2 == 1) {
583 return '1'B;
584 } else {
585 return '0'B;
586 }
587}
588
589template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
590 elementIdentifier := '08'O,
591 lengthIndicator := 0, /* overwritten */
592 typeOfIdentity := '001'B, /* IMSI */
593 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
594 digits := imsi_digits
595}
596
Harald Welte72cecfa2017-12-11 19:50:14 +0100597template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
598 cIl_noCell := ''O
599}
600
601private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte5d1a2202017-12-13 19:51:29 +0100602 return hex2oct(mcc[1] & mcc[0] & mnc[0] & mnc[2] & mnc[1]);
Harald Welte72cecfa2017-12-11 19:50:14 +0100603}
604
605template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
606 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
607 lac := int2oct(lac, 2),
608 ci := int2oct(ci, 2)
609}
610
611template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
612 lac := int2oct(lac, 2),
613 ci := int2oct(ci, 2)
614}
615
616template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
617 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
618 lac := int2oct(lac, 2)
619}
620
621template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
622template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
623
624template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
625 elementIdentifier := '24'O,
626 channel := chneed,
627 spare := '000000'B
628}
629
630template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
631 elementIdentifier := '09'O,
632 lengthIndicator := 4,
633 tmsiOctets := tmsi
634};
635
636private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
637 var template BSSMAP_IE_TMSI ret;
638 if (ispresent(tmsi)) {
639 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
640 } else {
641 ret := omit;
642 }
643 return ret;
644}
645
646template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
647 template BSSMAP_FIELD_CellIdentificationList cid_list,
648 template OCT4 tmsi := omit,
649 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100650modifies ts_BSSAP_BSSMAP := {
651 pdu := {
652 bssmap := {
653 paging := {
654 messageType := '51'O,
655 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100656 tMSI := f_tmsi_or_omit(tmsi),
657 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
658 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100659 eMLPP_Priority := omit,
660 pagingInformation := omit /* only VGCS/VBS flag */
661 }
662 }
663 }
664}
665
Harald Weltec859df52017-11-24 23:41:41 +0100666
Harald Welteb69533d2017-12-15 13:55:17 +0100667} with { encode "RAW" };