blob: 05b8295a7f83cd8c590c2fe52ac292f74293c445 [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
Pau Espin Pedrolc2cfd552024-02-07 17:51:55 +0100327template (value) GSUP_PDU ts_GSUP_SAI_REQ_PDP_INFO(hexstring imsi, template (value) GSUP_IEs pdp_info) :=
328 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
329 valueof(ts_GSUP_IE_IMSI(imsi)),
330 valueof(ts_GSUP_IE_PdpInfo_ie(pdp_info))
331 });
332
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100333template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
334 tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
335
336template GSUP_PDU tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
337 template hexstring imsi,
338 template octetstring auts,
339 template octetstring rand) :=
340 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
341 tr_GSUP_IE_IMSI(imsi),
342 tr_GSUP_IE_AUTS(auts),
343 tr_GSUP_IE_RAND(rand),
344 *
345 });
346
347template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
348 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
349 valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
350
351template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
352 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
353 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
354
355template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
356 ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
357 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
358
359
360template GSUP_PDU tr_GSUP_SAI_RES(template (present) hexstring imsi,
361 template (present) GSUP_IE auth_tuple_ie := tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE)) :=
362 tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
363 tr_GSUP_IE_IMSI(imsi), *, auth_tuple_ie, * });
364
365template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
366 template octetstring source_name := omit) :=
367 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, dom := dom,
368 source_name := source_name));
369
370template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
371 tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
372
373template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi, octetstring destination_name := ''O) :=
374 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)),
375 valueof(ts_GSUP_IE_Destination_Name(destination_name))});
376
377template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi, template octetstring destination_name := omit) :=
378 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, f_gen_tr_ies(imsi, destination_name := destination_name));
379
380template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
381 ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
382 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
383
384template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?,
385 template octetstring destination_name := omit) :=
386 tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR,
387 f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));
388
389template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn, octetstring destination_name := ''O) :=
390 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
391 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)),
392 valueof(ts_GSUP_IE_Destination_Name(destination_name))});
393
394template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?,
395 template octetstring destination_name := omit) :=
396 tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST,
397 f_gen_tr_ies(imsi, msisdn := msisdn, destination_name := destination_name));
398
399template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi,
400 template octetstring source_name := omit,
401 template octetstring destination_name := omit) :=
402 ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT,
403 f_gen_ts_ies(imsi, source_name := source_name,
404 destination_name := destination_name));
405
406template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
407 tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
408
409template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
410 tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
411
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +0100412template (present) GSUP_PDU tr_GSUP_CL_REQ(template (present) hexstring imsi := ?,
413 template GSUP_CnDomain dom := omit,
414 template GSUP_CancelType ctype := omit) :=
415 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST,
416 f_gen_tr_ies(imsi,
417 cancel_type := ctype,
418 cn_domain := dom));
419
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100420template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
421 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
422 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
423
424template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
425 tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
426
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +0100427template (value) GSUP_PDU ts_GSUP_CL_RES(template (value) hexstring imsi) :=
428 ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, {valueof(ts_GSUP_IE_IMSI(imsi))});
429
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100430template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
431 tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
432 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
433
434template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
435 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
436 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
437
438template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
439 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
440 tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
441
442template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
443 ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
444 valueof(ts_GSUP_IE_IMSI(imsi)) });
445
446template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
447 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
448 tr_GSUP_IE_IMSI(imsi), * });
449
450template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
451 tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
452 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
453
454template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei,
455 template (omit) octetstring source_name := omit) :=
456 ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, f_gen_ts_ies(imsi, imei := imei, source_name := source_name));
457
458template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(
459 template hexstring imsi,
460 template hexstring imei
461) := tr_GSUP(
462 OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST,
463 {
464 tr_GSUP_IE_IMSI(imsi),
465 tr_GSUP_IE_IMEI(imei),
466 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT)
467 }
468);
469
470template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_RES(hexstring imsi, GSUP_IMEIResult result) :=
471 ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
472 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI_Result(result)) });
473
474template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result,
475 template octetstring destination_name := omit) :=
476 tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT,
477 f_gen_tr_ies(imsi, imei_result := result, destination_name := destination_name));
478
479template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer cause) :=
480 ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
481 valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
482
483template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause,
484 template octetstring destination_name := omit) :=
485 tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));
486
487
488/* EPDG Tunnel */
489template (value) GSUP_PDU ts_GSUP_EPDGTunnel_REQ(hexstring imsi,
490 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
491 GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
492 template (omit) octetstring source_name := omit) :=
493 ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST, f_gen_ts_ies(imsi,
494 message_class := message_class,
495 dom := dom,
496 source_name := source_name));
497
498template (present) GSUP_PDU tr_GSUP_EPDGTunnel_REQ(template (present) hexstring imsi := ?,
499 template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG) :=
500 tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST,
501 f_gen_tr_ies(imsi,
502 message_class := message_class));
503
504
505template (value) GSUP_PDU ts_GSUP_EPDGTunnel_RES(hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100506 template (value) GSUP_IEs pdp_info,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100507 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
508 octetstring destination_name := ''O) :=
509 ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT, {
510 valueof(ts_GSUP_IE_IMSI(imsi)),
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100511 valueof(ts_GSUP_IE_PdpInfoCompl),
512 valueof(ts_GSUP_IE_PdpInfo_ie(pdp_info)),
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100513 valueof(ts_GSUP_IE_Message_Class(message_class)),
514 valueof(ts_GSUP_IE_Destination_Name(destination_name))
515 });
516
517template (present) GSUP_PDU tr_GSUP_EPDGTunnel_RES(template (present) hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100518 template (present) GSUP_IEs pdp_info,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100519 template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
520 template octetstring destination_name := omit) :=
521 tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT,
522 f_gen_tr_ies(imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +0100523 pdp_info_compl := true,
524 pdp_info := pdp_info,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100525 message_class := message_class,
526 destination_name := destination_name));
527
528template (value) GSUP_PDU ts_GSUP_EPDGTunnel_ERR(hexstring imsi,
529 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
530 integer cause := 0) :=
531 ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR, {
532 valueof(ts_GSUP_IE_IMSI(imsi)),
533 valueof(ts_GSUP_IE_Cause(cause)),
534 valueof(ts_GSUP_IE_Message_Class(message_class))
535 });
536
537template (present) GSUP_PDU tr_GSUP_EPDGTunnel_ERR(template (present) hexstring imsi,
538 template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
539 template (present) integer cause := ?,
540 template octetstring destination_name := omit) :=
541 tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR,
542 f_gen_tr_ies(imsi,
543 message_class := message_class,
544 cause := cause,
545 destination_name := destination_name));
546
547
548template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
549 tag := OSMO_GSUP_CANCEL_TYPE_IE,
550 len := 0, /* overwritten */
551 val := {
552 cancel_type := ctype
553 }
554}
555
556template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
557 tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
558
559template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
560 tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
561
562template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
563 tag := iei,
564 len := ?,
565 val := val
566}
567
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +0100568template (value) GSUP_IE ts_GSUP_IE_IMSI(template (value) hexstring imsi) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100569 tag := OSMO_GSUP_IMSI_IE,
570 len := 0, /* overwritten */
571 val := {
572 imsi := imsi
573 }
574}
575
576template (present) GSUP_IE tr_GSUP_IE_IMSI(template (present) hexstring imsi := ?) := {
577 tag := OSMO_GSUP_IMSI_IE,
578 len := ?,
579 val := {
580 imsi := imsi
581 }
582}
583
584template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
585 tag := OSMO_GSUP_MSISDN_IE,
586 len := 0, /* overwritten */
587 val := {
588 msisdn := ts_GSUP_MSISDN(msisdn)
589 }
590}
591
592template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
593 tag := OSMO_GSUP_MSISDN_IE,
594 len := ?,
595 val := {
596 msisdn := tr_GSUP_MSISDN(msisdn)
597 }
598}
599
600
601template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
602 tag := OSMO_GSUP_CAUSE_IE,
603 len := 0, /* overwritten */
604 val := {
605 cause := cause
606 }
607}
608
609template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
610 tag := OSMO_GSUP_CAUSE_IE,
611 len := ?,
612 val := {
613 cause := cause
614 }
615}
616
617template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
618 tag := OSMO_GSUP_AUTS_IE,
619 len := 0, /* overwritten */
620 val := {
621 auts := auts
622 }
623}
624
625template GSUP_IE tr_GSUP_IE_AUTS(template octetstring auts) := {
626 tag := OSMO_GSUP_AUTS_IE,
627 len := ?,
628 val := {
629 auts := auts
630 }
631}
632
633template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
634 tag := OSMO_GSUP_RAND_IE,
635 len := 0, /* overwritten */
636 val := {
637 rand := rand
638 }
639}
640
641template GSUP_IE tr_GSUP_IE_RAND(template octetstring rand := ?) := {
642 tag := OSMO_GSUP_RAND_IE,
643 len := ?,
644 val := {
645 rand := rand
646 }
647}
648
649template (present) GSUP_IE tr_GSUP_IE_SRES(template (present) octetstring sres := ?) := {
650 tag := OSMO_GSUP_SRES_IE,
651 len := ?,
652 val := {
653 sres := sres
654 }
655}
656
657template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
658 tag := OSMO_GSUP_SRES_IE,
659 len := 0, /* overwritten */
660 val := {
661 sres := sres
662 }
663}
664
665template (present) GSUP_IE tr_GSUP_IE_Kc(template (present) octetstring kc := ?) := {
666 tag := OSMO_GSUP_KC_IE,
667 len := ?,
668 val := {
669 kc := kc
670 }
671}
672
673template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
674 tag := OSMO_GSUP_KC_IE,
675 len := 0, /* overwritten */
676 val := {
677 kc := kc
678 }
679}
680
681template (present) GSUP_IE tr_GSUP_IE_IK(template (present) octetstring ik := ?) := {
682 tag := OSMO_GSUP_IK_IE,
683 len := ?,
684 val := {
685 ik := ik
686 }
687}
688
689template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
690 tag := OSMO_GSUP_IK_IE,
691 len := 0, /* overwritten */
692 val := {
693 ik := ik
694 }
695}
696
697template (present) GSUP_IE tr_GSUP_IE_CK(template (present) octetstring ck := ?) := {
698 tag := OSMO_GSUP_CK_IE,
699 len := ?,
700 val := {
701 ck := ck
702 }
703}
704
705template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
706 tag := OSMO_GSUP_CK_IE,
707 len := 0, /* overwritten */
708 val := {
709 ck := ck
710 }
711}
712
713template (present) GSUP_IE tr_GSUP_IE_AUTN(template (present) octetstring autn := ?) := {
714 tag := OSMO_GSUP_AUTN_IE,
715 len := ?,
716 val := {
717 autn := autn
718 }
719}
720
721template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
722 tag := OSMO_GSUP_AUTN_IE,
723 len := 0, /* overwritten */
724 val := {
725 autn := autn
726 }
727}
728
729template (present) GSUP_IE tr_GSUP_IE_RES(template (present) octetstring res := ?) := {
730 tag := OSMO_GSUP_RES_IE,
731 len := ?,
732 val := {
733 res := res
734 }
735}
736
737template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
738 tag := OSMO_GSUP_RES_IE,
739 len := 0, /* overwritten */
740 val := {
741 res := res
742 }
743}
744
Pau Espin Pedrol7b7a1e82024-01-19 20:49:28 +0100745template (value) GSUP_IE ts_GSUP_IE_APN(template (value) octetstring apn) := {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +0100746 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
747 len := 0, /* overwritten */
748 val := {
749 apn := apn
750 }
751}
752
753template GSUP_IE tr_GSUP_IE_APN(template octetstring apn) := {
754 tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
755 len := ?,
756 val := {
757 apn := apn
758 }
759}
760
761template GSUP_IE ts_GSUP_IE_CnDomain(template GSUP_CnDomain dom) := {
762 tag := OSMO_GSUP_CN_DOMAIN_IE,
763 len := 0, /* overwritten */
764 val := {
765 cn_domain := dom
766 }
767}
768
769template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
770 tag := OSMO_GSUP_SESSION_ID_IE,
771 len := 0, /* overwritten */
772 val := {
773 session_id := sid
774 }
775}
776template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
777 tag := OSMO_GSUP_SESSION_ID_IE,
778 len := ?,
779 val := {
780 session_id := sid
781 }
782}
783
784template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
785 tag := OSMO_GSUP_SESSION_STATE_IE,
786 len := 0, /* overwritten */
787 val := {
788 session_state := state
789 }
790}
791template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
792 tag := OSMO_GSUP_SESSION_STATE_IE,
793 len := ?,
794 val := {
795 session_state := state
796 }
797}
798
799template (value) GSUP_IE ts_GSUP_IE_SM_RP_MR(OCT1 ref) := {
800 tag := OSMO_GSUP_SM_RP_MR_IE,
801 len := 0, /* overwritten */
802 val := {
803 sm_rp_mr := ref
804 }
805}
806template GSUP_IE tr_GSUP_IE_SM_RP_MR(template OCT1 ref) := {
807 tag := OSMO_GSUP_SM_RP_MR_IE,
808 len := ?,
809 val := {
810 sm_rp_mr := ref
811 }
812}
813
814template (value) GSUP_IE ts_GSUP_IE_SM_RP_CAUSE(OCT1 cause) := {
815 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
816 len := 0, /* overwritten */
817 val := {
818 sm_rp_cause := cause
819 }
820}
821template GSUP_IE tr_GSUP_IE_SM_RP_CAUSE(template OCT1 cause) := {
822 tag := OSMO_GSUP_SM_RP_CAUSE_IE,
823 len := ?,
824 val := {
825 sm_rp_cause := cause
826 }
827}
828
829template (value) GSUP_IE ts_GSUP_IE_SM_RP_MMS(OCT1 mms) := {
830 tag := OSMO_GSUP_SM_RP_MMS_IE,
831 len := 0, /* overwritten */
832 val := {
833 sm_rp_mms := mms
834 }
835}
836template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
837 tag := OSMO_GSUP_SM_RP_MMS_IE,
838 len := ?,
839 val := {
840 sm_rp_mms := mms
841 }
842}
843
844template (value) GSUP_IE ts_GSUP_IE_IMEI(hexstring imei) := {
845 tag := OSMO_GSUP_IMEI_IE,
846 len := 0, /* overwritten */
847 val := {
848 imei := ts_GSUP_IMEI(imei)
849 }
850}
851template GSUP_IE tr_GSUP_IE_IMEI(template hexstring imei) := {
852 tag := OSMO_GSUP_IMEI_IE,
853 len := ?,
854 val := {
855 imei := tr_GSUP_IMEI(imei)
856 }
857}
858
859template (value) GSUP_IE ts_GSUP_IE_IMEI_Result(GSUP_IMEIResult result) := {
860 tag := OSMO_GSUP_IMEI_RESULT_IE,
861 len := 0, /* overwritten */
862 val := {
863 imei_result := result
864 }
865}
866template GSUP_IE tr_GSUP_IE_IMEI_Result(template GSUP_IMEIResult result) := {
867 tag := OSMO_GSUP_IMEI_RESULT_IE,
868 len := ?,
869 val := {
870 imei_result := result
871 }
872}
873
874template (value) GSUP_IE ts_GSUP_IE_NUM_VECTORS_REQ(OCT1 num) := {
875 tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
876 len := 0, /* overwritten */
877 val := {
878 num_auth_vectors := num
879 }
880}
881template GSUP_IE tr_GSUP_IE_NUM_VECTORS_REQ(template OCT1 num) := {
882 tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
883 len := ?,
884 val := {
885 num_auth_vectors := num
886 }
887}
888
889/* See 3GPP TS 24.011, figures 8.5 and 8.6 */
890private function f_pad_SM_RP_Addr(template hexstring number)
891return template hexstring {
892 if (isvalue(number) and not istemplatekind(number, "omit")) {
893 return f_pad_bcd_number(valueof(number));
894 } else {
895 return number;
896 }
897}
898
899template GSUP_SM_RP_Addr t_GSUP_SM_RP_Addr(template hexstring number,
900 template BIT4 npi := '0001'B,
901 template BIT3 ton := '001'B,
902 template BIT1 ext := '1'B) := {
903 ext := ext,
904 ton := ton,
905 npi := npi,
906 /* Work around TITAN's padding problems: encoding works fine,
907 * but it does not consider 'F'H as padding in decoded data. */
908 number := f_pad_SM_RP_Addr(number)
909}
910
911/**
912 * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
913 * It can be either of the following:
914 * - IMSI
915 * - LMSI (not implemented)
916 * - MSISDN
917 * - roaming number (not implemented)
918 * - service centre address
919 */
920template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
921 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
922 id_enc := { imsi := imsi }
923}
924template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
925 id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
926 id_enc := { imsi := imsi }
927}
928
929template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
930 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
931 id_enc := { msisdn := msisdn }
932}
933template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
934 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
935 id_enc := { msisdn := msisdn }
936}
937
938template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
939 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
940 id_enc := { smsc_addr := smsc_addr }
941}
942template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
943 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
944 id_enc := { smsc_addr := smsc_addr }
945}
946
947template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_NULL := {
948 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
949 id_enc := omit
950}
951template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_NULL := {
952 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
953 id_enc := omit
954}
955
956template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
957 tag := OSMO_GSUP_SM_RP_DA_IE,
958 len := 0, /* overwritten */
959 val := {
960 sm_rp_da := val
961 }
962}
963template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
964 tag := OSMO_GSUP_SM_RP_DA_IE,
965 len := ?,
966 val := {
967 sm_rp_da := val
968 }
969}
970
971/**
972 * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
973 * It can be either of the following:
974 * - MSISDN
975 * - service centre address
976 */
977template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
978 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
979 id_enc := { msisdn := msisdn }
980}
981template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
982 id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
983 id_enc := { msisdn := msisdn }
984}
985
986template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
987 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
988 id_enc := { smsc_addr := smsc_addr }
989}
990template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
991 id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
992 id_enc := { smsc_addr := smsc_addr }
993}
994
995template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_NULL := {
996 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
997 id_enc := omit
998}
999template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_NULL := {
1000 id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
1001 id_enc := omit
1002}
1003
1004template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
1005 tag := OSMO_GSUP_SM_RP_OA_IE,
1006 len := 0, /* overwritten */
1007 val := {
1008 sm_rp_oa := val
1009 }
1010}
1011template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
1012 tag := OSMO_GSUP_SM_RP_OA_IE,
1013 len := ?,
1014 val := {
1015 sm_rp_oa := val
1016 }
1017}
1018
1019/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
1020template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
1021 tag := OSMO_GSUP_SM_RP_UI_IE,
1022 len := 0, /* overwritten */
1023 val := {
1024 sm_rp_ui := val
1025 }
1026}
1027template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
1028 tag := OSMO_GSUP_SM_RP_UI_IE,
1029 len := ?,
1030 val := {
1031 sm_rp_ui := val
1032 }
1033}
1034
1035/* SM Alert Reason IE (used in READY-FOR-SM), see 7.6.8.8 */
1036template (value) GSUP_IE ts_GSUP_IE_SM_ALERT_RSN(GSUP_SM_ALERT_RSN_Type rsn) := {
1037 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
1038 len := 0, /* overwritten */
1039 val := {
1040 sm_alert_rsn := rsn
1041 }
1042}
1043template GSUP_IE tr_GSUP_IE_SM_ALERT_RSN(template GSUP_SM_ALERT_RSN_Type rsn) := {
1044 tag := OSMO_GSUP_SM_ALERT_RSN_IE,
1045 len := ?,
1046 val := {
1047 sm_alert_rsn := rsn
1048 }
1049}
1050
1051template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
1052 tag := OSMO_GSUP_SS_INFO_IE,
1053 len := 0, /* overwritten */
1054 val := {
1055 ss_info := ss
1056 }
1057}
1058template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
1059 tag := OSMO_GSUP_SS_INFO_IE,
1060 len := ?,
1061 val := {
1062 ss_info := ss
1063 }
1064}
1065
1066template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
1067 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1068 len := ?,
1069 val := {
1070 message_class := val
1071 }
1072}
1073
1074template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
1075 tag := OSMO_GSUP_MESSAGE_CLASS_IE,
1076 len := 0, /* overwritten */
1077 val := {
1078 message_class := val
1079 }
1080}
1081
1082template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
1083 tag := OSMO_GSUP_SOURCE_NAME_IE,
1084 len := ?,
1085 val := {
1086 source_name := name
1087 }
1088}
1089
1090template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
1091 tag := OSMO_GSUP_SOURCE_NAME_IE,
1092 len := 0, /* overwritten */
1093 val := {
1094 source_name := name
1095 }
1096}
1097
1098template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
1099 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1100 len := ?,
1101 val := {
1102 destination_name := name
1103 }
1104}
1105
1106template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
1107 tag := OSMO_GSUP_DESTINATION_NAME_IE,
1108 len := 0, /* overwritten */
1109 val := {
1110 destination_name := name
1111 }
1112}
1113
1114template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {
1115 tag := OSMO_GSUP_AN_APDU_IE,
1116 len := ?,
1117 val := {
1118 an_apdu := an_apdu
1119 }
1120}
1121
1122template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {
1123 tag := OSMO_GSUP_AN_APDU_IE,
1124 len := 0, /* overwritten */
1125 val := {
1126 an_apdu := an_apdu
1127 }
1128}
1129
1130template (present) GSUP_IE tr_GSUP_IE_SUPPORTED_RAT_TYPES(template (present) GSUP_RatTypes ratt) := {
1131 tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
1132 len := ?,
1133 val := {
1134 supported_rat_types := ratt
1135 }
1136}
1137template (value) GSUP_IE ts_GSUP_IE_SUPPORTED_RAT_TYPES(GSUP_RatTypes ratt) := {
1138 tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
1139 len := 0, /* overwritten */
1140 val := {
1141 supported_rat_types := ratt
1142 }
1143}
1144
1145template (present) GSUP_IE tr_GSUP_IE_CURRENT_RAT_TYPE(template (present) GSUP_RatType ratt) := {
1146 tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
1147 len := ?,
1148 val := {
1149 current_rat_type := ratt
1150 }
1151}
1152template (value) GSUP_IE ts_GSUP_IE_CURRENT_RAT_TYPE(GSUP_RatType ratt) := {
1153 tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
1154 len := 0, /* overwritten */
1155 val := {
1156 current_rat_type := ratt
1157 }
1158}
1159
1160private function f_gen_ts_ies(hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001161 template (omit) boolean pdp_info_compl := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001162 template (omit) GSUP_Message_Class message_class := omit,
1163 template (omit) hexstring imei := omit,
1164 template (omit) GSUP_CnDomain dom := omit,
1165 template (omit) octetstring source_name := omit,
1166 template (omit) octetstring destination_name := omit
1167 ) return GSUP_IEs {
1168 var GSUP_IEs ies := {
1169 valueof(ts_GSUP_IE_IMSI(imsi))
1170 };
1171
1172 if (isvalue(dom)) {
1173 ies := ies & { valueof(ts_GSUP_IE_CnDomain(dom)) };
1174 }
1175
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001176 if (isvalue(pdp_info_compl) and valueof(pdp_info_compl)) {
1177 ies := ies & { valueof(ts_GSUP_IE_PdpInfoCompl) };
1178 }
1179
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001180 if (isvalue(imei)) {
1181 ies := ies & { valueof(ts_GSUP_IE_IMEI(valueof(imei))) };
1182 }
1183
1184 if (isvalue(message_class)) {
1185 ies := ies & { valueof(ts_GSUP_IE_Message_Class(valueof(message_class))) };
1186 }
1187
1188 if (isvalue(source_name)) {
1189 ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
1190 }
1191
1192 if (isvalue(destination_name)) {
1193 ies := ies & { valueof(ts_GSUP_IE_Destination_Name(valueof(destination_name))) };
1194 }
1195
1196 return ies;
1197}
1198
1199private function f_gen_tr_ies(template hexstring imsi,
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001200 template boolean pdp_info_compl := omit,
1201 template GSUP_IEs pdp_info := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001202 template GSUP_Message_Class message_class := omit,
1203 template integer cause := omit,
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001204 template GSUP_CancelType cancel_type := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001205 template hexstring msisdn := omit,
1206 template GSUP_IMEIResult imei_result := omit,
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001207 template GSUP_CnDomain cn_domain := omit,
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001208 template octetstring source_name := omit,
1209 template octetstring destination_name := omit
1210 ) return template GSUP_IEs {
1211 var template GSUP_IEs ies := {
1212 tr_GSUP_IE_IMSI(imsi)
1213 };
1214 var integer idx := 1;
1215
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001216 if (not istemplatekind(msisdn, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001217 ies[idx] := tr_GSUP_IE_MSISDN(msisdn);
1218 idx := idx + 1;
1219 }
1220
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001221 if (not istemplatekind(cause, "omit")) {
1222 ies[idx] := tr_GSUP_IE_Cause(cause);
1223 idx := idx + 1;
1224 }
1225
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001226 if (not istemplatekind(cancel_type, "omit")) {
1227 ies[idx] := tr_GSUP_IE_CancelType(cancel_type);
1228 idx := idx + 1;
1229 }
1230
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001231 if (not istemplatekind(pdp_info_compl, "omit")) {
1232 ies[idx] := tr_GSUP_IE_PdpInfoCompl;
1233 idx := idx + 1;
1234 }
1235
1236 if (not istemplatekind(pdp_info, "omit")) {
1237 ies[idx] := tr_GSUP_IE_PdpInfo_ie(pdp_info);
1238 idx := idx + 1;
1239 }
1240
Pau Espin Pedrolcbe6eba2024-02-06 12:53:14 +01001241 if (not istemplatekind(cn_domain, "omit")) {
1242 ies[idx] := tr_GSUP_IE_CnDomain(cn_domain);
1243 idx := idx + 1;
1244 }
1245
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001246 if (not istemplatekind(imei_result, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001247 ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);
1248 idx := idx + 1;
1249 }
1250
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001251 if (not istemplatekind(message_class, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001252 ies[idx] := tr_GSUP_IE_Message_Class(message_class);
1253 idx := idx + 1;
1254 }
1255
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001256 if (not istemplatekind(source_name, "omit")) {
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001257 ies[idx] := tr_GSUP_IE_Source_Name(source_name);
1258 idx := idx + 1;
1259 }
1260
1261 ies[idx] := *;
1262 idx := idx + 1;
1263
Pau Espin Pedrola6b0c1c2024-01-22 20:02:06 +01001264 if (not istemplatekind(destination_name, "omit")) {
1265 if (istemplatekind(destination_name, "*")) {
1266 ies[idx] := *;
1267 } else {
1268 ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
1269 }
Pau Espin Pedrol8f1403a2024-01-18 20:08:43 +01001270 idx := idx + 1;
1271 }
1272
1273 return ies;
1274}
1275
1276private function f_gen_ts_ss_ies(
1277 hexstring imsi,
1278 OCT4 sid,
1279 GSUP_SessionState state,
1280 template (omit) octetstring ss := omit,
1281 template (omit) integer cause := omit,
1282 template octetstring source_name := omit
1283) return GSUP_IEs {
1284 /* Mandatory IEs */
1285 var GSUP_IEs ies := {
1286 valueof(ts_GSUP_IE_IMSI(imsi))
1287 };
1288
1289 /* Cause IE is needed for PROC_SS_ERR */
1290 if (isvalue(cause)) {
1291 ies := ies & { valueof(ts_GSUP_IE_Cause(valueof(cause))) };
1292 }
1293
1294 /* Mandatory session IEs */
1295 ies := ies & { valueof(ts_GSUP_IE_SessionId(sid)) };
1296 ies := ies & { valueof(ts_GSUP_IE_SessionState(state)) };
1297
1298 /* Optional SS payload */
1299 if (isvalue(ss)) {
1300 ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
1301 }
1302
1303 if (isvalue(source_name)) {
1304 ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
1305 }
1306
1307 return ies;
1308}
1309private function f_gen_tr_ss_ies(
1310 template hexstring imsi,
1311 template OCT4 sid := ?,
1312 template GSUP_SessionState state := ?,
1313 template octetstring ss := omit,
1314 template integer cause := omit,
1315 template octetstring destination_name := omit
1316) return template GSUP_IEs {
1317 /* Mandatory IEs */
1318 var template GSUP_IEs ies := {
1319 tr_GSUP_IE_IMSI(imsi)
1320 };
1321 var integer idx := 1;
1322
1323 /* Cause IE is needed for PROC_SS_ERR */
1324 if (istemplatekind(cause, "*")) {
1325 ies[idx] := *;
1326 idx := idx + 1;
1327 } else if (not istemplatekind(cause, "omit")) {
1328 ies[idx] := tr_GSUP_IE_Cause(cause);
1329 idx := idx + 1;
1330 }
1331
1332 /* Mandatory session IEs */
1333 ies[idx] := tr_GSUP_IE_SessionId(sid);
1334 ies[idx + 1] := tr_GSUP_IE_SessionState(state);
1335 idx := idx + 2;
1336
1337 /* Optional SS payload */
1338 if (istemplatekind(ss, "*")) {
1339 ies[idx] := *;
1340 idx := idx + 1;
1341 } else if (not istemplatekind(ss, "omit")) {
1342 ies[idx] := tr_GSUP_IE_SSInfo(ss);
1343 idx := idx + 1;
1344 }
1345
1346 if (isvalue(destination_name)) {
1347 ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
1348 idx := idx + 1;
1349 }
1350
1351 /* the GSUP Message Class IE is optional, as old implementations don't have it yet */
1352 var template GSUP_IEs ies2 := ies;
1353 ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
1354 idx := idx + 1;
1355
1356 return (ies, ies2);
1357}
1358
1359template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
1360 hexstring imsi,
1361 OCT4 sid,
1362 GSUP_SessionState state,
1363 template (omit) octetstring ss := omit,
1364 template (omit) octetstring source_name := omit
1365) := ts_GSUP(
1366 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
1367 f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)
1368);
1369template GSUP_PDU tr_GSUP_PROC_SS_REQ(
1370 template hexstring imsi,
1371 template OCT4 sid := ?,
1372 template GSUP_SessionState state := ?,
1373 template octetstring ss := *
1374) := tr_GSUP(
1375 OSMO_GSUP_MSGT_PROC_SS_REQUEST,
1376 f_gen_tr_ss_ies(imsi, sid, state, ss)
1377);
1378
1379template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
1380 hexstring imsi,
1381 OCT4 sid,
1382 GSUP_SessionState state,
1383 template (omit) octetstring ss := omit
1384) := ts_GSUP(
1385 OSMO_GSUP_MSGT_PROC_SS_RESULT,
1386 f_gen_ts_ss_ies(imsi, sid, state, ss)
1387);
1388template GSUP_PDU tr_GSUP_PROC_SS_RES(
1389 template hexstring imsi,
1390 template OCT4 sid := ?,
1391 template GSUP_SessionState state := ?,
1392 template octetstring ss := *,
1393 template octetstring destination_name := omit
1394) := tr_GSUP(
1395 OSMO_GSUP_MSGT_PROC_SS_RESULT,
1396 f_gen_tr_ss_ies(imsi, sid, state, ss, destination_name := destination_name)
1397);
1398
1399template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
1400 hexstring imsi,
1401 OCT4 sid,
1402 GSUP_SessionState state,
1403 integer cause
1404) := ts_GSUP(
1405 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1406 f_gen_ts_ss_ies(imsi, sid, state, cause := cause)
1407);
1408template GSUP_PDU tr_GSUP_PROC_SS_ERR(
1409 template hexstring imsi,
1410 template OCT4 sid := ?,
1411 template GSUP_SessionState state := ?,
1412 template integer cause := ?
1413) := tr_GSUP(
1414 OSMO_GSUP_MSGT_PROC_SS_ERROR,
1415 f_gen_tr_ss_ies(imsi, sid, state, cause := cause)
1416);
1417
1418template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
1419 hexstring imsi,
1420 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1421 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1422 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1423 octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1424) := ts_GSUP(
1425 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1426 {
1427 valueof(ts_GSUP_IE_IMSI(imsi)),
1428 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1429 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1430 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1431 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
1432 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1433 }
1434);
1435template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
1436 template hexstring imsi := ?,
1437 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1438 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1439 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1440 template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
1441) := tr_GSUP(
1442 OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
1443 {
1444 tr_GSUP_IE_IMSI(imsi),
1445 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1446 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1447 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
1448 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
1449 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1450 tr_GSUP_IE_Source_Name(?)
1451 }
1452);
1453
1454template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
1455 hexstring imsi,
1456 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1457) := ts_GSUP(
1458 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1459 {
1460 valueof(ts_GSUP_IE_IMSI(imsi)),
1461 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1462 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1463 }
1464);
1465template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
1466 template hexstring imsi := ?,
1467 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1468) := tr_GSUP(
1469 OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
1470 {
1471 tr_GSUP_IE_IMSI(imsi),
1472 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1473 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1474 tr_GSUP_IE_Source_Name(?)
1475 }
1476);
1477
1478template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
1479 hexstring imsi,
1480 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1481 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1482) := ts_GSUP(
1483 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1484 {
1485 valueof(ts_GSUP_IE_IMSI(imsi)),
1486 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1487 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
1488 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1489 }
1490);
1491template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
1492 template hexstring imsi := ?,
1493 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1494 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1495) := tr_GSUP(
1496 OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
1497 {
1498 tr_GSUP_IE_IMSI(imsi),
1499 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1500 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1501 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1502 tr_GSUP_IE_Source_Name(?)
1503 }
1504);
1505
1506template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
1507 hexstring imsi,
1508 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1509 GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1510 GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1511 octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1512 OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1513) := ts_GSUP(
1514 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1515 {
1516 /**
1517 * TODO: add MT-specific fields (and IEs):
1518 * - smDeliveryTimer
1519 * - smDeliveryStartTime
1520 */
1521 valueof(ts_GSUP_IE_IMSI(imsi)),
1522 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1523 valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
1524 valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
1525 valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
1526 valueof(ts_GSUP_IE_SM_RP_MMS(sm_rp_mms)),
1527 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1528 }
1529);
1530template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
1531 template hexstring imsi := ?,
1532 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1533 template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
1534 template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
1535 template octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
1536 template OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
1537) := tr_GSUP(
1538 OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
1539 {
1540 /**
1541 * TODO: add MT-specific fields (and IEs):
1542 * - smDeliveryTimer
1543 * - smDeliveryStartTime
1544 */
1545 tr_GSUP_IE_IMSI(imsi),
1546 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1547 tr_GSUP_IE_SM_RP_DA(sm_rp_da),
1548 tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
1549 tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
1550 tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),
1551 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1552 tr_GSUP_IE_Source_Name(?)
1553 }
1554);
1555
1556template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
1557 hexstring imsi,
1558 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1559) := ts_GSUP(
1560 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1561 {
1562 valueof(ts_GSUP_IE_IMSI(imsi)),
1563 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1564 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1565 }
1566);
1567template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
1568 template hexstring imsi := ?,
1569 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1570) := tr_GSUP(
1571 OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
1572 {
1573 tr_GSUP_IE_IMSI(imsi),
1574 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1575 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1576 tr_GSUP_IE_Source_Name(?)
1577 }
1578);
1579
1580template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
1581 hexstring imsi,
1582 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1583 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1584) := ts_GSUP(
1585 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1586 {
1587 valueof(ts_GSUP_IE_IMSI(imsi)),
1588 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1589 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
1590 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1591 }
1592);
1593template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
1594 template hexstring imsi := ?,
1595 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1596 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1597) := tr_GSUP(
1598 OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
1599 {
1600 tr_GSUP_IE_IMSI(imsi),
1601 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1602 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1603 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1604 tr_GSUP_IE_Source_Name(?)
1605 }
1606);
1607
1608template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_REQ(
1609 hexstring imsi,
1610 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1611 GSUP_SM_ALERT_RSN_Type sm_alert_rsn /* SM Alert Reason, see 7.6.8.8 */
1612) := ts_GSUP(
1613 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1614 {
1615 valueof(ts_GSUP_IE_IMSI(imsi)),
1616 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1617 valueof(ts_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn)),
1618 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1619 }
1620);
1621template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_REQ(
1622 template hexstring imsi := ?,
1623 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1624 template GSUP_SM_ALERT_RSN_Type sm_alert_rsn := ? /* SM Alert Reason, see 7.6.8.8 */
1625) := tr_GSUP(
1626 OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
1627 {
1628 tr_GSUP_IE_IMSI(imsi),
1629 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1630 tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),
1631 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1632 tr_GSUP_IE_Source_Name(?)
1633 }
1634);
1635
1636template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_RES(
1637 hexstring imsi,
1638 OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
1639) := ts_GSUP(
1640 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1641 {
1642 valueof(ts_GSUP_IE_IMSI(imsi)),
1643 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1644 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1645 }
1646);
1647template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_RES(
1648 template hexstring imsi := ?,
1649 template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
1650) := tr_GSUP(
1651 OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
1652 {
1653 tr_GSUP_IE_IMSI(imsi),
1654 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1655 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1656 tr_GSUP_IE_Source_Name(?)
1657 }
1658);
1659
1660template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_ERR(
1661 hexstring imsi,
1662 OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1663 OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1664) := ts_GSUP(
1665 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1666 {
1667 valueof(ts_GSUP_IE_IMSI(imsi)),
1668 valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
1669 valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
1670 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
1671 }
1672);
1673template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_ERR(
1674 template hexstring imsi := ?,
1675 template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
1676 template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
1677) := tr_GSUP(
1678 OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
1679 {
1680 tr_GSUP_IE_IMSI(imsi),
1681 tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
1682 tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
1683 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
1684 tr_GSUP_IE_Source_Name(?)
1685 }
1686);
1687
1688function f_gsup_find_nested_ie_multiple(GSUP_IEs ies, GSUP_IEI iei, integer nth, out GSUP_IeValue ret) return boolean {
1689 var integer current := 0;
1690 for (var integer i := 0; i < sizeof(ies); i := i+1) {
1691 if (ies[i].tag == iei) {
1692 if (current == nth) {
1693 ret := ies[i].val;
1694 return true;
1695 } else {
1696 current := current + 1;
1697 }
1698 }
1699 }
1700 return false;
1701}
1702
1703function f_gsup_find_nested_ie(GSUP_IEs ies, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
1704 for (var integer i := 0; i < sizeof(ies); i := i+1) {
1705 if (ies[i].tag == iei) {
1706 ret := ies[i].val;
1707 return true;
1708 }
1709 }
1710 return false;
1711}
1712
1713function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
1714 return f_gsup_find_nested_ie(msg.ies, iei, ret);
1715}
1716
1717template GSUP_AN_APDU t_GSUP_AN_APDU(
1718 template GSUP_AN_PROTO an_proto := ?,
1719 template octetstring pdu := ?
1720) := {
1721 proto := an_proto,
1722 pdu := pdu
1723};
1724
1725template GSUP_PDU tr_GSUP_E_AN_APDU(
1726 template GSUP_MessageType msgt,
1727 template hexstring imsi := ?,
1728 template octetstring source_name := ?,
1729 template octetstring destination_name := ?,
1730 template GSUP_AN_APDU an_apdu := ?
1731) := tr_GSUP(
1732 msgt,
1733 {
1734 tr_GSUP_IE_IMSI(imsi),
1735 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1736 tr_GSUP_IE_Source_Name(source_name),
1737 tr_GSUP_IE_Destination_Name(destination_name),
1738 tr_GSUP_IE_AN_APDU(an_apdu)
1739 }
1740);
1741
1742template GSUP_PDU tr_GSUP_E_NO_PDU(
1743 template GSUP_MessageType msgt,
1744 template hexstring imsi := ?,
1745 template octetstring source_name := ?,
1746 template octetstring destination_name := ?
1747) := tr_GSUP(
1748 msgt,
1749 {
1750 tr_GSUP_IE_IMSI(imsi),
1751 tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
1752 tr_GSUP_IE_Source_Name(source_name),
1753 tr_GSUP_IE_Destination_Name(destination_name)
1754 }
1755);
1756
1757template (value) GSUP_PDU ts_GSUP_E_AN_APDU(
1758 GSUP_MessageType msgt,
1759 hexstring imsi,
1760 octetstring source_name,
1761 octetstring destination_name,
1762 GSUP_AN_APDU an_apdu
1763) := ts_GSUP(
1764 msgt,
1765 {
1766 valueof(ts_GSUP_IE_IMSI(imsi)),
1767 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1768 valueof(ts_GSUP_IE_Source_Name(source_name)),
1769 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1770 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1771 }
1772);
1773
1774template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(
1775 hexstring imsi,
1776 hexstring msisdn,
1777 octetstring source_name,
1778 octetstring destination_name,
1779 GSUP_AN_APDU an_apdu
1780) := ts_GSUP(
1781 OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,
1782 {
1783 valueof(ts_GSUP_IE_IMSI(imsi)),
1784 valueof(ts_GSUP_IE_MSISDN(msisdn)),
1785 valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
1786 valueof(ts_GSUP_IE_Source_Name(source_name)),
1787 valueof(ts_GSUP_IE_Destination_Name(destination_name)),
1788 valueof(ts_GSUP_IE_AN_APDU(an_apdu))
1789 }
1790);
1791
1792} with { encode "RAW"; variant "FIELDORDER(msb)" }