blob: 10cf1b8e60a604c23e2430c253d20e282e1e1fbd [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 *
Harald Welte34b5a952019-05-27 11:54:11 +02008 * (C) 2017-2019 by Harald Welte <laforge@gnumonks.org>
9 * contributions by sysmocom - s.f.m.c. GmbH
Harald Welte35bb7162018-01-03 21:07:52 +010010 * All rights reserved.
11 *
12 * Released under the terms of GNU General Public License, Version 2 or
13 * (at your option) any later version.
Harald Welte34b5a952019-05-27 11:54:11 +020014 *
15 * SPDX-License-Identifier: GPL-2.0-or-later
Harald Welte35bb7162018-01-03 21:07:52 +010016 */
17
Harald Weltedf327232017-12-28 22:51:51 +010018import from General_Types all;
19import from Osmocom_Types all;
20
21type enumerated GSUP_IEI {
22 OSMO_GSUP_IMSI_IE ('01'O),
23 OSMO_GSUP_CAUSE_IE ('02'O),
24 OSMO_GSUP_AUTH_TUPLE_IE ('03'O),
25 OSMO_GSUP_PDP_INFO_COMPL_IE ('04'O),
26 OSMO_GSUP_PDP_INFO_IE ('05'O),
27 OSMO_GSUP_CANCEL_TYPE_IE ('06'O),
28 OSMO_GSUP_FREEZE_PTMSI_IE ('07'O),
29 OSMO_GSUP_MSISDN_IE ('08'O),
30 OSMO_GSUP_HLR_NUMBER_IE ('09'O),
31 OSMO_GSUP_PDP_CONTEXT_ID_IE ('10'O),
32 OSMO_GSUP_PDP_TYPE_IE ('11'O),
33 OSMO_GSUP_ACCESS_POINT_NAME_IE ('12'O),
34 OSMO_GSUP_PDP_QOS_IE ('13'O),
35 OSMO_GSUP_CHARG_CHAR_IE ('14'O),
36
37 OSMO_GSUP_RAND_IE ('20'O),
38 OSMO_GSUP_SRES_IE ('21'O),
39 OSMO_GSUP_KC_IE ('22'O),
40 OSMO_GSUP_IK_IE ('23'O),
41 OSMO_GSUP_CK_IE ('24'O),
42 OSMO_GSUP_AUTN_IE ('25'O),
43 OSMO_GSUP_AUTS_IE ('26'O),
44 OSMO_GSUP_RES_IE ('27'O),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +070045 OSMO_GSUP_CN_DOMAIN_IE ('28'O),
46
47 OSMO_GSUP_SESSION_ID_IE ('30'O),
48 OSMO_GSUP_SESSION_STATE_IE ('31'O),
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +070049 OSMO_GSUP_SS_INFO_IE ('35'O),
50
51 /* SM related IEs (see 3GPP TS 29.002, section 7.6.8) */
52 OSMO_GSUP_SM_RP_MR_IE ('40'O),
53 OSMO_GSUP_SM_RP_DA_IE ('41'O),
54 OSMO_GSUP_SM_RP_OA_IE ('42'O),
55 OSMO_GSUP_SM_RP_UI_IE ('43'O),
56 OSMO_GSUP_SM_RP_CAUSE_IE ('44'O),
Vadim Yanitskiy88e23232018-11-13 03:04:02 +070057 OSMO_GSUP_SM_RP_MMS_IE ('45'O),
Oliver Smithc5748292019-02-22 15:02:48 +010058 OSMO_GSUP_SM_ALERT_RSN_IE ('46'O),
59
60 OSMO_GSUP_IMEI_IE ('50'O),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +020061 OSMO_GSUP_IMEI_RESULT_IE ('51'O),
62
63 OSMO_GSUP_MESSAGE_CLASS_IE ('0a'O),
64
65 OSMO_GSUP_SOURCE_NAME_IE ('60'O),
66 OSMO_GSUP_DESTINATION_NAME_IE ('61'O),
67 OSMO_GSUP_AN_APDU_IE ('62'O),
68 OSMO_GSUP_CAUSE_RR_IE ('63'O),
69 OSMO_GSUP_CAUSE_BSSAP_IE ('64'O),
70 OSMO_GSUP_CAUSE_SM_IE ('65'O)
Harald Weltedf327232017-12-28 22:51:51 +010071} with { variant "FIELDLENGTH(8)" };
72
73type enumerated GSUP_MessageType {
74 OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST ('00000100'B),
75 OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR ('00000101'B),
76 OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT ('00000110'B),
77
78 OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST ('00001000'B),
79 OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR ('00001001'B),
80 OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT ('00001010'B),
81
82 OSMO_GSUP_MSGT_AUTH_FAIL_REPORT ('00001011'B),
83
84 OSMO_GSUP_MSGT_PURGE_MS_REQUEST ('00001100'B),
85 OSMO_GSUP_MSGT_PURGE_MS_ERROR ('00001101'B),
86 OSMO_GSUP_MSGT_PURGE_MS_RESULT ('00001110'B),
87
88 OSMO_GSUP_MSGT_INSERT_DATA_REQUEST ('00010000'B),
89 OSMO_GSUP_MSGT_INSERT_DATA_ERROR ('00010001'B),
90 OSMO_GSUP_MSGT_INSERT_DATA_RESULT ('00010010'B),
91
92 OSMO_GSUP_MSGT_DELETE_DATA_REQUEST ('00010100'B),
93 OSMO_GSUP_MSGT_DELETE_DATA_ERROR ('00010101'B),
94 OSMO_GSUP_MSGT_DELETE_DATA_RESULT ('00010110'B),
95
96 OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST ('00011100'B),
97 OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR ('00011101'B),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +070098 OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT ('00011110'B),
99
100 OSMO_GSUP_MSGT_PROC_SS_REQUEST ('00100000'B),
101 OSMO_GSUP_MSGT_PROC_SS_ERROR ('00100001'B),
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700102 OSMO_GSUP_MSGT_PROC_SS_RESULT ('00100010'B),
103
104 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST ('00100100'B),
105 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR ('00100101'B),
106 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT ('00100110'B),
107
108 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST ('00101000'B),
109 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR ('00101001'B),
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700110 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT ('00101010'B),
111
112 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST ('00101100'B),
113 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR ('00101101'B),
Oliver Smithc5748292019-02-22 15:02:48 +0100114 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT ('00101110'B),
115
116 OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST ('00110000'B),
117 OSMO_GSUP_MSGT_CHECK_IMEI_ERROR ('00110001'B),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200118 OSMO_GSUP_MSGT_CHECK_IMEI_RESULT ('00110010'B),
119
120 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST ('00110100'B),
121 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR ('00110101'B),
122 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT ('00110110'B),
123
124 OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST ('00111000'B),
125 OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR ('00111001'B),
126 OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT ('00111010'B),
127
128 OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST ('00111100'B),
129 OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR ('00111101'B),
130 OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT ('00111110'B),
131
132 OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST ('01000000'B),
133 OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST ('01000100'B),
134
135 OSMO_GSUP_MSGT_E_CLOSE ('01000111'B),
136 OSMO_GSUP_MSGT_E_ABORT ('01001011'B),
137
138 OSMO_GSUP_MSGT_E_ROUTING_ERROR ('01001110'B)
Harald Weltedf327232017-12-28 22:51:51 +0100139} with { variant "FIELDLENGTH(8)" };
140
141type enumerated GSUP_CancelType {
Alexander Couzens4786b3f2018-09-16 03:33:30 +0200142 OSMO_GSUP_CANCEL_TYPE_UPDATE (0),
143 OSMO_GSUP_CANCEL_TYPE_WITHDRAW (1)
Harald Weltedf327232017-12-28 22:51:51 +0100144} with { variant "FIELDLENGTH(8)" };
145
146type enumerated GSUP_CnDomain {
147 OSMO_GSUP_CN_DOMAIN_PS (1),
148 OSMO_GSUP_CN_DOMAIN_CS (2)
149} with { variant "FIELDLENGTH(8)" };
150
Oliver Smithc5748292019-02-22 15:02:48 +0100151type enumerated GSUP_IMEIResult {
152 OSMO_GSUP_IMEI_RESULT_ACK (0),
153 OSMO_GSUP_IMEI_RESULT_NACK (1)
154} with { variant "FIELDLENGTH(8)" };
155
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700156type enumerated GSUP_SessionState {
157 OSMO_GSUP_SESSION_STATE_NONE (0),
158 OSMO_GSUP_SESSION_STATE_BEGIN (1),
159 OSMO_GSUP_SESSION_STATE_CONTINUE (2),
160 OSMO_GSUP_SESSION_STATE_END (3)
161} with { variant "FIELDLENGTH(8)" };
162
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200163type enumerated GSUP_Message_Class {
164 OSMO_GSUP_MESSAGE_CLASS_UNSET (0),
165 OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT (1),
166 OSMO_GSUP_MESSAGE_CLASS_SMS (2),
167 OSMO_GSUP_MESSAGE_CLASS_USSD (3),
168 OSMO_GSUP_MESSAGE_CLASS_INTER_MSC (4)
169} with { variant "FIELDLENGTH(8)" };
170
Harald Welte3f95be82018-01-27 00:48:13 +0100171type record GSUP_MSISDN {
172 uint8_t len,
173 hexstring digits optional
174} with { variant (len) "LENGTHTO(digits)" };
175
Oliver Smithc5748292019-02-22 15:02:48 +0100176type record GSUP_IMEI {
177 uint8_t len,
178 hexstring digits optional
179} with { variant (len) "LENGTHTO(digits)" };
180
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200181type enumerated GSUP_AN_PROTO {
182 OSMO_GSUP_AN_PROTO_48006 (1),
183 OSMO_GSUP_AN_PROTO_25413 (2)
184} with { variant "FIELDLENGTH(8)" };
185
186type record GSUP_AN_APDU {
187 GSUP_AN_PROTO proto,
188 octetstring pdu
189};
190
Harald Weltedf327232017-12-28 22:51:51 +0100191type record GSUP_IE {
192 GSUP_IEI tag,
193 uint8_t len,
194 GSUP_IeValue val
195} with { variant (len) "LENGTHTO(val)"
196 variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
197 cause, tag = OSMO_GSUP_CAUSE_IE;
198 cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +0100199 auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100200 auts, tag = OSMO_GSUP_AUTS_IE;
201 rand, tag = OSMO_GSUP_RAND_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +0100202 sres, tag = OSMO_GSUP_SRES_IE;
203 kc, tag = OSMO_GSUP_KC_IE;
204 ik, tag = OSMO_GSUP_IK_IE;
205 ck, tag = OSMO_GSUP_CK_IE;
206 autn, tag = OSMO_GSUP_AUTN_IE;
207 res, tag = OSMO_GSUP_RES_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100208 msisdn, tag = OSMO_GSUP_MSISDN_IE;
209 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
210 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
Harald Welteeded9ad2018-02-17 20:57:34 +0100211 pdp_info, tag = OSMO_GSUP_PDP_INFO_IE;
212 apn, tag = OSMO_GSUP_ACCESS_POINT_NAME_IE;
213 pdp_qos, tag = OSMO_GSUP_PDP_QOS_IE;
214 pdp_type, tag = OSMO_GSUP_PDP_TYPE_IE;
215 charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE;
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700216 session_state, tag = OSMO_GSUP_SESSION_STATE_IE;
217 session_id, tag = OSMO_GSUP_SESSION_ID_IE;
218 ss_info, tag = OSMO_GSUP_SS_INFO_IE;
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700219 sm_rp_mr, tag = OSMO_GSUP_SM_RP_MR_IE;
220 sm_rp_da, tag = OSMO_GSUP_SM_RP_DA_IE;
221 sm_rp_oa, tag = OSMO_GSUP_SM_RP_OA_IE;
222 sm_rp_ui, tag = OSMO_GSUP_SM_RP_UI_IE;
223 sm_rp_cause, tag = OSMO_GSUP_SM_RP_CAUSE_IE;
224 sm_rp_mms, tag = OSMO_GSUP_SM_RP_MMS_IE;
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700225 sm_alert_rsn, tag = OSMO_GSUP_SM_ALERT_RSN_IE;
Oliver Smithc5748292019-02-22 15:02:48 +0100226 imei, tag = OSMO_GSUP_IMEI_IE;
227 imei_result, tag = OSMO_GSUP_IMEI_RESULT_IE;
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200228 message_class, tag = OSMO_GSUP_MESSAGE_CLASS_IE;
229 source_name, tag = OSMO_GSUP_SOURCE_NAME_IE;
230 destination_name, tag = OSMO_GSUP_DESTINATION_NAME_IE;
231 an_apdu, tag = OSMO_GSUP_AN_APDU_IE;
232 cause_rr, tag = OSMO_GSUP_CAUSE_RR_IE;
233 cause_bssap, tag = OSMO_GSUP_CAUSE_BSSAP_IE;
234 cause_sm, tag = OSMO_GSUP_CAUSE_SM_IE;
Harald Welteeded9ad2018-02-17 20:57:34 +0100235 )"
Harald Weltedf327232017-12-28 22:51:51 +0100236};
237
238type record of GSUP_IE GSUP_IEs;
239
240type union GSUP_IeValue {
241 hexstring imsi,
242 integer cause,
243 GSUP_CancelType cancel_type,
244 //boolean pdp_info_compl,
245 //boolean freeze_ptmsi,
Harald Weltedf327232017-12-28 22:51:51 +0100246 GSUP_IEs auth_tuple,
247 octetstring auts,
248 octetstring rand,
Harald Welte77a8eba2018-01-22 21:22:32 +0100249 octetstring sres,
250 octetstring kc,
251 octetstring ik,
252 octetstring ck,
253 octetstring autn,
254 octetstring res,
Harald Welte3f95be82018-01-27 00:48:13 +0100255 GSUP_MSISDN msisdn,
Harald Weltedf327232017-12-28 22:51:51 +0100256 octetstring hlr_number,
257 GSUP_CnDomain cn_domain,
Harald Welteeded9ad2018-02-17 20:57:34 +0100258 /* PDP context + nested IEs */
259 GSUP_IEs pdp_info,
260 octetstring apn,
261 octetstring pdp_qos,
262 OCT2 pdp_type,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700263 octetstring charg_char,
264 /* Session information */
265 GSUP_SessionState session_state,
266 OCT4 session_id,
267 /* Supplementary Services */
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700268 octetstring ss_info,
269 /* Short Message Service */
270 OCT1 sm_rp_mr,
271 GSUP_SM_RP_DA sm_rp_da,
272 GSUP_SM_RP_OA sm_rp_oa,
273 octetstring sm_rp_ui,
274 OCT1 sm_rp_cause,
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700275 OCT1 sm_rp_mms,
Oliver Smithc5748292019-02-22 15:02:48 +0100276 GSUP_SM_ALERT_RSN_Type sm_alert_rsn,
277
278 GSUP_IMEI imei,
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200279 GSUP_IMEIResult imei_result,
280
281 GSUP_Message_Class message_class,
282
283 octetstring source_name,
284 octetstring destination_name,
285
286 GSUP_AN_APDU an_apdu,
287
288 OCT1 cause_rr,
289 OCT1 cause_bssap,
290 OCT1 cause_sm
Harald Weltedf327232017-12-28 22:51:51 +0100291};
292
293type record GSUP_PDU {
294 GSUP_MessageType msg_type,
295 GSUP_IEs ies
296};
297
298external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
299 with { extension "prototype(convert) encode(RAW)" };
300
301external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
302 with { extension "prototype(convert) decode(RAW)" };
303
Harald Welte2f562b12018-01-24 20:52:38 +0100304function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
305 if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
306 /* if last digit is 'F', then there's an odd number of digits and we must strip the F */
307 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
308 if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
309 gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
310 }
311 }
312}
313
314function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
315 if (ischosen(gsup.ies[0].val.imsi)) {
316 /* if number of digits is odd, add a 'F' as padding at the end */
317 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
318 if (num_digits rem 2 == 1) {
319 gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
320 }
321 }
322}
323
Harald Welte3f95be82018-01-27 00:48:13 +0100324template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
325 BIT3 ton := '000'B,
326 BIT4 npi := '0000'B) := {
327 len := 0, /* overwritten */
328 /* numberingPlanIdentification := npi,
329 typeOfNumber := ton,
330 ext1 := '0'B, */
331 digits := digits
332}
333
334template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
335 template BIT3 ton := ?,
336 template BIT4 npi := ?) := {
337 len := ?,
338 /* numberingPlanIdentification := npi,
339 typeOfNumber := ton,
340 ext1 := '0'B, */
341 digits := digits
342}
343
344
Harald Weltedf327232017-12-28 22:51:51 +0100345
Harald Welte77a8eba2018-01-22 21:22:32 +0100346template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
347 octetstring kc) := {
348 tag := OSMO_GSUP_AUTH_TUPLE_IE,
349 len := 0, /* overwritten */
350 val := {
351 auth_tuple := {
352 valueof(ts_GSUP_IE_RAND(rand)),
353 valueof(ts_GSUP_IE_SRES(sres)),
354 valueof(ts_GSUP_IE_Kc(kc))
355 }
356 }
357}
358
359template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
360 octetstring kc, octetstring ik,
361 octetstring ck, octetstring autn,
362 octetstring res) := {
363 tag := OSMO_GSUP_AUTH_TUPLE_IE,
364 len := 0, /* overwritten */
365 val := {
366 auth_tuple := {
367 valueof(ts_GSUP_IE_RAND(rand)),
368 valueof(ts_GSUP_IE_SRES(sres)),
369 valueof(ts_GSUP_IE_Kc(kc)),
370 valueof(ts_GSUP_IE_IK(ik)),
371 valueof(ts_GSUP_IE_CK(ck)),
372 valueof(ts_GSUP_IE_AUTN(autn)),
373 valueof(ts_GSUP_IE_RES(res))
374 }
375 }
376}
377
Harald Welteeded9ad2018-02-17 20:57:34 +0100378template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
379 tag := OSMO_GSUP_PDP_INFO_IE,
380 len := 0, /* overwritten */
381 val := {
382 pdp_info := {
383 valueof(ts_GSUP_IE_APN(apn)),
384 valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
385 valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
386 }
387 }
388}
389
390template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
391 tag := OSMO_GSUP_PDP_TYPE_IE,
392 len := 0,
393 val := {
394 pdp_type := pdp_type
395 }
396}
397
398template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
399 tag := OSMO_GSUP_PDP_QOS_IE,
400 len := 0,
401 val := {
402 pdp_qos := pdp_qos
403 }
404}
405
406
Harald Weltedf327232017-12-28 22:51:51 +0100407template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
408 msg_type := msgt,
409 ies := ies
410}
411
Harald Welte8a1dd532018-01-27 15:38:18 +0100412template GSUP_PDU tr_GSUP_IMSI(template GSUP_MessageType msgt := ?, template hexstring imsi) := {
413 msg_type := msgt,
414 ies := { tr_GSUP_IE_IMSI(imsi), * }
415}
416
Harald Weltedf327232017-12-28 22:51:51 +0100417template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
418 msg_type := msgt,
419 ies := ies
420}
421
Harald Welte6aa04e32018-01-27 15:35:19 +0100422template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
Harald Weltedf327232017-12-28 22:51:51 +0100423 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
424
Harald Welteef9fa872018-01-22 03:00:17 +0100425template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100426 tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
Harald Welteef9fa872018-01-22 03:00:17 +0100427
Alexander Couzensd24973d2018-09-04 16:10:14 +0200428template GSUP_PDU tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
429 template hexstring imsi,
430 template octetstring auts,
431 template octetstring rand) :=
432 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
433 tr_GSUP_IE_IMSI(imsi),
434 tr_GSUP_IE_AUTS(auts),
435 tr_GSUP_IE_RAND(rand),
436 *
437 });
438
Harald Welte77a8eba2018-01-22 21:22:32 +0100439template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
440 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
441 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
442
Harald Weltedf327232017-12-28 22:51:51 +0100443template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
Harald Welte071ed732018-01-23 19:53:52 +0100444 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
Harald Weltedf327232017-12-28 22:51:51 +0100445 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
446
Harald Welte6aa04e32018-01-27 15:35:19 +0100447template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
448 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
449 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
Harald Welte071ed732018-01-23 19:53:52 +0100450
451
Harald Weltedf327232017-12-28 22:51:51 +0100452template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
Harald Weltec2c52552018-03-01 21:20:39 +0100453 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
Harald Weltedf327232017-12-28 22:51:51 +0100454 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
455
Harald Weltec2c52552018-03-01 21:20:39 +0100456template (value) GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi) :=
457 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
458 valueof(ts_GSUP_IE_IMSI(imsi)) });
459
Harald Weltedfe94dd2018-01-21 13:55:22 +0100460template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100461 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
Harald Weltedfe94dd2018-01-21 13:55:22 +0100462
Harald Welte6aa04e32018-01-27 15:35:19 +0100463template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
Harald Weltedfe94dd2018-01-21 13:55:22 +0100464 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
465
Harald Weltec2c52552018-03-01 21:20:39 +0100466template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=
467 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);
468
Harald Welte6aa04e32018-01-27 15:35:19 +0100469template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100470 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
471 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
472
Harald Weltec2c52552018-03-01 21:20:39 +0100473template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?) :=
474 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
475 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
476
Harald Welte6aa04e32018-01-27 15:35:19 +0100477template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100478 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
479 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
480
Harald Weltec2c52552018-03-01 21:20:39 +0100481template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?) :=
482 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
Harald Welte8f6ac162018-03-01 22:43:28 +0100483 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * });
Harald Weltec2c52552018-03-01 21:20:39 +0100484
485template (value) GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi) :=
486 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
487 valueof(ts_GSUP_IE_IMSI(imsi)) });
488
Harald Welte6ff81902018-01-21 19:09:08 +0100489template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100490 tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100491
Harald Weltec638f4d2018-01-24 22:00:36 +0100492template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100493 tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100494
Harald Welte167458a2018-01-27 15:58:16 +0100495template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
496 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
497 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
498
499template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
500 tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
501
502template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
503 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
Alexander Couzens4cfff3a2018-05-22 17:08:36 +0200504 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
Harald Welte167458a2018-01-27 15:58:16 +0100505
Harald Welte958f8b42018-03-01 23:40:17 +0100506template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
507 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
508 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
509
Harald Welte6abb9fe2018-02-17 15:24:48 +0100510template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
511 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
512 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
513
514template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
515 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
516 valueof(ts_GSUP_IE_IMSI(imsi)) });
517
Harald Welte958f8b42018-03-01 23:40:17 +0100518template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
519 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
520 tr_GSUP_IE_IMSI(imsi), * });
521
522template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
523 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
524 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
525
Harald Welte167458a2018-01-27 15:58:16 +0100526
527template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
528 tag := OSMO_GSUP_CANCEL_TYPE_IE,
529 len := 0, /* overwritten */
530 val := {
531 cancel_type := ctype
532 }
533}
534
535template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
536 tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
537
Harald Welte6abb9fe2018-02-17 15:24:48 +0100538template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
539 tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
540
Harald Weltedf327232017-12-28 22:51:51 +0100541template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
542 tag := iei,
543 len := ?,
544 val := val
545}
546
547template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
548 tag := OSMO_GSUP_IMSI_IE,
549 len := 0, /* overwritten */
550 val := {
551 imsi := imsi
552 }
553}
554
555template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
556 tag := OSMO_GSUP_IMSI_IE,
557 len := ?,
558 val := {
559 imsi := imsi
560 }
561}
562
Harald Welte6ff81902018-01-21 19:09:08 +0100563template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
564 tag := OSMO_GSUP_MSISDN_IE,
565 len := 0, /* overwritten */
566 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100567 msisdn := ts_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100568 }
569}
570
571template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
572 tag := OSMO_GSUP_MSISDN_IE,
573 len := ?,
574 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100575 msisdn := tr_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100576 }
577}
578
579
Harald Weltedf327232017-12-28 22:51:51 +0100580template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
581 tag := OSMO_GSUP_CAUSE_IE,
582 len := 0, /* overwritten */
583 val := {
584 cause := cause
585 }
586}
587
588template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
589 tag := OSMO_GSUP_CAUSE_IE,
590 len := ?,
591 val := {
592 cause := cause
593 }
594}
595
596template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
597 tag := OSMO_GSUP_AUTS_IE,
598 len := 0, /* overwritten */
599 val := {
600 auts := auts
601 }
602}
603
Alexander Couzensd24973d2018-09-04 16:10:14 +0200604template GSUP_IE tr_GSUP_IE_AUTS(template octetstring auts) := {
605 tag := OSMO_GSUP_AUTS_IE,
606 len := ?,
607 val := {
608 auts := auts
609 }
610}
611
Harald Weltedf327232017-12-28 22:51:51 +0100612template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
613 tag := OSMO_GSUP_RAND_IE,
614 len := 0, /* overwritten */
615 val := {
616 rand := rand
617 }
618}
619
Alexander Couzensd24973d2018-09-04 16:10:14 +0200620template GSUP_IE tr_GSUP_IE_RAND(template octetstring rand) := {
621 tag := OSMO_GSUP_RAND_IE,
622 len := ?,
623 val := {
624 rand := rand
625 }
626}
627
Harald Welte77a8eba2018-01-22 21:22:32 +0100628template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
629 tag := OSMO_GSUP_SRES_IE,
630 len := 0, /* overwritten */
631 val := {
632 sres := sres
633 }
634}
635
636template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
637 tag := OSMO_GSUP_KC_IE,
638 len := 0, /* overwritten */
639 val := {
640 kc := kc
641 }
642}
643
644template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
645 tag := OSMO_GSUP_IK_IE,
646 len := 0, /* overwritten */
647 val := {
648 ik := ik
649 }
650}
651
652template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
653 tag := OSMO_GSUP_CK_IE,
654 len := 0, /* overwritten */
655 val := {
656 ck := ck
657 }
658}
659
660template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
661 tag := OSMO_GSUP_AUTN_IE,
662 len := 0, /* overwritten */
663 val := {
664 autn := autn
665 }
666}
667
668template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
669 tag := OSMO_GSUP_RES_IE,
670 len := 0, /* overwritten */
671 val := {
672 res := res
673 }
674}
Harald Weltedf327232017-12-28 22:51:51 +0100675
Harald Welteeded9ad2018-02-17 20:57:34 +0100676template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
677 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
678 len := 0, /* overwritten */
679 val := {
680 apn := apn
681 }
682}
683
Harald Welte958f8b42018-03-01 23:40:17 +0100684template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := {
685 tag := OSMO_GSUP_CN_DOMAIN_IE,
686 len := 0, /* overwritten */
687 val := {
688 cn_domain := dom
689 }
690}
Harald Weltedf327232017-12-28 22:51:51 +0100691
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700692template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
693 tag := OSMO_GSUP_SESSION_ID_IE,
694 len := 0, /* overwritten */
695 val := {
696 session_id := sid
697 }
698}
699template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
700 tag := OSMO_GSUP_SESSION_ID_IE,
701 len := ?,
702 val := {
703 session_id := sid
704 }
705}
706
707template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
708 tag := OSMO_GSUP_SESSION_STATE_IE,
709 len := 0, /* overwritten */
710 val := {
711 session_state := state
712 }
713}
714template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
715 tag := OSMO_GSUP_SESSION_STATE_IE,
716 len := ?,
717 val := {
718 session_state := state
719 }
720}
721
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700722template (value) GSUP_IE ts_GSUP_IE_SM_RP_MR(OCT1 ref) := {
723 tag := OSMO_GSUP_SM_RP_MR_IE,
724 len := 0, /* overwritten */
725 val := {
726 sm_rp_mr := ref
727 }
728}
729template GSUP_IE tr_GSUP_IE_SM_RP_MR(template OCT1 ref) := {
730 tag := OSMO_GSUP_SM_RP_MR_IE,
731 len := ?,
732 val := {
733 sm_rp_mr := ref
734 }
735}
736
737template (value) GSUP_IE ts_GSUP_IE_SM_RP_CAUSE(OCT1 cause) := {
738 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
739 len := 0, /* overwritten */
740 val := {
741 sm_rp_cause := cause
742 }
743}
744template GSUP_IE tr_GSUP_IE_SM_RP_CAUSE(template OCT1 cause) := {
745 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
746 len := ?,
747 val := {
748 sm_rp_cause := cause
749 }
750}
751
752template (value) GSUP_IE ts_GSUP_IE_SM_RP_MMS(OCT1 mms) := {
753 tag := OSMO_GSUP_SM_RP_MMS_IE,
754 len := 0, /* overwritten */
755 val := {
756 sm_rp_mms := mms
757 }
758}
759template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
760 tag := OSMO_GSUP_SM_RP_MMS_IE,
761 len := ?,
762 val := {
763 sm_rp_mms := mms
764 }
765}
766
Oliver Smithc5748292019-02-22 15:02:48 +0100767template (value) GSUP_IE ts_GSUP_IE_IMEI_IE(GSUP_IMEI imei) := {
768 tag := OSMO_GSUP_IMEI_IE,
769 len := 0, /* overwritten */
770 val := {
771 imei := imei
772 }
773}
774template GSUP_IE tr_GSUP_IE_IMEI_IE(template GSUP_IMEI imei) := {
775 tag := OSMO_GSUP_IMEI_IE,
776 len := ?,
777 val := {
778 imei := imei
779 }
780}
781
782template (value) GSUP_IE ts_GSUP_IE_IMEI_RESULT_IE(GSUP_IMEIResult result) := {
783 tag := OSMO_GSUP_IMEI_RESULT_IE,
784 len := 0, /* overwritten */
785 val := {
786 imei_result := result
787 }
788}
789template GSUP_IE tr_GSUP_IE_IMEI_RESULT_IE(template GSUP_IMEIResult result) := {
790 tag := OSMO_GSUP_IMEI_RESULT_IE,
791 len := ?,
792 val := {
793 imei_result := result
794 }
795}
796
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700797/* Possible identity types for SM-RP-{OA|DA} IEs */
798type enumerated GSUP_SM_RP_ODA_IdType {
799 OSMO_GSUP_SM_RP_ODA_ID_NONE ('00'O),
800 OSMO_GSUP_SM_RP_ODA_ID_IMSI ('01'O),
801 OSMO_GSUP_SM_RP_ODA_ID_MSISDN ('02'O),
802 OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR ('03'O),
803 /* Special value for noSM-RP-DA and noSM-RP-OA */
804 OSMO_GSUP_SM_RP_ODA_ID_NULL ('FF'O)
805} with { variant "FIELDLENGTH(8)" };
806
807/**
808 * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
809 * It can be either of the following:
810 * - IMSI
811 * - LMSI (not implemented)
812 * - MSISDN
813 * - roaming number (not implemented)
814 * - service centre address
815 */
816type union GSUP_SM_RP_DA_ID {
817 hexstring imsi,
818 hexstring msisdn,
819 hexstring smsc_addr
820};
821
822type record GSUP_SM_RP_DA {
823 GSUP_SM_RP_ODA_IdType id_type,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700824 GSUP_SM_RP_DA_ID id_enc optional
Vadim Yanitskiyf1f39bd2018-12-14 08:00:33 +0700825} with { variant (id_enc) "CROSSTAG(
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700826 imsi, id_type = OSMO_GSUP_SM_RP_ODA_ID_IMSI;
827 msisdn, id_type = OSMO_GSUP_SM_RP_ODA_ID_MSISDN;
828 smsc_addr, id_type = OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR;
829 /* FIXME: how to handle noSM-RP-DA? */
830 )"
831};
832
833template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
834 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700835 id_enc := { imsi := imsi }
836}
837template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
838 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700839 id_enc := { imsi := imsi }
840}
841
842template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(hexstring msisdn) := {
843 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700844 id_enc := { msisdn := msisdn }
845}
846template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template hexstring msisdn) := {
847 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700848 id_enc := { msisdn := msisdn }
849}
850
851template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(hexstring smsc_addr) := {
852 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700853 id_enc := { smsc_addr := smsc_addr }
854}
855template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template hexstring smsc_addr) := {
856 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700857 id_enc := { smsc_addr := smsc_addr }
858}
859
860template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_NULL := {
861 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700862 id_enc := omit
863}
864template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_NULL := {
865 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700866 id_enc := omit
867}
868
869template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
870 tag := OSMO_GSUP_SM_RP_DA_IE,
871 len := 0, /* overwritten */
872 val := {
873 sm_rp_da := val
874 }
875}
876template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
877 tag := OSMO_GSUP_SM_RP_DA_IE,
878 len := ?,
879 val := {
880 sm_rp_da := val
881 }
882}
883
884/**
885 * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
886 * It can be either of the following:
887 * - MSISDN
888 * - service centre address
889 */
890type union GSUP_SM_RP_OA_ID {
891 hexstring msisdn,
892 hexstring smsc_addr
893};
894
895type record GSUP_SM_RP_OA {
896 GSUP_SM_RP_ODA_IdType id_type,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700897 GSUP_SM_RP_OA_ID id_enc optional
Vadim Yanitskiyf1f39bd2018-12-14 08:00:33 +0700898} with { variant (id_enc) "CROSSTAG(
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700899 msisdn, id_type = OSMO_GSUP_SM_RP_ODA_ID_MSISDN;
900 smsc_addr, id_type = OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR;
901 /* FIXME: how to handle noSM-RP-OA? */
902 )"
903};
904
905template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(hexstring msisdn) := {
906 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700907 id_enc := { msisdn := msisdn }
908}
909template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template hexstring msisdn) := {
910 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700911 id_enc := { msisdn := msisdn }
912}
913
914template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(hexstring smsc_addr) := {
915 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700916 id_enc := { smsc_addr := smsc_addr }
917}
918template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template hexstring smsc_addr) := {
919 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700920 id_enc := { smsc_addr := smsc_addr }
921}
922
923template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_NULL := {
924 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700925 id_enc := omit
926}
927template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_NULL := {
928 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700929 id_enc := omit
930}
931
932template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
933 tag := OSMO_GSUP_SM_RP_OA_IE,
934 len := 0, /* overwritten */
935 val := {
936 sm_rp_oa := val
937 }
938}
939template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
940 tag := OSMO_GSUP_SM_RP_OA_IE,
941 len := ?,
942 val := {
943 sm_rp_oa := val
944 }
945}
946
947/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
948template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
949 tag := OSMO_GSUP_SM_RP_UI_IE,
950 len := 0, /* overwritten */
951 val := {
952 sm_rp_ui := val
953 }
954}
955template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
956 tag := OSMO_GSUP_SM_RP_UI_IE,
957 len := ?,
958 val := {
959 sm_rp_ui := val
960 }
961}
962
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700963/* SM Alert Reason types, see 7.6.8.8 */
964type enumerated GSUP_SM_ALERT_RSN_Type {
965 GSUP_SM_ALERT_RSN_TYPE_NONE ('00'O),
966 GSUP_SM_ALERT_RSN_TYPE_MS_PRESENT ('01'O),
967 GSUP_SM_ALERT_RSN_TYPE_MEM_AVAIL ('02'O)
968} with { variant "FIELDLENGTH(8)" };
969
970/* SM Alert Reason IE (used in READY-FOR-SM), see 7.6.8.8 */
971template (value) GSUP_IE ts_GSUP_IE_SM_ALERT_RSN(GSUP_SM_ALERT_RSN_Type rsn) := {
972 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
973 len := 0, /* overwritten */
974 val := {
975 sm_alert_rsn := rsn
976 }
977}
978template GSUP_IE tr_GSUP_IE_SM_ALERT_RSN(template GSUP_SM_ALERT_RSN_Type rsn) := {
979 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
980 len := ?,
981 val := {
982 sm_alert_rsn := rsn
983 }
984}
985
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700986template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
987 tag := OSMO_GSUP_SS_INFO_IE,
988 len := 0, /* overwritten */
989 val := {
990 ss_info := ss
991 }
992}
993template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
994 tag := OSMO_GSUP_SS_INFO_IE,
995 len := ?,
996 val := {
997 ss_info := ss
998 }
999}
1000
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001001template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
1002 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1003 len := ?,
1004 val := {
1005 message_class := val
1006 }
1007}
1008
1009template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
1010 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1011 len := 0, /* overwritten */
1012 val := {
1013 message_class := val
1014 }
1015}
1016
1017template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
1018 tag := OSMO_GSUP_SOURCE_NAME_IE,
1019 len := ?,
1020 val := {
1021 source_name := name
1022 }
1023}
1024
1025template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
1026 tag := OSMO_GSUP_SOURCE_NAME_IE,
1027 len := 0, /* overwritten */
1028 val := {
1029 source_name := name
1030 }
1031}
1032
1033template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
1034 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1035 len := ?,
1036 val := {
1037 destination_name := name
1038 }
1039}
1040
1041template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
1042 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1043 len := 0, /* overwritten */
1044 val := {
1045 destination_name := name
1046 }
1047}
1048
1049template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {
1050 tag := OSMO_GSUP_AN_APDU_IE,
1051 len := ?,
1052 val := {
1053 an_apdu := an_apdu
1054 }
1055}
1056
1057template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {
1058 tag := OSMO_GSUP_AN_APDU_IE,
1059 len := 0, /* overwritten */
1060 val := {
1061 an_apdu := an_apdu
1062 }
1063}
1064
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001065private function f_gen_ts_ss_ies(
1066 hexstring imsi,
1067 OCT4 sid,
1068 GSUP_SessionState state,
1069 template (omit) octetstring ss
1070) return GSUP_IEs {
1071 /* Mandatory IEs */
1072 var GSUP_IEs ies := {
1073 valueof(ts_GSUP_IE_IMSI(imsi)),
1074 valueof(ts_GSUP_IE_SessionId(sid)),
1075 valueof(ts_GSUP_IE_SessionState(state))
1076 };
1077
1078 /* Optional SS payload */
1079 if (isvalue(ss)) {
1080 ies[3] := valueof(ts_GSUP_IE_SSInfo(valueof(ss)));
1081 }
1082
1083 return ies;
1084}
1085private function f_gen_tr_ss_ies(
1086 template hexstring imsi,
1087 template OCT4 sid := ?,
1088 template GSUP_SessionState state := ?,
1089 template octetstring ss := ?
1090) return template GSUP_IEs {
1091 /* Mandatory IEs */
1092 var template GSUP_IEs ies := {
1093 tr_GSUP_IE_IMSI(imsi),
1094 tr_GSUP_IE_SessionId(sid),
1095 tr_GSUP_IE_SessionState(state)
1096 };
Harald Welte0622a9f2019-05-11 10:58:15 +02001097 var integer last_idx := 3;
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001098
1099 /* Optional SS payload */
1100 if (istemplatekind(ss, "*")) {
1101 ies[3] := *;
Harald Welte0622a9f2019-05-11 10:58:15 +02001102 last_idx := last_idx + 1;
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001103 } else if (not istemplatekind(ss, "omit")) {
1104 ies[3] := tr_GSUP_IE_SSInfo(ss);
Harald Welte0622a9f2019-05-11 10:58:15 +02001105 last_idx := last_idx + 1;
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001106 }
1107
Harald Welte0622a9f2019-05-11 10:58:15 +02001108 /* the GSUP Message Class IE is optional, as old implementations don't have it yet */
1109 var template GSUP_IEs ies2 := ies;
1110 ies2[last_idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
1111 last_idx := last_idx + 1;
1112
1113 return (ies, ies2);
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001114}
1115
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001116template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
1117 hexstring imsi,
1118 OCT4 sid,
1119 GSUP_SessionState state,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001120 template (omit) octetstring ss := omit
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001121) := ts_GSUP(
1122 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001123 f_gen_ts_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001124);
1125template GSUP_PDU tr_GSUP_PROC_SS_REQ(
1126 template hexstring imsi,
1127 template OCT4 sid := ?,
1128 template GSUP_SessionState state := ?,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001129 template octetstring ss := *
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001130) := tr_GSUP(
1131 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001132 f_gen_tr_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001133);
1134
1135template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
1136 hexstring imsi,
1137 OCT4 sid,
1138 GSUP_SessionState state,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001139 template (omit) octetstring ss := omit
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001140) := ts_GSUP(
1141 OSMO_GSUP_MSGT_PROC_SS_RESULT,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001142 f_gen_ts_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001143);
1144template GSUP_PDU tr_GSUP_PROC_SS_RES(
1145 template hexstring imsi,
1146 template OCT4 sid := ?,
1147 template GSUP_SessionState state := ?,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001148 template octetstring ss := *
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001149) := tr_GSUP(
1150 OSMO_GSUP_MSGT_PROC_SS_RESULT,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001151 f_gen_tr_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001152);
1153
1154template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
1155 hexstring imsi,
1156 OCT4 sid,
Vadim Yanitskiy21c42332018-11-29 00:18:05 +07001157 GSUP_SessionState state,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001158 integer cause
1159) := ts_GSUP(
1160 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1161 {
1162 valueof(ts_GSUP_IE_IMSI(imsi)),
Vadim Yanitskiy772a8452018-11-29 02:17:37 +07001163 valueof(ts_GSUP_IE_Cause(cause)),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001164 valueof(ts_GSUP_IE_SessionId(sid)),
Vadim Yanitskiy772a8452018-11-29 02:17:37 +07001165 valueof(ts_GSUP_IE_SessionState(state))
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001166 }
1167);
1168template GSUP_PDU tr_GSUP_PROC_SS_ERR(
1169 template hexstring imsi,
1170 template OCT4 sid := ?,
Vadim Yanitskiy21c42332018-11-29 00:18:05 +07001171 template GSUP_SessionState state := ?,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001172 template integer cause := ?
1173) := tr_GSUP(
1174 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1175 {
1176 tr_GSUP_IE_IMSI(imsi),
Vadim Yanitskiy772a8452018-11-29 02:17:37 +07001177 tr_GSUP_IE_Cause(cause),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001178 tr_GSUP_IE_SessionId(sid),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001179 tr_GSUP_IE_SessionState(state),
Harald Welted29a64c2019-05-11 12:24:30 +02001180 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001181 }
1182);
Harald Weltedf327232017-12-28 22:51:51 +01001183
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001184template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
1185 hexstring imsi,
1186 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1187 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1188 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1189 octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1190) := ts_GSUP(
1191 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1192 {
1193 valueof(ts_GSUP_IE_IMSI(imsi)),
1194 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1195 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1196 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1197 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
1198 }
1199);
1200template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
1201 template hexstring imsi := ?,
1202 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1203 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1204 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1205 template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1206) := tr_GSUP(
1207 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1208 {
1209 tr_GSUP_IE_IMSI(imsi),
1210 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1211 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1212 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001213 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
1214 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001215 }
1216);
1217
1218template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
1219 hexstring imsi,
1220 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1221) := ts_GSUP(
1222 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1223 {
1224 valueof(ts_GSUP_IE_IMSI(imsi)),
1225 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
1226 }
1227);
1228template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
1229 template hexstring imsi := ?,
1230 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1231) := tr_GSUP(
1232 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1233 {
1234 tr_GSUP_IE_IMSI(imsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001235 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1236 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001237 }
1238);
1239
1240template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
1241 hexstring imsi,
1242 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1243 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1244) := ts_GSUP(
1245 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1246 {
1247 valueof(ts_GSUP_IE_IMSI(imsi)),
1248 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1249 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
1250 }
1251);
1252template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
1253 template hexstring imsi := ?,
1254 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1255 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1256) := tr_GSUP(
1257 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1258 {
1259 tr_GSUP_IE_IMSI(imsi),
1260 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001261 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1262 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001263 }
1264);
1265
1266template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
1267 hexstring imsi,
1268 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1269 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1270 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1271 octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1272 OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1273) := ts_GSUP(
1274 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1275 {
1276 /**
1277 * TODO: add MT-specific fields (and IEs):
1278 * - smDeliveryTimer
1279 * - smDeliveryStartTime
1280 */
1281 valueof(ts_GSUP_IE_IMSI(imsi)),
1282 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1283 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1284 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1285 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
1286 valueof(ts_GSUP_IE_SM_RP_MMS(sm_rp_mms))
1287 }
1288);
1289template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
1290 template hexstring imsi := ?,
1291 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1292 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1293 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1294 template octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1295 template OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1296) := tr_GSUP(
1297 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1298 {
1299 /**
1300 * TODO: add MT-specific fields (and IEs):
1301 * - smDeliveryTimer
1302 * - smDeliveryStartTime
1303 */
1304 tr_GSUP_IE_IMSI(imsi),
1305 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1306 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1307 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
1308 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001309 tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),
1310 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001311 }
1312);
1313
1314template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
1315 hexstring imsi,
1316 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1317) := ts_GSUP(
1318 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1319 {
1320 valueof(ts_GSUP_IE_IMSI(imsi)),
1321 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
1322 }
1323);
1324template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
1325 template hexstring imsi := ?,
1326 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1327) := tr_GSUP(
1328 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1329 {
1330 tr_GSUP_IE_IMSI(imsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001331 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1332 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001333 }
1334);
1335
1336template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
1337 hexstring imsi,
1338 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1339 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1340) := ts_GSUP(
1341 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1342 {
1343 valueof(ts_GSUP_IE_IMSI(imsi)),
1344 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1345 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
1346 }
1347);
1348template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
1349 template hexstring imsi := ?,
1350 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1351 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1352) := tr_GSUP(
1353 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1354 {
1355 tr_GSUP_IE_IMSI(imsi),
1356 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001357 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1358 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001359 }
1360);
1361
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001362template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_REQ(
1363 hexstring imsi,
1364 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1365 GSUP_SM_ALERT_RSN_Type sm_alert_rsn /* SM Alert Reason, see 7.6.8.8 */
1366) := ts_GSUP(
1367 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1368 {
1369 valueof(ts_GSUP_IE_IMSI(imsi)),
1370 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1371 valueof(ts_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn))
1372 }
1373);
1374template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_REQ(
1375 template hexstring imsi := ?,
1376 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1377 template GSUP_SM_ALERT_RSN_Type sm_alert_rsn := ? /* SM Alert Reason, see 7.6.8.8 */
1378) := tr_GSUP(
1379 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1380 {
1381 tr_GSUP_IE_IMSI(imsi),
1382 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001383 tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),
1384 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001385 }
1386);
1387
1388template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_RES(
1389 hexstring imsi,
1390 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1391) := ts_GSUP(
1392 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1393 {
1394 valueof(ts_GSUP_IE_IMSI(imsi)),
1395 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
1396 }
1397);
1398template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_RES(
1399 template hexstring imsi := ?,
1400 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1401) := tr_GSUP(
1402 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1403 {
1404 tr_GSUP_IE_IMSI(imsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001405 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1406 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001407 }
1408);
1409
1410template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_ERR(
1411 hexstring imsi,
1412 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1413 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1414) := ts_GSUP(
1415 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1416 {
1417 valueof(ts_GSUP_IE_IMSI(imsi)),
1418 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1419 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
1420 }
1421);
1422template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_ERR(
1423 template hexstring imsi := ?,
1424 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1425 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1426) := tr_GSUP(
1427 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1428 {
1429 tr_GSUP_IE_IMSI(imsi),
1430 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001431 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1432 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001433 }
1434);
1435
Harald Weltef9d449e2018-06-24 22:27:47 +02001436function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
1437 for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {
1438 if (msg.ies[i].tag == iei) {
1439 ret := msg.ies[i].val;
1440 return true;
1441 }
1442 }
1443 return false;
1444}
1445
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001446template GSUP_AN_APDU t_GSUP_AN_APDU(
1447 template GSUP_AN_PROTO an_proto := ?,
1448 template octetstring pdu := ?
1449) := {
1450 proto := an_proto,
1451 pdu := pdu
1452};
1453
1454template GSUP_PDU tr_GSUP_E_AN_APDU(
1455 template GSUP_MessageType msgt,
1456 template hexstring imsi := ?,
1457 template octetstring source_name := ?,
1458 template octetstring destination_name := ?,
1459 template GSUP_AN_APDU an_apdu := ?
1460) := tr_GSUP(
1461 msgt,
1462 {
1463 tr_GSUP_IE_IMSI(imsi),
1464 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1465 tr_GSUP_IE_Source_Name(source_name),
1466 tr_GSUP_IE_Destination_Name(destination_name),
1467 tr_GSUP_IE_AN_APDU(an_apdu)
1468 }
1469);
1470
1471template GSUP_PDU tr_GSUP_E_NO_PDU(
1472 template GSUP_MessageType msgt,
1473 template hexstring imsi := ?,
1474 template octetstring source_name := ?,
1475 template octetstring destination_name := ?
1476) := tr_GSUP(
1477 msgt,
1478 {
1479 tr_GSUP_IE_IMSI(imsi),
1480 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1481 tr_GSUP_IE_Source_Name(source_name),
1482 tr_GSUP_IE_Destination_Name(destination_name)
1483 }
1484);
1485
1486template (value) GSUP_PDU ts_GSUP_E_AN_APDU(
1487 GSUP_MessageType msgt,
1488 hexstring imsi,
1489 octetstring source_name,
1490 octetstring destination_name,
1491 GSUP_AN_APDU an_apdu
1492) := ts_GSUP(
1493 msgt,
1494 {
1495 valueof(ts_GSUP_IE_IMSI(imsi)),
1496 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1497 valueof(ts_GSUP_IE_Source_Name(source_name)),
1498 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1499 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1500 }
1501);
1502
1503template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(
1504 hexstring imsi,
1505 hexstring msisdn,
1506 octetstring source_name,
1507 octetstring destination_name,
1508 GSUP_AN_APDU an_apdu
1509) := ts_GSUP(
1510 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,
1511 {
1512 valueof(ts_GSUP_IE_IMSI(imsi)),
1513 valueof(ts_GSUP_IE_MSISDN(msisdn)),
1514 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1515 valueof(ts_GSUP_IE_Source_Name(source_name)),
1516 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1517 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1518 }
1519);
Harald Weltef9d449e2018-06-24 22:27:47 +02001520
Harald Weltedf327232017-12-28 22:51:51 +01001521} with { encode "RAW"; variant "FIELDORDER(msb)" }