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