blob: 7f239cad1351f9fbd8fd8621b173a93b6f91606e [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
83type record GSUP_IE {
84 GSUP_IEI tag,
85 uint8_t len,
86 GSUP_IeValue val
87} with { variant (len) "LENGTHTO(val)"
88 variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
89 cause, tag = OSMO_GSUP_CAUSE_IE;
90 cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +010091 auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
Harald Weltedf327232017-12-28 22:51:51 +010092 auts, tag = OSMO_GSUP_AUTS_IE;
93 rand, tag = OSMO_GSUP_RAND_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +010094 sres, tag = OSMO_GSUP_SRES_IE;
95 kc, tag = OSMO_GSUP_KC_IE;
96 ik, tag = OSMO_GSUP_IK_IE;
97 ck, tag = OSMO_GSUP_CK_IE;
98 autn, tag = OSMO_GSUP_AUTN_IE;
99 res, tag = OSMO_GSUP_RES_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100100 msisdn, tag = OSMO_GSUP_MSISDN_IE;
101 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
102 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
103 charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE)"
104};
105
106type record of GSUP_IE GSUP_IEs;
107
108type union GSUP_IeValue {
109 hexstring imsi,
110 integer cause,
111 GSUP_CancelType cancel_type,
112 //boolean pdp_info_compl,
113 //boolean freeze_ptmsi,
114 GSUP_IEs pdp_info,
115 GSUP_IEs auth_tuple,
116 octetstring auts,
117 octetstring rand,
Harald Welte77a8eba2018-01-22 21:22:32 +0100118 octetstring sres,
119 octetstring kc,
120 octetstring ik,
121 octetstring ck,
122 octetstring autn,
123 octetstring res,
Harald Weltedf327232017-12-28 22:51:51 +0100124 hexstring msisdn,
125 octetstring hlr_number,
126 GSUP_CnDomain cn_domain,
127 octetstring charg_char
128};
129
130type record GSUP_PDU {
131 GSUP_MessageType msg_type,
132 GSUP_IEs ies
133};
134
135external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
136 with { extension "prototype(convert) encode(RAW)" };
137
138external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
139 with { extension "prototype(convert) decode(RAW)" };
140
Harald Welte2f562b12018-01-24 20:52:38 +0100141function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
142 if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
143 /* if last digit is 'F', then there's an odd number of digits and we must strip the F */
144 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
145 if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
146 gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
147 }
148 }
149}
150
151function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
152 if (ischosen(gsup.ies[0].val.imsi)) {
153 /* if number of digits is odd, add a 'F' as padding at the end */
154 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
155 if (num_digits rem 2 == 1) {
156 gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
157 }
158 }
159}
160
Harald Weltedf327232017-12-28 22:51:51 +0100161
Harald Welte77a8eba2018-01-22 21:22:32 +0100162template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
163 octetstring kc) := {
164 tag := OSMO_GSUP_AUTH_TUPLE_IE,
165 len := 0, /* overwritten */
166 val := {
167 auth_tuple := {
168 valueof(ts_GSUP_IE_RAND(rand)),
169 valueof(ts_GSUP_IE_SRES(sres)),
170 valueof(ts_GSUP_IE_Kc(kc))
171 }
172 }
173}
174
175template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
176 octetstring kc, octetstring ik,
177 octetstring ck, octetstring autn,
178 octetstring res) := {
179 tag := OSMO_GSUP_AUTH_TUPLE_IE,
180 len := 0, /* overwritten */
181 val := {
182 auth_tuple := {
183 valueof(ts_GSUP_IE_RAND(rand)),
184 valueof(ts_GSUP_IE_SRES(sres)),
185 valueof(ts_GSUP_IE_Kc(kc)),
186 valueof(ts_GSUP_IE_IK(ik)),
187 valueof(ts_GSUP_IE_CK(ck)),
188 valueof(ts_GSUP_IE_AUTN(autn)),
189 valueof(ts_GSUP_IE_RES(res))
190 }
191 }
192}
193
Harald Weltedf327232017-12-28 22:51:51 +0100194template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
195 msg_type := msgt,
196 ies := ies
197}
198
199template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
200 msg_type := msgt,
201 ies := ies
202}
203
204template GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
205 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
206
Harald Welteef9fa872018-01-22 03:00:17 +0100207template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
208 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { tr_GSUP_IE_IMSI(imsi), * });
209
Harald Welte77a8eba2018-01-22 21:22:32 +0100210template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
211 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
212 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
213
Harald Weltedf327232017-12-28 22:51:51 +0100214template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
Harald Welte071ed732018-01-23 19:53:52 +0100215 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
Harald Weltedf327232017-12-28 22:51:51 +0100216 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
217
Harald Welte071ed732018-01-23 19:53:52 +0100218template GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
219 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
220 ts_GSUP_IE_IMSI(imsi), ts_GSUP_IE_Cause(cause) });
221
222
Harald Weltedf327232017-12-28 22:51:51 +0100223template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
224 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
225 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
226
Harald Weltedfe94dd2018-01-21 13:55:22 +0100227template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
228 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
229 tr_GSUP_IE_IMSI(imsi), * });
230
231template GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
232 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
233
Harald Welte6ff81902018-01-21 19:09:08 +0100234template GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
235 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
236 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
237
238template GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
239 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
240 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
241
242template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
243 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
Harald Weltedfe94dd2018-01-21 13:55:22 +0100244 tr_GSUP_IE_IMSI(imsi), * });
Harald Weltedf327232017-12-28 22:51:51 +0100245
Harald Weltec638f4d2018-01-24 22:00:36 +0100246template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
247 tr_GSUP(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, {
248 tr_GSUP_IE_IMSI(imsi), * });
Harald Weltedf327232017-12-28 22:51:51 +0100249
250template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
251 tag := iei,
252 len := ?,
253 val := val
254}
255
256template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
257 tag := OSMO_GSUP_IMSI_IE,
258 len := 0, /* overwritten */
259 val := {
260 imsi := imsi
261 }
262}
263
264template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
265 tag := OSMO_GSUP_IMSI_IE,
266 len := ?,
267 val := {
268 imsi := imsi
269 }
270}
271
Harald Welte6ff81902018-01-21 19:09:08 +0100272template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
273 tag := OSMO_GSUP_MSISDN_IE,
274 len := 0, /* overwritten */
275 val := {
276 msisdn := msisdn
277 }
278}
279
280template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
281 tag := OSMO_GSUP_MSISDN_IE,
282 len := ?,
283 val := {
284 msisdn := msisdn
285 }
286}
287
288
Harald Weltedf327232017-12-28 22:51:51 +0100289template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
290 tag := OSMO_GSUP_CAUSE_IE,
291 len := 0, /* overwritten */
292 val := {
293 cause := cause
294 }
295}
296
297template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
298 tag := OSMO_GSUP_CAUSE_IE,
299 len := ?,
300 val := {
301 cause := cause
302 }
303}
304
305template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
306 tag := OSMO_GSUP_AUTS_IE,
307 len := 0, /* overwritten */
308 val := {
309 auts := auts
310 }
311}
312
313template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
314 tag := OSMO_GSUP_RAND_IE,
315 len := 0, /* overwritten */
316 val := {
317 rand := rand
318 }
319}
320
Harald Welte77a8eba2018-01-22 21:22:32 +0100321template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
322 tag := OSMO_GSUP_SRES_IE,
323 len := 0, /* overwritten */
324 val := {
325 sres := sres
326 }
327}
328
329template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
330 tag := OSMO_GSUP_KC_IE,
331 len := 0, /* overwritten */
332 val := {
333 kc := kc
334 }
335}
336
337template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
338 tag := OSMO_GSUP_IK_IE,
339 len := 0, /* overwritten */
340 val := {
341 ik := ik
342 }
343}
344
345template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
346 tag := OSMO_GSUP_CK_IE,
347 len := 0, /* overwritten */
348 val := {
349 ck := ck
350 }
351}
352
353template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
354 tag := OSMO_GSUP_AUTN_IE,
355 len := 0, /* overwritten */
356 val := {
357 autn := autn
358 }
359}
360
361template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
362 tag := OSMO_GSUP_RES_IE,
363 len := 0, /* overwritten */
364 val := {
365 res := res
366 }
367}
Harald Weltedf327232017-12-28 22:51:51 +0100368
369
370
371} with { encode "RAW"; variant "FIELDORDER(msb)" }