blob: 0d2db3daf14c4868dd3e63e7a55166f978502262 [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
10template PDU_BSSAP ts_BSSAP_BSSMAP := {
11 discriminator := '0'B,
12 spare := '0000000'B,
13 dlci := omit,
14 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +010015 pdu := {
16 bssmap := ?
17 }
Harald Weltec76f29f2017-11-22 12:46:46 +010018}
19
20template PDU_BSSAP tr_BSSAP_BSSMAP := {
21 discriminator := '0'B,
22 spare := '0000000'B,
23 dlci := omit,
24 lengthIndicator := ?,
25 pdu := {
26 bssmap := ?
27 }
28}
29
Harald Welteb3414b22017-11-23 18:22:10 +010030template PDU_BSSAP ts_BSSAP_DTAP := {
31 discriminator := '1'B,
32 spare := '0000000'B,
33 dlci := omit,
34 lengthIndicator := 0, /* overwritten by codec */
35 pdu := {
36 dtap := ?
37 }
38}
39
40template PDU_BSSAP tr_BSSAP_DTAP := {
41 discriminator := '1'B,
42 spare := '0000000'B,
43 dlci := omit,
44 lengthIndicator := ?,
45 pdu := {
46 dtap := ?
47 }
48}
49
50
Harald Weltec76f29f2017-11-22 12:46:46 +010051template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
52 elementIdentifier := '04'O,
53 lengthIndicator := 0,
54 causeValue := int2bit(val, 7),
55 extensionCauseValue := '0'B,
56 spare1 := omit
57}
58
59template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
60 pdu := {
61 bssmap := {
62 reset := {
63 messageType := '30'O,
64 cause := ts_BSSMAP_IE_Cause(cause),
65 a_InterfaceSelectorForReset := omit
66 }
67 }
68 }
69}
70
Harald Welte365f4ed2017-11-23 00:00:43 +010071template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {
72 pdu := {
73 bssmap := {
74 reset := {
75 messageType := '30'O,
76 cause := ?,
77 a_InterfaceSelectorForReset := *
78 }
79 }
80 }
81}
82
Harald Weltec76f29f2017-11-22 12:46:46 +010083template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
84 pdu := {
85 bssmap := {
86 resetAck := {
87 messageType := '31'O,
88 a_InterfaceSelectorForReset := omit
89 }
90 }
91 }
92}
93
94template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
95 pdu := {
96 bssmap := {
97 resetAck := {
98 messageType := '31'O,
99 a_InterfaceSelectorForReset := *
100 }
101 }
102 }
103}
104
105template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
106 elementIdentifier := '05'O,
107 lengthIndicator := 0,
108 cellIdentifierDiscriminator := '0000'B,
109 spare1_4 := '0000'B,
110 cellIdentification := ?
111}
112
113type uint16_t BssmapLAC;
114type uint16_t BssmapCI;
115
116/*
117template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
118modifies ts_BSSMAP_IE_CellID := {
119 cellIdentification := {
120 cI_LAC_CGI := {
121 mnc_mcc := FIXME,
122 lac := int2oct(lac, 2),
123 ci := int2oct(ci, 2)
124 }
125 }
126}
127*/
128
129template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
130modifies ts_BSSMAP_IE_CellID := {
131 cellIdentification := {
132 cI_LAC_CI := {
133 lac := int2oct(lac, 2),
134 ci := int2oct(ci, 2)
135 }
136 }
137}
138
139template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
140modifies ts_BSSMAP_IE_CellID := {
141 cellIdentification := {
142 cI_CI := int2oct(ci, 2)
143 }
144}
145
146template BSSMAP_IE_CellIdentifier ts_CellId_none
147modifies ts_BSSMAP_IE_CellID := {
148 cellIdentification := {
149 cI_noCell := ''O
150 }
151}
152
153
154template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
155 elementIdentifier := '17'O,
156 lengthIndicator := 0,
157 layer3info := l3info
158}
159
Harald Weltef8a0bda2017-12-09 00:53:17 +0100160template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
161 elementIdentifier := '17'O,
162 lengthIndicator := ?,
163 layer3info := l3info
164}
165
166
Harald Weltec76f29f2017-11-22 12:46:46 +0100167template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
168modifies ts_BSSAP_BSSMAP := {
169 pdu := {
170 bssmap := {
171 completeLayer3Information := {
172 messageType := '57'O,
173 cellIdentifier := cell_id,
174 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
175 chosenChannel := omit,
176 lSAIdentifier := omit,
177 aPDU := omit,
178 codecList := omit,
179 redirectAttemptFlag := omit,
180 sendSequenceNumber := omit,
181 iMSI := omit
182 }
183 }
184 }
185}
186
Harald Weltef8a0bda2017-12-09 00:53:17 +0100187template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
188 template BSSMAP_IE_CellIdentifier cell_id := ?)
189modifies tr_BSSAP_BSSMAP := {
Harald Welte365f4ed2017-11-23 00:00:43 +0100190 pdu := {
191 bssmap := {
Harald Weltef8a0bda2017-12-09 00:53:17 +0100192 completeLayer3Information := {
193 messageType := '57'O,
194 cellIdentifier := cell_id,
195 layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
196 chosenChannel := *,
197 lSAIdentifier := *,
198 aPDU := *,
199 codecList := *,
200 redirectAttemptFlag := *,
201 sendSequenceNumber := *,
202 iMSI := *
203 }
Harald Welte365f4ed2017-11-23 00:00:43 +0100204 }
205 }
206}
207
Harald Welte28d943e2017-11-25 15:00:50 +0100208template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(BSSMAP_FIELD_CellIdentificationList cid_list) := {
209 elementIdentifier := '1A'O,
210 lengthIndicator := 0, /* overwritten */
211 cellIdentifierDiscriminator := '0000'B, /* overwritten */
212 spare1_4 := '0000'B,
213 cellIdentificationList := cid_list
214}
Harald Welte365f4ed2017-11-23 00:00:43 +0100215
Harald Welte28d943e2017-11-25 15:00:50 +0100216template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_FIELD_CellIdentificationList cid_list)
Harald Weltec76f29f2017-11-22 12:46:46 +0100217modifies ts_BSSAP_BSSMAP := {
218 pdu := {
219 bssmap := {
220 handoverRequired := {
221 messageType := '11'O,
222 cause := ts_BSSMAP_IE_Cause(cause),
223 responseRequest := omit,
Harald Welte28d943e2017-11-25 15:00:50 +0100224 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Weltec76f29f2017-11-22 12:46:46 +0100225 circuitPoolList := omit,
226 currentChannelType1 := omit,
227 speechVersion := omit,
228 queueingIndicator := omit,
229 oldToNewBSSInfo := omit,
230 sourceToTargetRNCTransparentInfo := omit,
231 sourceToTargetRNCTransparentInfoCDMA := omit,
232 gERANClassmark := omit,
233 talkerPriority := omit,
234 speechCodec := omit,
235 cSG_Identifier := omit
236 }
237 }
238 }
239}
240
Harald Welte365f4ed2017-11-23 00:00:43 +0100241const OCT1 ChRate_TCHF := '08'O;
242const OCT1 ChRate_TCHH := '09'O;
243
244template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
245 elementIdentifier := '0B'O, /* overwritten */
246 lengthIndicator := 0, /* overwritten */
247 speechOrDataIndicator := '0001'B, /* speech */
248 spare1_4 := '0000'B,
249 channelRateAndType := ChRate_TCHF,
250 speechId_DataIndicator := '01'O /* FRv1 */
251}
252
253template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
254 elementIdentifier := '01'O, /* overwritten */
255 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
256 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
257}
258
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100259template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
260 uint16_t udp_port) := {
261 elementIdentifier := '7C'O,
262 lengthIndicator := 0, /* overwritten */
263 ipAddress := addr,
264 uDPPortValue := udp_port
265}
266
267template PDU_BSSAP
268ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
269 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welte365f4ed2017-11-23 00:00:43 +0100270modifies ts_BSSAP_BSSMAP := {
271 pdu := {
272 bssmap := {
273 assignmentRequest := {
274 messageType :='01'O, /* overwritten */
275 channelType := ts_BSSMAP_IE_ChannelType,
276 layer3HeaderInfo := omit,
277 priority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100278 circuitIdentityCode := cic,
Harald Welte365f4ed2017-11-23 00:00:43 +0100279 downLinkDTX_Flag := omit,
280 interferenceBandToBeUsed := omit,
281 classmarkInformationType2 := omit,
282 groupCallReference := omit,
283 talkerFlag := omit,
284 configurationEvolutionIndication := omit,
285 lsaAccesControlSuppression := omit,
286 serviceHandover := omit,
287 encryptionInformation := omit,
288 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100289 aoIPTransportLayer := aoip,
Harald Welte365f4ed2017-11-23 00:00:43 +0100290 codecList := omit,
291 callIdentifier := omit,
292 kC128 := omit,
293 globalCallReference := omit,
294 lCLS_Configuration := omit,
295 lCLS_ConnectionStatusControl := omit,
296 lCLS_CorrelationNotNeeded := omit
297 }
298 }
299 }
300}
Harald Weltec76f29f2017-11-22 12:46:46 +0100301
Harald Welteab05d6c2017-11-23 18:50:52 +0100302template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100303 pdu := {
304 bssmap := {
305 assignmentRequest := {
306 messageType :='01'O, /* overwritten */
307 channelType := ?,
308 layer3HeaderInfo := *,
309 priority := *,
310 circuitIdentityCode := ?,
311 downLinkDTX_Flag := *,
312 interferenceBandToBeUsed := *,
313 classmarkInformationType2 := *,
314 groupCallReference := *,
315 talkerFlag := *,
316 configurationEvolutionIndication := *,
317 lsaAccesControlSuppression := *,
318 serviceHandover := *,
319 encryptionInformation := *,
320 talkerPriority := *,
321 aoIPTransportLayer := *,
322 codecList := *,
323 callIdentifier := *,
324 kC128 := *,
325 globalCallReference := *,
326 lCLS_Configuration := *,
327 lCLS_ConnectionStatusControl := *,
328 lCLS_CorrelationNotNeeded := *
329 }
330 }
331 }
332}
333
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100334template PDU_BSSAP
335ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
336 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)
Harald Welteb3414b22017-11-23 18:22:10 +0100337modifies ts_BSSAP_BSSMAP := {
338 pdu := {
339 bssmap := {
340 assignmentComplete := {
341 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100342 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100343 circuitIdentityCode := cic,
344 cellIdentifier := omit,
345 chosenChannel := omit,
346 chosenEncryptionAlgorithm := omit,
347 circuitPool := omit,
348 speechVersion := omit,
349 lSAIdentifier := omit,
350 talkerPriority := omit,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100351 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100352 speechCodec := omit,
353 codecList := omit,
354 lCLS_BSS_Status := omit
355 }
356 }
357 }
358}
359
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100360template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
361 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
362modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100363 pdu := {
364 bssmap := {
365 assignmentComplete := {
366 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100367 rR_Cause := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100368 circuitIdentityCode := cic,
Harald Welteb3414b22017-11-23 18:22:10 +0100369 cellIdentifier := *,
370 chosenChannel := *,
371 chosenEncryptionAlgorithm := *,
372 circuitPool := *,
373 speechVersion := *,
374 lSAIdentifier := *,
375 talkerPriority := *,
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100376 aoIPTransportLayer := aoip,
Harald Welteb3414b22017-11-23 18:22:10 +0100377 speechCodec := *,
378 codecList := *,
379 lCLS_BSS_Status := *
380 }
381 }
382 }
383}
384
Harald Welte16a4adf2017-12-14 18:54:01 +0100385template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
386 pdu := {
387 bssmap := {
388 assignmentFailure := {
389 messageType := '03'O, /* overwritten */
390 rR_Cause := *,
391 circuitPool := *,
392 circuitPoolList := *,
393 talkerPriority := *,
394 codecList := *
395 }
396 }
397 }
398}
399
400
Harald Welteb3414b22017-11-23 18:22:10 +0100401template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
402modifies ts_BSSAP_BSSMAP := {
403 pdu := {
404 bssmap := {
405 clearCommand := {
406 messageType := '20'O, /* overwritten */
407 layer3HeaderInfo := omit,
408 cause := ts_BSSMAP_IE_Cause(cause),
409 cSFB_Indication := omit
410 }
411 }
412 }
413}
414
415template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
416 pdu := {
417 bssmap := {
418 clearCommand := {
419 messageType := '20'O, /* overwritten */
420 layer3HeaderInfo := *,
421 cause := ?,
422 cSFB_Indication := *
423 }
424 }
425 }
426}
427
428template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
429modifies ts_BSSAP_BSSMAP := {
430 pdu := {
431 bssmap := {
432 clearComplete := {
433 messageType := '21'O /* overwritten */
434 }
435 }
436 }
437}
438
Harald Weltec859df52017-11-24 23:41:41 +0100439template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
440 pdu := {
441 bssmap := {
442 clearComplete := {
443 messageType := '21'O
444 }
445 }
446 }
447}
448
Harald Weltecfa79ad2017-12-09 22:33:47 +0100449template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
450 pdu := {
451 bssmap := {
452 clearRequest := {
453 messageType := '22'O, /* overwritten */
454 cause := ?
455 }
456 }
457 }
458}
459
460
Harald Welte28d943e2017-11-25 15:00:50 +0100461function f_hex_is_odd_length(hexstring digits) return bitstring {
462 if (lengthof(digits) rem 2 == 1) {
463 return '1'B;
464 } else {
465 return '0'B;
466 }
467}
468
469template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
470 elementIdentifier := '08'O,
471 lengthIndicator := 0, /* overwritten */
472 typeOfIdentity := '001'B, /* IMSI */
473 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
474 digits := imsi_digits
475}
476
Harald Welte72cecfa2017-12-11 19:50:14 +0100477template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
478 cIl_noCell := ''O
479}
480
481private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
Harald Welte5d1a2202017-12-13 19:51:29 +0100482 return hex2oct(mcc[1] & mcc[0] & mnc[0] & mnc[2] & mnc[1]);
Harald Welte72cecfa2017-12-11 19:50:14 +0100483}
484
485template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
486 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
487 lac := int2oct(lac, 2),
488 ci := int2oct(ci, 2)
489}
490
491template BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
492 lac := int2oct(lac, 2),
493 ci := int2oct(ci, 2)
494}
495
496template BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
497 mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
498 lac := int2oct(lac, 2)
499}
500
501template OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
502template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
503
504template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
505 elementIdentifier := '24'O,
506 channel := chneed,
507 spare := '000000'B
508}
509
510template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
511 elementIdentifier := '09'O,
512 lengthIndicator := 4,
513 tmsiOctets := tmsi
514};
515
516private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
517 var template BSSMAP_IE_TMSI ret;
518 if (ispresent(tmsi)) {
519 ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
520 } else {
521 ret := omit;
522 }
523 return ret;
524}
525
526template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
527 template BSSMAP_FIELD_CellIdentificationList cid_list,
528 template OCT4 tmsi := omit,
529 template BSSMAP_IE_ChannelNeeded chneed := omit)
Harald Welte28d943e2017-11-25 15:00:50 +0100530modifies ts_BSSAP_BSSMAP := {
531 pdu := {
532 bssmap := {
533 paging := {
534 messageType := '51'O,
535 iMSI := ts_BSSMAP_Imsi(imsi_digits),
Harald Welte72cecfa2017-12-11 19:50:14 +0100536 tMSI := f_tmsi_or_omit(tmsi),
537 cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
538 channelNeeded := chneed,
Harald Welte28d943e2017-11-25 15:00:50 +0100539 eMLPP_Priority := omit,
540 pagingInformation := omit /* only VGCS/VBS flag */
541 }
542 }
543 }
544}
545
Harald Weltec859df52017-11-24 23:41:41 +0100546
547
Harald Weltec76f29f2017-11-22 12:46:46 +0100548}