blob: fda9549c2f8a574c040e5bc996a3933d6fa8baf2 [file] [log] [blame]
Harald Weltedf327232017-12-28 22:51:51 +01001module GSUP_Types {
2
Harald Welte35bb7162018-01-03 21:07:52 +01003/* GSUP_Types, defining abstract TTCN-3 data types for the GSUP protocol.
4 *
5 * GSUP is a non-standard protocol used between OsmoMSC/OsmoSGSN and OsmoHLR
6 * in order to replace the complex TCAP/MAP protocol.
7 *
8 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
9 * All rights reserved.
10 *
11 * Released under the terms of GNU General Public License, Version 2 or
12 * (at your option) any later version.
13 */
14
Harald Weltedf327232017-12-28 22:51:51 +010015import from General_Types all;
16import from Osmocom_Types all;
17
18type enumerated GSUP_IEI {
19 OSMO_GSUP_IMSI_IE ('01'O),
20 OSMO_GSUP_CAUSE_IE ('02'O),
21 OSMO_GSUP_AUTH_TUPLE_IE ('03'O),
22 OSMO_GSUP_PDP_INFO_COMPL_IE ('04'O),
23 OSMO_GSUP_PDP_INFO_IE ('05'O),
24 OSMO_GSUP_CANCEL_TYPE_IE ('06'O),
25 OSMO_GSUP_FREEZE_PTMSI_IE ('07'O),
26 OSMO_GSUP_MSISDN_IE ('08'O),
27 OSMO_GSUP_HLR_NUMBER_IE ('09'O),
28 OSMO_GSUP_PDP_CONTEXT_ID_IE ('10'O),
29 OSMO_GSUP_PDP_TYPE_IE ('11'O),
30 OSMO_GSUP_ACCESS_POINT_NAME_IE ('12'O),
31 OSMO_GSUP_PDP_QOS_IE ('13'O),
32 OSMO_GSUP_CHARG_CHAR_IE ('14'O),
33
34 OSMO_GSUP_RAND_IE ('20'O),
35 OSMO_GSUP_SRES_IE ('21'O),
36 OSMO_GSUP_KC_IE ('22'O),
37 OSMO_GSUP_IK_IE ('23'O),
38 OSMO_GSUP_CK_IE ('24'O),
39 OSMO_GSUP_AUTN_IE ('25'O),
40 OSMO_GSUP_AUTS_IE ('26'O),
41 OSMO_GSUP_RES_IE ('27'O),
42 OSMO_GSUP_CN_DOMAIN_IE ('28'O)
43} with { variant "FIELDLENGTH(8)" };
44
45type enumerated GSUP_MessageType {
46 OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST ('00000100'B),
47 OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR ('00000101'B),
48 OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT ('00000110'B),
49
50 OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST ('00001000'B),
51 OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR ('00001001'B),
52 OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT ('00001010'B),
53
54 OSMO_GSUP_MSGT_AUTH_FAIL_REPORT ('00001011'B),
55
56 OSMO_GSUP_MSGT_PURGE_MS_REQUEST ('00001100'B),
57 OSMO_GSUP_MSGT_PURGE_MS_ERROR ('00001101'B),
58 OSMO_GSUP_MSGT_PURGE_MS_RESULT ('00001110'B),
59
60 OSMO_GSUP_MSGT_INSERT_DATA_REQUEST ('00010000'B),
61 OSMO_GSUP_MSGT_INSERT_DATA_ERROR ('00010001'B),
62 OSMO_GSUP_MSGT_INSERT_DATA_RESULT ('00010010'B),
63
64 OSMO_GSUP_MSGT_DELETE_DATA_REQUEST ('00010100'B),
65 OSMO_GSUP_MSGT_DELETE_DATA_ERROR ('00010101'B),
66 OSMO_GSUP_MSGT_DELETE_DATA_RESULT ('00010110'B),
67
68 OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST ('00011100'B),
69 OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR ('00011101'B),
70 OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT ('00011110'B)
71} with { variant "FIELDLENGTH(8)" };
72
73type enumerated GSUP_CancelType {
74 OSMO_GSUP_CANCEL_TYPE_UPDATE (1),
75 OSMO_GSUP_CANCEL_TYPE_WITHDRAW (2)
76} with { variant "FIELDLENGTH(8)" };
77
78type enumerated GSUP_CnDomain {
79 OSMO_GSUP_CN_DOMAIN_PS (1),
80 OSMO_GSUP_CN_DOMAIN_CS (2)
81} with { variant "FIELDLENGTH(8)" };
82
Harald Welte3f95be82018-01-27 00:48:13 +010083type record GSUP_MSISDN {
84 uint8_t len,
85 hexstring digits optional
86} with { variant (len) "LENGTHTO(digits)" };
87
Harald Weltedf327232017-12-28 22:51:51 +010088type record GSUP_IE {
89 GSUP_IEI tag,
90 uint8_t len,
91 GSUP_IeValue val
92} with { variant (len) "LENGTHTO(val)"
93 variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
94 cause, tag = OSMO_GSUP_CAUSE_IE;
95 cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +010096 auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
Harald Weltedf327232017-12-28 22:51:51 +010097 auts, tag = OSMO_GSUP_AUTS_IE;
98 rand, tag = OSMO_GSUP_RAND_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +010099 sres, tag = OSMO_GSUP_SRES_IE;
100 kc, tag = OSMO_GSUP_KC_IE;
101 ik, tag = OSMO_GSUP_IK_IE;
102 ck, tag = OSMO_GSUP_CK_IE;
103 autn, tag = OSMO_GSUP_AUTN_IE;
104 res, tag = OSMO_GSUP_RES_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100105 msisdn, tag = OSMO_GSUP_MSISDN_IE;
106 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
107 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
108 charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE)"
109};
110
111type record of GSUP_IE GSUP_IEs;
112
113type union GSUP_IeValue {
114 hexstring imsi,
115 integer cause,
116 GSUP_CancelType cancel_type,
117 //boolean pdp_info_compl,
118 //boolean freeze_ptmsi,
119 GSUP_IEs pdp_info,
120 GSUP_IEs auth_tuple,
121 octetstring auts,
122 octetstring rand,
Harald Welte77a8eba2018-01-22 21:22:32 +0100123 octetstring sres,
124 octetstring kc,
125 octetstring ik,
126 octetstring ck,
127 octetstring autn,
128 octetstring res,
Harald Welte3f95be82018-01-27 00:48:13 +0100129 GSUP_MSISDN msisdn,
Harald Weltedf327232017-12-28 22:51:51 +0100130 octetstring hlr_number,
131 GSUP_CnDomain cn_domain,
132 octetstring charg_char
133};
134
135type record GSUP_PDU {
136 GSUP_MessageType msg_type,
137 GSUP_IEs ies
138};
139
140external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
141 with { extension "prototype(convert) encode(RAW)" };
142
143external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
144 with { extension "prototype(convert) decode(RAW)" };
145
Harald Welte2f562b12018-01-24 20:52:38 +0100146function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
147 if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
148 /* if last digit is 'F', then there's an odd number of digits and we must strip the F */
149 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
150 if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
151 gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
152 }
153 }
154}
155
156function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
157 if (ischosen(gsup.ies[0].val.imsi)) {
158 /* if number of digits is odd, add a 'F' as padding at the end */
159 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
160 if (num_digits rem 2 == 1) {
161 gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
162 }
163 }
164}
165
Harald Welte3f95be82018-01-27 00:48:13 +0100166template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
167 BIT3 ton := '000'B,
168 BIT4 npi := '0000'B) := {
169 len := 0, /* overwritten */
170 /* numberingPlanIdentification := npi,
171 typeOfNumber := ton,
172 ext1 := '0'B, */
173 digits := digits
174}
175
176template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
177 template BIT3 ton := ?,
178 template BIT4 npi := ?) := {
179 len := ?,
180 /* numberingPlanIdentification := npi,
181 typeOfNumber := ton,
182 ext1 := '0'B, */
183 digits := digits
184}
185
186
Harald Weltedf327232017-12-28 22:51:51 +0100187
Harald Welte77a8eba2018-01-22 21:22:32 +0100188template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
189 octetstring kc) := {
190 tag := OSMO_GSUP_AUTH_TUPLE_IE,
191 len := 0, /* overwritten */
192 val := {
193 auth_tuple := {
194 valueof(ts_GSUP_IE_RAND(rand)),
195 valueof(ts_GSUP_IE_SRES(sres)),
196 valueof(ts_GSUP_IE_Kc(kc))
197 }
198 }
199}
200
201template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
202 octetstring kc, octetstring ik,
203 octetstring ck, octetstring autn,
204 octetstring res) := {
205 tag := OSMO_GSUP_AUTH_TUPLE_IE,
206 len := 0, /* overwritten */
207 val := {
208 auth_tuple := {
209 valueof(ts_GSUP_IE_RAND(rand)),
210 valueof(ts_GSUP_IE_SRES(sres)),
211 valueof(ts_GSUP_IE_Kc(kc)),
212 valueof(ts_GSUP_IE_IK(ik)),
213 valueof(ts_GSUP_IE_CK(ck)),
214 valueof(ts_GSUP_IE_AUTN(autn)),
215 valueof(ts_GSUP_IE_RES(res))
216 }
217 }
218}
219
Harald Weltedf327232017-12-28 22:51:51 +0100220template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
221 msg_type := msgt,
222 ies := ies
223}
224
Harald Welte8a1dd532018-01-27 15:38:18 +0100225template GSUP_PDU tr_GSUP_IMSI(template GSUP_MessageType msgt := ?, template hexstring imsi) := {
226 msg_type := msgt,
227 ies := { tr_GSUP_IE_IMSI(imsi), * }
228}
229
Harald Weltedf327232017-12-28 22:51:51 +0100230template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
231 msg_type := msgt,
232 ies := ies
233}
234
Harald Welte6aa04e32018-01-27 15:35:19 +0100235template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
Harald Weltedf327232017-12-28 22:51:51 +0100236 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
237
Harald Welteef9fa872018-01-22 03:00:17 +0100238template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100239 tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
Harald Welteef9fa872018-01-22 03:00:17 +0100240
Harald Welte77a8eba2018-01-22 21:22:32 +0100241template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
242 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
243 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
244
Harald Weltedf327232017-12-28 22:51:51 +0100245template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
Harald Welte071ed732018-01-23 19:53:52 +0100246 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
Harald Weltedf327232017-12-28 22:51:51 +0100247 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
248
Harald Welte6aa04e32018-01-27 15:35:19 +0100249template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
250 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
251 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
Harald Welte071ed732018-01-23 19:53:52 +0100252
253
Harald Weltedf327232017-12-28 22:51:51 +0100254template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
255 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
256 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
257
Harald Weltedfe94dd2018-01-21 13:55:22 +0100258template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100259 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
Harald Weltedfe94dd2018-01-21 13:55:22 +0100260
Harald Welte6aa04e32018-01-27 15:35:19 +0100261template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
Harald Weltedfe94dd2018-01-21 13:55:22 +0100262 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
263
Harald Welte6aa04e32018-01-27 15:35:19 +0100264template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100265 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
266 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
267
Harald Welte6aa04e32018-01-27 15:35:19 +0100268template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100269 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
270 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
271
272template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100273 tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100274
Harald Weltec638f4d2018-01-24 22:00:36 +0100275template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100276 tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100277
Harald Welte167458a2018-01-27 15:58:16 +0100278template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
279 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
280 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
281
282template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
283 tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
284
285template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
286 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
287 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
288
289
290template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
291 tag := OSMO_GSUP_CANCEL_TYPE_IE,
292 len := 0, /* overwritten */
293 val := {
294 cancel_type := ctype
295 }
296}
297
298template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
299 tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
300
Harald Weltedf327232017-12-28 22:51:51 +0100301template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
302 tag := iei,
303 len := ?,
304 val := val
305}
306
307template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
308 tag := OSMO_GSUP_IMSI_IE,
309 len := 0, /* overwritten */
310 val := {
311 imsi := imsi
312 }
313}
314
315template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
316 tag := OSMO_GSUP_IMSI_IE,
317 len := ?,
318 val := {
319 imsi := imsi
320 }
321}
322
Harald Welte6ff81902018-01-21 19:09:08 +0100323template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
324 tag := OSMO_GSUP_MSISDN_IE,
325 len := 0, /* overwritten */
326 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100327 msisdn := ts_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100328 }
329}
330
331template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
332 tag := OSMO_GSUP_MSISDN_IE,
333 len := ?,
334 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100335 msisdn := tr_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100336 }
337}
338
339
Harald Weltedf327232017-12-28 22:51:51 +0100340template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
341 tag := OSMO_GSUP_CAUSE_IE,
342 len := 0, /* overwritten */
343 val := {
344 cause := cause
345 }
346}
347
348template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
349 tag := OSMO_GSUP_CAUSE_IE,
350 len := ?,
351 val := {
352 cause := cause
353 }
354}
355
356template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
357 tag := OSMO_GSUP_AUTS_IE,
358 len := 0, /* overwritten */
359 val := {
360 auts := auts
361 }
362}
363
364template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
365 tag := OSMO_GSUP_RAND_IE,
366 len := 0, /* overwritten */
367 val := {
368 rand := rand
369 }
370}
371
Harald Welte77a8eba2018-01-22 21:22:32 +0100372template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
373 tag := OSMO_GSUP_SRES_IE,
374 len := 0, /* overwritten */
375 val := {
376 sres := sres
377 }
378}
379
380template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
381 tag := OSMO_GSUP_KC_IE,
382 len := 0, /* overwritten */
383 val := {
384 kc := kc
385 }
386}
387
388template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
389 tag := OSMO_GSUP_IK_IE,
390 len := 0, /* overwritten */
391 val := {
392 ik := ik
393 }
394}
395
396template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
397 tag := OSMO_GSUP_CK_IE,
398 len := 0, /* overwritten */
399 val := {
400 ck := ck
401 }
402}
403
404template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
405 tag := OSMO_GSUP_AUTN_IE,
406 len := 0, /* overwritten */
407 val := {
408 autn := autn
409 }
410}
411
412template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
413 tag := OSMO_GSUP_RES_IE,
414 len := 0, /* overwritten */
415 val := {
416 res := res
417 }
418}
Harald Weltedf327232017-12-28 22:51:51 +0100419
420
421
422} with { encode "RAW"; variant "FIELDORDER(msb)" }