blob: 12aabc66c2a2ba036573113866167e978059abc3 [file] [log] [blame]
Harald Weltec76f29f2017-11-22 12:46:46 +01001module BSSMAP_Templates {
2
3import from General_Types all;
4import from Osmocom_Types all;
5import from BSSAP_Types all;
6
7type integer BssmapCause;
8
9template PDU_BSSAP ts_BSSAP_BSSMAP := {
10 discriminator := '0'B,
11 spare := '0000000'B,
12 dlci := omit,
13 lengthIndicator := 0, /* overwritten by codec */
Harald Welteb3414b22017-11-23 18:22:10 +010014 pdu := {
15 bssmap := ?
16 }
Harald Weltec76f29f2017-11-22 12:46:46 +010017}
18
19template PDU_BSSAP tr_BSSAP_BSSMAP := {
20 discriminator := '0'B,
21 spare := '0000000'B,
22 dlci := omit,
23 lengthIndicator := ?,
24 pdu := {
25 bssmap := ?
26 }
27}
28
Harald Welteb3414b22017-11-23 18:22:10 +010029template PDU_BSSAP ts_BSSAP_DTAP := {
30 discriminator := '1'B,
31 spare := '0000000'B,
32 dlci := omit,
33 lengthIndicator := 0, /* overwritten by codec */
34 pdu := {
35 dtap := ?
36 }
37}
38
39template PDU_BSSAP tr_BSSAP_DTAP := {
40 discriminator := '1'B,
41 spare := '0000000'B,
42 dlci := omit,
43 lengthIndicator := ?,
44 pdu := {
45 dtap := ?
46 }
47}
48
49
Harald Weltec76f29f2017-11-22 12:46:46 +010050template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
51 elementIdentifier := '04'O,
52 lengthIndicator := 0,
53 causeValue := int2bit(val, 7),
54 extensionCauseValue := '0'B,
55 spare1 := omit
56}
57
58template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
59 pdu := {
60 bssmap := {
61 reset := {
62 messageType := '30'O,
63 cause := ts_BSSMAP_IE_Cause(cause),
64 a_InterfaceSelectorForReset := omit
65 }
66 }
67 }
68}
69
Harald Welte365f4ed2017-11-23 00:00:43 +010070template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {
71 pdu := {
72 bssmap := {
73 reset := {
74 messageType := '30'O,
75 cause := ?,
76 a_InterfaceSelectorForReset := *
77 }
78 }
79 }
80}
81
Harald Weltec76f29f2017-11-22 12:46:46 +010082template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
83 pdu := {
84 bssmap := {
85 resetAck := {
86 messageType := '31'O,
87 a_InterfaceSelectorForReset := omit
88 }
89 }
90 }
91}
92
93template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
94 pdu := {
95 bssmap := {
96 resetAck := {
97 messageType := '31'O,
98 a_InterfaceSelectorForReset := *
99 }
100 }
101 }
102}
103
104template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
105 elementIdentifier := '05'O,
106 lengthIndicator := 0,
107 cellIdentifierDiscriminator := '0000'B,
108 spare1_4 := '0000'B,
109 cellIdentification := ?
110}
111
112type uint16_t BssmapLAC;
113type uint16_t BssmapCI;
114
115/*
116template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
117modifies ts_BSSMAP_IE_CellID := {
118 cellIdentification := {
119 cI_LAC_CGI := {
120 mnc_mcc := FIXME,
121 lac := int2oct(lac, 2),
122 ci := int2oct(ci, 2)
123 }
124 }
125}
126*/
127
128template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
129modifies ts_BSSMAP_IE_CellID := {
130 cellIdentification := {
131 cI_LAC_CI := {
132 lac := int2oct(lac, 2),
133 ci := int2oct(ci, 2)
134 }
135 }
136}
137
138template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
139modifies ts_BSSMAP_IE_CellID := {
140 cellIdentification := {
141 cI_CI := int2oct(ci, 2)
142 }
143}
144
145template BSSMAP_IE_CellIdentifier ts_CellId_none
146modifies ts_BSSMAP_IE_CellID := {
147 cellIdentification := {
148 cI_noCell := ''O
149 }
150}
151
152
153template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
154 elementIdentifier := '17'O,
155 lengthIndicator := 0,
156 layer3info := l3info
157}
158
159template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
160modifies ts_BSSAP_BSSMAP := {
161 pdu := {
162 bssmap := {
163 completeLayer3Information := {
164 messageType := '57'O,
165 cellIdentifier := cell_id,
166 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
167 chosenChannel := omit,
168 lSAIdentifier := omit,
169 aPDU := omit,
170 codecList := omit,
171 redirectAttemptFlag := omit,
172 sendSequenceNumber := omit,
173 iMSI := omit
174 }
175 }
176 }
177}
178
Harald Welte365f4ed2017-11-23 00:00:43 +0100179template PDU_BSSAP tr_BSSMAP_ComplL3 modifies tr_BSSAP_BSSMAP := {
180 pdu := {
181 bssmap := {
182 completeLayer3Information := ?
183 }
184 }
185}
186
Harald Welte28d943e2017-11-25 15:00:50 +0100187template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(BSSMAP_FIELD_CellIdentificationList cid_list) := {
188 elementIdentifier := '1A'O,
189 lengthIndicator := 0, /* overwritten */
190 cellIdentifierDiscriminator := '0000'B, /* overwritten */
191 spare1_4 := '0000'B,
192 cellIdentificationList := cid_list
193}
Harald Welte365f4ed2017-11-23 00:00:43 +0100194
Harald Welte28d943e2017-11-25 15:00:50 +0100195template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_FIELD_CellIdentificationList cid_list)
Harald Weltec76f29f2017-11-22 12:46:46 +0100196modifies ts_BSSAP_BSSMAP := {
197 pdu := {
198 bssmap := {
199 handoverRequired := {
200 messageType := '11'O,
201 cause := ts_BSSMAP_IE_Cause(cause),
202 responseRequest := omit,
Harald Welte28d943e2017-11-25 15:00:50 +0100203 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
Harald Weltec76f29f2017-11-22 12:46:46 +0100204 circuitPoolList := omit,
205 currentChannelType1 := omit,
206 speechVersion := omit,
207 queueingIndicator := omit,
208 oldToNewBSSInfo := omit,
209 sourceToTargetRNCTransparentInfo := omit,
210 sourceToTargetRNCTransparentInfoCDMA := omit,
211 gERANClassmark := omit,
212 talkerPriority := omit,
213 speechCodec := omit,
214 cSG_Identifier := omit
215 }
216 }
217 }
218}
219
Harald Welte365f4ed2017-11-23 00:00:43 +0100220const OCT1 ChRate_TCHF := '08'O;
221const OCT1 ChRate_TCHH := '09'O;
222
223template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
224 elementIdentifier := '0B'O, /* overwritten */
225 lengthIndicator := 0, /* overwritten */
226 speechOrDataIndicator := '0001'B, /* speech */
227 spare1_4 := '0000'B,
228 channelRateAndType := ChRate_TCHF,
229 speechId_DataIndicator := '01'O /* FRv1 */
230}
231
232template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
233 elementIdentifier := '01'O, /* overwritten */
234 cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
235 cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
236}
237
Harald Welteab05d6c2017-11-23 18:50:52 +0100238template (value) PDU_BSSAP ts_BSSMAP_AssignmentReq(uint11_t span, uint5_t ts)
Harald Welte365f4ed2017-11-23 00:00:43 +0100239modifies ts_BSSAP_BSSMAP := {
240 pdu := {
241 bssmap := {
242 assignmentRequest := {
243 messageType :='01'O, /* overwritten */
244 channelType := ts_BSSMAP_IE_ChannelType,
245 layer3HeaderInfo := omit,
246 priority := omit,
247 circuitIdentityCode := ts_BSSMAP_IE_CIC(span, ts),
248 downLinkDTX_Flag := omit,
249 interferenceBandToBeUsed := omit,
250 classmarkInformationType2 := omit,
251 groupCallReference := omit,
252 talkerFlag := omit,
253 configurationEvolutionIndication := omit,
254 lsaAccesControlSuppression := omit,
255 serviceHandover := omit,
256 encryptionInformation := omit,
257 talkerPriority := omit,
258 aoIPTransportLayer := omit,
259 codecList := omit,
260 callIdentifier := omit,
261 kC128 := omit,
262 globalCallReference := omit,
263 lCLS_Configuration := omit,
264 lCLS_ConnectionStatusControl := omit,
265 lCLS_CorrelationNotNeeded := omit
266 }
267 }
268 }
269}
Harald Weltec76f29f2017-11-22 12:46:46 +0100270
Harald Welteab05d6c2017-11-23 18:50:52 +0100271template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
Harald Welteb3414b22017-11-23 18:22:10 +0100272 pdu := {
273 bssmap := {
274 assignmentRequest := {
275 messageType :='01'O, /* overwritten */
276 channelType := ?,
277 layer3HeaderInfo := *,
278 priority := *,
279 circuitIdentityCode := ?,
280 downLinkDTX_Flag := *,
281 interferenceBandToBeUsed := *,
282 classmarkInformationType2 := *,
283 groupCallReference := *,
284 talkerFlag := *,
285 configurationEvolutionIndication := *,
286 lsaAccesControlSuppression := *,
287 serviceHandover := *,
288 encryptionInformation := *,
289 talkerPriority := *,
290 aoIPTransportLayer := *,
291 codecList := *,
292 callIdentifier := *,
293 kC128 := *,
294 globalCallReference := *,
295 lCLS_Configuration := *,
296 lCLS_ConnectionStatusControl := *,
297 lCLS_CorrelationNotNeeded := *
298 }
299 }
300 }
301}
302
303template (value) PDU_BSSAP ts_BSSMAP_AssignmentComplete(BSSMAP_IE_CircuitIdentityCode cic)
304modifies ts_BSSAP_BSSMAP := {
305 pdu := {
306 bssmap := {
307 assignmentComplete := {
308 messageType :='02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100309 rR_Cause := omit,
Harald Welteb3414b22017-11-23 18:22:10 +0100310 circuitIdentityCode := cic,
311 cellIdentifier := omit,
312 chosenChannel := omit,
313 chosenEncryptionAlgorithm := omit,
314 circuitPool := omit,
315 speechVersion := omit,
316 lSAIdentifier := omit,
317 talkerPriority := omit,
318 aoIPTransportLayer := omit,
319 speechCodec := omit,
320 codecList := omit,
321 lCLS_BSS_Status := omit
322 }
323 }
324 }
325}
326
327template PDU_BSSAP tr_BSSMAP_AssignmentComplete modifies tr_BSSAP_BSSMAP := {
328 pdu := {
329 bssmap := {
330 assignmentComplete := {
331 messageType := '02'O, /* overwritten */
Harald Welte7ed2b082017-11-23 18:52:13 +0100332 rR_Cause := *,
Harald Welteb3414b22017-11-23 18:22:10 +0100333 circuitIdentityCode := ?,
334 cellIdentifier := *,
335 chosenChannel := *,
336 chosenEncryptionAlgorithm := *,
337 circuitPool := *,
338 speechVersion := *,
339 lSAIdentifier := *,
340 talkerPriority := *,
341 aoIPTransportLayer := *,
342 speechCodec := *,
343 codecList := *,
344 lCLS_BSS_Status := *
345 }
346 }
347 }
348}
349
350template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
351modifies ts_BSSAP_BSSMAP := {
352 pdu := {
353 bssmap := {
354 clearCommand := {
355 messageType := '20'O, /* overwritten */
356 layer3HeaderInfo := omit,
357 cause := ts_BSSMAP_IE_Cause(cause),
358 cSFB_Indication := omit
359 }
360 }
361 }
362}
363
364template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
365 pdu := {
366 bssmap := {
367 clearCommand := {
368 messageType := '20'O, /* overwritten */
369 layer3HeaderInfo := *,
370 cause := ?,
371 cSFB_Indication := *
372 }
373 }
374 }
375}
376
377template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
378modifies ts_BSSAP_BSSMAP := {
379 pdu := {
380 bssmap := {
381 clearComplete := {
382 messageType := '21'O /* overwritten */
383 }
384 }
385 }
386}
387
Harald Weltec859df52017-11-24 23:41:41 +0100388template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
389 pdu := {
390 bssmap := {
391 clearComplete := {
392 messageType := '21'O
393 }
394 }
395 }
396}
397
Harald Welte28d943e2017-11-25 15:00:50 +0100398function f_hex_is_odd_length(hexstring digits) return bitstring {
399 if (lengthof(digits) rem 2 == 1) {
400 return '1'B;
401 } else {
402 return '0'B;
403 }
404}
405
406template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
407 elementIdentifier := '08'O,
408 lengthIndicator := 0, /* overwritten */
409 typeOfIdentity := '001'B, /* IMSI */
410 oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
411 digits := imsi_digits
412}
413
414template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits, BSSMAP_FIELD_CellIdentificationList cid_list,
415 template integer tmsi := omit)
416modifies ts_BSSAP_BSSMAP := {
417 pdu := {
418 bssmap := {
419 paging := {
420 messageType := '51'O,
421 iMSI := ts_BSSMAP_Imsi(imsi_digits),
422 tMSI := omit, // FIXME: convert tmsi,
423 cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
424 channelNeeded := omit,
425 eMLPP_Priority := omit,
426 pagingInformation := omit /* only VGCS/VBS flag */
427 }
428 }
429 }
430}
431
Harald Weltec859df52017-11-24 23:41:41 +0100432
433
Harald Weltec76f29f2017-11-22 12:46:46 +0100434}