blob: 069b4e986769b4c46bc1fbe7bd4dc2497ca533d0 [file] [log] [blame]
Vadim Yanitskiy4019ec92018-05-29 05:36:29 +07001module SS_Templates {
2
3/* SS/USSD Facility IE templates, building on top of SS_Types.
4 *
5 * (C) 2018 by Vadim Yanitskiy <axilirator@gmail.com>
6 * All rights reserved.
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
Harald Welte34b5a952019-05-27 11:54:11 +020010 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
Vadim Yanitskiy4019ec92018-05-29 05:36:29 +070012 */
13
14import from General_Types all;
15import from SS_Types all;
16
17/* GSM TS 04.80, section 4.5, SS operation code */
18type enumerated SS_Op_Code {
19 SS_OP_CODE_REGISTER_SS ('0A'O),
20 SS_OP_CODE_ERASE_SS ('0B'O),
21 SS_OP_CODE_ACTIVATE_SS ('0C'O),
22 SS_OP_CODE_DEACTIVATE_SS ('0D'O),
23 SS_OP_CODE_INTERROGATE_SS ('0E'O),
24 SS_OP_CODE_NOTIFY_SS ('10'O),
25 SS_OP_CODE_REGISTER_PASSWORD ('11'O),
26 SS_OP_CODE_GET_PASSWORD ('12'O),
27 SS_OP_CODE_PROCESS_USS_DATA ('13'O),
28 SS_OP_CODE_FORWARD_CHECK_SS_IND ('26'O),
29 SS_OP_CODE_PROCESS_USS_REQ ('3B'O),
30 SS_OP_CODE_USS_REQUEST ('3C'O),
31 SS_OP_CODE_USS_NOTIFY ('3D'O),
32 SS_OP_CODE_FORWARD_CUG_INFO ('78'O),
33 SS_OP_CODE_SPLIT_MPTY ('79'O),
34 SS_OP_CODE_RETRIEVE_MPTY ('7A'O),
35 SS_OP_CODE_HOLD_MPTY ('7B'O),
36 SS_OP_CODE_BUILD_MPTY ('7C'O),
37 SS_OP_CODE_FORWARD_CHARGE_ADVICE ('7D'O)
38}
39
40/* GSM TS 04.80, section 4.5, SS error code */
41type enumerated SS_Err_Code {
42 SS_ERR_CODE_UNKNOWN_SUBSCRIBER ('01'O),
43 SS_ERR_CODE_ILLEGAL_SUBSCRIBER ('09'O),
44 SS_ERR_CODE_BEARER_SERVICE_NOT_PROVISIONED ('0A'O),
45 SS_ERR_CODE_TELESERVICE_NOT_PROVISIONED ('0B'O),
46 SS_ERR_CODE_ILLEGAL_EQUIPMENT ('0C'O),
47 SS_ERR_CODE_CALL_BARRED ('0D'O),
48 SS_ERR_CODE_ILLEGAL_SS_OPERATION ('10'O),
49 SS_ERR_CODE_SS_ERROR_STATUS ('11'O),
50 SS_ERR_CODE_SS_NOT_AVAILABLE ('12'O),
51 SS_ERR_CODE_SS_SUBSCRIPTION_VIOLATION ('13'O),
52 SS_ERR_CODE_SS_INCOMPATIBILITY ('14'O),
53 SS_ERR_CODE_FACILITY_NOT_SUPPORTED ('15'O),
54 SS_ERR_CODE_ABSENT_SUBSCRIBER ('1B'O),
55 SS_ERR_CODE_SYSTEM_FAILURE ('22'O),
56 SS_ERR_CODE_DATA_MISSING ('23'O),
57 SS_ERR_CODE_UNEXPECTED_DATA_VALUE ('24'O),
58 SS_ERR_CODE_PW_REGISTRATION_FAILURE ('25'O),
59 SS_ERR_CODE_NEGATIVE_PW_CHECK ('26'O),
60 SS_ERR_CODE_NUM_PW_ATTEMPTS_VIOLATION ('2B'O),
61 SS_ERR_CODE_UNKNOWN_ALPHABET ('47'O),
62 SS_ERR_CODE_USSD_BUSY ('48'O),
63 SS_ERR_CODE_MAX_MPTY_PARTICIPANTS ('7E'O),
64 SS_ERR_CODE_RESOURCES_NOT_AVAILABLE ('7F'O)
65}
66
67/**
68 * According to GSM TS 02.90, section 4.1.1,
69 * the mobile initiated USSD request shall contain
70 * an alphabet indicator set to "SMS default alphabet"
71 * and language indicator set to "language unspecified".
72 *
73 * This DCS value is used quite often, so it makes
74 * sense to define it here as a constant.
75 */
76const octetstring SS_USSD_DEFAULT_DCS := '0F'O;
77
78template (value) SS_FacilityInformation ts_SS_USSD_FACILITY_INVOKE(
79 integer invoke_id := 1,
80 SS_Op_Code op_code := SS_OP_CODE_PROCESS_USS_REQ,
81 octetstring ussd_dcs := SS_USSD_DEFAULT_DCS,
82 octetstring ussd_string := 'AA180C3602'O // *#100#
83) := {
84 {
85 invoke := {
86 invokeId := { present_ := invoke_id },
87 linkedId := omit,
88 opcode := {
89 local := enum2int(op_code)
90 },
91 argument := {
92 uSSD_Arg := {
93 ussd_DataCodingScheme := ussd_dcs,
94 ussd_String := ussd_string,
95 alertingPattern := omit,
96 msisdn := omit
97 }
98 }
99 }
100 }
101}
102template SS_FacilityInformation tr_SS_USSD_FACILITY_INVOKE(
103 template integer invoke_id := ?,
104 template integer op_code := ?,
105 template octetstring ussd_dcs := ?,
106 template octetstring ussd_string := ?
107) := {
108 {
109 invoke := {
110 invokeId := { present_ := invoke_id },
111 linkedId := omit,
112 opcode := {
113 local := op_code
114 },
115 argument := {
116 uSSD_Arg := {
117 ussd_DataCodingScheme := ussd_dcs,
118 ussd_String := ussd_string,
119 alertingPattern := omit,
120 msisdn := omit
121 }
122 }
123 }
124 }
125}
126
Vadim Yanitskiybc18afa2018-11-28 06:00:52 +0700127template (value) SS_FacilityInformation ts_SS_FACILITY_INVOKE(
128 integer invoke_id := 1,
129 SS_Op_Code op_code,
130 OCT1 ss_code
131) := {
132 {
133 invoke := {
134 invokeId := { present_ := invoke_id },
135 linkedId := omit,
136 opcode := { local := enum2int(op_code) },
137 argument := {
138 sS_ForBS_Code := {
139 ss_Code := ss_code,
140 basicService := omit,
141 longFTN_Supported := omit
142 }
143 }
144 }
145 }
146}
147template SS_FacilityInformation tr_SS_FACILITY_INVOKE(
148 template integer invoke_id := 1,
149 template integer op_code := ?,
150 template OCT1 ss_code := ?
151) := {
152 {
153 invoke := {
154 invokeId := { present_ := invoke_id },
155 linkedId := omit,
156 opcode := { local := op_code },
157 argument := {
158 sS_ForBS_Code := {
159 ss_Code := ss_code,
160 basicService := omit,
161 longFTN_Supported := omit
162 }
163 }
164 }
165 }
166}
167
Vadim Yanitskiy4019ec92018-05-29 05:36:29 +0700168template (value) SS_FacilityInformation ts_SS_USSD_FACILITY_RETURN_RESULT(
169 integer invoke_id := 1,
170 SS_Op_Code op_code := SS_OP_CODE_PROCESS_USS_REQ,
171 octetstring ussd_dcs,
172 octetstring ussd_string
173) := {
174 {
175 returnResult := {
176 invokeId := { present_ := invoke_id },
177 result := {
178 opcode := {
179 local := enum2int(op_code)
180 },
181 result := {
182 uSSD_Res := {
183 ussd_DataCodingScheme := ussd_dcs,
184 ussd_String := ussd_string
185 }
186 }
187 }
188 }
189 }
190}
191template SS_FacilityInformation tr_SS_USSD_FACILITY_RETURN_RESULT(
192 template integer invoke_id := ?,
193 template integer op_code := ?,
194 template octetstring ussd_dcs := ?,
195 template octetstring ussd_string := ?
196) := {
197 {
198 returnResult := {
199 invokeId := { present_ := invoke_id },
200 result := {
201 opcode := {
202 local := op_code
203 },
204 result := {
205 uSSD_Res := {
206 ussd_DataCodingScheme := ussd_dcs,
207 ussd_String := ussd_string
208 }
209 }
210 }
211 }
212 }
213}
214
Vadim Yanitskiyb59ae2d2018-06-19 00:45:00 +0700215template (value) SS_FacilityInformation ts_SS_USSD_FACILITY_RETURN_RESULT_EMPTY(
216 integer invoke_id := 1
217) := {
218 {
219 returnResult := {
220 invokeId := { present_ := invoke_id },
221 result := omit
222 }
223 }
224}
225template SS_FacilityInformation tr_SS_USSD_FACILITY_RETURN_RESULT_EMPTY(
226 template integer invoke_id := ?
227) := {
228 {
229 returnResult := {
230 invokeId := { present_ := invoke_id },
231 result := omit
232 }
233 }
234}
235
Vadim Yanitskiy4019ec92018-05-29 05:36:29 +0700236/* Common for both structured and unstructured SS */
237template (value) SS_FacilityInformation ts_SS_FACILITY_RETURN_ERROR(
238 integer invoke_id := 1,
239 SS_Err_Code err_code
240) := {
241 {
242 returnError := {
243 invokeId := { present_ := invoke_id },
244 errcode := {
245 local := enum2int(err_code)
246 },
247 parameter := omit
248 }
249 }
250}
251template SS_FacilityInformation tr_SS_FACILITY_RETURN_ERROR(
252 template integer invoke_id := ?,
253 template integer err_code := ?
254) := {
255 {
256 returnError := {
257 invokeId := { present_ := invoke_id },
258 errcode := {
259 local := err_code
260 },
261 parameter := omit
262 }
263 }
264}
265
266}