blob: 3a616a6b3646d96b6c332db3236e0b157af346b4 [file] [log] [blame]
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001module GSUP_Templates {
2
3/* GSUP_Templates, defining TTCN-3 templates 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-2019 by Harald Welte <laforge@gnumonks.org>
9 * contributions by sysmocom - s.f.m.c. GmbH
10 * All rights reserved.
11 *
12 * Released under the terms of GNU General Public License, Version 2 or
13 * (at your option) any later version.
14 *
15 * SPDX-License-Identifier: GPL-2.0-or-later
16 */
17
18import from General_Types all;
19import from Osmocom_Types all;
20import from GSUP_Types all;
21
22function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
23 if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
24 /* if last digit is 'F', then there's an odd number of digits and we must strip the F */
25 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
26 if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
27 gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
28 }
29 }
30}
31
32function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
33 if (ischosen(gsup.ies[0].val.imsi)) {
34 /* if number of digits is odd, add a 'F' as padding at the end */
35 var integer num_digits := lengthof(gsup.ies[0].val.imsi);
36 if (num_digits rem 2 == 1) {
37 gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
38 }
39 }
40}
41
42template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
43 BIT3 ton := '000'B,
44 BIT4 npi := '0000'B) := {
45 len := 0, /* overwritten */
46 /* numberingPlanIdentification := npi,
47 typeOfNumber := ton,
48 ext1 := '0'B, */
49 digits := digits
50}
51
52template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
53 template BIT3 ton := ?,
54 template BIT4 npi := ?) := {
55 len := ?,
56 /* numberingPlanIdentification := npi,
57 typeOfNumber := ton,
58 ext1 := '0'B, */
59 digits := digits
60}
61
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +010062template (value) GSUP_PDP_Address ts_GSUP_PDP_Address_IPv4(template (omit) OCT4 ip_addr) := {
63 ipv4 := {
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +010064 spare := '1111'B,
Pau Espin Pedrola518d052024-01-30 12:35:33 +010065 pdp_typeorg := '0001'B,
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +010066 pdp_typenum := '21'O,
67 ipv4_address := ip_addr
68 }
69}
70template (value) GSUP_PDP_Address ts_EuaIPv4Dyn := ts_GSUP_PDP_Address_IPv4(omit);
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +010071
72template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
73 octetstring kc) := {
74 tag := OSMO_GSUP_AUTH_TUPLE_IE,
75 len := 0, /* overwritten */
76 val := {
77 auth_tuple := {
78 valueof(ts_GSUP_IE_RAND(rand)),
79 valueof(ts_GSUP_IE_SRES(sres)),
80 valueof(ts_GSUP_IE_Kc(kc))
81 }
82 }
83}
84
85template GSUP_IE tr_GSUP_IE_AuthTuple3G(
86 template (present) octetstring rand := ?,
87 template (present) octetstring ik := ?,
88 template (present) octetstring ck := ?,
89 template (present) octetstring autn := ?,
90 template (present) octetstring res := ?) := {
91 tag := OSMO_GSUP_AUTH_TUPLE_IE,
92 len := ?,
93 val := {
94 auth_tuple := {
95 tr_GSUP_IE_RAND(rand),
96 tr_GSUP_IE_IK(ik),
97 tr_GSUP_IE_CK(ck),
98 tr_GSUP_IE_AUTN(autn),
99 tr_GSUP_IE_RES(res)
100 }
101 }
102}
103
104template GSUP_IE ts_GSUP_IE_AuthTuple3G(octetstring rand, octetstring ik,
105 octetstring ck, octetstring autn,
106 octetstring res) := {
107 tag := OSMO_GSUP_AUTH_TUPLE_IE,
108 len := 0, /* overwritten */
109 val := {
110 auth_tuple := {
111 valueof(ts_GSUP_IE_RAND(rand)),
112 valueof(ts_GSUP_IE_IK(ik)),
113 valueof(ts_GSUP_IE_CK(ck)),
114 valueof(ts_GSUP_IE_AUTN(autn)),
115 valueof(ts_GSUP_IE_RES(res))
116 }
117 }
118}
119
120template GSUP_IE tr_GSUP_IE_AuthTuple2G3G(
121 template (present) octetstring rand := ?,
122 template (present) octetstring sres := ?,
123 template (present) octetstring kc := ?,
124 template (present) octetstring ik := ?,
125 template (present) octetstring ck := ?,
126 template (present) octetstring autn := ?,
127 template (present) octetstring res := ?) := {
128 tag := OSMO_GSUP_AUTH_TUPLE_IE,
129 len := ?,
130 val := {
131 auth_tuple := {
132 tr_GSUP_IE_RAND(rand),
133 tr_GSUP_IE_SRES(sres),
134 tr_GSUP_IE_Kc(kc),
135 tr_GSUP_IE_IK(ik),
136 tr_GSUP_IE_CK(ck),
137 tr_GSUP_IE_AUTN(autn),
138 tr_GSUP_IE_RES(res)
139 }
140 }
141}
142
143template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
144 octetstring kc, octetstring ik,
145 octetstring ck, octetstring autn,
146 octetstring res) := {
147 tag := OSMO_GSUP_AUTH_TUPLE_IE,
148 len := 0, /* overwritten */
149 val := {
150 auth_tuple := {
151 valueof(ts_GSUP_IE_RAND(rand)),
152 valueof(ts_GSUP_IE_SRES(sres)),
153 valueof(ts_GSUP_IE_Kc(kc)),
154 valueof(ts_GSUP_IE_IK(ik)),
155 valueof(ts_GSUP_IE_CK(ck)),
156 valueof(ts_GSUP_IE_AUTN(autn)),
157 valueof(ts_GSUP_IE_RES(res))
158 }
159 }
160}
161
Pau Espin Pedrolbb76d7a2024-01-22 19:56:13 +0100162template (value) GSUP_IE ts_GSUP_IE_PdpInfoCompl := {
163 tag := OSMO_GSUP_PDP_INFO_COMPL_IE,
164 len := 0, /* overwritten */
165 val := {
166 pdp_info_compl := ''O
167 }
168}
169
170template (present) GSUP_IE tr_GSUP_IE_PdpInfoCompl := {
171 tag := OSMO_GSUP_PDP_INFO_COMPL_IE,
172 len := 0, /* overwritten */
173 val := {
174 pdp_info_compl := ''O
175 }
176}
177
Pau Espin Pedrolc63fa8e2024-01-22 19:58:09 +0100178template (value) GSUP_IE ts_GSUP_IE_PdpInfo(template (value) OCT1 ctx_id,
179 template (value) octetstring apn,
180 template (value) GSUP_PDP_Address pdp_address,
181 template (value) octetstring pdp_qos) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100182 tag := OSMO_GSUP_PDP_INFO_IE,
183 len := 0, /* overwritten */
184 val := {
185 pdp_info := {
Pau Espin Pedrolc63fa8e2024-01-22 19:58:09 +0100186 valueof(ts_GSUP_IE_PDP_CONTEXT_ID(ctx_id)),
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +0100187 valueof(ts_GSUP_IE_PDP_ADDRESS(pdp_address)),
Pau Espin Pedrolc63fa8e2024-01-22 19:58:09 +0100188 valueof(ts_GSUP_IE_APN(apn)),
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100189 valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
190 }
191 }
192}
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100193template (value) GSUP_IE ts_GSUP_IE_PdpInfo_ie(template (value) GSUP_IEs pdp_info) := {
194 tag := OSMO_GSUP_PDP_INFO_IE,
195 len := 0, /* overwritten */
196 val := {
197 pdp_info := pdp_info
198 }
199}
200
201template (present) GSUP_IE tr_GSUP_IE_PdpInfo(template (present) OCT1 ctx_id,
202 template (present) octetstring apn,
203 template (present) GSUP_PDP_Address pdp_address) := {
204 tag := OSMO_GSUP_PDP_INFO_IE,
205 len := ?,
206 val := {
207 pdp_info := {
208 tr_GSUP_IE_PDP_CONTEXT_ID(ctx_id),
209 tr_GSUP_IE_PDP_ADDRESS(pdp_address),
210 tr_GSUP_IE_APN(apn)
211 }
212 }
213}
214template (present) GSUP_IE tr_GSUP_IE_PdpInfo_ie(template (present) GSUP_IEs pdp_info := ?) := {
215 tag := OSMO_GSUP_PDP_INFO_IE,
216 len := ?,
217 val := {
218 pdp_info := pdp_info
219 }
220}
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100221
Pau Espin Pedrolc63fa8e2024-01-22 19:58:09 +0100222template (value) GSUP_IE ts_GSUP_IE_PDP_CONTEXT_ID(template (value) OCT1 ctx_id) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100223 tag := OSMO_GSUP_PDP_CONTEXT_ID_IE,
224 len := 0,
225 val := {
226 pdp_ctx_id := ctx_id
227 }
228}
229
Pau Espin Pedrolc63fa8e2024-01-22 19:58:09 +0100230template (present) GSUP_IE tr_GSUP_IE_PDP_CONTEXT_ID(template OCT1 ctx_id) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100231 tag := OSMO_GSUP_PDP_CONTEXT_ID_IE,
232 len := ?,
233 val := {
234 pdp_ctx_id := ctx_id
235 }
236}
237
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +0100238template (value) GSUP_IE ts_GSUP_IE_PDP_ADDRESS(template (value) GSUP_PDP_Address pdp_address) := {
239 tag := OSMO_GSUP_PDP_ADDRESS_IE,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100240 len := 0,
241 val := {
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +0100242 pdp_address := pdp_address
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100243 }
244}
245
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100246template (present) GSUP_IE tr_GSUP_IE_PDP_ADDRESS(template (present) GSUP_PDP_Address pdp_address := ?) := {
247 tag := OSMO_GSUP_PDP_ADDRESS_IE,
248 len := ?,
249 val := {
250 pdp_address := pdp_address
251 }
252}
253
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +0100254template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(template (value) octetstring pdp_qos) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100255 tag := OSMO_GSUP_PDP_QOS_IE,
256 len := 0,
257 val := {
258 pdp_qos := pdp_qos
259 }
260}
261
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100262template (present) GSUP_IE tr_GSUP_IE_PDP_QOS(template (present) octetstring pdp_qos := ?) := {
263 tag := OSMO_GSUP_PDP_QOS_IE,
264 len := ?,
265 val := {
266 pdp_qos := pdp_qos
267 }
268}
269
270template (value) GSUP_IE ts_GSUP_IE_Charging_Characteristics(template (value) octetstring charg_char) := {
271 tag := OSMO_GSUP_CHARG_CHAR_IE,
272 len := 0,
273 val := {
274 charg_char := charg_char
275 }
276}
277
278template (present) GSUP_IE tr_GSUP_IE_Charging_Characteristics(template (present) octetstring charg_char := ?) := {
279 tag := OSMO_GSUP_CHARG_CHAR_IE,
280 len := ?,
281 val := {
282 charg_char := charg_char
283 }
284}
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100285
286template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
287 msg_type := msgt,
288 ies := ies
289}
290
291template (present) GSUP_PDU tr_GSUP_IMSI(template (present) GSUP_MessageType msgt := ?, template (present) hexstring imsi := ?) := {
292 msg_type := msgt,
293 ies := { tr_GSUP_IE_IMSI(imsi), * }
294}
295
296template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
297 msg_type := msgt,
298 ies := ies
299}
300
301template (value) GSUP_IMEI ts_GSUP_IMEI(hexstring digits) := {
302 len := 0, /* overwritten */
303 digits := digits
304}
305
306template GSUP_IMEI tr_GSUP_IMEI(template hexstring digits) := {
307 len := ?,
308 digits := digits
309}
310
311
312template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
313 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
314
315template (value) GSUP_PDU ts_GSUP_SAI_REQ_EPS(hexstring imsi) :=
316 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
317 valueof(ts_GSUP_IE_IMSI(imsi)),
318 valueof(ts_GSUP_IE_CURRENT_RAT_TYPE(RAT_TYPE_EUTRAN_SGs))
319 });
320
321template (value) GSUP_PDU ts_GSUP_SAI_REQ_NUM_AUTH(hexstring imsi, OCT1 num_auth_vectors) :=
322 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
323 valueof(ts_GSUP_IE_IMSI(imsi)),
324 valueof(ts_GSUP_IE_NUM_VECTORS_REQ(num_auth_vectors))
325 });
326
327template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
328 tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
329
330template GSUP_PDU tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
331 template hexstring imsi,
332 template octetstring auts,
333 template octetstring rand) :=
334 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
335 tr_GSUP_IE_IMSI(imsi),
336 tr_GSUP_IE_AUTS(auts),
337 tr_GSUP_IE_RAND(rand),
338 *
339 });
340
341template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
342 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
343 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
344
345template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
346 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
347 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
348
349template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
350 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
351 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
352
353
354template GSUP_PDU tr_GSUP_SAI_RES(template (present) hexstring imsi,
355 template (present) GSUP_IE auth_tuple_ie := tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE)) :=
356 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
357 tr_GSUP_IE_IMSI(imsi), *, auth_tuple_ie, * });
358
359template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
360 template octetstring source_name := omit) :=
361 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, dom := dom,
362 source_name := source_name));
363
364template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
365 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
366
367template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi, octetstring destination_name := ''O) :=
368 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)),
369 valueof(ts_GSUP_IE_Destination_Name(destination_name))});
370
371template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi, template octetstring destination_name := omit) :=
372 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, f_gen_tr_ies(imsi, destination_name := destination_name));
373
374template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
375 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
376 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
377
378template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?,
379 template octetstring destination_name := omit) :=
380 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR,
381 f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));
382
383template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn, octetstring destination_name := ''O) :=
384 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
385 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)),
386 valueof(ts_GSUP_IE_Destination_Name(destination_name))});
387
388template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?,
389 template octetstring destination_name := omit) :=
390 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST,
391 f_gen_tr_ies(imsi, msisdn := msisdn, destination_name := destination_name));
392
393template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi,
394 template octetstring source_name := omit,
395 template octetstring destination_name := omit) :=
396 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT,
397 f_gen_ts_ies(imsi, source_name := source_name,
398 destination_name := destination_name));
399
400template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
401 tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
402
403template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
404 tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
405
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +0100406template (present) GSUP_PDU tr_GSUP_CL_REQ(template (present) hexstring imsi := ?,
407 template GSUP_CnDomain dom := omit,
408 template GSUP_CancelType ctype := omit) :=
409 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST,
410 f_gen_tr_ies(imsi,
411 cancel_type := ctype,
412 cn_domain := dom));
413
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100414template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
415 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
416 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
417
418template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
419 tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
420
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +0100421template (value) GSUP_PDU ts_GSUP_CL_RES(template (value) hexstring imsi) :=
422 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, {valueof(ts_GSUP_IE_IMSI(imsi))});
423
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100424template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
425 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
426 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
427
428template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
429 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
430 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
431
432template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
433 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
434 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
435
436template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
437 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
438 valueof(ts_GSUP_IE_IMSI(imsi)) });
439
440template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
441 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
442 tr_GSUP_IE_IMSI(imsi), * });
443
444template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
445 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
446 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
447
448template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei,
449 template (omit) octetstring source_name := omit) :=
450 ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, f_gen_ts_ies(imsi, imei := imei, source_name := source_name));
451
452template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(
453 template hexstring imsi,
454 template hexstring imei
455) := tr_GSUP(
456 OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST,
457 {
458 tr_GSUP_IE_IMSI(imsi),
459 tr_GSUP_IE_IMEI(imei),
460 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT)
461 }
462);
463
464template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_RES(hexstring imsi, GSUP_IMEIResult result) :=
465 ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
466 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI_Result(result)) });
467
468template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result,
469 template octetstring destination_name := omit) :=
470 tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT,
471 f_gen_tr_ies(imsi, imei_result := result, destination_name := destination_name));
472
473template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer cause) :=
474 ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
475 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
476
477template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause,
478 template octetstring destination_name := omit) :=
479 tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));
480
481
482/* EPDG Tunnel */
483template (value) GSUP_PDU ts_GSUP_EPDGTunnel_REQ(hexstring imsi,
484 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
485 GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
486 template (omit) octetstring source_name := omit) :=
487 ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST, f_gen_ts_ies(imsi,
488 message_class := message_class,
489 dom := dom,
490 source_name := source_name));
491
492template (present) GSUP_PDU tr_GSUP_EPDGTunnel_REQ(template (present) hexstring imsi := ?,
493 template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG) :=
494 tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST,
495 f_gen_tr_ies(imsi,
496 message_class := message_class));
497
498
499template (value) GSUP_PDU ts_GSUP_EPDGTunnel_RES(hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100500 template (value) GSUP_IEs pdp_info,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100501 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
502 octetstring destination_name := ''O) :=
503 ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT, {
504 valueof(ts_GSUP_IE_IMSI(imsi)),
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100505 valueof(ts_GSUP_IE_PdpInfoCompl),
506 valueof(ts_GSUP_IE_PdpInfo_ie(pdp_info)),
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100507 valueof(ts_GSUP_IE_Message_Class(message_class)),
508 valueof(ts_GSUP_IE_Destination_Name(destination_name))
509 });
510
511template (present) GSUP_PDU tr_GSUP_EPDGTunnel_RES(template (present) hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100512 template (present) GSUP_IEs pdp_info,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100513 template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
514 template octetstring destination_name := omit) :=
515 tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT,
516 f_gen_tr_ies(imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100517 pdp_info_compl := true,
518 pdp_info := pdp_info,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100519 message_class := message_class,
520 destination_name := destination_name));
521
522template (value) GSUP_PDU ts_GSUP_EPDGTunnel_ERR(hexstring imsi,
523 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
524 integer cause := 0) :=
525 ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR, {
526 valueof(ts_GSUP_IE_IMSI(imsi)),
527 valueof(ts_GSUP_IE_Cause(cause)),
528 valueof(ts_GSUP_IE_Message_Class(message_class))
529 });
530
531template (present) GSUP_PDU tr_GSUP_EPDGTunnel_ERR(template (present) hexstring imsi,
532 template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
533 template (present) integer cause := ?,
534 template octetstring destination_name := omit) :=
535 tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR,
536 f_gen_tr_ies(imsi,
537 message_class := message_class,
538 cause := cause,
539 destination_name := destination_name));
540
541
542template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
543 tag := OSMO_GSUP_CANCEL_TYPE_IE,
544 len := 0, /* overwritten */
545 val := {
546 cancel_type := ctype
547 }
548}
549
550template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
551 tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
552
553template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
554 tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
555
556template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
557 tag := iei,
558 len := ?,
559 val := val
560}
561
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +0100562template (value) GSUP_IE ts_GSUP_IE_IMSI(template (value) hexstring imsi) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100563 tag := OSMO_GSUP_IMSI_IE,
564 len := 0, /* overwritten */
565 val := {
566 imsi := imsi
567 }
568}
569
570template (present) GSUP_IE tr_GSUP_IE_IMSI(template (present) hexstring imsi := ?) := {
571 tag := OSMO_GSUP_IMSI_IE,
572 len := ?,
573 val := {
574 imsi := imsi
575 }
576}
577
578template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
579 tag := OSMO_GSUP_MSISDN_IE,
580 len := 0, /* overwritten */
581 val := {
582 msisdn := ts_GSUP_MSISDN(msisdn)
583 }
584}
585
586template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
587 tag := OSMO_GSUP_MSISDN_IE,
588 len := ?,
589 val := {
590 msisdn := tr_GSUP_MSISDN(msisdn)
591 }
592}
593
594
595template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
596 tag := OSMO_GSUP_CAUSE_IE,
597 len := 0, /* overwritten */
598 val := {
599 cause := cause
600 }
601}
602
603template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
604 tag := OSMO_GSUP_CAUSE_IE,
605 len := ?,
606 val := {
607 cause := cause
608 }
609}
610
611template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
612 tag := OSMO_GSUP_AUTS_IE,
613 len := 0, /* overwritten */
614 val := {
615 auts := auts
616 }
617}
618
619template GSUP_IE tr_GSUP_IE_AUTS(template octetstring auts) := {
620 tag := OSMO_GSUP_AUTS_IE,
621 len := ?,
622 val := {
623 auts := auts
624 }
625}
626
627template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
628 tag := OSMO_GSUP_RAND_IE,
629 len := 0, /* overwritten */
630 val := {
631 rand := rand
632 }
633}
634
635template GSUP_IE tr_GSUP_IE_RAND(template octetstring rand := ?) := {
636 tag := OSMO_GSUP_RAND_IE,
637 len := ?,
638 val := {
639 rand := rand
640 }
641}
642
643template (present) GSUP_IE tr_GSUP_IE_SRES(template (present) octetstring sres := ?) := {
644 tag := OSMO_GSUP_SRES_IE,
645 len := ?,
646 val := {
647 sres := sres
648 }
649}
650
651template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
652 tag := OSMO_GSUP_SRES_IE,
653 len := 0, /* overwritten */
654 val := {
655 sres := sres
656 }
657}
658
659template (present) GSUP_IE tr_GSUP_IE_Kc(template (present) octetstring kc := ?) := {
660 tag := OSMO_GSUP_KC_IE,
661 len := ?,
662 val := {
663 kc := kc
664 }
665}
666
667template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
668 tag := OSMO_GSUP_KC_IE,
669 len := 0, /* overwritten */
670 val := {
671 kc := kc
672 }
673}
674
675template (present) GSUP_IE tr_GSUP_IE_IK(template (present) octetstring ik := ?) := {
676 tag := OSMO_GSUP_IK_IE,
677 len := ?,
678 val := {
679 ik := ik
680 }
681}
682
683template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
684 tag := OSMO_GSUP_IK_IE,
685 len := 0, /* overwritten */
686 val := {
687 ik := ik
688 }
689}
690
691template (present) GSUP_IE tr_GSUP_IE_CK(template (present) octetstring ck := ?) := {
692 tag := OSMO_GSUP_CK_IE,
693 len := ?,
694 val := {
695 ck := ck
696 }
697}
698
699template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
700 tag := OSMO_GSUP_CK_IE,
701 len := 0, /* overwritten */
702 val := {
703 ck := ck
704 }
705}
706
707template (present) GSUP_IE tr_GSUP_IE_AUTN(template (present) octetstring autn := ?) := {
708 tag := OSMO_GSUP_AUTN_IE,
709 len := ?,
710 val := {
711 autn := autn
712 }
713}
714
715template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
716 tag := OSMO_GSUP_AUTN_IE,
717 len := 0, /* overwritten */
718 val := {
719 autn := autn
720 }
721}
722
723template (present) GSUP_IE tr_GSUP_IE_RES(template (present) octetstring res := ?) := {
724 tag := OSMO_GSUP_RES_IE,
725 len := ?,
726 val := {
727 res := res
728 }
729}
730
731template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
732 tag := OSMO_GSUP_RES_IE,
733 len := 0, /* overwritten */
734 val := {
735 res := res
736 }
737}
738
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +0100739template (value) GSUP_IE ts_GSUP_IE_APN(template (value) octetstring apn) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100740 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
741 len := 0, /* overwritten */
742 val := {
743 apn := apn
744 }
745}
746
747template GSUP_IE tr_GSUP_IE_APN(template octetstring apn) := {
748 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
749 len := ?,
750 val := {
751 apn := apn
752 }
753}
754
755template GSUP_IE ts_GSUP_IE_CnDomain(template GSUP_CnDomain dom) := {
756 tag := OSMO_GSUP_CN_DOMAIN_IE,
757 len := 0, /* overwritten */
758 val := {
759 cn_domain := dom
760 }
761}
762
763template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
764 tag := OSMO_GSUP_SESSION_ID_IE,
765 len := 0, /* overwritten */
766 val := {
767 session_id := sid
768 }
769}
770template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
771 tag := OSMO_GSUP_SESSION_ID_IE,
772 len := ?,
773 val := {
774 session_id := sid
775 }
776}
777
778template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
779 tag := OSMO_GSUP_SESSION_STATE_IE,
780 len := 0, /* overwritten */
781 val := {
782 session_state := state
783 }
784}
785template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
786 tag := OSMO_GSUP_SESSION_STATE_IE,
787 len := ?,
788 val := {
789 session_state := state
790 }
791}
792
793template (value) GSUP_IE ts_GSUP_IE_SM_RP_MR(OCT1 ref) := {
794 tag := OSMO_GSUP_SM_RP_MR_IE,
795 len := 0, /* overwritten */
796 val := {
797 sm_rp_mr := ref
798 }
799}
800template GSUP_IE tr_GSUP_IE_SM_RP_MR(template OCT1 ref) := {
801 tag := OSMO_GSUP_SM_RP_MR_IE,
802 len := ?,
803 val := {
804 sm_rp_mr := ref
805 }
806}
807
808template (value) GSUP_IE ts_GSUP_IE_SM_RP_CAUSE(OCT1 cause) := {
809 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
810 len := 0, /* overwritten */
811 val := {
812 sm_rp_cause := cause
813 }
814}
815template GSUP_IE tr_GSUP_IE_SM_RP_CAUSE(template OCT1 cause) := {
816 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
817 len := ?,
818 val := {
819 sm_rp_cause := cause
820 }
821}
822
823template (value) GSUP_IE ts_GSUP_IE_SM_RP_MMS(OCT1 mms) := {
824 tag := OSMO_GSUP_SM_RP_MMS_IE,
825 len := 0, /* overwritten */
826 val := {
827 sm_rp_mms := mms
828 }
829}
830template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
831 tag := OSMO_GSUP_SM_RP_MMS_IE,
832 len := ?,
833 val := {
834 sm_rp_mms := mms
835 }
836}
837
838template (value) GSUP_IE ts_GSUP_IE_IMEI(hexstring imei) := {
839 tag := OSMO_GSUP_IMEI_IE,
840 len := 0, /* overwritten */
841 val := {
842 imei := ts_GSUP_IMEI(imei)
843 }
844}
845template GSUP_IE tr_GSUP_IE_IMEI(template hexstring imei) := {
846 tag := OSMO_GSUP_IMEI_IE,
847 len := ?,
848 val := {
849 imei := tr_GSUP_IMEI(imei)
850 }
851}
852
853template (value) GSUP_IE ts_GSUP_IE_IMEI_Result(GSUP_IMEIResult result) := {
854 tag := OSMO_GSUP_IMEI_RESULT_IE,
855 len := 0, /* overwritten */
856 val := {
857 imei_result := result
858 }
859}
860template GSUP_IE tr_GSUP_IE_IMEI_Result(template GSUP_IMEIResult result) := {
861 tag := OSMO_GSUP_IMEI_RESULT_IE,
862 len := ?,
863 val := {
864 imei_result := result
865 }
866}
867
868template (value) GSUP_IE ts_GSUP_IE_NUM_VECTORS_REQ(OCT1 num) := {
869 tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
870 len := 0, /* overwritten */
871 val := {
872 num_auth_vectors := num
873 }
874}
875template GSUP_IE tr_GSUP_IE_NUM_VECTORS_REQ(template OCT1 num) := {
876 tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
877 len := ?,
878 val := {
879 num_auth_vectors := num
880 }
881}
882
883/* See 3GPP TS 24.011, figures 8.5 and 8.6 */
884private function f_pad_SM_RP_Addr(template hexstring number)
885return template hexstring {
886 if (isvalue(number) and not istemplatekind(number, "omit")) {
887 return f_pad_bcd_number(valueof(number));
888 } else {
889 return number;
890 }
891}
892
893template GSUP_SM_RP_Addr t_GSUP_SM_RP_Addr(template hexstring number,
894 template BIT4 npi := '0001'B,
895 template BIT3 ton := '001'B,
896 template BIT1 ext := '1'B) := {
897 ext := ext,
898 ton := ton,
899 npi := npi,
900 /* Work around TITAN's padding problems: encoding works fine,
901 * but it does not consider 'F'H as padding in decoded data. */
902 number := f_pad_SM_RP_Addr(number)
903}
904
905/**
906 * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
907 * It can be either of the following:
908 * - IMSI
909 * - LMSI (not implemented)
910 * - MSISDN
911 * - roaming number (not implemented)
912 * - service centre address
913 */
914template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
915 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
916 id_enc := { imsi := imsi }
917}
918template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
919 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
920 id_enc := { imsi := imsi }
921}
922
923template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
924 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
925 id_enc := { msisdn := msisdn }
926}
927template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
928 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
929 id_enc := { msisdn := msisdn }
930}
931
932template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
933 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
934 id_enc := { smsc_addr := smsc_addr }
935}
936template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
937 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
938 id_enc := { smsc_addr := smsc_addr }
939}
940
941template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_NULL := {
942 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
943 id_enc := omit
944}
945template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_NULL := {
946 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
947 id_enc := omit
948}
949
950template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
951 tag := OSMO_GSUP_SM_RP_DA_IE,
952 len := 0, /* overwritten */
953 val := {
954 sm_rp_da := val
955 }
956}
957template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
958 tag := OSMO_GSUP_SM_RP_DA_IE,
959 len := ?,
960 val := {
961 sm_rp_da := val
962 }
963}
964
965/**
966 * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
967 * It can be either of the following:
968 * - MSISDN
969 * - service centre address
970 */
971template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
972 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
973 id_enc := { msisdn := msisdn }
974}
975template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
976 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
977 id_enc := { msisdn := msisdn }
978}
979
980template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
981 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
982 id_enc := { smsc_addr := smsc_addr }
983}
984template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
985 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
986 id_enc := { smsc_addr := smsc_addr }
987}
988
989template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_NULL := {
990 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
991 id_enc := omit
992}
993template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_NULL := {
994 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
995 id_enc := omit
996}
997
998template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
999 tag := OSMO_GSUP_SM_RP_OA_IE,
1000 len := 0, /* overwritten */
1001 val := {
1002 sm_rp_oa := val
1003 }
1004}
1005template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
1006 tag := OSMO_GSUP_SM_RP_OA_IE,
1007 len := ?,
1008 val := {
1009 sm_rp_oa := val
1010 }
1011}
1012
1013/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
1014template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
1015 tag := OSMO_GSUP_SM_RP_UI_IE,
1016 len := 0, /* overwritten */
1017 val := {
1018 sm_rp_ui := val
1019 }
1020}
1021template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
1022 tag := OSMO_GSUP_SM_RP_UI_IE,
1023 len := ?,
1024 val := {
1025 sm_rp_ui := val
1026 }
1027}
1028
1029/* SM Alert Reason IE (used in READY-FOR-SM), see 7.6.8.8 */
1030template (value) GSUP_IE ts_GSUP_IE_SM_ALERT_RSN(GSUP_SM_ALERT_RSN_Type rsn) := {
1031 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
1032 len := 0, /* overwritten */
1033 val := {
1034 sm_alert_rsn := rsn
1035 }
1036}
1037template GSUP_IE tr_GSUP_IE_SM_ALERT_RSN(template GSUP_SM_ALERT_RSN_Type rsn) := {
1038 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
1039 len := ?,
1040 val := {
1041 sm_alert_rsn := rsn
1042 }
1043}
1044
1045template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
1046 tag := OSMO_GSUP_SS_INFO_IE,
1047 len := 0, /* overwritten */
1048 val := {
1049 ss_info := ss
1050 }
1051}
1052template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
1053 tag := OSMO_GSUP_SS_INFO_IE,
1054 len := ?,
1055 val := {
1056 ss_info := ss
1057 }
1058}
1059
1060template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
1061 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1062 len := ?,
1063 val := {
1064 message_class := val
1065 }
1066}
1067
1068template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
1069 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1070 len := 0, /* overwritten */
1071 val := {
1072 message_class := val
1073 }
1074}
1075
1076template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
1077 tag := OSMO_GSUP_SOURCE_NAME_IE,
1078 len := ?,
1079 val := {
1080 source_name := name
1081 }
1082}
1083
1084template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
1085 tag := OSMO_GSUP_SOURCE_NAME_IE,
1086 len := 0, /* overwritten */
1087 val := {
1088 source_name := name
1089 }
1090}
1091
1092template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
1093 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1094 len := ?,
1095 val := {
1096 destination_name := name
1097 }
1098}
1099
1100template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
1101 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1102 len := 0, /* overwritten */
1103 val := {
1104 destination_name := name
1105 }
1106}
1107
1108template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {
1109 tag := OSMO_GSUP_AN_APDU_IE,
1110 len := ?,
1111 val := {
1112 an_apdu := an_apdu
1113 }
1114}
1115
1116template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {
1117 tag := OSMO_GSUP_AN_APDU_IE,
1118 len := 0, /* overwritten */
1119 val := {
1120 an_apdu := an_apdu
1121 }
1122}
1123
1124template (present) GSUP_IE tr_GSUP_IE_SUPPORTED_RAT_TYPES(template (present) GSUP_RatTypes ratt) := {
1125 tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
1126 len := ?,
1127 val := {
1128 supported_rat_types := ratt
1129 }
1130}
1131template (value) GSUP_IE ts_GSUP_IE_SUPPORTED_RAT_TYPES(GSUP_RatTypes ratt) := {
1132 tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
1133 len := 0, /* overwritten */
1134 val := {
1135 supported_rat_types := ratt
1136 }
1137}
1138
1139template (present) GSUP_IE tr_GSUP_IE_CURRENT_RAT_TYPE(template (present) GSUP_RatType ratt) := {
1140 tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
1141 len := ?,
1142 val := {
1143 current_rat_type := ratt
1144 }
1145}
1146template (value) GSUP_IE ts_GSUP_IE_CURRENT_RAT_TYPE(GSUP_RatType ratt) := {
1147 tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
1148 len := 0, /* overwritten */
1149 val := {
1150 current_rat_type := ratt
1151 }
1152}
1153
1154private function f_gen_ts_ies(hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001155 template (omit) boolean pdp_info_compl := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001156 template (omit) GSUP_Message_Class message_class := omit,
1157 template (omit) hexstring imei := omit,
1158 template (omit) GSUP_CnDomain dom := omit,
1159 template (omit) octetstring source_name := omit,
1160 template (omit) octetstring destination_name := omit
1161 ) return GSUP_IEs {
1162 var GSUP_IEs ies := {
1163 valueof(ts_GSUP_IE_IMSI(imsi))
1164 };
1165
1166 if (isvalue(dom)) {
1167 ies := ies & { valueof(ts_GSUP_IE_CnDomain(dom)) };
1168 }
1169
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001170 if (isvalue(pdp_info_compl) and valueof(pdp_info_compl)) {
1171 ies := ies & { valueof(ts_GSUP_IE_PdpInfoCompl) };
1172 }
1173
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001174 if (isvalue(imei)) {
1175 ies := ies & { valueof(ts_GSUP_IE_IMEI(valueof(imei))) };
1176 }
1177
1178 if (isvalue(message_class)) {
1179 ies := ies & { valueof(ts_GSUP_IE_Message_Class(valueof(message_class))) };
1180 }
1181
1182 if (isvalue(source_name)) {
1183 ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
1184 }
1185
1186 if (isvalue(destination_name)) {
1187 ies := ies & { valueof(ts_GSUP_IE_Destination_Name(valueof(destination_name))) };
1188 }
1189
1190 return ies;
1191}
1192
1193private function f_gen_tr_ies(template hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001194 template boolean pdp_info_compl := omit,
1195 template GSUP_IEs pdp_info := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001196 template GSUP_Message_Class message_class := omit,
1197 template integer cause := omit,
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001198 template GSUP_CancelType cancel_type := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001199 template hexstring msisdn := omit,
1200 template GSUP_IMEIResult imei_result := omit,
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001201 template GSUP_CnDomain cn_domain := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001202 template octetstring source_name := omit,
1203 template octetstring destination_name := omit
1204 ) return template GSUP_IEs {
1205 var template GSUP_IEs ies := {
1206 tr_GSUP_IE_IMSI(imsi)
1207 };
1208 var integer idx := 1;
1209
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001210 if (not istemplatekind(msisdn, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001211 ies[idx] := tr_GSUP_IE_MSISDN(msisdn);
1212 idx := idx + 1;
1213 }
1214
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001215 if (not istemplatekind(cause, "omit")) {
1216 ies[idx] := tr_GSUP_IE_Cause(cause);
1217 idx := idx + 1;
1218 }
1219
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001220 if (not istemplatekind(cancel_type, "omit")) {
1221 ies[idx] := tr_GSUP_IE_CancelType(cancel_type);
1222 idx := idx + 1;
1223 }
1224
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001225 if (not istemplatekind(pdp_info_compl, "omit")) {
1226 ies[idx] := tr_GSUP_IE_PdpInfoCompl;
1227 idx := idx + 1;
1228 }
1229
1230 if (not istemplatekind(pdp_info, "omit")) {
1231 ies[idx] := tr_GSUP_IE_PdpInfo_ie(pdp_info);
1232 idx := idx + 1;
1233 }
1234
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001235 if (not istemplatekind(cn_domain, "omit")) {
1236 ies[idx] := tr_GSUP_IE_CnDomain(cn_domain);
1237 idx := idx + 1;
1238 }
1239
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001240 if (not istemplatekind(imei_result, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001241 ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);
1242 idx := idx + 1;
1243 }
1244
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001245 if (not istemplatekind(message_class, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001246 ies[idx] := tr_GSUP_IE_Message_Class(message_class);
1247 idx := idx + 1;
1248 }
1249
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001250 if (not istemplatekind(source_name, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001251 ies[idx] := tr_GSUP_IE_Source_Name(source_name);
1252 idx := idx + 1;
1253 }
1254
1255 ies[idx] := *;
1256 idx := idx + 1;
1257
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001258 if (not istemplatekind(destination_name, "omit")) {
1259 if (istemplatekind(destination_name, "*")) {
1260 ies[idx] := *;
1261 } else {
1262 ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
1263 }
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001264 idx := idx + 1;
1265 }
1266
1267 return ies;
1268}
1269
1270private function f_gen_ts_ss_ies(
1271 hexstring imsi,
1272 OCT4 sid,
1273 GSUP_SessionState state,
1274 template (omit) octetstring ss := omit,
1275 template (omit) integer cause := omit,
1276 template octetstring source_name := omit
1277) return GSUP_IEs {
1278 /* Mandatory IEs */
1279 var GSUP_IEs ies := {
1280 valueof(ts_GSUP_IE_IMSI(imsi))
1281 };
1282
1283 /* Cause IE is needed for PROC_SS_ERR */
1284 if (isvalue(cause)) {
1285 ies := ies & { valueof(ts_GSUP_IE_Cause(valueof(cause))) };
1286 }
1287
1288 /* Mandatory session IEs */
1289 ies := ies & { valueof(ts_GSUP_IE_SessionId(sid)) };
1290 ies := ies & { valueof(ts_GSUP_IE_SessionState(state)) };
1291
1292 /* Optional SS payload */
1293 if (isvalue(ss)) {
1294 ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
1295 }
1296
1297 if (isvalue(source_name)) {
1298 ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
1299 }
1300
1301 return ies;
1302}
1303private function f_gen_tr_ss_ies(
1304 template hexstring imsi,
1305 template OCT4 sid := ?,
1306 template GSUP_SessionState state := ?,
1307 template octetstring ss := omit,
1308 template integer cause := omit,
1309 template octetstring destination_name := omit
1310) return template GSUP_IEs {
1311 /* Mandatory IEs */
1312 var template GSUP_IEs ies := {
1313 tr_GSUP_IE_IMSI(imsi)
1314 };
1315 var integer idx := 1;
1316
1317 /* Cause IE is needed for PROC_SS_ERR */
1318 if (istemplatekind(cause, "*")) {
1319 ies[idx] := *;
1320 idx := idx + 1;
1321 } else if (not istemplatekind(cause, "omit")) {
1322 ies[idx] := tr_GSUP_IE_Cause(cause);
1323 idx := idx + 1;
1324 }
1325
1326 /* Mandatory session IEs */
1327 ies[idx] := tr_GSUP_IE_SessionId(sid);
1328 ies[idx + 1] := tr_GSUP_IE_SessionState(state);
1329 idx := idx + 2;
1330
1331 /* Optional SS payload */
1332 if (istemplatekind(ss, "*")) {
1333 ies[idx] := *;
1334 idx := idx + 1;
1335 } else if (not istemplatekind(ss, "omit")) {
1336 ies[idx] := tr_GSUP_IE_SSInfo(ss);
1337 idx := idx + 1;
1338 }
1339
1340 if (isvalue(destination_name)) {
1341 ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
1342 idx := idx + 1;
1343 }
1344
1345 /* the GSUP Message Class IE is optional, as old implementations don't have it yet */
1346 var template GSUP_IEs ies2 := ies;
1347 ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
1348 idx := idx + 1;
1349
1350 return (ies, ies2);
1351}
1352
1353template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
1354 hexstring imsi,
1355 OCT4 sid,
1356 GSUP_SessionState state,
1357 template (omit) octetstring ss := omit,
1358 template (omit) octetstring source_name := omit
1359) := ts_GSUP(
1360 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
1361 f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)
1362);
1363template GSUP_PDU tr_GSUP_PROC_SS_REQ(
1364 template hexstring imsi,
1365 template OCT4 sid := ?,
1366 template GSUP_SessionState state := ?,
1367 template octetstring ss := *
1368) := tr_GSUP(
1369 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
1370 f_gen_tr_ss_ies(imsi, sid, state, ss)
1371);
1372
1373template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
1374 hexstring imsi,
1375 OCT4 sid,
1376 GSUP_SessionState state,
1377 template (omit) octetstring ss := omit
1378) := ts_GSUP(
1379 OSMO_GSUP_MSGT_PROC_SS_RESULT,
1380 f_gen_ts_ss_ies(imsi, sid, state, ss)
1381);
1382template GSUP_PDU tr_GSUP_PROC_SS_RES(
1383 template hexstring imsi,
1384 template OCT4 sid := ?,
1385 template GSUP_SessionState state := ?,
1386 template octetstring ss := *,
1387 template octetstring destination_name := omit
1388) := tr_GSUP(
1389 OSMO_GSUP_MSGT_PROC_SS_RESULT,
1390 f_gen_tr_ss_ies(imsi, sid, state, ss, destination_name := destination_name)
1391);
1392
1393template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
1394 hexstring imsi,
1395 OCT4 sid,
1396 GSUP_SessionState state,
1397 integer cause
1398) := ts_GSUP(
1399 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1400 f_gen_ts_ss_ies(imsi, sid, state, cause := cause)
1401);
1402template GSUP_PDU tr_GSUP_PROC_SS_ERR(
1403 template hexstring imsi,
1404 template OCT4 sid := ?,
1405 template GSUP_SessionState state := ?,
1406 template integer cause := ?
1407) := tr_GSUP(
1408 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1409 f_gen_tr_ss_ies(imsi, sid, state, cause := cause)
1410);
1411
1412template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
1413 hexstring imsi,
1414 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1415 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1416 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1417 octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1418) := ts_GSUP(
1419 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1420 {
1421 valueof(ts_GSUP_IE_IMSI(imsi)),
1422 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1423 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1424 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1425 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
1426 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1427 }
1428);
1429template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
1430 template hexstring imsi := ?,
1431 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1432 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1433 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1434 template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1435) := tr_GSUP(
1436 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1437 {
1438 tr_GSUP_IE_IMSI(imsi),
1439 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1440 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1441 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
1442 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
1443 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1444 tr_GSUP_IE_Source_Name(?)
1445 }
1446);
1447
1448template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
1449 hexstring imsi,
1450 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1451) := ts_GSUP(
1452 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1453 {
1454 valueof(ts_GSUP_IE_IMSI(imsi)),
1455 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1456 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1457 }
1458);
1459template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
1460 template hexstring imsi := ?,
1461 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1462) := tr_GSUP(
1463 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1464 {
1465 tr_GSUP_IE_IMSI(imsi),
1466 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1467 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1468 tr_GSUP_IE_Source_Name(?)
1469 }
1470);
1471
1472template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
1473 hexstring imsi,
1474 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1475 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1476) := ts_GSUP(
1477 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1478 {
1479 valueof(ts_GSUP_IE_IMSI(imsi)),
1480 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1481 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
1482 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1483 }
1484);
1485template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
1486 template hexstring imsi := ?,
1487 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1488 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1489) := tr_GSUP(
1490 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1491 {
1492 tr_GSUP_IE_IMSI(imsi),
1493 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1494 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1495 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1496 tr_GSUP_IE_Source_Name(?)
1497 }
1498);
1499
1500template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
1501 hexstring imsi,
1502 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1503 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1504 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1505 octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1506 OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1507) := ts_GSUP(
1508 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1509 {
1510 /**
1511 * TODO: add MT-specific fields (and IEs):
1512 * - smDeliveryTimer
1513 * - smDeliveryStartTime
1514 */
1515 valueof(ts_GSUP_IE_IMSI(imsi)),
1516 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1517 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1518 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1519 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
1520 valueof(ts_GSUP_IE_SM_RP_MMS(sm_rp_mms)),
1521 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1522 }
1523);
1524template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
1525 template hexstring imsi := ?,
1526 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1527 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1528 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1529 template octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1530 template OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1531) := tr_GSUP(
1532 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1533 {
1534 /**
1535 * TODO: add MT-specific fields (and IEs):
1536 * - smDeliveryTimer
1537 * - smDeliveryStartTime
1538 */
1539 tr_GSUP_IE_IMSI(imsi),
1540 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1541 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1542 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
1543 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
1544 tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),
1545 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1546 tr_GSUP_IE_Source_Name(?)
1547 }
1548);
1549
1550template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
1551 hexstring imsi,
1552 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1553) := ts_GSUP(
1554 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1555 {
1556 valueof(ts_GSUP_IE_IMSI(imsi)),
1557 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1558 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1559 }
1560);
1561template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
1562 template hexstring imsi := ?,
1563 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1564) := tr_GSUP(
1565 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1566 {
1567 tr_GSUP_IE_IMSI(imsi),
1568 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1569 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1570 tr_GSUP_IE_Source_Name(?)
1571 }
1572);
1573
1574template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
1575 hexstring imsi,
1576 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1577 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1578) := ts_GSUP(
1579 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1580 {
1581 valueof(ts_GSUP_IE_IMSI(imsi)),
1582 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1583 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
1584 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1585 }
1586);
1587template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
1588 template hexstring imsi := ?,
1589 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1590 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1591) := tr_GSUP(
1592 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1593 {
1594 tr_GSUP_IE_IMSI(imsi),
1595 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1596 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1597 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1598 tr_GSUP_IE_Source_Name(?)
1599 }
1600);
1601
1602template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_REQ(
1603 hexstring imsi,
1604 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1605 GSUP_SM_ALERT_RSN_Type sm_alert_rsn /* SM Alert Reason, see 7.6.8.8 */
1606) := ts_GSUP(
1607 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1608 {
1609 valueof(ts_GSUP_IE_IMSI(imsi)),
1610 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1611 valueof(ts_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn)),
1612 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1613 }
1614);
1615template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_REQ(
1616 template hexstring imsi := ?,
1617 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1618 template GSUP_SM_ALERT_RSN_Type sm_alert_rsn := ? /* SM Alert Reason, see 7.6.8.8 */
1619) := tr_GSUP(
1620 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1621 {
1622 tr_GSUP_IE_IMSI(imsi),
1623 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1624 tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),
1625 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1626 tr_GSUP_IE_Source_Name(?)
1627 }
1628);
1629
1630template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_RES(
1631 hexstring imsi,
1632 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1633) := ts_GSUP(
1634 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1635 {
1636 valueof(ts_GSUP_IE_IMSI(imsi)),
1637 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1638 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1639 }
1640);
1641template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_RES(
1642 template hexstring imsi := ?,
1643 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1644) := tr_GSUP(
1645 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1646 {
1647 tr_GSUP_IE_IMSI(imsi),
1648 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1649 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1650 tr_GSUP_IE_Source_Name(?)
1651 }
1652);
1653
1654template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_ERR(
1655 hexstring imsi,
1656 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1657 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1658) := ts_GSUP(
1659 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1660 {
1661 valueof(ts_GSUP_IE_IMSI(imsi)),
1662 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1663 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
1664 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1665 }
1666);
1667template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_ERR(
1668 template hexstring imsi := ?,
1669 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1670 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1671) := tr_GSUP(
1672 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1673 {
1674 tr_GSUP_IE_IMSI(imsi),
1675 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1676 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1677 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1678 tr_GSUP_IE_Source_Name(?)
1679 }
1680);
1681
1682function f_gsup_find_nested_ie_multiple(GSUP_IEs ies, GSUP_IEI iei, integer nth, out GSUP_IeValue ret) return boolean {
1683 var integer current := 0;
1684 for (var integer i := 0; i < sizeof(ies); i := i+1) {
1685 if (ies[i].tag == iei) {
1686 if (current == nth) {
1687 ret := ies[i].val;
1688 return true;
1689 } else {
1690 current := current + 1;
1691 }
1692 }
1693 }
1694 return false;
1695}
1696
1697function f_gsup_find_nested_ie(GSUP_IEs ies, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
1698 for (var integer i := 0; i < sizeof(ies); i := i+1) {
1699 if (ies[i].tag == iei) {
1700 ret := ies[i].val;
1701 return true;
1702 }
1703 }
1704 return false;
1705}
1706
1707function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
1708 return f_gsup_find_nested_ie(msg.ies, iei, ret);
1709}
1710
1711template GSUP_AN_APDU t_GSUP_AN_APDU(
1712 template GSUP_AN_PROTO an_proto := ?,
1713 template octetstring pdu := ?
1714) := {
1715 proto := an_proto,
1716 pdu := pdu
1717};
1718
1719template GSUP_PDU tr_GSUP_E_AN_APDU(
1720 template GSUP_MessageType msgt,
1721 template hexstring imsi := ?,
1722 template octetstring source_name := ?,
1723 template octetstring destination_name := ?,
1724 template GSUP_AN_APDU an_apdu := ?
1725) := tr_GSUP(
1726 msgt,
1727 {
1728 tr_GSUP_IE_IMSI(imsi),
1729 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1730 tr_GSUP_IE_Source_Name(source_name),
1731 tr_GSUP_IE_Destination_Name(destination_name),
1732 tr_GSUP_IE_AN_APDU(an_apdu)
1733 }
1734);
1735
1736template GSUP_PDU tr_GSUP_E_NO_PDU(
1737 template GSUP_MessageType msgt,
1738 template hexstring imsi := ?,
1739 template octetstring source_name := ?,
1740 template octetstring destination_name := ?
1741) := tr_GSUP(
1742 msgt,
1743 {
1744 tr_GSUP_IE_IMSI(imsi),
1745 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1746 tr_GSUP_IE_Source_Name(source_name),
1747 tr_GSUP_IE_Destination_Name(destination_name)
1748 }
1749);
1750
1751template (value) GSUP_PDU ts_GSUP_E_AN_APDU(
1752 GSUP_MessageType msgt,
1753 hexstring imsi,
1754 octetstring source_name,
1755 octetstring destination_name,
1756 GSUP_AN_APDU an_apdu
1757) := ts_GSUP(
1758 msgt,
1759 {
1760 valueof(ts_GSUP_IE_IMSI(imsi)),
1761 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1762 valueof(ts_GSUP_IE_Source_Name(source_name)),
1763 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1764 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1765 }
1766);
1767
1768template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(
1769 hexstring imsi,
1770 hexstring msisdn,
1771 octetstring source_name,
1772 octetstring destination_name,
1773 GSUP_AN_APDU an_apdu
1774) := ts_GSUP(
1775 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,
1776 {
1777 valueof(ts_GSUP_IE_IMSI(imsi)),
1778 valueof(ts_GSUP_IE_MSISDN(msisdn)),
1779 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1780 valueof(ts_GSUP_IE_Source_Name(source_name)),
1781 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1782 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1783 }
1784);
1785
1786} with { encode "RAW"; variant "FIELDORDER(msb)" }