blob: bc545102addf1746d577c7fb7f64e406110eaf44 [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
141
Harald Welte77a8eba2018-01-22 21:22:32 +0100142template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
143 octetstring kc) := {
144 tag := OSMO_GSUP_AUTH_TUPLE_IE,
145 len := 0, /* overwritten */
146 val := {
147 auth_tuple := {
148 valueof(ts_GSUP_IE_RAND(rand)),
149 valueof(ts_GSUP_IE_SRES(sres)),
150 valueof(ts_GSUP_IE_Kc(kc))
151 }
152 }
153}
154
155template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
156 octetstring kc, octetstring ik,
157 octetstring ck, octetstring autn,
158 octetstring res) := {
159 tag := OSMO_GSUP_AUTH_TUPLE_IE,
160 len := 0, /* overwritten */
161 val := {
162 auth_tuple := {
163 valueof(ts_GSUP_IE_RAND(rand)),
164 valueof(ts_GSUP_IE_SRES(sres)),
165 valueof(ts_GSUP_IE_Kc(kc)),
166 valueof(ts_GSUP_IE_IK(ik)),
167 valueof(ts_GSUP_IE_CK(ck)),
168 valueof(ts_GSUP_IE_AUTN(autn)),
169 valueof(ts_GSUP_IE_RES(res))
170 }
171 }
172}
173
Harald Weltedf327232017-12-28 22:51:51 +0100174template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
175 msg_type := msgt,
176 ies := ies
177}
178
179template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
180 msg_type := msgt,
181 ies := ies
182}
183
184template GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
185 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
186
Harald Welteef9fa872018-01-22 03:00:17 +0100187template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
188 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { tr_GSUP_IE_IMSI(imsi), * });
189
Harald Welte77a8eba2018-01-22 21:22:32 +0100190template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
191 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
192 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
193
Harald Weltedf327232017-12-28 22:51:51 +0100194template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
195 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
196 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
197
198template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
199 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
200 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
201
Harald Weltedfe94dd2018-01-21 13:55:22 +0100202template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
203 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
204 tr_GSUP_IE_IMSI(imsi), * });
205
206template GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
207 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
208
Harald Welte6ff81902018-01-21 19:09:08 +0100209template GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
210 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
211 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
212
213template GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
214 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
215 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
216
217template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
218 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
Harald Weltedfe94dd2018-01-21 13:55:22 +0100219 tr_GSUP_IE_IMSI(imsi), * });
Harald Weltedf327232017-12-28 22:51:51 +0100220
221
222template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
223 tag := iei,
224 len := ?,
225 val := val
226}
227
228template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
229 tag := OSMO_GSUP_IMSI_IE,
230 len := 0, /* overwritten */
231 val := {
232 imsi := imsi
233 }
234}
235
236template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
237 tag := OSMO_GSUP_IMSI_IE,
238 len := ?,
239 val := {
240 imsi := imsi
241 }
242}
243
Harald Welte6ff81902018-01-21 19:09:08 +0100244template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
245 tag := OSMO_GSUP_MSISDN_IE,
246 len := 0, /* overwritten */
247 val := {
248 msisdn := msisdn
249 }
250}
251
252template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
253 tag := OSMO_GSUP_MSISDN_IE,
254 len := ?,
255 val := {
256 msisdn := msisdn
257 }
258}
259
260
Harald Weltedf327232017-12-28 22:51:51 +0100261template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
262 tag := OSMO_GSUP_CAUSE_IE,
263 len := 0, /* overwritten */
264 val := {
265 cause := cause
266 }
267}
268
269template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
270 tag := OSMO_GSUP_CAUSE_IE,
271 len := ?,
272 val := {
273 cause := cause
274 }
275}
276
277template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
278 tag := OSMO_GSUP_AUTS_IE,
279 len := 0, /* overwritten */
280 val := {
281 auts := auts
282 }
283}
284
285template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
286 tag := OSMO_GSUP_RAND_IE,
287 len := 0, /* overwritten */
288 val := {
289 rand := rand
290 }
291}
292
Harald Welte77a8eba2018-01-22 21:22:32 +0100293template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
294 tag := OSMO_GSUP_SRES_IE,
295 len := 0, /* overwritten */
296 val := {
297 sres := sres
298 }
299}
300
301template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
302 tag := OSMO_GSUP_KC_IE,
303 len := 0, /* overwritten */
304 val := {
305 kc := kc
306 }
307}
308
309template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
310 tag := OSMO_GSUP_IK_IE,
311 len := 0, /* overwritten */
312 val := {
313 ik := ik
314 }
315}
316
317template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
318 tag := OSMO_GSUP_CK_IE,
319 len := 0, /* overwritten */
320 val := {
321 ck := ck
322 }
323}
324
325template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
326 tag := OSMO_GSUP_AUTN_IE,
327 len := 0, /* overwritten */
328 val := {
329 autn := autn
330 }
331}
332
333template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
334 tag := OSMO_GSUP_RES_IE,
335 len := 0, /* overwritten */
336 val := {
337 res := res
338 }
339}
Harald Weltedf327232017-12-28 22:51:51 +0100340
341
342
343} with { encode "RAW"; variant "FIELDORDER(msb)" }