blob: ba8180fe9424e24c95ede275a47e8d58ae042600 [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),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +070042 OSMO_GSUP_CN_DOMAIN_IE ('28'O),
43
44 OSMO_GSUP_SESSION_ID_IE ('30'O),
45 OSMO_GSUP_SESSION_STATE_IE ('31'O),
46 OSMO_GSUP_SS_INFO_IE ('35'O)
Harald Weltedf327232017-12-28 22:51:51 +010047} with { variant "FIELDLENGTH(8)" };
48
49type enumerated GSUP_MessageType {
50 OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST ('00000100'B),
51 OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR ('00000101'B),
52 OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT ('00000110'B),
53
54 OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST ('00001000'B),
55 OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR ('00001001'B),
56 OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT ('00001010'B),
57
58 OSMO_GSUP_MSGT_AUTH_FAIL_REPORT ('00001011'B),
59
60 OSMO_GSUP_MSGT_PURGE_MS_REQUEST ('00001100'B),
61 OSMO_GSUP_MSGT_PURGE_MS_ERROR ('00001101'B),
62 OSMO_GSUP_MSGT_PURGE_MS_RESULT ('00001110'B),
63
64 OSMO_GSUP_MSGT_INSERT_DATA_REQUEST ('00010000'B),
65 OSMO_GSUP_MSGT_INSERT_DATA_ERROR ('00010001'B),
66 OSMO_GSUP_MSGT_INSERT_DATA_RESULT ('00010010'B),
67
68 OSMO_GSUP_MSGT_DELETE_DATA_REQUEST ('00010100'B),
69 OSMO_GSUP_MSGT_DELETE_DATA_ERROR ('00010101'B),
70 OSMO_GSUP_MSGT_DELETE_DATA_RESULT ('00010110'B),
71
72 OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST ('00011100'B),
73 OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR ('00011101'B),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +070074 OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT ('00011110'B),
75
76 OSMO_GSUP_MSGT_PROC_SS_REQUEST ('00100000'B),
77 OSMO_GSUP_MSGT_PROC_SS_ERROR ('00100001'B),
78 OSMO_GSUP_MSGT_PROC_SS_RESULT ('00100010'B)
Harald Weltedf327232017-12-28 22:51:51 +010079} with { variant "FIELDLENGTH(8)" };
80
81type enumerated GSUP_CancelType {
82 OSMO_GSUP_CANCEL_TYPE_UPDATE (1),
83 OSMO_GSUP_CANCEL_TYPE_WITHDRAW (2)
84} with { variant "FIELDLENGTH(8)" };
85
86type enumerated GSUP_CnDomain {
87 OSMO_GSUP_CN_DOMAIN_PS (1),
88 OSMO_GSUP_CN_DOMAIN_CS (2)
89} with { variant "FIELDLENGTH(8)" };
90
Vadim Yanitskiyb761d142018-06-02 21:05:04 +070091type enumerated GSUP_SessionState {
92 OSMO_GSUP_SESSION_STATE_NONE (0),
93 OSMO_GSUP_SESSION_STATE_BEGIN (1),
94 OSMO_GSUP_SESSION_STATE_CONTINUE (2),
95 OSMO_GSUP_SESSION_STATE_END (3)
96} with { variant "FIELDLENGTH(8)" };
97
Harald Welte3f95be82018-01-27 00:48:13 +010098type record GSUP_MSISDN {
99 uint8_t len,
100 hexstring digits optional
101} with { variant (len) "LENGTHTO(digits)" };
102
Harald Weltedf327232017-12-28 22:51:51 +0100103type record GSUP_IE {
104 GSUP_IEI tag,
105 uint8_t len,
106 GSUP_IeValue val
107} with { variant (len) "LENGTHTO(val)"
108 variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
109 cause, tag = OSMO_GSUP_CAUSE_IE;
110 cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +0100111 auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100112 auts, tag = OSMO_GSUP_AUTS_IE;
113 rand, tag = OSMO_GSUP_RAND_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +0100114 sres, tag = OSMO_GSUP_SRES_IE;
115 kc, tag = OSMO_GSUP_KC_IE;
116 ik, tag = OSMO_GSUP_IK_IE;
117 ck, tag = OSMO_GSUP_CK_IE;
118 autn, tag = OSMO_GSUP_AUTN_IE;
119 res, tag = OSMO_GSUP_RES_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100120 msisdn, tag = OSMO_GSUP_MSISDN_IE;
121 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
122 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
Harald Welteeded9ad2018-02-17 20:57:34 +0100123 pdp_info, tag = OSMO_GSUP_PDP_INFO_IE;
124 apn, tag = OSMO_GSUP_ACCESS_POINT_NAME_IE;
125 pdp_qos, tag = OSMO_GSUP_PDP_QOS_IE;
126 pdp_type, tag = OSMO_GSUP_PDP_TYPE_IE;
127 charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE;
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700128 session_state, tag = OSMO_GSUP_SESSION_STATE_IE;
129 session_id, tag = OSMO_GSUP_SESSION_ID_IE;
130 ss_info, tag = OSMO_GSUP_SS_INFO_IE;
Harald Welteeded9ad2018-02-17 20:57:34 +0100131 )"
Harald Weltedf327232017-12-28 22:51:51 +0100132};
133
134type record of GSUP_IE GSUP_IEs;
135
136type union GSUP_IeValue {
137 hexstring imsi,
138 integer cause,
139 GSUP_CancelType cancel_type,
140 //boolean pdp_info_compl,
141 //boolean freeze_ptmsi,
Harald Weltedf327232017-12-28 22:51:51 +0100142 GSUP_IEs auth_tuple,
143 octetstring auts,
144 octetstring rand,
Harald Welte77a8eba2018-01-22 21:22:32 +0100145 octetstring sres,
146 octetstring kc,
147 octetstring ik,
148 octetstring ck,
149 octetstring autn,
150 octetstring res,
Harald Welte3f95be82018-01-27 00:48:13 +0100151 GSUP_MSISDN msisdn,
Harald Weltedf327232017-12-28 22:51:51 +0100152 octetstring hlr_number,
153 GSUP_CnDomain cn_domain,
Harald Welteeded9ad2018-02-17 20:57:34 +0100154 /* PDP context + nested IEs */
155 GSUP_IEs pdp_info,
156 octetstring apn,
157 octetstring pdp_qos,
158 OCT2 pdp_type,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700159 octetstring charg_char,
160 /* Session information */
161 GSUP_SessionState session_state,
162 OCT4 session_id,
163 /* Supplementary Services */
164 octetstring ss_info
Harald Weltedf327232017-12-28 22:51:51 +0100165};
166
167type record GSUP_PDU {
168 GSUP_MessageType msg_type,
169 GSUP_IEs ies
170};
171
172external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
173 with { extension "prototype(convert) encode(RAW)" };
174
175external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
176 with { extension "prototype(convert) decode(RAW)" };
177
Harald Welte2f562b12018-01-24 20:52:38 +0100178function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
179 if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
180 /* if last digit is 'F', then there's an odd number of digits and we must strip the F */
181 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
182 if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
183 gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
184 }
185 }
186}
187
188function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
189 if (ischosen(gsup.ies[0].val.imsi)) {
190 /* if number of digits is odd, add a 'F' as padding at the end */
191 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
192 if (num_digits rem 2 == 1) {
193 gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
194 }
195 }
196}
197
Harald Welte3f95be82018-01-27 00:48:13 +0100198template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
199 BIT3 ton := '000'B,
200 BIT4 npi := '0000'B) := {
201 len := 0, /* overwritten */
202 /* numberingPlanIdentification := npi,
203 typeOfNumber := ton,
204 ext1 := '0'B, */
205 digits := digits
206}
207
208template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
209 template BIT3 ton := ?,
210 template BIT4 npi := ?) := {
211 len := ?,
212 /* numberingPlanIdentification := npi,
213 typeOfNumber := ton,
214 ext1 := '0'B, */
215 digits := digits
216}
217
218
Harald Weltedf327232017-12-28 22:51:51 +0100219
Harald Welte77a8eba2018-01-22 21:22:32 +0100220template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
221 octetstring kc) := {
222 tag := OSMO_GSUP_AUTH_TUPLE_IE,
223 len := 0, /* overwritten */
224 val := {
225 auth_tuple := {
226 valueof(ts_GSUP_IE_RAND(rand)),
227 valueof(ts_GSUP_IE_SRES(sres)),
228 valueof(ts_GSUP_IE_Kc(kc))
229 }
230 }
231}
232
233template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
234 octetstring kc, octetstring ik,
235 octetstring ck, octetstring autn,
236 octetstring res) := {
237 tag := OSMO_GSUP_AUTH_TUPLE_IE,
238 len := 0, /* overwritten */
239 val := {
240 auth_tuple := {
241 valueof(ts_GSUP_IE_RAND(rand)),
242 valueof(ts_GSUP_IE_SRES(sres)),
243 valueof(ts_GSUP_IE_Kc(kc)),
244 valueof(ts_GSUP_IE_IK(ik)),
245 valueof(ts_GSUP_IE_CK(ck)),
246 valueof(ts_GSUP_IE_AUTN(autn)),
247 valueof(ts_GSUP_IE_RES(res))
248 }
249 }
250}
251
Harald Welteeded9ad2018-02-17 20:57:34 +0100252template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
253 tag := OSMO_GSUP_PDP_INFO_IE,
254 len := 0, /* overwritten */
255 val := {
256 pdp_info := {
257 valueof(ts_GSUP_IE_APN(apn)),
258 valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
259 valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
260 }
261 }
262}
263
264template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
265 tag := OSMO_GSUP_PDP_TYPE_IE,
266 len := 0,
267 val := {
268 pdp_type := pdp_type
269 }
270}
271
272template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
273 tag := OSMO_GSUP_PDP_QOS_IE,
274 len := 0,
275 val := {
276 pdp_qos := pdp_qos
277 }
278}
279
280
Harald Weltedf327232017-12-28 22:51:51 +0100281template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
282 msg_type := msgt,
283 ies := ies
284}
285
Harald Welte8a1dd532018-01-27 15:38:18 +0100286template GSUP_PDU tr_GSUP_IMSI(template GSUP_MessageType msgt := ?, template hexstring imsi) := {
287 msg_type := msgt,
288 ies := { tr_GSUP_IE_IMSI(imsi), * }
289}
290
Harald Weltedf327232017-12-28 22:51:51 +0100291template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
292 msg_type := msgt,
293 ies := ies
294}
295
Harald Welte6aa04e32018-01-27 15:35:19 +0100296template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
Harald Weltedf327232017-12-28 22:51:51 +0100297 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
298
Harald Welteef9fa872018-01-22 03:00:17 +0100299template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100300 tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
Harald Welteef9fa872018-01-22 03:00:17 +0100301
Harald Welte77a8eba2018-01-22 21:22:32 +0100302template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
303 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
304 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
305
Harald Weltedf327232017-12-28 22:51:51 +0100306template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
Harald Welte071ed732018-01-23 19:53:52 +0100307 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
Harald Weltedf327232017-12-28 22:51:51 +0100308 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
309
Harald Welte6aa04e32018-01-27 15:35:19 +0100310template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
311 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
312 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
Harald Welte071ed732018-01-23 19:53:52 +0100313
314
Harald Weltedf327232017-12-28 22:51:51 +0100315template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
Harald Weltec2c52552018-03-01 21:20:39 +0100316 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
Harald Weltedf327232017-12-28 22:51:51 +0100317 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
318
Harald Weltec2c52552018-03-01 21:20:39 +0100319template (value) GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi) :=
320 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
321 valueof(ts_GSUP_IE_IMSI(imsi)) });
322
Harald Weltedfe94dd2018-01-21 13:55:22 +0100323template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100324 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
Harald Weltedfe94dd2018-01-21 13:55:22 +0100325
Harald Welte6aa04e32018-01-27 15:35:19 +0100326template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
Harald Weltedfe94dd2018-01-21 13:55:22 +0100327 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
328
Harald Weltec2c52552018-03-01 21:20:39 +0100329template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=
330 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);
331
Harald Welte6aa04e32018-01-27 15:35:19 +0100332template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100333 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
334 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
335
Harald Weltec2c52552018-03-01 21:20:39 +0100336template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?) :=
337 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
338 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
339
Harald Welte6aa04e32018-01-27 15:35:19 +0100340template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100341 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
342 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
343
Harald Weltec2c52552018-03-01 21:20:39 +0100344template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?) :=
345 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
Harald Welte8f6ac162018-03-01 22:43:28 +0100346 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * });
Harald Weltec2c52552018-03-01 21:20:39 +0100347
348template (value) GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi) :=
349 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
350 valueof(ts_GSUP_IE_IMSI(imsi)) });
351
Harald Welte6ff81902018-01-21 19:09:08 +0100352template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100353 tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100354
Harald Weltec638f4d2018-01-24 22:00:36 +0100355template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100356 tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100357
Harald Welte167458a2018-01-27 15:58:16 +0100358template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
359 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
360 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
361
362template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
363 tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
364
365template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
366 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
Alexander Couzens4cfff3a2018-05-22 17:08:36 +0200367 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
Harald Welte167458a2018-01-27 15:58:16 +0100368
Harald Welte958f8b42018-03-01 23:40:17 +0100369template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
370 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
371 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
372
Harald Welte6abb9fe2018-02-17 15:24:48 +0100373template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
374 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
375 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
376
377template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
378 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
379 valueof(ts_GSUP_IE_IMSI(imsi)) });
380
Harald Welte958f8b42018-03-01 23:40:17 +0100381template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
382 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
383 tr_GSUP_IE_IMSI(imsi), * });
384
385template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
386 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
387 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
388
Harald Welte167458a2018-01-27 15:58:16 +0100389
390template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
391 tag := OSMO_GSUP_CANCEL_TYPE_IE,
392 len := 0, /* overwritten */
393 val := {
394 cancel_type := ctype
395 }
396}
397
398template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
399 tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
400
Harald Welte6abb9fe2018-02-17 15:24:48 +0100401template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
402 tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
403
Harald Weltedf327232017-12-28 22:51:51 +0100404template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
405 tag := iei,
406 len := ?,
407 val := val
408}
409
410template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
411 tag := OSMO_GSUP_IMSI_IE,
412 len := 0, /* overwritten */
413 val := {
414 imsi := imsi
415 }
416}
417
418template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
419 tag := OSMO_GSUP_IMSI_IE,
420 len := ?,
421 val := {
422 imsi := imsi
423 }
424}
425
Harald Welte6ff81902018-01-21 19:09:08 +0100426template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
427 tag := OSMO_GSUP_MSISDN_IE,
428 len := 0, /* overwritten */
429 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100430 msisdn := ts_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100431 }
432}
433
434template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
435 tag := OSMO_GSUP_MSISDN_IE,
436 len := ?,
437 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100438 msisdn := tr_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100439 }
440}
441
442
Harald Weltedf327232017-12-28 22:51:51 +0100443template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
444 tag := OSMO_GSUP_CAUSE_IE,
445 len := 0, /* overwritten */
446 val := {
447 cause := cause
448 }
449}
450
451template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
452 tag := OSMO_GSUP_CAUSE_IE,
453 len := ?,
454 val := {
455 cause := cause
456 }
457}
458
459template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
460 tag := OSMO_GSUP_AUTS_IE,
461 len := 0, /* overwritten */
462 val := {
463 auts := auts
464 }
465}
466
467template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
468 tag := OSMO_GSUP_RAND_IE,
469 len := 0, /* overwritten */
470 val := {
471 rand := rand
472 }
473}
474
Harald Welte77a8eba2018-01-22 21:22:32 +0100475template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
476 tag := OSMO_GSUP_SRES_IE,
477 len := 0, /* overwritten */
478 val := {
479 sres := sres
480 }
481}
482
483template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
484 tag := OSMO_GSUP_KC_IE,
485 len := 0, /* overwritten */
486 val := {
487 kc := kc
488 }
489}
490
491template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
492 tag := OSMO_GSUP_IK_IE,
493 len := 0, /* overwritten */
494 val := {
495 ik := ik
496 }
497}
498
499template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
500 tag := OSMO_GSUP_CK_IE,
501 len := 0, /* overwritten */
502 val := {
503 ck := ck
504 }
505}
506
507template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
508 tag := OSMO_GSUP_AUTN_IE,
509 len := 0, /* overwritten */
510 val := {
511 autn := autn
512 }
513}
514
515template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
516 tag := OSMO_GSUP_RES_IE,
517 len := 0, /* overwritten */
518 val := {
519 res := res
520 }
521}
Harald Weltedf327232017-12-28 22:51:51 +0100522
Harald Welteeded9ad2018-02-17 20:57:34 +0100523template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
524 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
525 len := 0, /* overwritten */
526 val := {
527 apn := apn
528 }
529}
530
Harald Welte958f8b42018-03-01 23:40:17 +0100531template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := {
532 tag := OSMO_GSUP_CN_DOMAIN_IE,
533 len := 0, /* overwritten */
534 val := {
535 cn_domain := dom
536 }
537}
Harald Weltedf327232017-12-28 22:51:51 +0100538
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700539template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
540 tag := OSMO_GSUP_SESSION_ID_IE,
541 len := 0, /* overwritten */
542 val := {
543 session_id := sid
544 }
545}
546template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
547 tag := OSMO_GSUP_SESSION_ID_IE,
548 len := ?,
549 val := {
550 session_id := sid
551 }
552}
553
554template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
555 tag := OSMO_GSUP_SESSION_STATE_IE,
556 len := 0, /* overwritten */
557 val := {
558 session_state := state
559 }
560}
561template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
562 tag := OSMO_GSUP_SESSION_STATE_IE,
563 len := ?,
564 val := {
565 session_state := state
566 }
567}
568
569template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
570 tag := OSMO_GSUP_SS_INFO_IE,
571 len := 0, /* overwritten */
572 val := {
573 ss_info := ss
574 }
575}
576template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
577 tag := OSMO_GSUP_SS_INFO_IE,
578 len := ?,
579 val := {
580 ss_info := ss
581 }
582}
583
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700584private function f_gen_ts_ss_ies(
585 hexstring imsi,
586 OCT4 sid,
587 GSUP_SessionState state,
588 template (omit) octetstring ss
589) return GSUP_IEs {
590 /* Mandatory IEs */
591 var GSUP_IEs ies := {
592 valueof(ts_GSUP_IE_IMSI(imsi)),
593 valueof(ts_GSUP_IE_SessionId(sid)),
594 valueof(ts_GSUP_IE_SessionState(state))
595 };
596
597 /* Optional SS payload */
598 if (isvalue(ss)) {
599 ies[3] := valueof(ts_GSUP_IE_SSInfo(valueof(ss)));
600 }
601
602 return ies;
603}
604private function f_gen_tr_ss_ies(
605 template hexstring imsi,
606 template OCT4 sid := ?,
607 template GSUP_SessionState state := ?,
608 template octetstring ss := ?
609) return template GSUP_IEs {
610 /* Mandatory IEs */
611 var template GSUP_IEs ies := {
612 tr_GSUP_IE_IMSI(imsi),
613 tr_GSUP_IE_SessionId(sid),
614 tr_GSUP_IE_SessionState(state)
615 };
616
617 /* Optional SS payload */
618 if (istemplatekind(ss, "*")) {
619 ies[3] := *;
620 } else if (not istemplatekind(ss, "omit")) {
621 ies[3] := tr_GSUP_IE_SSInfo(ss);
622 }
623
624 return ies;
625}
626
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700627template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
628 hexstring imsi,
629 OCT4 sid,
630 GSUP_SessionState state,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700631 template (omit) octetstring ss := omit
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700632) := ts_GSUP(
633 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700634 f_gen_ts_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700635);
636template GSUP_PDU tr_GSUP_PROC_SS_REQ(
637 template hexstring imsi,
638 template OCT4 sid := ?,
639 template GSUP_SessionState state := ?,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700640 template octetstring ss := *
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700641) := tr_GSUP(
642 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700643 f_gen_tr_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700644);
645
646template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
647 hexstring imsi,
648 OCT4 sid,
649 GSUP_SessionState state,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700650 template (omit) octetstring ss := omit
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700651) := ts_GSUP(
652 OSMO_GSUP_MSGT_PROC_SS_RESULT,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700653 f_gen_ts_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700654);
655template GSUP_PDU tr_GSUP_PROC_SS_RES(
656 template hexstring imsi,
657 template OCT4 sid := ?,
658 template GSUP_SessionState state := ?,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700659 template octetstring ss := *
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700660) := tr_GSUP(
661 OSMO_GSUP_MSGT_PROC_SS_RESULT,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +0700662 f_gen_tr_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700663);
664
665template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
666 hexstring imsi,
667 OCT4 sid,
668 integer cause
669) := ts_GSUP(
670 OSMO_GSUP_MSGT_PROC_SS_ERROR,
671 {
672 valueof(ts_GSUP_IE_IMSI(imsi)),
673 valueof(ts_GSUP_IE_SessionId(sid)),
674 valueof(ts_GSUP_IE_Cause(cause))
675 }
676);
677template GSUP_PDU tr_GSUP_PROC_SS_ERR(
678 template hexstring imsi,
679 template OCT4 sid := ?,
680 template integer cause := ?
681) := tr_GSUP(
682 OSMO_GSUP_MSGT_PROC_SS_ERROR,
683 {
684 tr_GSUP_IE_IMSI(imsi),
685 tr_GSUP_IE_SessionId(sid),
686 tr_GSUP_IE_Cause(cause)
687 }
688);
Harald Weltedf327232017-12-28 22:51:51 +0100689
Harald Weltef9d449e2018-06-24 22:27:47 +0200690function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
691 for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {
692 if (msg.ies[i].tag == iei) {
693 ret := msg.ies[i].val;
694 return true;
695 }
696 }
697 return false;
698}
699
700
Harald Weltedf327232017-12-28 22:51:51 +0100701} with { encode "RAW"; variant "FIELDORDER(msb)" }