blob: 7e26e19ffae24925603e94e78f77449c593b36b7 [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),
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +070046 OSMO_GSUP_SS_INFO_IE ('35'O),
47
48 /* SM related IEs (see 3GPP TS 29.002, section 7.6.8) */
49 OSMO_GSUP_SM_RP_MR_IE ('40'O),
50 OSMO_GSUP_SM_RP_DA_IE ('41'O),
51 OSMO_GSUP_SM_RP_OA_IE ('42'O),
52 OSMO_GSUP_SM_RP_UI_IE ('43'O),
53 OSMO_GSUP_SM_RP_CAUSE_IE ('44'O),
Vadim Yanitskiy88e23232018-11-13 03:04:02 +070054 OSMO_GSUP_SM_RP_MMS_IE ('45'O),
Oliver Smithc5748292019-02-22 15:02:48 +010055 OSMO_GSUP_SM_ALERT_RSN_IE ('46'O),
56
57 OSMO_GSUP_IMEI_IE ('50'O),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +020058 OSMO_GSUP_IMEI_RESULT_IE ('51'O),
59
60 OSMO_GSUP_MESSAGE_CLASS_IE ('0a'O),
61
62 OSMO_GSUP_SOURCE_NAME_IE ('60'O),
63 OSMO_GSUP_DESTINATION_NAME_IE ('61'O),
64 OSMO_GSUP_AN_APDU_IE ('62'O),
65 OSMO_GSUP_CAUSE_RR_IE ('63'O),
66 OSMO_GSUP_CAUSE_BSSAP_IE ('64'O),
67 OSMO_GSUP_CAUSE_SM_IE ('65'O)
Harald Weltedf327232017-12-28 22:51:51 +010068} with { variant "FIELDLENGTH(8)" };
69
70type enumerated GSUP_MessageType {
71 OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST ('00000100'B),
72 OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR ('00000101'B),
73 OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT ('00000110'B),
74
75 OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST ('00001000'B),
76 OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR ('00001001'B),
77 OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT ('00001010'B),
78
79 OSMO_GSUP_MSGT_AUTH_FAIL_REPORT ('00001011'B),
80
81 OSMO_GSUP_MSGT_PURGE_MS_REQUEST ('00001100'B),
82 OSMO_GSUP_MSGT_PURGE_MS_ERROR ('00001101'B),
83 OSMO_GSUP_MSGT_PURGE_MS_RESULT ('00001110'B),
84
85 OSMO_GSUP_MSGT_INSERT_DATA_REQUEST ('00010000'B),
86 OSMO_GSUP_MSGT_INSERT_DATA_ERROR ('00010001'B),
87 OSMO_GSUP_MSGT_INSERT_DATA_RESULT ('00010010'B),
88
89 OSMO_GSUP_MSGT_DELETE_DATA_REQUEST ('00010100'B),
90 OSMO_GSUP_MSGT_DELETE_DATA_ERROR ('00010101'B),
91 OSMO_GSUP_MSGT_DELETE_DATA_RESULT ('00010110'B),
92
93 OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST ('00011100'B),
94 OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR ('00011101'B),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +070095 OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT ('00011110'B),
96
97 OSMO_GSUP_MSGT_PROC_SS_REQUEST ('00100000'B),
98 OSMO_GSUP_MSGT_PROC_SS_ERROR ('00100001'B),
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +070099 OSMO_GSUP_MSGT_PROC_SS_RESULT ('00100010'B),
100
101 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST ('00100100'B),
102 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR ('00100101'B),
103 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT ('00100110'B),
104
105 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST ('00101000'B),
106 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR ('00101001'B),
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700107 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT ('00101010'B),
108
109 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST ('00101100'B),
110 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR ('00101101'B),
Oliver Smithc5748292019-02-22 15:02:48 +0100111 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT ('00101110'B),
112
113 OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST ('00110000'B),
114 OSMO_GSUP_MSGT_CHECK_IMEI_ERROR ('00110001'B),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200115 OSMO_GSUP_MSGT_CHECK_IMEI_RESULT ('00110010'B),
116
117 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST ('00110100'B),
118 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR ('00110101'B),
119 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT ('00110110'B),
120
121 OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST ('00111000'B),
122 OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR ('00111001'B),
123 OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT ('00111010'B),
124
125 OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST ('00111100'B),
126 OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR ('00111101'B),
127 OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT ('00111110'B),
128
129 OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST ('01000000'B),
130 OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST ('01000100'B),
131
132 OSMO_GSUP_MSGT_E_CLOSE ('01000111'B),
133 OSMO_GSUP_MSGT_E_ABORT ('01001011'B),
134
135 OSMO_GSUP_MSGT_E_ROUTING_ERROR ('01001110'B)
Harald Weltedf327232017-12-28 22:51:51 +0100136} with { variant "FIELDLENGTH(8)" };
137
138type enumerated GSUP_CancelType {
Alexander Couzens4786b3f2018-09-16 03:33:30 +0200139 OSMO_GSUP_CANCEL_TYPE_UPDATE (0),
140 OSMO_GSUP_CANCEL_TYPE_WITHDRAW (1)
Harald Weltedf327232017-12-28 22:51:51 +0100141} with { variant "FIELDLENGTH(8)" };
142
143type enumerated GSUP_CnDomain {
144 OSMO_GSUP_CN_DOMAIN_PS (1),
145 OSMO_GSUP_CN_DOMAIN_CS (2)
146} with { variant "FIELDLENGTH(8)" };
147
Oliver Smithc5748292019-02-22 15:02:48 +0100148type enumerated GSUP_IMEIResult {
149 OSMO_GSUP_IMEI_RESULT_ACK (0),
150 OSMO_GSUP_IMEI_RESULT_NACK (1)
151} with { variant "FIELDLENGTH(8)" };
152
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700153type enumerated GSUP_SessionState {
154 OSMO_GSUP_SESSION_STATE_NONE (0),
155 OSMO_GSUP_SESSION_STATE_BEGIN (1),
156 OSMO_GSUP_SESSION_STATE_CONTINUE (2),
157 OSMO_GSUP_SESSION_STATE_END (3)
158} with { variant "FIELDLENGTH(8)" };
159
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200160type enumerated GSUP_Message_Class {
161 OSMO_GSUP_MESSAGE_CLASS_UNSET (0),
162 OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT (1),
163 OSMO_GSUP_MESSAGE_CLASS_SMS (2),
164 OSMO_GSUP_MESSAGE_CLASS_USSD (3),
165 OSMO_GSUP_MESSAGE_CLASS_INTER_MSC (4)
166} with { variant "FIELDLENGTH(8)" };
167
Harald Welte3f95be82018-01-27 00:48:13 +0100168type record GSUP_MSISDN {
169 uint8_t len,
170 hexstring digits optional
171} with { variant (len) "LENGTHTO(digits)" };
172
Oliver Smithc5748292019-02-22 15:02:48 +0100173type record GSUP_IMEI {
174 uint8_t len,
175 hexstring digits optional
176} with { variant (len) "LENGTHTO(digits)" };
177
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200178type enumerated GSUP_AN_PROTO {
179 OSMO_GSUP_AN_PROTO_48006 (1),
180 OSMO_GSUP_AN_PROTO_25413 (2)
181} with { variant "FIELDLENGTH(8)" };
182
183type record GSUP_AN_APDU {
184 GSUP_AN_PROTO proto,
185 octetstring pdu
186};
187
Harald Weltedf327232017-12-28 22:51:51 +0100188type record GSUP_IE {
189 GSUP_IEI tag,
190 uint8_t len,
191 GSUP_IeValue val
192} with { variant (len) "LENGTHTO(val)"
193 variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
194 cause, tag = OSMO_GSUP_CAUSE_IE;
195 cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +0100196 auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100197 auts, tag = OSMO_GSUP_AUTS_IE;
198 rand, tag = OSMO_GSUP_RAND_IE;
Harald Welte77a8eba2018-01-22 21:22:32 +0100199 sres, tag = OSMO_GSUP_SRES_IE;
200 kc, tag = OSMO_GSUP_KC_IE;
201 ik, tag = OSMO_GSUP_IK_IE;
202 ck, tag = OSMO_GSUP_CK_IE;
203 autn, tag = OSMO_GSUP_AUTN_IE;
204 res, tag = OSMO_GSUP_RES_IE;
Harald Weltedf327232017-12-28 22:51:51 +0100205 msisdn, tag = OSMO_GSUP_MSISDN_IE;
206 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
207 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
Harald Welteeded9ad2018-02-17 20:57:34 +0100208 pdp_info, tag = OSMO_GSUP_PDP_INFO_IE;
209 apn, tag = OSMO_GSUP_ACCESS_POINT_NAME_IE;
210 pdp_qos, tag = OSMO_GSUP_PDP_QOS_IE;
211 pdp_type, tag = OSMO_GSUP_PDP_TYPE_IE;
212 charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE;
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700213 session_state, tag = OSMO_GSUP_SESSION_STATE_IE;
214 session_id, tag = OSMO_GSUP_SESSION_ID_IE;
215 ss_info, tag = OSMO_GSUP_SS_INFO_IE;
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700216 sm_rp_mr, tag = OSMO_GSUP_SM_RP_MR_IE;
217 sm_rp_da, tag = OSMO_GSUP_SM_RP_DA_IE;
218 sm_rp_oa, tag = OSMO_GSUP_SM_RP_OA_IE;
219 sm_rp_ui, tag = OSMO_GSUP_SM_RP_UI_IE;
220 sm_rp_cause, tag = OSMO_GSUP_SM_RP_CAUSE_IE;
221 sm_rp_mms, tag = OSMO_GSUP_SM_RP_MMS_IE;
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700222 sm_alert_rsn, tag = OSMO_GSUP_SM_ALERT_RSN_IE;
Oliver Smithc5748292019-02-22 15:02:48 +0100223 imei, tag = OSMO_GSUP_IMEI_IE;
224 imei_result, tag = OSMO_GSUP_IMEI_RESULT_IE;
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200225 message_class, tag = OSMO_GSUP_MESSAGE_CLASS_IE;
226 source_name, tag = OSMO_GSUP_SOURCE_NAME_IE;
227 destination_name, tag = OSMO_GSUP_DESTINATION_NAME_IE;
228 an_apdu, tag = OSMO_GSUP_AN_APDU_IE;
229 cause_rr, tag = OSMO_GSUP_CAUSE_RR_IE;
230 cause_bssap, tag = OSMO_GSUP_CAUSE_BSSAP_IE;
231 cause_sm, tag = OSMO_GSUP_CAUSE_SM_IE;
Harald Welteeded9ad2018-02-17 20:57:34 +0100232 )"
Harald Weltedf327232017-12-28 22:51:51 +0100233};
234
235type record of GSUP_IE GSUP_IEs;
236
237type union GSUP_IeValue {
238 hexstring imsi,
239 integer cause,
240 GSUP_CancelType cancel_type,
241 //boolean pdp_info_compl,
242 //boolean freeze_ptmsi,
Harald Weltedf327232017-12-28 22:51:51 +0100243 GSUP_IEs auth_tuple,
244 octetstring auts,
245 octetstring rand,
Harald Welte77a8eba2018-01-22 21:22:32 +0100246 octetstring sres,
247 octetstring kc,
248 octetstring ik,
249 octetstring ck,
250 octetstring autn,
251 octetstring res,
Harald Welte3f95be82018-01-27 00:48:13 +0100252 GSUP_MSISDN msisdn,
Harald Weltedf327232017-12-28 22:51:51 +0100253 octetstring hlr_number,
254 GSUP_CnDomain cn_domain,
Harald Welteeded9ad2018-02-17 20:57:34 +0100255 /* PDP context + nested IEs */
256 GSUP_IEs pdp_info,
257 octetstring apn,
258 octetstring pdp_qos,
259 OCT2 pdp_type,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700260 octetstring charg_char,
261 /* Session information */
262 GSUP_SessionState session_state,
263 OCT4 session_id,
264 /* Supplementary Services */
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700265 octetstring ss_info,
266 /* Short Message Service */
267 OCT1 sm_rp_mr,
268 GSUP_SM_RP_DA sm_rp_da,
269 GSUP_SM_RP_OA sm_rp_oa,
270 octetstring sm_rp_ui,
271 OCT1 sm_rp_cause,
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700272 OCT1 sm_rp_mms,
Oliver Smithc5748292019-02-22 15:02:48 +0100273 GSUP_SM_ALERT_RSN_Type sm_alert_rsn,
274
275 GSUP_IMEI imei,
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200276 GSUP_IMEIResult imei_result,
277
278 GSUP_Message_Class message_class,
279
280 octetstring source_name,
281 octetstring destination_name,
282
283 GSUP_AN_APDU an_apdu,
284
285 OCT1 cause_rr,
286 OCT1 cause_bssap,
287 OCT1 cause_sm
Harald Weltedf327232017-12-28 22:51:51 +0100288};
289
290type record GSUP_PDU {
291 GSUP_MessageType msg_type,
292 GSUP_IEs ies
293};
294
295external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
296 with { extension "prototype(convert) encode(RAW)" };
297
298external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
299 with { extension "prototype(convert) decode(RAW)" };
300
Harald Welte2f562b12018-01-24 20:52:38 +0100301function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
302 if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
303 /* if last digit is 'F', then there's an odd number of digits and we must strip the F */
304 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
305 if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
306 gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
307 }
308 }
309}
310
311function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
312 if (ischosen(gsup.ies[0].val.imsi)) {
313 /* if number of digits is odd, add a 'F' as padding at the end */
314 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
315 if (num_digits rem 2 == 1) {
316 gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
317 }
318 }
319}
320
Harald Welte3f95be82018-01-27 00:48:13 +0100321template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
322 BIT3 ton := '000'B,
323 BIT4 npi := '0000'B) := {
324 len := 0, /* overwritten */
325 /* numberingPlanIdentification := npi,
326 typeOfNumber := ton,
327 ext1 := '0'B, */
328 digits := digits
329}
330
331template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
332 template BIT3 ton := ?,
333 template BIT4 npi := ?) := {
334 len := ?,
335 /* numberingPlanIdentification := npi,
336 typeOfNumber := ton,
337 ext1 := '0'B, */
338 digits := digits
339}
340
341
Harald Weltedf327232017-12-28 22:51:51 +0100342
Harald Welte77a8eba2018-01-22 21:22:32 +0100343template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
344 octetstring kc) := {
345 tag := OSMO_GSUP_AUTH_TUPLE_IE,
346 len := 0, /* overwritten */
347 val := {
348 auth_tuple := {
349 valueof(ts_GSUP_IE_RAND(rand)),
350 valueof(ts_GSUP_IE_SRES(sres)),
351 valueof(ts_GSUP_IE_Kc(kc))
352 }
353 }
354}
355
356template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
357 octetstring kc, octetstring ik,
358 octetstring ck, octetstring autn,
359 octetstring res) := {
360 tag := OSMO_GSUP_AUTH_TUPLE_IE,
361 len := 0, /* overwritten */
362 val := {
363 auth_tuple := {
364 valueof(ts_GSUP_IE_RAND(rand)),
365 valueof(ts_GSUP_IE_SRES(sres)),
366 valueof(ts_GSUP_IE_Kc(kc)),
367 valueof(ts_GSUP_IE_IK(ik)),
368 valueof(ts_GSUP_IE_CK(ck)),
369 valueof(ts_GSUP_IE_AUTN(autn)),
370 valueof(ts_GSUP_IE_RES(res))
371 }
372 }
373}
374
Harald Welteeded9ad2018-02-17 20:57:34 +0100375template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
376 tag := OSMO_GSUP_PDP_INFO_IE,
377 len := 0, /* overwritten */
378 val := {
379 pdp_info := {
380 valueof(ts_GSUP_IE_APN(apn)),
381 valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
382 valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
383 }
384 }
385}
386
387template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
388 tag := OSMO_GSUP_PDP_TYPE_IE,
389 len := 0,
390 val := {
391 pdp_type := pdp_type
392 }
393}
394
395template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
396 tag := OSMO_GSUP_PDP_QOS_IE,
397 len := 0,
398 val := {
399 pdp_qos := pdp_qos
400 }
401}
402
403
Harald Weltedf327232017-12-28 22:51:51 +0100404template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
405 msg_type := msgt,
406 ies := ies
407}
408
Harald Welte8a1dd532018-01-27 15:38:18 +0100409template GSUP_PDU tr_GSUP_IMSI(template GSUP_MessageType msgt := ?, template hexstring imsi) := {
410 msg_type := msgt,
411 ies := { tr_GSUP_IE_IMSI(imsi), * }
412}
413
Harald Weltedf327232017-12-28 22:51:51 +0100414template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
415 msg_type := msgt,
416 ies := ies
417}
418
Harald Welte6aa04e32018-01-27 15:35:19 +0100419template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
Harald Weltedf327232017-12-28 22:51:51 +0100420 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
421
Harald Welteef9fa872018-01-22 03:00:17 +0100422template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100423 tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
Harald Welteef9fa872018-01-22 03:00:17 +0100424
Alexander Couzensd24973d2018-09-04 16:10:14 +0200425template GSUP_PDU tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
426 template hexstring imsi,
427 template octetstring auts,
428 template octetstring rand) :=
429 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
430 tr_GSUP_IE_IMSI(imsi),
431 tr_GSUP_IE_AUTS(auts),
432 tr_GSUP_IE_RAND(rand),
433 *
434 });
435
Harald Welte77a8eba2018-01-22 21:22:32 +0100436template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
437 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
438 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
439
Harald Weltedf327232017-12-28 22:51:51 +0100440template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
Harald Welte071ed732018-01-23 19:53:52 +0100441 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
Harald Weltedf327232017-12-28 22:51:51 +0100442 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
443
Harald Welte6aa04e32018-01-27 15:35:19 +0100444template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
445 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
446 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
Harald Welte071ed732018-01-23 19:53:52 +0100447
448
Harald Weltedf327232017-12-28 22:51:51 +0100449template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
Harald Weltec2c52552018-03-01 21:20:39 +0100450 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
Harald Weltedf327232017-12-28 22:51:51 +0100451 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
452
Harald Weltec2c52552018-03-01 21:20:39 +0100453template (value) GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi) :=
454 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
455 valueof(ts_GSUP_IE_IMSI(imsi)) });
456
Harald Weltedfe94dd2018-01-21 13:55:22 +0100457template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100458 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
Harald Weltedfe94dd2018-01-21 13:55:22 +0100459
Harald Welte6aa04e32018-01-27 15:35:19 +0100460template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
Harald Weltedfe94dd2018-01-21 13:55:22 +0100461 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
462
Harald Weltec2c52552018-03-01 21:20:39 +0100463template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=
464 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);
465
Harald Welte6aa04e32018-01-27 15:35:19 +0100466template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100467 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
468 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
469
Harald Weltec2c52552018-03-01 21:20:39 +0100470template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?) :=
471 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
472 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
473
Harald Welte6aa04e32018-01-27 15:35:19 +0100474template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
Harald Welte6ff81902018-01-21 19:09:08 +0100475 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
476 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
477
Harald Weltec2c52552018-03-01 21:20:39 +0100478template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?) :=
479 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
Harald Welte8f6ac162018-03-01 22:43:28 +0100480 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * });
Harald Weltec2c52552018-03-01 21:20:39 +0100481
482template (value) GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi) :=
483 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
484 valueof(ts_GSUP_IE_IMSI(imsi)) });
485
Harald Welte6ff81902018-01-21 19:09:08 +0100486template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100487 tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100488
Harald Weltec638f4d2018-01-24 22:00:36 +0100489template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
Harald Welte8a1dd532018-01-27 15:38:18 +0100490 tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
Harald Weltedf327232017-12-28 22:51:51 +0100491
Harald Welte167458a2018-01-27 15:58:16 +0100492template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
493 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
494 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
495
496template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
497 tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
498
499template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
500 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
Alexander Couzens4cfff3a2018-05-22 17:08:36 +0200501 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
Harald Welte167458a2018-01-27 15:58:16 +0100502
Harald Welte958f8b42018-03-01 23:40:17 +0100503template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
504 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
505 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
506
Harald Welte6abb9fe2018-02-17 15:24:48 +0100507template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
508 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
509 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
510
511template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
512 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
513 valueof(ts_GSUP_IE_IMSI(imsi)) });
514
Harald Welte958f8b42018-03-01 23:40:17 +0100515template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
516 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
517 tr_GSUP_IE_IMSI(imsi), * });
518
519template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
520 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
521 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
522
Harald Welte167458a2018-01-27 15:58:16 +0100523
524template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
525 tag := OSMO_GSUP_CANCEL_TYPE_IE,
526 len := 0, /* overwritten */
527 val := {
528 cancel_type := ctype
529 }
530}
531
532template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
533 tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
534
Harald Welte6abb9fe2018-02-17 15:24:48 +0100535template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
536 tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
537
Harald Weltedf327232017-12-28 22:51:51 +0100538template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
539 tag := iei,
540 len := ?,
541 val := val
542}
543
544template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
545 tag := OSMO_GSUP_IMSI_IE,
546 len := 0, /* overwritten */
547 val := {
548 imsi := imsi
549 }
550}
551
552template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
553 tag := OSMO_GSUP_IMSI_IE,
554 len := ?,
555 val := {
556 imsi := imsi
557 }
558}
559
Harald Welte6ff81902018-01-21 19:09:08 +0100560template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
561 tag := OSMO_GSUP_MSISDN_IE,
562 len := 0, /* overwritten */
563 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100564 msisdn := ts_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100565 }
566}
567
568template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
569 tag := OSMO_GSUP_MSISDN_IE,
570 len := ?,
571 val := {
Harald Welte3f95be82018-01-27 00:48:13 +0100572 msisdn := tr_GSUP_MSISDN(msisdn)
Harald Welte6ff81902018-01-21 19:09:08 +0100573 }
574}
575
576
Harald Weltedf327232017-12-28 22:51:51 +0100577template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
578 tag := OSMO_GSUP_CAUSE_IE,
579 len := 0, /* overwritten */
580 val := {
581 cause := cause
582 }
583}
584
585template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
586 tag := OSMO_GSUP_CAUSE_IE,
587 len := ?,
588 val := {
589 cause := cause
590 }
591}
592
593template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
594 tag := OSMO_GSUP_AUTS_IE,
595 len := 0, /* overwritten */
596 val := {
597 auts := auts
598 }
599}
600
Alexander Couzensd24973d2018-09-04 16:10:14 +0200601template GSUP_IE tr_GSUP_IE_AUTS(template octetstring auts) := {
602 tag := OSMO_GSUP_AUTS_IE,
603 len := ?,
604 val := {
605 auts := auts
606 }
607}
608
Harald Weltedf327232017-12-28 22:51:51 +0100609template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
610 tag := OSMO_GSUP_RAND_IE,
611 len := 0, /* overwritten */
612 val := {
613 rand := rand
614 }
615}
616
Alexander Couzensd24973d2018-09-04 16:10:14 +0200617template GSUP_IE tr_GSUP_IE_RAND(template octetstring rand) := {
618 tag := OSMO_GSUP_RAND_IE,
619 len := ?,
620 val := {
621 rand := rand
622 }
623}
624
Harald Welte77a8eba2018-01-22 21:22:32 +0100625template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
626 tag := OSMO_GSUP_SRES_IE,
627 len := 0, /* overwritten */
628 val := {
629 sres := sres
630 }
631}
632
633template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
634 tag := OSMO_GSUP_KC_IE,
635 len := 0, /* overwritten */
636 val := {
637 kc := kc
638 }
639}
640
641template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
642 tag := OSMO_GSUP_IK_IE,
643 len := 0, /* overwritten */
644 val := {
645 ik := ik
646 }
647}
648
649template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
650 tag := OSMO_GSUP_CK_IE,
651 len := 0, /* overwritten */
652 val := {
653 ck := ck
654 }
655}
656
657template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
658 tag := OSMO_GSUP_AUTN_IE,
659 len := 0, /* overwritten */
660 val := {
661 autn := autn
662 }
663}
664
665template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
666 tag := OSMO_GSUP_RES_IE,
667 len := 0, /* overwritten */
668 val := {
669 res := res
670 }
671}
Harald Weltedf327232017-12-28 22:51:51 +0100672
Harald Welteeded9ad2018-02-17 20:57:34 +0100673template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
674 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
675 len := 0, /* overwritten */
676 val := {
677 apn := apn
678 }
679}
680
Harald Welte958f8b42018-03-01 23:40:17 +0100681template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := {
682 tag := OSMO_GSUP_CN_DOMAIN_IE,
683 len := 0, /* overwritten */
684 val := {
685 cn_domain := dom
686 }
687}
Harald Weltedf327232017-12-28 22:51:51 +0100688
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700689template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
690 tag := OSMO_GSUP_SESSION_ID_IE,
691 len := 0, /* overwritten */
692 val := {
693 session_id := sid
694 }
695}
696template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
697 tag := OSMO_GSUP_SESSION_ID_IE,
698 len := ?,
699 val := {
700 session_id := sid
701 }
702}
703
704template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
705 tag := OSMO_GSUP_SESSION_STATE_IE,
706 len := 0, /* overwritten */
707 val := {
708 session_state := state
709 }
710}
711template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
712 tag := OSMO_GSUP_SESSION_STATE_IE,
713 len := ?,
714 val := {
715 session_state := state
716 }
717}
718
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700719template (value) GSUP_IE ts_GSUP_IE_SM_RP_MR(OCT1 ref) := {
720 tag := OSMO_GSUP_SM_RP_MR_IE,
721 len := 0, /* overwritten */
722 val := {
723 sm_rp_mr := ref
724 }
725}
726template GSUP_IE tr_GSUP_IE_SM_RP_MR(template OCT1 ref) := {
727 tag := OSMO_GSUP_SM_RP_MR_IE,
728 len := ?,
729 val := {
730 sm_rp_mr := ref
731 }
732}
733
734template (value) GSUP_IE ts_GSUP_IE_SM_RP_CAUSE(OCT1 cause) := {
735 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
736 len := 0, /* overwritten */
737 val := {
738 sm_rp_cause := cause
739 }
740}
741template GSUP_IE tr_GSUP_IE_SM_RP_CAUSE(template OCT1 cause) := {
742 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
743 len := ?,
744 val := {
745 sm_rp_cause := cause
746 }
747}
748
749template (value) GSUP_IE ts_GSUP_IE_SM_RP_MMS(OCT1 mms) := {
750 tag := OSMO_GSUP_SM_RP_MMS_IE,
751 len := 0, /* overwritten */
752 val := {
753 sm_rp_mms := mms
754 }
755}
756template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
757 tag := OSMO_GSUP_SM_RP_MMS_IE,
758 len := ?,
759 val := {
760 sm_rp_mms := mms
761 }
762}
763
Oliver Smithc5748292019-02-22 15:02:48 +0100764template (value) GSUP_IE ts_GSUP_IE_IMEI_IE(GSUP_IMEI imei) := {
765 tag := OSMO_GSUP_IMEI_IE,
766 len := 0, /* overwritten */
767 val := {
768 imei := imei
769 }
770}
771template GSUP_IE tr_GSUP_IE_IMEI_IE(template GSUP_IMEI imei) := {
772 tag := OSMO_GSUP_IMEI_IE,
773 len := ?,
774 val := {
775 imei := imei
776 }
777}
778
779template (value) GSUP_IE ts_GSUP_IE_IMEI_RESULT_IE(GSUP_IMEIResult result) := {
780 tag := OSMO_GSUP_IMEI_RESULT_IE,
781 len := 0, /* overwritten */
782 val := {
783 imei_result := result
784 }
785}
786template GSUP_IE tr_GSUP_IE_IMEI_RESULT_IE(template GSUP_IMEIResult result) := {
787 tag := OSMO_GSUP_IMEI_RESULT_IE,
788 len := ?,
789 val := {
790 imei_result := result
791 }
792}
793
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700794/* Possible identity types for SM-RP-{OA|DA} IEs */
795type enumerated GSUP_SM_RP_ODA_IdType {
796 OSMO_GSUP_SM_RP_ODA_ID_NONE ('00'O),
797 OSMO_GSUP_SM_RP_ODA_ID_IMSI ('01'O),
798 OSMO_GSUP_SM_RP_ODA_ID_MSISDN ('02'O),
799 OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR ('03'O),
800 /* Special value for noSM-RP-DA and noSM-RP-OA */
801 OSMO_GSUP_SM_RP_ODA_ID_NULL ('FF'O)
802} with { variant "FIELDLENGTH(8)" };
803
804/**
805 * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
806 * It can be either of the following:
807 * - IMSI
808 * - LMSI (not implemented)
809 * - MSISDN
810 * - roaming number (not implemented)
811 * - service centre address
812 */
813type union GSUP_SM_RP_DA_ID {
814 hexstring imsi,
815 hexstring msisdn,
816 hexstring smsc_addr
817};
818
819type record GSUP_SM_RP_DA {
820 GSUP_SM_RP_ODA_IdType id_type,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700821 GSUP_SM_RP_DA_ID id_enc optional
Vadim Yanitskiyf1f39bd2018-12-14 08:00:33 +0700822} with { variant (id_enc) "CROSSTAG(
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700823 imsi, id_type = OSMO_GSUP_SM_RP_ODA_ID_IMSI;
824 msisdn, id_type = OSMO_GSUP_SM_RP_ODA_ID_MSISDN;
825 smsc_addr, id_type = OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR;
826 /* FIXME: how to handle noSM-RP-DA? */
827 )"
828};
829
830template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
831 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700832 id_enc := { imsi := imsi }
833}
834template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
835 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700836 id_enc := { imsi := imsi }
837}
838
839template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(hexstring msisdn) := {
840 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700841 id_enc := { msisdn := msisdn }
842}
843template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template hexstring msisdn) := {
844 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700845 id_enc := { msisdn := msisdn }
846}
847
848template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(hexstring smsc_addr) := {
849 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700850 id_enc := { smsc_addr := smsc_addr }
851}
852template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template hexstring smsc_addr) := {
853 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700854 id_enc := { smsc_addr := smsc_addr }
855}
856
857template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_NULL := {
858 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700859 id_enc := omit
860}
861template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_NULL := {
862 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700863 id_enc := omit
864}
865
866template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
867 tag := OSMO_GSUP_SM_RP_DA_IE,
868 len := 0, /* overwritten */
869 val := {
870 sm_rp_da := val
871 }
872}
873template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
874 tag := OSMO_GSUP_SM_RP_DA_IE,
875 len := ?,
876 val := {
877 sm_rp_da := val
878 }
879}
880
881/**
882 * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
883 * It can be either of the following:
884 * - MSISDN
885 * - service centre address
886 */
887type union GSUP_SM_RP_OA_ID {
888 hexstring msisdn,
889 hexstring smsc_addr
890};
891
892type record GSUP_SM_RP_OA {
893 GSUP_SM_RP_ODA_IdType id_type,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700894 GSUP_SM_RP_OA_ID id_enc optional
Vadim Yanitskiyf1f39bd2018-12-14 08:00:33 +0700895} with { variant (id_enc) "CROSSTAG(
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700896 msisdn, id_type = OSMO_GSUP_SM_RP_ODA_ID_MSISDN;
897 smsc_addr, id_type = OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR;
898 /* FIXME: how to handle noSM-RP-OA? */
899 )"
900};
901
902template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(hexstring msisdn) := {
903 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700904 id_enc := { msisdn := msisdn }
905}
906template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template hexstring msisdn) := {
907 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700908 id_enc := { msisdn := msisdn }
909}
910
911template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(hexstring smsc_addr) := {
912 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700913 id_enc := { smsc_addr := smsc_addr }
914}
915template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template hexstring smsc_addr) := {
916 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700917 id_enc := { smsc_addr := smsc_addr }
918}
919
920template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_NULL := {
921 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700922 id_enc := omit
923}
924template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_NULL := {
925 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +0700926 id_enc := omit
927}
928
929template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
930 tag := OSMO_GSUP_SM_RP_OA_IE,
931 len := 0, /* overwritten */
932 val := {
933 sm_rp_oa := val
934 }
935}
936template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
937 tag := OSMO_GSUP_SM_RP_OA_IE,
938 len := ?,
939 val := {
940 sm_rp_oa := val
941 }
942}
943
944/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
945template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
946 tag := OSMO_GSUP_SM_RP_UI_IE,
947 len := 0, /* overwritten */
948 val := {
949 sm_rp_ui := val
950 }
951}
952template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
953 tag := OSMO_GSUP_SM_RP_UI_IE,
954 len := ?,
955 val := {
956 sm_rp_ui := val
957 }
958}
959
Vadim Yanitskiy88e23232018-11-13 03:04:02 +0700960/* SM Alert Reason types, see 7.6.8.8 */
961type enumerated GSUP_SM_ALERT_RSN_Type {
962 GSUP_SM_ALERT_RSN_TYPE_NONE ('00'O),
963 GSUP_SM_ALERT_RSN_TYPE_MS_PRESENT ('01'O),
964 GSUP_SM_ALERT_RSN_TYPE_MEM_AVAIL ('02'O)
965} with { variant "FIELDLENGTH(8)" };
966
967/* SM Alert Reason IE (used in READY-FOR-SM), see 7.6.8.8 */
968template (value) GSUP_IE ts_GSUP_IE_SM_ALERT_RSN(GSUP_SM_ALERT_RSN_Type rsn) := {
969 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
970 len := 0, /* overwritten */
971 val := {
972 sm_alert_rsn := rsn
973 }
974}
975template GSUP_IE tr_GSUP_IE_SM_ALERT_RSN(template GSUP_SM_ALERT_RSN_Type rsn) := {
976 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
977 len := ?,
978 val := {
979 sm_alert_rsn := rsn
980 }
981}
982
Vadim Yanitskiyb761d142018-06-02 21:05:04 +0700983template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
984 tag := OSMO_GSUP_SS_INFO_IE,
985 len := 0, /* overwritten */
986 val := {
987 ss_info := ss
988 }
989}
990template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
991 tag := OSMO_GSUP_SS_INFO_IE,
992 len := ?,
993 val := {
994 ss_info := ss
995 }
996}
997
Neels Hofmeyr0ac63152019-05-07 01:20:17 +0200998template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
999 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1000 len := ?,
1001 val := {
1002 message_class := val
1003 }
1004}
1005
1006template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
1007 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1008 len := 0, /* overwritten */
1009 val := {
1010 message_class := val
1011 }
1012}
1013
1014template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
1015 tag := OSMO_GSUP_SOURCE_NAME_IE,
1016 len := ?,
1017 val := {
1018 source_name := name
1019 }
1020}
1021
1022template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
1023 tag := OSMO_GSUP_SOURCE_NAME_IE,
1024 len := 0, /* overwritten */
1025 val := {
1026 source_name := name
1027 }
1028}
1029
1030template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
1031 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1032 len := ?,
1033 val := {
1034 destination_name := name
1035 }
1036}
1037
1038template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
1039 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1040 len := 0, /* overwritten */
1041 val := {
1042 destination_name := name
1043 }
1044}
1045
1046template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {
1047 tag := OSMO_GSUP_AN_APDU_IE,
1048 len := ?,
1049 val := {
1050 an_apdu := an_apdu
1051 }
1052}
1053
1054template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {
1055 tag := OSMO_GSUP_AN_APDU_IE,
1056 len := 0, /* overwritten */
1057 val := {
1058 an_apdu := an_apdu
1059 }
1060}
1061
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001062private function f_gen_ts_ss_ies(
1063 hexstring imsi,
1064 OCT4 sid,
1065 GSUP_SessionState state,
1066 template (omit) octetstring ss
1067) return GSUP_IEs {
1068 /* Mandatory IEs */
1069 var GSUP_IEs ies := {
1070 valueof(ts_GSUP_IE_IMSI(imsi)),
1071 valueof(ts_GSUP_IE_SessionId(sid)),
1072 valueof(ts_GSUP_IE_SessionState(state))
1073 };
1074
1075 /* Optional SS payload */
1076 if (isvalue(ss)) {
1077 ies[3] := valueof(ts_GSUP_IE_SSInfo(valueof(ss)));
1078 }
1079
1080 return ies;
1081}
1082private function f_gen_tr_ss_ies(
1083 template hexstring imsi,
1084 template OCT4 sid := ?,
1085 template GSUP_SessionState state := ?,
1086 template octetstring ss := ?
1087) return template GSUP_IEs {
1088 /* Mandatory IEs */
1089 var template GSUP_IEs ies := {
1090 tr_GSUP_IE_IMSI(imsi),
1091 tr_GSUP_IE_SessionId(sid),
1092 tr_GSUP_IE_SessionState(state)
1093 };
1094
1095 /* Optional SS payload */
1096 if (istemplatekind(ss, "*")) {
1097 ies[3] := *;
1098 } else if (not istemplatekind(ss, "omit")) {
1099 ies[3] := tr_GSUP_IE_SSInfo(ss);
1100 }
1101
1102 return ies;
1103}
1104
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001105template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
1106 hexstring imsi,
1107 OCT4 sid,
1108 GSUP_SessionState state,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001109 template (omit) octetstring ss := omit
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001110) := ts_GSUP(
1111 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001112 f_gen_ts_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001113);
1114template GSUP_PDU tr_GSUP_PROC_SS_REQ(
1115 template hexstring imsi,
1116 template OCT4 sid := ?,
1117 template GSUP_SessionState state := ?,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001118 template octetstring ss := *
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001119) := tr_GSUP(
1120 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001121 f_gen_tr_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001122);
1123
1124template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
1125 hexstring imsi,
1126 OCT4 sid,
1127 GSUP_SessionState state,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001128 template (omit) octetstring ss := omit
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001129) := ts_GSUP(
1130 OSMO_GSUP_MSGT_PROC_SS_RESULT,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001131 f_gen_ts_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001132);
1133template GSUP_PDU tr_GSUP_PROC_SS_RES(
1134 template hexstring imsi,
1135 template OCT4 sid := ?,
1136 template GSUP_SessionState state := ?,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001137 template octetstring ss := *
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001138) := tr_GSUP(
1139 OSMO_GSUP_MSGT_PROC_SS_RESULT,
Vadim Yanitskiy911257e2018-06-21 04:18:54 +07001140 f_gen_tr_ss_ies(imsi, sid, state, ss)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001141);
1142
1143template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
1144 hexstring imsi,
1145 OCT4 sid,
Vadim Yanitskiy21c42332018-11-29 00:18:05 +07001146 GSUP_SessionState state,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001147 integer cause
1148) := ts_GSUP(
1149 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1150 {
1151 valueof(ts_GSUP_IE_IMSI(imsi)),
Vadim Yanitskiy772a8452018-11-29 02:17:37 +07001152 valueof(ts_GSUP_IE_Cause(cause)),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001153 valueof(ts_GSUP_IE_SessionId(sid)),
Vadim Yanitskiy772a8452018-11-29 02:17:37 +07001154 valueof(ts_GSUP_IE_SessionState(state))
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001155 }
1156);
1157template GSUP_PDU tr_GSUP_PROC_SS_ERR(
1158 template hexstring imsi,
1159 template OCT4 sid := ?,
Vadim Yanitskiy21c42332018-11-29 00:18:05 +07001160 template GSUP_SessionState state := ?,
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001161 template integer cause := ?
1162) := tr_GSUP(
1163 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1164 {
1165 tr_GSUP_IE_IMSI(imsi),
Vadim Yanitskiy772a8452018-11-29 02:17:37 +07001166 tr_GSUP_IE_Cause(cause),
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001167 tr_GSUP_IE_SessionId(sid),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001168 tr_GSUP_IE_SessionState(state),
1169 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiyb761d142018-06-02 21:05:04 +07001170 }
1171);
Harald Weltedf327232017-12-28 22:51:51 +01001172
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001173template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
1174 hexstring imsi,
1175 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1176 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1177 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1178 octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1179) := ts_GSUP(
1180 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1181 {
1182 valueof(ts_GSUP_IE_IMSI(imsi)),
1183 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1184 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1185 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1186 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
1187 }
1188);
1189template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
1190 template hexstring imsi := ?,
1191 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1192 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1193 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1194 template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1195) := tr_GSUP(
1196 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1197 {
1198 tr_GSUP_IE_IMSI(imsi),
1199 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1200 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1201 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001202 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
1203 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001204 }
1205);
1206
1207template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
1208 hexstring imsi,
1209 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1210) := ts_GSUP(
1211 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1212 {
1213 valueof(ts_GSUP_IE_IMSI(imsi)),
1214 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
1215 }
1216);
1217template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
1218 template hexstring imsi := ?,
1219 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1220) := tr_GSUP(
1221 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1222 {
1223 tr_GSUP_IE_IMSI(imsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001224 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1225 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001226 }
1227);
1228
1229template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
1230 hexstring imsi,
1231 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1232 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1233) := ts_GSUP(
1234 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1235 {
1236 valueof(ts_GSUP_IE_IMSI(imsi)),
1237 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1238 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
1239 }
1240);
1241template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
1242 template hexstring imsi := ?,
1243 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1244 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1245) := tr_GSUP(
1246 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1247 {
1248 tr_GSUP_IE_IMSI(imsi),
1249 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001250 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1251 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001252 }
1253);
1254
1255template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
1256 hexstring imsi,
1257 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1258 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1259 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1260 octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1261 OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1262) := ts_GSUP(
1263 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1264 {
1265 /**
1266 * TODO: add MT-specific fields (and IEs):
1267 * - smDeliveryTimer
1268 * - smDeliveryStartTime
1269 */
1270 valueof(ts_GSUP_IE_IMSI(imsi)),
1271 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1272 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1273 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1274 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
1275 valueof(ts_GSUP_IE_SM_RP_MMS(sm_rp_mms))
1276 }
1277);
1278template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
1279 template hexstring imsi := ?,
1280 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1281 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1282 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1283 template octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1284 template OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1285) := tr_GSUP(
1286 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1287 {
1288 /**
1289 * TODO: add MT-specific fields (and IEs):
1290 * - smDeliveryTimer
1291 * - smDeliveryStartTime
1292 */
1293 tr_GSUP_IE_IMSI(imsi),
1294 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1295 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1296 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
1297 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001298 tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),
1299 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001300 }
1301);
1302
1303template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
1304 hexstring imsi,
1305 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1306) := ts_GSUP(
1307 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1308 {
1309 valueof(ts_GSUP_IE_IMSI(imsi)),
1310 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
1311 }
1312);
1313template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
1314 template hexstring imsi := ?,
1315 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1316) := tr_GSUP(
1317 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1318 {
1319 tr_GSUP_IE_IMSI(imsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001320 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1321 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001322 }
1323);
1324
1325template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
1326 hexstring imsi,
1327 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1328 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1329) := ts_GSUP(
1330 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1331 {
1332 valueof(ts_GSUP_IE_IMSI(imsi)),
1333 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1334 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
1335 }
1336);
1337template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
1338 template hexstring imsi := ?,
1339 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1340 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1341) := tr_GSUP(
1342 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1343 {
1344 tr_GSUP_IE_IMSI(imsi),
1345 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001346 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1347 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy8a1d4b62018-09-23 20:28:23 +07001348 }
1349);
1350
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001351template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_REQ(
1352 hexstring imsi,
1353 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1354 GSUP_SM_ALERT_RSN_Type sm_alert_rsn /* SM Alert Reason, see 7.6.8.8 */
1355) := ts_GSUP(
1356 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1357 {
1358 valueof(ts_GSUP_IE_IMSI(imsi)),
1359 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1360 valueof(ts_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn))
1361 }
1362);
1363template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_REQ(
1364 template hexstring imsi := ?,
1365 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1366 template GSUP_SM_ALERT_RSN_Type sm_alert_rsn := ? /* SM Alert Reason, see 7.6.8.8 */
1367) := tr_GSUP(
1368 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1369 {
1370 tr_GSUP_IE_IMSI(imsi),
1371 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001372 tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),
1373 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001374 }
1375);
1376
1377template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_RES(
1378 hexstring imsi,
1379 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1380) := ts_GSUP(
1381 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1382 {
1383 valueof(ts_GSUP_IE_IMSI(imsi)),
1384 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
1385 }
1386);
1387template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_RES(
1388 template hexstring imsi := ?,
1389 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1390) := tr_GSUP(
1391 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1392 {
1393 tr_GSUP_IE_IMSI(imsi),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001394 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1395 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001396 }
1397);
1398
1399template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_ERR(
1400 hexstring imsi,
1401 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1402 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1403) := ts_GSUP(
1404 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1405 {
1406 valueof(ts_GSUP_IE_IMSI(imsi)),
1407 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1408 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
1409 }
1410);
1411template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_ERR(
1412 template hexstring imsi := ?,
1413 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1414 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1415) := tr_GSUP(
1416 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1417 {
1418 tr_GSUP_IE_IMSI(imsi),
1419 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001420 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1421 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
Vadim Yanitskiy88e23232018-11-13 03:04:02 +07001422 }
1423);
1424
Harald Weltef9d449e2018-06-24 22:27:47 +02001425function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
1426 for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {
1427 if (msg.ies[i].tag == iei) {
1428 ret := msg.ies[i].val;
1429 return true;
1430 }
1431 }
1432 return false;
1433}
1434
Neels Hofmeyr0ac63152019-05-07 01:20:17 +02001435template GSUP_AN_APDU t_GSUP_AN_APDU(
1436 template GSUP_AN_PROTO an_proto := ?,
1437 template octetstring pdu := ?
1438) := {
1439 proto := an_proto,
1440 pdu := pdu
1441};
1442
1443template GSUP_PDU tr_GSUP_E_AN_APDU(
1444 template GSUP_MessageType msgt,
1445 template hexstring imsi := ?,
1446 template octetstring source_name := ?,
1447 template octetstring destination_name := ?,
1448 template GSUP_AN_APDU an_apdu := ?
1449) := tr_GSUP(
1450 msgt,
1451 {
1452 tr_GSUP_IE_IMSI(imsi),
1453 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1454 tr_GSUP_IE_Source_Name(source_name),
1455 tr_GSUP_IE_Destination_Name(destination_name),
1456 tr_GSUP_IE_AN_APDU(an_apdu)
1457 }
1458);
1459
1460template GSUP_PDU tr_GSUP_E_NO_PDU(
1461 template GSUP_MessageType msgt,
1462 template hexstring imsi := ?,
1463 template octetstring source_name := ?,
1464 template octetstring destination_name := ?
1465) := tr_GSUP(
1466 msgt,
1467 {
1468 tr_GSUP_IE_IMSI(imsi),
1469 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1470 tr_GSUP_IE_Source_Name(source_name),
1471 tr_GSUP_IE_Destination_Name(destination_name)
1472 }
1473);
1474
1475template (value) GSUP_PDU ts_GSUP_E_AN_APDU(
1476 GSUP_MessageType msgt,
1477 hexstring imsi,
1478 octetstring source_name,
1479 octetstring destination_name,
1480 GSUP_AN_APDU an_apdu
1481) := ts_GSUP(
1482 msgt,
1483 {
1484 valueof(ts_GSUP_IE_IMSI(imsi)),
1485 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1486 valueof(ts_GSUP_IE_Source_Name(source_name)),
1487 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1488 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1489 }
1490);
1491
1492template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(
1493 hexstring imsi,
1494 hexstring msisdn,
1495 octetstring source_name,
1496 octetstring destination_name,
1497 GSUP_AN_APDU an_apdu
1498) := ts_GSUP(
1499 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,
1500 {
1501 valueof(ts_GSUP_IE_IMSI(imsi)),
1502 valueof(ts_GSUP_IE_MSISDN(msisdn)),
1503 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1504 valueof(ts_GSUP_IE_Source_Name(source_name)),
1505 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1506 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1507 }
1508);
Harald Weltef9d449e2018-06-24 22:27:47 +02001509
Harald Weltedf327232017-12-28 22:51:51 +01001510} with { encode "RAW"; variant "FIELDORDER(msb)" }