blob: 15560c7fbed0f527eebf48a506ca9a66b728f9ae [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) :=
Harald Welte071ed732018-01-23 19:53:52 +0100195 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
Harald Weltedf327232017-12-28 22:51:51 +0100196 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
197
Harald Welte071ed732018-01-23 19:53:52 +0100198template GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
199 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
200 ts_GSUP_IE_IMSI(imsi), ts_GSUP_IE_Cause(cause) });
201
202
Harald Weltedf327232017-12-28 22:51:51 +0100203template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
204 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
205 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
206
Harald Weltedfe94dd2018-01-21 13:55:22 +0100207template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
208 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
209 tr_GSUP_IE_IMSI(imsi), * });
210
211template GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
212 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
213
Harald Welte6ff81902018-01-21 19:09:08 +0100214template GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
215 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
216 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
217
218template GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
219 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
220 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
221
222template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
223 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
Harald Weltedfe94dd2018-01-21 13:55:22 +0100224 tr_GSUP_IE_IMSI(imsi), * });
Harald Weltedf327232017-12-28 22:51:51 +0100225
226
227template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
228 tag := iei,
229 len := ?,
230 val := val
231}
232
233template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
234 tag := OSMO_GSUP_IMSI_IE,
235 len := 0, /* overwritten */
236 val := {
237 imsi := imsi
238 }
239}
240
241template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
242 tag := OSMO_GSUP_IMSI_IE,
243 len := ?,
244 val := {
245 imsi := imsi
246 }
247}
248
Harald Welte6ff81902018-01-21 19:09:08 +0100249template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
250 tag := OSMO_GSUP_MSISDN_IE,
251 len := 0, /* overwritten */
252 val := {
253 msisdn := msisdn
254 }
255}
256
257template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
258 tag := OSMO_GSUP_MSISDN_IE,
259 len := ?,
260 val := {
261 msisdn := msisdn
262 }
263}
264
265
Harald Weltedf327232017-12-28 22:51:51 +0100266template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
267 tag := OSMO_GSUP_CAUSE_IE,
268 len := 0, /* overwritten */
269 val := {
270 cause := cause
271 }
272}
273
274template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
275 tag := OSMO_GSUP_CAUSE_IE,
276 len := ?,
277 val := {
278 cause := cause
279 }
280}
281
282template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
283 tag := OSMO_GSUP_AUTS_IE,
284 len := 0, /* overwritten */
285 val := {
286 auts := auts
287 }
288}
289
290template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
291 tag := OSMO_GSUP_RAND_IE,
292 len := 0, /* overwritten */
293 val := {
294 rand := rand
295 }
296}
297
Harald Welte77a8eba2018-01-22 21:22:32 +0100298template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
299 tag := OSMO_GSUP_SRES_IE,
300 len := 0, /* overwritten */
301 val := {
302 sres := sres
303 }
304}
305
306template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
307 tag := OSMO_GSUP_KC_IE,
308 len := 0, /* overwritten */
309 val := {
310 kc := kc
311 }
312}
313
314template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
315 tag := OSMO_GSUP_IK_IE,
316 len := 0, /* overwritten */
317 val := {
318 ik := ik
319 }
320}
321
322template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
323 tag := OSMO_GSUP_CK_IE,
324 len := 0, /* overwritten */
325 val := {
326 ck := ck
327 }
328}
329
330template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
331 tag := OSMO_GSUP_AUTN_IE,
332 len := 0, /* overwritten */
333 val := {
334 autn := autn
335 }
336}
337
338template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
339 tag := OSMO_GSUP_RES_IE,
340 len := 0, /* overwritten */
341 val := {
342 res := res
343 }
344}
Harald Weltedf327232017-12-28 22:51:51 +0100345
346
347
348} with { encode "RAW"; variant "FIELDORDER(msb)" }