blob: 5bbb2c34210d5e43a9a92fdf6ff3bf4af62e34d6 [file] [log] [blame]
Harald Welted27ab242019-07-26 13:45:18 +02001module DIAMETER_Templates {
2
3/* (C) 2019 by Harald Welte <laforge@gnumonks.org>
4 * All rights reserved.
5 *
6 * Released under the terms of GNU General Public License, Version 2 or
7 * (at your option) any later version.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12import from DIAMETER_Types all;
13import from Osmocom_Types all;
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +020014import from Misc_Helpers all;
Harald Welted27ab242019-07-26 13:45:18 +020015
16/* https://www.iana.org/assignments/aaa-parameters/aaa-parameters.xhtml#aaa-parameters-4 */
17type enumerated DIAMETER_Resultcode {
18 /* Informational */
19 DIAMETER_MULTI_ROUND_AUTH (1001),
20
21 /* Success */
22 DIAMETER_SUCCESS (2001),
23 DIAMETER_LIMITED_SUCCESS (2002),
24 DIAMETER_FIRST_REGISTRATION (2003),
25 DIAMETER_SUBSEQUENT_REGISTRATION (2004),
26 DIAMETER_UNREGISTERED_SERVICE (2005),
27 DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED (2006),
28 DIAMETER_SERVER_SELECTION (2007),
29 DIAMETER_SUCCESS_AUTH_SENT_SERVER_NOT_STORED (2008),
30 DIAMETER_SUCCESS_RELOCATE_HA (2009),
31
32 /* Protocol Errors */
33 DIAMETER_COMMAND_UNSUPPORTED (3001),
34 DIAMETER_UNABLE_TO_DELIVER (3002),
35 DIAMETER_REALM_NOT_SERVED (3003),
36 DIAMETER_TOO_BUSY (3004),
37 DIAMETER_LOOP_DETECTED (3005),
38 DIAMETER_REDIRECT_INDICATION (3006),
39 DIAMETER_APPLICATION_UNSUPPORTED (3007),
40 DIAMETER_INVALID_HDR_BITS (3008),
41 DIAMETER_INVALID_AVP_BITS (3009),
42 DIAMETER_UNKNOWN_PEER (3010),
43 DIAMETER_REALM_REDIRECT_INDICATION (3011),
44
45 /* Transient Failures */
46 DIAMETER_AUTHENTICATION_REJECTED (4001),
47 DIAMETER_OUT_OF_SPACE (4002),
48 ELECTION_LOST (4003),
49 DIAMETER_ERROR_MIP_REPLY_FAILURE (4005),
50 DIAMETER_ERROR_HA_NOT_AVAILABLE (4006),
51 DIAMETER_ERROR_BAD_KEY (4007),
52 DIAMETER_ERROR_MIP_FILTER_NOT_SUPPORTED (4008),
53 DIAMETER_END_USER_SERVICE_DENIED (4010),
54 DIAMETER_CREDIT_CONTROL_NOT_APPLICABLE (4011),
55 DIAMETER_CREDIT_LIMIT_REACHED (4012),
56 DIAMETER_USER_NAME_REQUIRED (4013),
57 RESOURCE_FAILURE (4014),
58
59 DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181),
60 DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT (4882),
61
62 /* Permanent Failure */
63 DIAMETER_AVP_UNSUPPORTED (5001),
64 DIAMETER_UNKNOWN_SESSION_ID (5002),
65 DIAMETER_AUTHORIZATION_REJECTED (5003),
66 DIAMETER_INVALID_AVP_VALUE (5004),
67 DIAMETER_MISSING_AVP (5005),
68 DIAMETER_RESOURCES_EXCEEDED (5006),
69 DIAMETER_CONTRADICTING_AVPS (5007),
70 DIAMETER_AVP_NOT_ALLOWED (5008),
71 DIAMETER_AVP_OCCURS_TOO_MANY_TIMES (5009),
72 DIAMETER_NO_COMMON_APPLICATION (5010),
73 DIAMETER_UNSUPPORTED_VERSION (5011),
74 DIAMETER_UNABLE_TO_COMPLY (5012),
75 DIAMETER_INVALID_BIT_IN_HEADER (5013),
76 DIAMETER_INVALID_AVP_LENGTH (5014),
77 DIAMETER_INVALID_MESSAGE_LENGTH (5015),
78 DIAMETER_INVALID_AVP_BIT_COMBO (5016),
79 DIAMETER_NO_COMMON_SECURITY (5017),
80 DIAMETER_RADIUS_AVP_UNTRANSLATABLE (5018),
81 DIAMETER_ERROR_NO_FOREIGN_HA_SERVICE (5024),
82 DIAMETER_ERROR_END_TO_END_MIP_KEY_ENCRYPTION (5025),
83 DIAMETER_USER_UNKNOWN (5030),
84 DIAMETER_RATING_FAILED (5031),
85 DIAMETER_ERROR_USER_UNKNOWN (5032),
86 DIAMETER_ERROR_IDENTITIES_DONT_MATCH (5033),
87 DIAMETER_ERROR_IDENTITY_NOT_REGISTERED (5034),
88 DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5035),
89 DIAMETER_ERROR_IDENTITY_ALREADY_REGISTERED (5036),
90 DIAMETER_ERROR_AUTH_SCHEME_NOT_SUPPORTED (5037),
91 DIAMETER_ERROR_IN_ASSIGNMENT_TYPE (5038),
92 DIAMETER_ERROR_TOO_MUCH_DATA (5039),
93 DIAMETER_ERROR_NOT_SUPPORTED_USER_DATA (5040),
94 DIAMETER_ERROR_MIP6_AUTH_MODE (5041),
95 UNKNOWN_BINDING_TEMPLATE_NAME (5042),
96 BINDING_FAILURE (5043),
97 MAX_BINDINGS_SET_FAILURE (5044),
98 MAXIMUM_BINDINGS_REACHED_FOR_ENDPOINT (5045),
99 SESSION_EXISTS (5046),
100 INSUFFICIENT_CLASSIFIERS (5047),
101 DIAMETER_ERROR_EAP_CODE_UNKNOWN (5048)
102};
103
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +0200104/* 3GPP TS 29.272 section 7.4. Errors in Experimental-Result-Code */
105type enumerated DIAMETER_ExperimentalResultcode {
106 /* transient */
107 DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181),
108 DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT (4182),
109 /* permanent */
110 DIAMETER_ERROR_USER_UNKNOWN (5001),
111 DIAMETER_AUTHORIZATION_REJECTED (5003),
112 DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5004),
113 DIAMETER_MISSING_AVP (5005),
114 DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION (5420),
115 DIAMETER_ERROR_RAT_NOT_ALLOWED (5421),
116 DIAMETER_ERROR_EQUIPMENT_UNKNOWN (5422),
117 DIAMETER_ERROR_UNKOWN_SERVING_NODE (5423)
118}
119
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +0100120/* Gy : 3GPP TS 32.299 7.1.6, RFC4006 3.1 */
121const uint32_t c_DIAMETER_CREDIT_CONTROL_AID := 4;
Harald Welted27ab242019-07-26 13:45:18 +0200122/* 3GPP TS 29.272 Section 7.1.8 */
Harald Weltef9fb63e2020-04-26 18:07:19 +0200123const uint32_t c_DIAMETER_3GPP_Gx_AID := 16777238;
Harald Welted27ab242019-07-26 13:45:18 +0200124const uint32_t c_DIAMETER_3GPP_S6_AID := 16777251;
125const uint32_t c_DIAMETER_3GPP_S13_AID := 16777252;
126const uint32_t c_DIAMETER_3GPP_S7_AID := 16777308;
127
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +0300128const octetstring c_def_sess_id := char2oct("ttcn3.session");
129
Harald Welted27ab242019-07-26 13:45:18 +0200130template (value) PDU_DIAMETER
131ts_DIAMETER(template (value) BIT8 flags,
132 template (value) Command_Code cmd_code,
133 template (value) OCTET4 app_id := '00000000'O,
Vadim Yanitskiy00720bd2021-12-12 02:05:08 +0300134 template (value) UINT32 hbh_id := '00000000'O,
135 template (value) UINT32 ete_id := '00000000'O,
Harald Welted27ab242019-07-26 13:45:18 +0200136 template (value) AVP_list avps := {}
137) := {
138 version := 1,
139 message_length := 0, /* overwritten */
140 RPETxxxx := flags,
141 command_code := cmd_code,
142 application_id := app_id,
143 hop_by_hop_id := hbh_id,
144 end_to_end_id := ete_id,
145 avps := avps
146}
147template (present) PDU_DIAMETER
148tr_DIAMETER(template (present) BIT8 flags := ?,
149 template (present) Command_Code cmd_code := ?,
150 template (present) OCTET4 app_id := ?,
151 template (present) UINT32 hbh_id := ?,
152 template (present) UINT32 ete_id := ?,
153 template (present) AVP_list avps := ?) := {
154 version := 1,
155 message_length := ?,
156 RPETxxxx := flags,
157 command_code := cmd_code,
158 application_id := app_id,
159 hop_by_hop_id := hbh_id,
160 end_to_end_id := ete_id,
161 avps := avps
162}
163template (present) PDU_DIAMETER
164tr_DIAMETER_A(
165 template (present) Command_Code cmd_code := ?,
166 template (present) OCTET4 app_id := ?,
167 template (present) UINT32 hbh_id := ?,
168 template (present) UINT32 ete_id := ?,
169 template (present) AVP_list avps := ?) :=
170 tr_DIAMETER('0???????'B, cmd_code, app_id, hbh_id, ete_id, avps);
171template (present) PDU_DIAMETER
172tr_DIAMETER_R(
173 template (present) Command_Code cmd_code := ?,
174 template (present) OCTET4 app_id := ?,
175 template (present) UINT32 hbh_id := ?,
176 template (present) UINT32 ete_id := ?,
177 template (present) AVP_list avps := ?) :=
178 tr_DIAMETER('1???????'B, cmd_code, app_id, hbh_id, ete_id, avps);
179
180
181template (value) AVP_Header
182ts_DIA_Hdr(template (value) AVP_Code avp_code,
183 template (value) BIT8 flags := '01000000'B) := {
184 avp_code := avp_code,
185 VMPxxxxx := flags,
186 avp_length := 0, /* overwritten */
187 vendor_id := omit
188}
189template (present) AVP_Header
190tr_DIA_Hdr(template (present) AVP_Code avp_code,
191 template (present) BIT8 flags := '0???????'B) := {
192 avp_code := avp_code,
193 VMPxxxxx := flags,
194 avp_length := ?, /* overwritten */
195 vendor_id := omit
196}
197
198template (value) AVP_Header
199ts_DIA_Hdr_3GPP(template (value) AVP_Code avp_code,
200 template (value) BIT8 flags := '11000000'B) := {
201 avp_code := avp_code,
202 VMPxxxxx := flags,
203 avp_length := 0, /* overwritten */
204 vendor_id := vendor_id_3GPP
205}
206template (present) AVP_Header
207tr_DIA_Hdr_3GPP(template (present) AVP_Code avp_code,
208 template (present) BIT8 flags := '1???????'B) := {
209 avp_code := avp_code,
210 VMPxxxxx := flags,
211 avp_length := ?, /* overwritten */
212 vendor_id := vendor_id_3GPP
213}
214
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200215template (present) AVP_Address tr_AVP_Address(template (present) AddressType addr_type := ?,
216 template (present) octetstring addr_data := ?) := {
217 address_type := addr_type,
218 address_data := addr_data
219}
220
221template (present) GenericAVP tr_AVP_SubcrId(template (present) DCC_NONE_Subscription_Id t) := {
222 avp := {
223 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id),
224 avp_data := {
225 avp_DCC_NONE_Subscription_Id := t
226 }
227 }
228}
229
Pau Espin Pedrolb8cd34a2022-05-18 16:34:12 +0200230template (present) GenericAVP tr_AVP_SubcrIdType(template (present) DCC_NONE_Subscription_Id_Type t) := {
Harald Weltef9fb63e2020-04-26 18:07:19 +0200231 avp := {
232 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id_Type),
233 avp_data := {
234 avp_DCC_NONE_Subscription_Id_Type := t
235 }
236 }
237}
Harald Welted27ab242019-07-26 13:45:18 +0200238
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200239template (present) GenericAVP tr_AVP_SubcrIdData(template (present) DCC_NONE_Subscription_Id_Data t) := {
240 avp := {
241 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id_Data),
242 avp_data := {
243 avp_DCC_NONE_Subscription_Id_Data := t
244 }
245 }
246}
247
248template (present) GenericAVP tr_AVP_RequestedAction(template (present) DCC_NONE_Requested_Action t := ?) := {
249 avp := {
250 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Requested_Action),
251 avp_data := {
252 avp_DCC_NONE_Requested_Action := t
253 }
254 }
255}
256
257template (present) GenericAVP tr_AVP_MultipleServicesIndicator(template (present) DCC_NONE_Multiple_Services_Indicator t := ?) := {
258 avp := {
259 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Multiple_Services_Indicator),
260 avp_data := {
261 avp_DCC_NONE_Multiple_Services_Indicator := t
262 }
263 }
264}
265
266template (present) GenericAVP tr_AVP_ServiceContextId(template (present) DCC_NONE_Service_Context_Id id := ?) := {
267 avp := {
268 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Service_Context_Id),
269 avp_data := {
270 avp_DCC_NONE_Service_Context_Id := id
271 }
272 }
273}
274
Harald Welted27ab242019-07-26 13:45:18 +0200275template (value) GenericAVP ts_AVP_OriginHost(template (value) charstring host) := {
276 avp := {
277 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Host),
278 avp_data := {
279 avp_BASE_NONE_Origin_Host := host
280 }
281 }
282}
283template (present) GenericAVP tr_AVP_OriginHost(template (present) charstring host := ?) := {
284 avp := {
285 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Host),
286 avp_data := {
287 avp_BASE_NONE_Origin_Host := host
288 }
289 }
290}
291
292
293template (value) GenericAVP ts_AVP_OriginRealm(template (value) charstring realm) := {
294 avp := {
295 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Realm),
296 avp_data := {
297 avp_BASE_NONE_Origin_Realm := realm
298 }
299 }
300}
301template (present) GenericAVP tr_AVP_OriginRealm(template (present) charstring realm := ?) := {
302 avp := {
303 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Realm),
304 avp_data := {
305 avp_BASE_NONE_Origin_Realm := realm
306 }
307 }
308}
309
310
311template (value) GenericAVP ts_AVP_OriginStateId(template (value) OCTET4 state_id) := {
312 avp := {
313 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_State_Id),
314 avp_data := {
315 avp_BASE_NONE_Origin_State_Id := state_id
316 }
317 }
318}
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +0300319template (present) GenericAVP tr_AVP_OriginStateId(template (present) OCTET4 state_id := ?) := {
320 avp := {
321 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_State_Id),
322 avp_data := {
323 avp_BASE_NONE_Origin_State_Id := state_id
324 }
325 }
326}
Harald Welted27ab242019-07-26 13:45:18 +0200327
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200328template (present) GenericAVP tr_AVP_TerminationCause(template (present) BASE_NONE_Termination_Cause tc) := {
329 avp := {
330 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Termination_Cause),
331 avp_data := {
332 avp_BASE_NONE_Termination_Cause := tc
333 }
334 }
335}
336
Harald Welted27ab242019-07-26 13:45:18 +0200337template (value) GenericAVP ts_AVP_HostIpAddr(template (value) OCTET4 ipv4_addr) := {
338 avp := {
339 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Host_IP_Address),
340 avp_data := {
341 avp_BASE_NONE_Host_IP_Address := {
342 address_type := IP,
343 address_data := ipv4_addr
344 }
345 }
346 }
347}
348
349template (value) GenericAVP ts_AVP_VendorId(Vendor_Id vendor_id) := {
350 avp := {
351 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id, '00000000'B),
352 avp_data := {
353 avp_BASE_NONE_Vendor_Id := int2oct(enum2int(vendor_id), 4)
354 }
355 }
356}
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +0200357private function f_tr_AVP_VendorId(template (present) Vendor_Id vendor_id)
358return template (present) BASE_NONE_Vendor_Id {
359 if (istemplatekind(vendor_id, "?")) {
360 return ?;
361 } else {
362 var template (present) BASE_NONE_Vendor_Id c;
363 c := int2oct(enum2int(valueof(vendor_id)), 4);
364 return c;
365 }
366}
367template (present) GenericAVP tr_AVP_VendorId(template (present) Vendor_Id vendor_id) := {
368 avp := {
369 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id),
370 avp_data := {
371 avp_BASE_NONE_Vendor_Id := f_tr_AVP_VendorId(vendor_id)
372 }
373 }
374}
Harald Welted27ab242019-07-26 13:45:18 +0200375
376template (value) GenericAVP ts_AVP_ProductName(charstring name) := {
377 avp := {
378 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Product_Name, '00000000'B),
379 avp_data := {
380 avp_BASE_NONE_Product_Name := char2oct(name)
381 }
382 }
383}
384
385template (value) GenericAVP ts_AVP_FwRevision(octetstring fw_version) := {
386 avp := {
387 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Firmware_Revision, '00000000'B),
388 avp_data := {
389 avp_BASE_NONE_Firmware_Revision := fw_version
390 }
391 }
392}
393
394template (value) GenericAVP ts_AVP_InbSecId(template (value) OCTET4 inb_sec_id) := {
395 avp := {
396 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Inband_Security_Id),
397 avp_data := {
398 avp_BASE_NONE_Inband_Security_Id := inb_sec_id
399 }
400 }
401}
402
403template (value) GenericAVP ts_AVP_VendorSpecAppId(Vendor_Id vendor_id, uint32_t auth_app_id) := {
404 avp := {
405 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Specific_Application_Id),
406 avp_data := {
407 avp_BASE_NONE_Vendor_Specific_Application_Id := {
408 {
409 avp := {
410 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id),
411 avp_data := {
412 avp_BASE_NONE_Vendor_Id := int2oct(enum2int(vendor_id), 4)
413 }
414 }
415 }, {
416 avp := {
417 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
418 avp_data := {
419 avp_BASE_NONE_Auth_Application_Id := int2oct(auth_app_id, 4)
420 }
421 }
422 }
423 }
424 }
425 }
426}
427
428template (value) GenericAVP ts_AVP_AuthAppId(template (value) OCTET4 auth_app_id) := {
429 avp := {
430 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
431 avp_data := {
432 avp_BASE_NONE_Auth_Application_Id := auth_app_id
433 }
434 }
435}
Harald Weltef4001512020-04-26 21:48:34 +0200436template (present) GenericAVP tr_AVP_AuthAppId(template (present) OCTET4 auth_app_id := ?) := {
437 avp := {
438 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
439 avp_data := {
440 avp_BASE_NONE_Auth_Application_Id := auth_app_id
441 }
442 }
443}
444
445template (value) GenericAVP ts_AVP_CcReqType(template (value) DCC_NONE_CC_Request_Type r) := {
446 avp := {
447 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Type),
448 avp_data := {
449 avp_DCC_NONE_CC_Request_Type := r
450 }
451 }
452}
453template (present) GenericAVP tr_AVP_CcReqType(template (present) DCC_NONE_CC_Request_Type r := ?) := {
454 avp := {
455 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Type),
456 avp_data := {
457 avp_DCC_NONE_CC_Request_Type := r
458 }
459 }
460}
461
462template (value) GenericAVP ts_AVP_CcReqNum(template (value) AVP_Unsigned32 n) := {
463 avp := {
464 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Number),
465 avp_data := {
466 avp_DCC_NONE_CC_Request_Number := n
467 }
468 }
469}
470template (present) GenericAVP tr_AVP_CcReqNum(template (present) AVP_Unsigned32 n := ?) := {
471 avp := {
472 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Number),
473 avp_data := {
474 avp_DCC_NONE_CC_Request_Number := n
475 }
476 }
477}
478
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200479template (present) GenericAVP tr_AVP_EventTimestamp(template (present) AVP_Unsigned32 n := ?) := {
480 avp := {
481 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Event_Timestamp),
482 avp_data := {
483 avp_BASE_NONE_Event_Timestamp := n
484 }
485 }
486}
Harald Weltef4001512020-04-26 21:48:34 +0200487
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +0200488template (present) GenericAVP tr_AVP_ExperimentalResultCode(template (present) AVP_Unsigned32 n := ?) := {
489 avp := {
490 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Experimental_Result_Code),
491 avp_data := {
492 avp_BASE_NONE_Experimental_Result_Code := n
493 }
494 }
495}
496
497template (present) GenericAVP tr_AVP_ExperimentalResult(template (present) Vendor_Id vendor_id := ?,
498 template (present) AVP_Unsigned32 err_code := ?
499 ) := {
500 avp := {
501 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Experimental_Result),
502 avp_data := {
503 avp_BASE_NONE_Experimental_Result := {
504 tr_AVP_VendorId(vendor_id),
505 tr_AVP_ExperimentalResultCode(err_code)
506 }
507 }
508 }
509}
Harald Welted27ab242019-07-26 13:45:18 +0200510
511template (value) GenericAVP ts_AVP_SuppVendorIdRaw(uint32_t vendor_id) := {
512 avp := {
513 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Supported_Vendor_Id),
514 avp_data := {
515 avp_BASE_NONE_Supported_Vendor_Id := int2oct(vendor_id, 4)
516 }
517 }
518}
519template (value) GenericAVP ts_AVP_SuppVendorId(Vendor_Id vendor_id) :=
520 ts_AVP_SuppVendorIdRaw(enum2int(vendor_id));
521
522template (value) GenericAVP ts_AVP_ResultCode(DIAMETER_Resultcode res_code) := {
523 avp := {
524 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Result_Code),
525 avp_data := {
526 avp_BASE_NONE_Result_Code := int2oct(enum2int(res_code), 4)
527 }
528 }
529}
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +0200530private function f_tr_DIAMETER_Resultcode(template (present) DIAMETER_Resultcode res_code)
531return template (present) BASE_NONE_Result_Code {
532 if (istemplatekind(res_code, "?")) {
533 return ?;
534 } else {
535 var template (present) BASE_NONE_Result_Code c;
536 c := int2oct(enum2int(valueof(res_code)), 4);
537 return c;
538 }
539}
540template (present) GenericAVP tr_AVP_ResultCode(template (present) DIAMETER_Resultcode res_code) := {
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +0300541 avp := {
542 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Result_Code),
543 avp_data := {
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +0200544 avp_BASE_NONE_Result_Code := f_tr_DIAMETER_Resultcode(res_code)
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +0300545 }
546 }
547}
Harald Welted27ab242019-07-26 13:45:18 +0200548
549template (value) GenericAVP ts_AVP_AuthSessionState(template (value) BASE_NONE_Auth_Session_State ass := NO_STATE_MAINTAINED) := {
550 avp := {
551 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Session_State),
552 avp_data := {
553 avp_BASE_NONE_Auth_Session_State := ass
554 }
555 }
556}
557template (present) GenericAVP tr_AVP_AuthSessionState(template (present) BASE_NONE_Auth_Session_State ass := ?) := {
558 avp := {
559 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Session_State),
560 avp_data := {
561 avp_BASE_NONE_Auth_Session_State := ass
562 }
563 }
564}
565
566template (value) GenericAVP ts_AVP_SessionId(template (value) octetstring session_id) := {
567 avp := {
568 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Session_Id),
569 avp_data := {
570 avp_BASE_NONE_Session_Id := session_id
571 }
572 }
573}
574template (present) GenericAVP tr_AVP_SessionId(template (present) octetstring session_id := ?) := {
575 avp := {
576 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Session_Id),
577 avp_data := {
578 avp_BASE_NONE_Session_Id := session_id
579 }
580 }
581}
582
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200583template (present) GenericAVP tr_AVP_DestinationHost(template (present) charstring host := ?) := {
584 avp := {
585 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Host),
586 avp_data := {
587 avp_BASE_NONE_Destination_Host := host
588 }
589 }
590}
591
Harald Welted27ab242019-07-26 13:45:18 +0200592/* 3.3 Destination Realm */
593template (value) GenericAVP ts_AVP_DestinationRealm(template (value) charstring dest_realm) := {
594 avp := {
595 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Realm),
596 avp_data := {
597 avp_BASE_NONE_Destination_Realm := dest_realm
598 }
599 }
600}
601template (present) GenericAVP tr_AVP_DestinationRealm(template (present) charstring dest_realm := ?) := {
602 avp := {
603 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Realm),
604 avp_data := {
605 avp_BASE_NONE_Destination_Realm := dest_realm
606 }
607 }
608}
609
610/* 8.14 User-Name */
611template (value) GenericAVP ts_AVP_UserName(template (value) octetstring uid) := {
612 avp := {
613 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_User_Name),
614 avp_data := {
615 avp_BASE_NONE_User_Name := uid
616 }
617 }
618}
619template (present) GenericAVP tr_AVP_UserName(template (present) octetstring uid := ?) := {
620 avp := {
621 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_User_Name),
622 avp_data := {
623 avp_BASE_NONE_User_Name := uid
624 }
625 }
626}
627template (value) GenericAVP ts_AVP_UserNameImsi(hexstring imsi) := ts_AVP_UserName(char2oct(hex2str(imsi)));
628template (present) GenericAVP tr_AVP_UserNameImsi(hexstring imsi) := tr_AVP_UserName(char2oct(hex2str(imsi)));
629
630
631
Harald Welte40b1e002023-01-27 17:26:39 +0100632/* TS 29.272 7.3.53 RAND */
Harald Welted27ab242019-07-26 13:45:18 +0200633template (value) GenericAVP ts_AVP_RAND(template (value) octetstring rand) := {
634 avp := {
635 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_RAND),
636 avp_data := {
637 avp_AAA_3GPP_RAND := rand
638 }
639 }
640}
641
Harald Welte40b1e002023-01-27 17:26:39 +0100642/* TS 29.272 7.3.54 XRES */
Harald Welted27ab242019-07-26 13:45:18 +0200643template (value) GenericAVP ts_AVP_XRES(template (value) octetstring xres) := {
644 avp := {
645 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_XRES),
646 avp_data := {
647 avp_AAA_3GPP_XRES := xres
648 }
649 }
650}
651
Harald Welte40b1e002023-01-27 17:26:39 +0100652/* TS 29.272 7.3.55 XRES */
Harald Welted27ab242019-07-26 13:45:18 +0200653template (value) GenericAVP ts_AVP_AUTN(template (value) octetstring autn) := {
654 avp := {
655 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AUTN),
656 avp_data := {
657 avp_AAA_3GPP_AUTN := autn
658 }
659 }
660}
661
Harald Welte40b1e002023-01-27 17:26:39 +0100662/* TS 29.272 7.3.56 KASME */
Harald Welted27ab242019-07-26 13:45:18 +0200663template (value) GenericAVP ts_AVP_KASME(template (value) octetstring kasme) := {
664 avp := {
665 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_KASME),
666 avp_data := {
667 avp_AAA_3GPP_KASME := kasme
668 }
669 }
670}
671
Harald Welte40b1e002023-01-27 17:26:39 +0100672/* TS 29.272 7.3.23 Item-Number */
Harald Welted27ab242019-07-26 13:45:18 +0200673template (value) GenericAVP ts_AVP_ItemNumber(uint32_t num) := {
674 avp := {
675 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_KASME),
676 avp_data := {
677 avp_AAA_3GPP_Item_Number := int2oct(num, 4)
678 }
679 }
680}
681
Harald Welte40b1e002023-01-27 17:26:39 +0100682/* TS 29.272 7.3.18 E-UTRAN Vector */
Harald Welted27ab242019-07-26 13:45:18 +0200683template (value) GenericAVP ts_AVP_EutranVec(uint32_t item_num, octetstring rand, octetstring xres,
684 octetstring autn, octetstring kasme) := {
685 avp := {
686 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_E_UTRAN_Vector),
687 avp_data := {
688 avp_AAA_3GPP_E_UTRAN_Vector := {
689 ts_AVP_ItemNumber(item_num),
690 ts_AVP_RAND(rand),
691 ts_AVP_XRES(xres),
692 ts_AVP_AUTN(autn),
693 ts_AVP_KASME(kasme)
694 }
695 }
696 }
697}
698
Harald Welte40b1e002023-01-27 17:26:39 +0100699/* TS 29.272 7.3.2 Subscription-Data */
Harald Welted27ab242019-07-26 13:45:18 +0200700template (value) GenericAVP ts_AVP_3GPP_SubscriptionData(template (value) AVP_list content) := {
701 avp := {
702 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscription_Data),
703 avp_data := {
704 avp_AAA_3GPP_Subscription_Data := content
705 }
706 }
707}
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +0300708template (present) GenericAVP
709tr_AVP_3GPP_SubscriptionData(template (present) AVP_list content := ?) := {
710 avp := {
711 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscription_Data),
712 avp_data := {
713 avp_AAA_3GPP_Subscription_Data := content
714 }
715 }
716}
Harald Welted27ab242019-07-26 13:45:18 +0200717
718
Harald Welte40b1e002023-01-27 17:26:39 +0100719/* TS 29.272 7.3.17 Authentication-Info */
Harald Welted27ab242019-07-26 13:45:18 +0200720template (value) GenericAVP ts_AVP_3GPP_AuthInfo(template (value) AVP_list content) := {
721 avp := {
722 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Authentication_Info),
723 avp_data := {
724 avp_AAA_3GPP_Authentication_Info := content
725 }
726 }
727}
Vadim Yanitskiy446edae2021-12-12 04:33:08 +0300728template (present) GenericAVP
729tr_AVP_3GPP_AuthInfo(template (present) AVP_list content := ?) := {
730 avp := {
731 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Authentication_Info),
732 avp_data := {
733 avp_AAA_3GPP_Authentication_Info := content
734 }
735 }
736}
Harald Welted27ab242019-07-26 13:45:18 +0200737
Harald Welte40b1e002023-01-27 17:26:39 +0100738/* TS 29.272 7.3.9 Visited-PLMN-Id */
Harald Welted27ab242019-07-26 13:45:18 +0200739template (value) GenericAVP ts_AVP_3GPP_VisitedPlmnId(template (value) octetstring id) := {
740 avp := {
741 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Visited_PLMN_Id),
742 avp_data := {
743 avp_AAA_3GPP_Visited_PLMN_Id := id
744 }
745 }
746}
747template (present) GenericAVP tr_AVP_3GPP_VisitedPlmnId(template (present) octetstring id := ?) := {
748 avp := {
749 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Visited_PLMN_Id),
750 avp_data := {
751 avp_AAA_3GPP_Visited_PLMN_Id := id
752 }
753 }
754}
755
Harald Welte40b1e002023-01-27 17:26:39 +0100756/* TS 29.272 7.3.13 RAT-Type */
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200757template (value) GenericAVP ts_AVP_PCC_3GPP_RatType(template (value) PCC_3GPP_RAT_Type rat_type) := {
Harald Welted27ab242019-07-26 13:45:18 +0200758 avp := {
759 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_RAT_Type),
760 avp_data := {
761 avp_PCC_3GPP_RAT_Type := rat_type
762 }
763 }
764}
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200765template (present) GenericAVP tr_AVP_PCC_3GPP_RatType(template (present) PCC_3GPP_RAT_Type rat_type := ?) := {
Harald Welted27ab242019-07-26 13:45:18 +0200766 avp := {
767 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_RAT_Type),
768 avp_data := {
769 avp_PCC_3GPP_RAT_Type := rat_type
770 }
771 }
772}
773
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200774template (present) GenericAVP tr_AVP_GI_3GPP_RatType(template (present) GI_3GPP_3GPP_RAT_Type rat_type := ?) := {
775 avp := {
776 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_RAT_Type),
777 avp_data := {
778 avp_GI_3GPP_3GPP_RAT_Type := rat_type
779 }
780 }
781}
782
Harald Welte40b1e002023-01-27 17:26:39 +0100783/* TS 29.272 7.3.7 ULR-Flags */
Harald Welted27ab242019-07-26 13:45:18 +0200784template (value) GenericAVP ts_AVP_3GPP_UlrFlags(template (value) UINT32 flags) := {
785 avp := {
786 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULR_Flags),
787 avp_data := {
788 avp_AAA_3GPP_ULR_Flags := flags
789 }
790 }
791}
792template (present) GenericAVP tr_AVP_3GPP_UlrFlags(template (present) UINT32 flags := ?) := {
793 avp := {
794 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULR_Flags),
795 avp_data := {
796 avp_AAA_3GPP_ULR_Flags := flags
797 }
798 }
799}
800
Harald Welte40b1e002023-01-27 17:26:39 +0100801/* TS 29.272 7.3.8 ULA-Flags */
Harald Welted27ab242019-07-26 13:45:18 +0200802template (value) GenericAVP ts_AVP_3GPP_UlaFlags(template (value) UINT32 flags) := {
803 avp := {
804 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULA_Flags),
805 avp_data := {
806 avp_AAA_3GPP_ULA_Flags := flags
807 }
808 }
809}
810template (present) GenericAVP tr_AVP_3GPP_UlaFlags(template (present) UINT32 flags := ?) := {
811 avp := {
812 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULA_Flags),
813 avp_data := {
814 avp_AAA_3GPP_ULA_Flags := flags
815 }
816 }
817}
818
Harald Welte6effabb2020-02-18 21:39:59 +0100819
820
821template (value) GenericAVP ts_AVP_NumOfReqVectors(template (value) UINT32 num_req := '00000004'O) := {
822 avp := {
823 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Number_Of_Requested_Vectors),
824 avp_data := {
825 avp_AAA_3GPP_Number_Of_Requested_Vectors := num_req
826 }
827 }
828}
829
830template (value) GenericAVP ts_AVP_ImmReqPref(template (value) UINT32 par := '00000000'O) := {
831 avp := {
832 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Immediate_Response_Preferred),
833 avp_data := {
834 avp_AAA_3GPP_Immediate_Response_Preferred := par
835 }
836 }
837}
838
839
840/* 7.3.11 Requested-EUTRAN-Authentication-Info */
841template (value) GenericAVP ts_AVP_RequestedEutranAuthInfo(template (value) UINT32 num_vec := '00000004'O) := {
842 avp := {
843 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Requested_EUTRAN_Authentication_Info),
844 avp_data := {
845 avp_AAA_3GPP_Requested_EUTRAN_Authentication_Info := {
846 ts_AVP_NumOfReqVectors(num_vec),
847 ts_AVP_ImmReqPref('00000000'O)
848 }
849 }
850 }
851}
852
853
Harald Welte40b1e002023-01-27 17:26:39 +0100854/* TS 29.272 7.3.27 Context-Identifier */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200855template (present) GenericAVP tr_AVP_3GPP_ContextId(template (present) uint32_t ctx := ?) := {
856 avp := {
857 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Context_Identifier),
858 avp_data := {
859 avp_AAA_3GPP_Context_Identifier := int2oct_tmpl(ctx, 4)
860 }
861 }
862}
Harald Welted27ab242019-07-26 13:45:18 +0200863template (value) GenericAVP ts_AVP_3GPP_ContextId(uint32_t ctx) := {
864 avp := {
865 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Context_Identifier),
866 avp_data := {
867 avp_AAA_3GPP_Context_Identifier := int2oct(ctx, 4)
868 }
869 }
870}
871
Harald Welte40b1e002023-01-27 17:26:39 +0100872/* Ts 29.272 7.3.29 Subscriber-Status */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200873template (present) GenericAVP tr_AVP_3GPP_SubscriberStatus(template (present) AAA_3GPP_Subscriber_Status sts) := {
874 avp := {
875 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscriber_Status),
876 avp_data := {
877 avp_AAA_3GPP_Subscriber_Status := sts
878 }
879 }
880}
Harald Welted27ab242019-07-26 13:45:18 +0200881template (value) GenericAVP ts_AVP_3GPP_SubscriberStatus(template (value) AAA_3GPP_Subscriber_Status sts) := {
882 avp := {
883 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscriber_Status),
884 avp_data := {
885 avp_AAA_3GPP_Subscriber_Status := sts
886 }
887 }
888}
889
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200890template (present) GenericAVP tr_AVP_3GPP_SubscrRauTauTmr(template (present) uint32_t tmr := ?) := {
891 avp := {
892 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer),
893 avp_data := {
894 avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer := int2oct_tmpl(tmr, 4)
895 }
896 }
897}
898
Harald Welted27ab242019-07-26 13:45:18 +0200899template (value) GenericAVP ts_AVP_3GPP_SubscrRauTauTmr(uint32_t tmr) := {
900 avp := {
901 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer),
902 avp_data := {
903 avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer := int2oct(tmr, 4)
904 }
905 }
906}
907
Harald Welte40b1e002023-01-27 17:26:39 +0100908/* TS 29.272 7.3.33 All-APN-Configurations-Included-Indicator */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200909template (present) GenericAVP tr_AVP_3GPP_AllApnConfigsIncl(template (present) AAA_3GPP_All_APN_Configurations_Included_Indicator ind := ?) := {
910 avp := {
911 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_All_APN_Configurations_Included_Indicator),
912 avp_data := {
913 avp_AAA_3GPP_All_APN_Configurations_Included_Indicator := ind
914 }
915 }
916}
Harald Welted27ab242019-07-26 13:45:18 +0200917template (value) GenericAVP ts_AVP_3GPP_AllApnConfigsIncl(template (value) AAA_3GPP_All_APN_Configurations_Included_Indicator ind := All_APN_CONFIGURATIONS_INCLUDED) := {
918 avp := {
919 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_All_APN_Configurations_Included_Indicator),
920 avp_data := {
921 avp_AAA_3GPP_All_APN_Configurations_Included_Indicator := ind
922 }
923 }
924}
925
Harald Welte40b1e002023-01-27 17:26:39 +0100926/* TS 29.272 7.3.34 APN-Configuration-Profile */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200927template (present) GenericAVP tr_AVP_3GPP_ApnConfigProfile(template (present) AVP_list content := ?) := {
928 avp := {
929 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
930 avp_data := {
931 avp_AAA_3GPP_APN_Configuration_Profile := content
932 }
933 }
934}
Harald Welted27ab242019-07-26 13:45:18 +0200935template (value) GenericAVP ts_AVP_3GPP_ApnConfigProfile(template (value) AVP_list content) := {
936 avp := {
937 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
938 avp_data := {
939 avp_AAA_3GPP_APN_Configuration_Profile := content
940 }
941 }
942}
943
Harald Welte40b1e002023-01-27 17:26:39 +0100944/* TS 29.272 7.3.35 APN-Configuration */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200945template (present) GenericAVP tr_AVP_3GPP_ApnConfig(template (present) uint32_t ctx := ?,
946 template (present) AAA_3GPP_PDN_Type pdn_type := ?,
947 template (present) charstring apn := ?) := {
948 avp := {
949 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration),
950 avp_data := {
951 avp_AAA_3GPP_APN_Configuration := superset(
952 tr_AVP_3GPP_ContextId(ctx),
953 tr_AVP_3GPP_PdnType(pdn_type),
954 tr_AVP_ServiceSelection(apn),
955 tr_AVP_3GPP_EpsSubscrQosProfile(?, ?)
956 )
957 }
958 }
959}
Harald Welted27ab242019-07-26 13:45:18 +0200960template (value) GenericAVP ts_AVP_3GPP_ApnConfig(uint32_t ctx, AAA_3GPP_PDN_Type pdn_type,
961 charstring apn) := {
962 avp := {
Pau Espin Pedrolaaad2762023-10-11 17:35:20 +0200963 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration),
Harald Welted27ab242019-07-26 13:45:18 +0200964 avp_data := {
965 avp_AAA_3GPP_APN_Configuration := {
966 ts_AVP_3GPP_ContextId(ctx),
967 ts_AVP_3GPP_PdnType(pdn_type),
Pau Espin Pedrolaaad2762023-10-11 17:35:20 +0200968 ts_AVP_ServiceSelection(apn),
969 ts_AVP_3GPP_EpsSubscrQosProfile(1, 1)
Harald Welted27ab242019-07-26 13:45:18 +0200970 }
971 }
972 }
973}
974
Harald Welte40b1e002023-01-27 17:26:39 +0100975/* TS 29.272 7.3.36 Service-Selection (refers to RFC 5778) */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +0200976template (present) GenericAVP tr_AVP_ServiceSelection(template (present) charstring apn := ?) := {
977 avp := {
978 avp_header := tr_DIA_Hdr(c_AVP_Code_MIPv6_NONE_Service_Selection),
979 avp_data := {
980 avp_MIPv6_NONE_Service_Selection := char2oct_tmpl(apn)
981 }
982 }
983}
Harald Welted27ab242019-07-26 13:45:18 +0200984template (value) GenericAVP ts_AVP_ServiceSelection(charstring apn) := {
985 avp := {
986 avp_header := ts_DIA_Hdr(c_AVP_Code_MIPv6_NONE_Service_Selection),
987 avp_data := {
988 avp_MIPv6_NONE_Service_Selection := char2oct(apn)
989 }
990 }
991}
992
Pau Espin Pedrol6477d732022-06-03 12:04:40 +0200993template (present) GenericAVP tr_AVP_PCC_3GPP_QoS_Information(template (present) AVP_list list := ?) := {
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200994 avp := {
995 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Information),
996 avp_data := {
997 avp_PCC_3GPP_QoS_Information := list
998 }
999 }
1000}
1001
Pau Espin Pedrol6477d732022-06-03 12:04:40 +02001002template (value) GenericAVP ts_AVP_PCC_3GPP_QoS_Information(template (value) AVP_list list) := {
1003 avp := {
1004 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Information),
1005 avp_data := {
1006 avp_PCC_3GPP_QoS_Information := list
1007 }
1008 }
1009}
1010
1011template (value) GenericAVP ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL(uint32_t val) := {
1012 avp := {
1013 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL),
1014 avp_data := {
1015 avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL := int2oct(val, 4)
1016 }
1017 }
1018}
1019
1020template (value) GenericAVP ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL(uint32_t val) := {
1021 avp := {
1022 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL),
1023 avp_data := {
1024 avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL := int2oct(val, 4)
1025 }
1026 }
1027}
1028
1029template (value) GenericAVP ts_AVP_PCC_3GPP_Default_EPS_Bearer_QoS(template (value) AVP_list list) := {
1030 avp := {
1031 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Default_EPS_Bearer_QoS),
1032 avp_data := {
1033 avp_PCC_3GPP_Default_EPS_Bearer_QoS := list
1034 }
1035 }
1036}
1037
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001038template (present) GenericAVP tr_AVP_PCC_3GPP_QoS_Class_Identifier(template (present) uint32_t val := ?) := {
1039 avp := {
1040 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Class_Identifier),
1041 avp_data := {
1042 avp_PCC_3GPP_QoS_Class_Identifier := int2oct_tmpl(val, 4)
1043 }
1044 }
1045}
1046
Pau Espin Pedrol6477d732022-06-03 12:04:40 +02001047template (value) GenericAVP ts_AVP_PCC_3GPP_QoS_Class_Identifier(uint32_t val) := {
Harald Welted27ab242019-07-26 13:45:18 +02001048 avp := {
1049 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Class_Identifier),
1050 avp_data := {
Pau Espin Pedrol6477d732022-06-03 12:04:40 +02001051 avp_PCC_3GPP_QoS_Class_Identifier := int2oct(val, 4)
Harald Welted27ab242019-07-26 13:45:18 +02001052 }
1053 }
1054}
1055
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001056template (present) GenericAVP tr_AVP_3GPP_PriorityLevel(template (present) uint32_t prio := ?) := {
1057 avp := {
1058 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Priority_Level),
1059 avp_data := {
1060 avp_PCC_3GPP_Priority_Level := int2oct_tmpl(prio, 4)
1061 }
1062 }
1063}
1064
Harald Welted27ab242019-07-26 13:45:18 +02001065template (value) GenericAVP ts_AVP_3GPP_PriorityLevel(uint32_t prio) := {
1066 avp := {
1067 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Priority_Level),
1068 avp_data := {
1069 avp_PCC_3GPP_Priority_Level := int2oct(prio, 4)
1070 }
1071 }
1072}
1073
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001074template (present) GenericAVP tr_AVP_PCC_3GPP_AllocRetenPrio(template (present) uint32_t prio := ?) := {
1075 avp := {
1076 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Allocation_Retention_Priority),
1077 avp_data := {
1078 avp_PCC_3GPP_Allocation_Retention_Priority := superset(
1079 tr_AVP_3GPP_PriorityLevel(prio)
1080 /* pre-emption capability */
1081 /* pre-emption vulnerability */
1082 )
1083 }
1084 }
1085}
Pau Espin Pedrol6477d732022-06-03 12:04:40 +02001086template (value) GenericAVP ts_AVP_PCC_3GPP_AllocRetenPrio(uint32_t prio) := {
Harald Welted27ab242019-07-26 13:45:18 +02001087 avp := {
1088 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Allocation_Retention_Priority),
1089 avp_data := {
1090 avp_PCC_3GPP_Allocation_Retention_Priority := {
1091 ts_AVP_3GPP_PriorityLevel(prio)
1092 /* pre-emption capability */
1093 /* pre-emption vulnerability */
1094 }
1095 }
1096 }
1097}
1098
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001099/* 7.3.37 EPS-Subscribed-QoS-Profile */
1100template (present) GenericAVP tr_AVP_3GPP_EpsSubscrQosProfile(template (present) uint32_t qos_class := ?,
1101 template (present) uint32_t prio := ?) := {
1102 avp := {
1103 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_EPS_Subscribed_QoS_Profile),
1104 avp_data := {
1105 avp_AAA_3GPP_EPS_Subscribed_QoS_Profile := superset(
1106 tr_AVP_PCC_3GPP_QoS_Class_Identifier(qos_class),
1107 tr_AVP_PCC_3GPP_AllocRetenPrio(prio)
1108 )
1109 }
1110 }
1111}
1112
Harald Welted27ab242019-07-26 13:45:18 +02001113template (value) GenericAVP ts_AVP_3GPP_EpsSubscrQosProfile(uint32_t qos_class, uint32_t prio) := {
1114 avp := {
1115 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_EPS_Subscribed_QoS_Profile),
1116 avp_data := {
1117 avp_AAA_3GPP_EPS_Subscribed_QoS_Profile := {
Pau Espin Pedrol6477d732022-06-03 12:04:40 +02001118 ts_AVP_PCC_3GPP_QoS_Class_Identifier(qos_class),
1119 ts_AVP_PCC_3GPP_AllocRetenPrio(prio)
Harald Welted27ab242019-07-26 13:45:18 +02001120 }
1121 }
1122 }
1123}
1124
1125
Harald Welte40b1e002023-01-27 17:26:39 +01001126/* TS 29.272 7.3.41 AMBR */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001127template (present) GenericAVP tr_AVP_3GPP_AMBR(template (present) uint32_t ul := ?, template (present) uint32_t dl := ?) := {
1128 avp := {
1129 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AMBR),
1130 avp_data := {
1131 avp_AAA_3GPP_AMBR := {
1132 tr_AVP_3GPP_MaxReqBwUL(ul),
1133 tr_AVP_3GPP_MaxReqBwDL(dl)
1134 }
1135 }
1136 }
1137}
Harald Welted27ab242019-07-26 13:45:18 +02001138template (value) GenericAVP ts_AVP_3GPP_AMBR(uint32_t ul, uint32_t dl) := {
1139 avp := {
1140 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AMBR),
1141 avp_data := {
1142 avp_AAA_3GPP_AMBR := {
1143 ts_AVP_3GPP_MaxReqBwUL(ul),
1144 ts_AVP_3GPP_MaxReqBwDL(dl)
1145 }
1146 }
1147 }
1148}
1149
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001150template (present) GenericAVP tr_AVP_3GPP_MaxReqBwUL(template (present) uint32_t bw := ?) := {
1151 avp := {
1152 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_UL),
1153 avp_data := {
1154 avp_RX_3GPP_Max_Requested_Bandwidth_UL := int2oct_tmpl(bw, 4)
1155 }
1156 }
1157}
1158
Harald Welted27ab242019-07-26 13:45:18 +02001159template (value) GenericAVP ts_AVP_3GPP_MaxReqBwUL(uint32_t bw) := {
1160 avp := {
1161 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_UL),
1162 avp_data := {
1163 avp_RX_3GPP_Max_Requested_Bandwidth_UL := int2oct(bw, 4)
1164 }
1165 }
1166}
1167
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001168template (present) GenericAVP tr_AVP_3GPP_MaxReqBwDL(template (present) uint32_t bw := ?) := {
1169 avp := {
1170 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_DL),
1171 avp_data := {
1172 avp_RX_3GPP_Max_Requested_Bandwidth_DL := int2oct_tmpl(bw, 4)
1173 }
1174 }
1175}
1176
Harald Welted27ab242019-07-26 13:45:18 +02001177template (value) GenericAVP ts_AVP_3GPP_MaxReqBwDL(uint32_t bw) := {
1178 avp := {
1179 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_DL),
1180 avp_data := {
1181 avp_RX_3GPP_Max_Requested_Bandwidth_DL := int2oct(bw, 4)
1182 }
1183 }
1184}
1185
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001186template (present) GenericAVP tr_AVP_3GPP_Reporting_Reason(template (present) DCA_3GPP_Reporting_Reason r := ?) := {
1187 avp := {
1188 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_Reporting_Reason),
1189 avp_data := {
1190 avp_DCA_3GPP_Reporting_Reason := r
1191 }
1192 }
1193}
Harald Welted27ab242019-07-26 13:45:18 +02001194
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001195template (present) GenericAVP tr_AVP_3GPP_AoCRequestType(template (present) DCA_3GPP_AoC_Request_Type t := ?) := {
1196 avp := {
1197 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_AoC_Request_Type),
1198 avp_data := {
1199 avp_DCA_3GPP_AoC_Request_Type := t
1200 }
1201 }
1202}
1203
1204template (present) GenericAVP tr_AVP_3GPP_ServiceInformation(template (present) AVP_list content := ?) := {
1205 avp := {
1206 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_Service_Information),
1207 avp_data := {
1208 avp_DCA_3GPP_Service_Information := content
1209 }
1210 }
1211}
1212
1213template (present) GenericAVP tr_AVP_3GPP_PSInformation(template (present) AVP_list content := ?) := {
1214 avp := {
1215 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_PS_Information),
1216 avp_data := {
1217 avp_DCA_3GPP_PS_Information := content
1218 }
1219 }
1220}
1221
1222template (present) GenericAVP tr_AVP_3GPP_ChargingId(template (present) AVP_OctetString id := ?) := {
1223 avp := {
1224 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_Charging_Id),
1225 avp_data := {
1226 avp_GI_3GPP_3GPP_Charging_Id := id
1227 }
1228 }
1229}
1230
1231template (present) GenericAVP tr_AVP_3GPP_PDPType(template (present) GI_3GPP_3GPP_PDP_Type t := ?) := {
1232 avp := {
1233 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_PDP_Type),
1234 avp_data := {
1235 avp_GI_3GPP_3GPP_PDP_Type := t
1236 }
1237 }
1238}
1239
1240template (present) GenericAVP tr_AVP_3GPP_PDPAddress(template (present) DCA_3GPP_PDP_Address addr := ?) := {
1241 avp := {
1242 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_PDP_Address),
1243 avp_data := {
1244 avp_DCA_3GPP_PDP_Address := addr
1245 }
1246 }
1247}
1248
1249template (present) GenericAVP tr_AVP_3GPP_SGSNAddress(template (present) DCA_3GPP_SGSN_Address addr := ?) := {
1250 avp := {
1251 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_SGSN_Address),
1252 avp_data := {
1253 avp_DCA_3GPP_SGSN_Address := addr
1254 }
1255 }
1256}
1257
1258template (present) GenericAVP tr_AVP_3GPP_GGSNAddress(template (present) DCA_3GPP_GGSN_Address addr := ?) := {
1259 avp := {
1260 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_GGSN_Address),
1261 avp_data := {
1262 avp_DCA_3GPP_GGSN_Address := addr
1263 }
1264 }
1265}
1266
1267template (present) GenericAVP tr_AVP_3GPP_SelectionMode(template (present) GI_3GPP_3GPP_Selection_Mode sm := ?) := {
1268 avp := {
1269 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_Selection_Mode),
1270 avp_data := {
1271 avp_GI_3GPP_3GPP_Selection_Mode := sm
1272 }
1273 }
1274}
1275
1276template (present) GenericAVP tr_AVP_3GPP_ChargingCharacteristics(template (present) GI_3GPP_3GPP_Charging_Characteristics cc := ?) := {
1277 avp := {
1278 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_Charging_Characteristics),
1279 avp_data := {
1280 avp_GI_3GPP_3GPP_Charging_Characteristics := cc
1281 }
1282 }
1283}
1284
1285template (present) GenericAVP tr_AVP_3GPP_SGSNMCCMNC(template (present) GI_3GPP_3GPP_SGSN_MCC_MNC smn := ?) := {
1286 avp := {
1287 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_SGSN_MCC_MNC),
1288 avp_data := {
1289 avp_GI_3GPP_3GPP_SGSN_MCC_MNC := smn
1290 }
1291 }
1292}
1293
1294template (present) GenericAVP tr_AVP_3GPP_NSAPI(template (present) GI_3GPP_3GPP_NSAPI nsapi := ?) := {
1295 avp := {
1296 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_NSAPI),
1297 avp_data := {
1298 avp_GI_3GPP_3GPP_NSAPI := nsapi
1299 }
1300 }
1301}
1302
1303template (present) GenericAVP tr_AVP_3GPP_MS_TimeZone(template (present) GI_3GPP_3GPP_MS_TimeZone ms_tz := ?) := {
1304 avp := {
1305 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_MS_TimeZone),
1306 avp_data := {
1307 avp_GI_3GPP_3GPP_MS_TimeZone := ms_tz
1308 }
1309 }
1310}
1311
1312template (present) GenericAVP tr_AVP_3GPP_ULI(template (present) GI_3GPP_3GPP_User_Location_Info uli := ?) := {
1313 avp := {
1314 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_User_Location_Info),
1315 avp_data := {
1316 avp_GI_3GPP_3GPP_User_Location_Info := uli
1317 }
1318 }
1319}
1320
1321template (present) GenericAVP tr_AVP_UserEquipmentInfo(template (present) DCC_NONE_User_Equipment_Info uei := ?) := {
1322 avp := {
1323 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_User_Equipment_Info),
1324 avp_data := {
1325 avp_DCC_NONE_User_Equipment_Info := uei
1326 }
1327 }
1328}
1329
1330template (present) GenericAVP tr_AVP_UserEquipmentInfoType(template (present) DCC_NONE_User_Equipment_Info_Type ueit := ?) := {
1331 avp := {
1332 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_User_Equipment_Info_Type),
1333 avp_data := {
1334 avp_DCC_NONE_User_Equipment_Info_Type := ueit
1335 }
1336 }
1337}
1338
1339template (present) GenericAVP tr_AVP_UserEquipmentInfoValue(template (present) DCC_NONE_User_Equipment_Info_Value ueiv := ?) := {
1340 avp := {
1341 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_User_Equipment_Info_Value),
1342 avp_data := {
1343 avp_DCC_NONE_User_Equipment_Info_Value := ueiv
1344 }
1345 }
1346}
Harald Welted27ab242019-07-26 13:45:18 +02001347
Harald Welte40b1e002023-01-27 17:26:39 +01001348/* TS 29.272 7.3.62 PDN-Type */
Pau Espin Pedrol446145a2023-10-10 19:12:21 +02001349template (present) GenericAVP tr_AVP_3GPP_PdnType(template (present) AAA_3GPP_PDN_Type pdn_type := ?) := {
1350 avp := {
1351 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_PDN_Type),
1352 avp_data := {
1353 avp_AAA_3GPP_PDN_Type := pdn_type
1354 }
1355 }
1356}
Harald Welted27ab242019-07-26 13:45:18 +02001357template (value) GenericAVP ts_AVP_3GPP_PdnType(template (value) AAA_3GPP_PDN_Type pdn_type) := {
1358 avp := {
1359 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_PDN_Type),
1360 avp_data := {
1361 avp_AAA_3GPP_PDN_Type := pdn_type
1362 }
1363 }
1364}
1365
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001366/* RFC4006 8.16 Multiple-Services-Credit-Control AVP */
1367template (value) GenericAVP ts_AVP_Multiple_Services_Credit_Control(template (value) AVP_list content) := {
1368 avp := {
1369 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Multiple_Services_Credit_Control),
1370 avp_data := {
1371 avp_DCC_NONE_Multiple_Services_Credit_Control := content
1372 }
1373 }
1374}
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001375template (present) GenericAVP tr_AVP_Multiple_Services_Credit_Control(template (present) AVP_list content := ?) := {
1376 avp := {
1377 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Multiple_Services_Credit_Control),
1378 avp_data := {
1379 avp_DCC_NONE_Multiple_Services_Credit_Control := content
1380 }
1381 }
1382}
1383
1384/* Requested-Service-Unit AVP */
1385template (present) GenericAVP tr_AVP_Requested_Service_Unit(template (present) AVP_list content := ?) := {
1386 avp := {
1387 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Requested_Service_Unit),
1388 avp_data := {
1389 avp_DCC_NONE_Requested_Service_Unit := content
1390 }
1391 }
1392}
1393
1394/* Used-Service-Unit AVP */
1395template (present) GenericAVP tr_AVP_Used_Service_Unit(template (present) AVP_list content := ?) := {
1396 avp := {
1397 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Used_Service_Unit),
1398 avp_data := {
1399 avp_DCC_NONE_Used_Service_Unit := content
1400 }
1401 }
1402}
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001403
1404/* RFC4006 8.17 Granted-Service-Unit AVP */
1405template (value) GenericAVP ts_AVP_Granted_Service_Unit(template (value) AVP_list content) := {
1406 avp := {
1407 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Granted_Service_Unit),
1408 avp_data := {
1409 avp_DCC_NONE_Granted_Service_Unit := content
1410 }
1411 }
1412}
1413
1414/* RFC4006 8.21 CC-Time AVP */
1415template (value) GenericAVP ts_AVP_CC_Time(uint32_t cc_time_val) := {
1416 avp := {
1417 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Time),
1418 avp_data := {
1419 avp_DCC_NONE_CC_Time := int2oct(cc_time_val, 4)
1420 }
1421 }
1422}
1423
1424/* RFC4006 8.23 CC-Total-Octets AVP */
1425template (value) GenericAVP ts_AVP_CC_Total_Octets(uint64_t cc_total_octets_val) := {
1426 avp := {
1427 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Total_Octets),
1428 avp_data := {
1429 avp_DCC_NONE_CC_Total_Octets := int2oct(cc_total_octets_val, 8)
1430 }
1431 }
1432}
1433
1434/* RFC4006 8.33 Validity-Time AVP */
1435template (value) GenericAVP ts_AVP_Validity_Time(uint32_t validity_time_val) := {
1436 avp := {
1437 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Validity_Time),
1438 avp_data := {
1439 avp_DCC_NONE_Validity_Time := int2oct(validity_time_val, 4)
1440 }
1441 }
1442}
1443
Pau Espin Pedrol52562c92022-05-23 15:45:46 +02001444template (value) GenericAVP ts_AVP_3GPP_VolumeQuotaThreshold(uint32_t volume_quota_thresh_val) := {
1445 avp := {
1446 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_Volume_Quota_Threshold),
1447 avp_data := {
1448 avp_DCA_3GPP_Volume_Quota_Threshold := int2oct(volume_quota_thresh_val, 4)
1449 }
1450 }
1451}
1452
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001453template (present) GenericAVP tr_AVP_3GPP_CalledStationId(template (present) DNAS_NONE_Called_Station_Id id := ?) := {
1454 avp := {
1455 avp_header := tr_DIA_Hdr(c_AVP_Code_DNAS_NONE_Called_Station_Id),
1456 avp_data := {
1457 avp_DNAS_NONE_Called_Station_Id := id
1458 }
1459 }
1460}
Harald Welted27ab242019-07-26 13:45:18 +02001461
1462
Vadim Yanitskiy0d6cbd32023-02-11 08:07:27 +07001463/* 5.3.1 Capabilities Exchange Request */
1464template (value) PDU_DIAMETER
1465ts_DIA_CER(octetstring host_ip, uint32_t vendor_app_id,
1466 template (value) charstring orig_host := "ttcn3.localdomain",
1467 template (value) charstring orig_realm := "localdomain",
1468 template (value) UINT32 hbh_id := '00000000'O,
1469 template (value) UINT32 ete_id := '00000000'O) :=
1470 ts_DIAMETER(flags := '10000000'B,
1471 cmd_code := Capabilities_Exchange,
1472 hbh_id := hbh_id,
1473 ete_id := ete_id,
1474 avps := {
1475 ts_AVP_OriginHost(orig_host),
1476 ts_AVP_OriginRealm(orig_realm),
1477 ts_AVP_HostIpAddr(host_ip),
1478 ts_AVP_VendorId(vendor_id_3GPP),
1479 ts_AVP_ProductName("TTCN-3 Testsuite"),
1480 ts_AVP_FwRevision('00000000'O),
1481 ts_AVP_InbSecId('00000000'O),
1482 ts_AVP_AuthAppId('FFFFFFFF'O),
1483 ts_AVP_VendorSpecAppId(vendor_id_3GPP, vendor_app_id)
1484 });
1485
1486
Harald Welted27ab242019-07-26 13:45:18 +02001487/* 5.3.2 Capabilities Exchange Answer */
1488template (value) PDU_DIAMETER
Pau Espin Pedrol33b47492022-03-08 17:43:01 +01001489ts_DIA_CEA_AUTH_APP_ID(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1490 template (value) charstring origin_host,
1491 template (value) charstring origin_realm,
1492 template (value) octetstring host_ip, uint32_t auth_app_id)
1493:= ts_DIAMETER(flags:='00000000'B, cmd_code:=Capabilities_Exchange, hbh_id:=hbh_id, ete_id:=ete_id,
1494 avps := {
1495 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1496 ts_AVP_OriginHost(origin_host),
1497 ts_AVP_OriginRealm(origin_realm),
1498 ts_AVP_HostIpAddr(host_ip),
1499 ts_AVP_VendorId(vendor_id_3GPP),
1500 ts_AVP_ProductName("TTCN-3 Testsuite"),
1501 ts_AVP_OriginStateId('00000001'O),
1502 ts_AVP_SuppVendorIdRaw(5535), /* 3GPP2 */
1503 ts_AVP_SuppVendorId(vendor_id_3GPP),
1504 ts_AVP_SuppVendorIdRaw(13019), /* ETSI */
Pau Espin Pedrol33b47492022-03-08 17:43:01 +01001505 ts_AVP_AuthAppId(int2oct(auth_app_id, 4)),
1506 ts_AVP_InbSecId('00000000'O)
1507 });
1508template (value) PDU_DIAMETER
1509ts_DIA_CEA_VENDOR_APP_ID(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1510 template (value) charstring origin_host,
1511 template (value) charstring origin_realm,
1512 template (value) octetstring host_ip, uint32_t vendor_app_id)
Harald Welted27ab242019-07-26 13:45:18 +02001513:= ts_DIAMETER(flags:='00000000'B, cmd_code:=Capabilities_Exchange, hbh_id:=hbh_id, ete_id:=ete_id,
1514 avps := {
1515 ts_AVP_ResultCode(DIAMETER_SUCCESS),
Harald Welte61f73d52020-04-26 21:41:12 +02001516 ts_AVP_OriginHost(origin_host),
1517 ts_AVP_OriginRealm(origin_realm),
1518 ts_AVP_HostIpAddr(host_ip),
Harald Welted27ab242019-07-26 13:45:18 +02001519 ts_AVP_VendorId(vendor_id_3GPP),
1520 ts_AVP_ProductName("TTCN-3 Testsuite"),
1521 ts_AVP_OriginStateId('00000001'O),
1522 ts_AVP_SuppVendorIdRaw(5535), /* 3GPP2 */
1523 ts_AVP_SuppVendorId(vendor_id_3GPP),
1524 ts_AVP_SuppVendorIdRaw(13019), /* ETSI */
Harald Welted27ab242019-07-26 13:45:18 +02001525 ts_AVP_InbSecId('00000000'O),
Harald Welte61f73d52020-04-26 21:41:12 +02001526 ts_AVP_VendorSpecAppId(vendor_id_3GPP, vendor_app_id)
Harald Welted27ab242019-07-26 13:45:18 +02001527 });
Pau Espin Pedrol33b47492022-03-08 17:43:01 +01001528function f_ts_DIA_CEA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1529 template (value) charstring origin_host,
1530 template (value) charstring origin_realm,
1531 template (value) octetstring host_ip, template (omit) uint32_t auth_app_id,
1532 template (omit) uint32_t vendor_app_id)
1533 return template (value) PDU_DIAMETER
1534{
1535 var template (value) PDU_DIAMETER diam_pdu;
1536 if (istemplatekind(vendor_app_id, "omit")) {
1537 diam_pdu := ts_DIA_CEA_AUTH_APP_ID(hbh_id, ete_id, origin_host, origin_realm, host_ip, valueof(auth_app_id));
1538 } else {
1539 diam_pdu := ts_DIA_CEA_VENDOR_APP_ID(hbh_id, ete_id, origin_host, origin_realm, host_ip, valueof(vendor_app_id));
1540 }
1541 return diam_pdu;
1542}
Harald Welted27ab242019-07-26 13:45:18 +02001543
Harald Welte6effabb2020-02-18 21:39:59 +01001544
1545template (value) PDU_DIAMETER
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001546ts_DIA_AIR(/* template (value) */ hexstring imsi,
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001547 template (value) octetstring mcc_mnc := '111F11'O,
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001548 template (value) octetstring sess_id := c_def_sess_id,
Vadim Yanitskiyb57ef872021-12-12 04:14:18 +03001549 template (value) charstring orig_host := "ttcn3.localdomain",
1550 template (value) charstring orig_realm := "localdomain",
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001551 template (value) charstring dest_realm := "localdomain",
1552 template (value) UINT32 hbh_id := '00000000'O,
1553 template (value) UINT32 ete_id := '00000000'O) :=
Vadim Yanitskiy21fd7db2021-12-15 05:29:35 +03001554 ts_DIAMETER(flags := '11000000'B,
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001555 cmd_code := Authentication_Information,
Vadim Yanitskiy463d8262021-12-11 16:50:46 +03001556 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001557 hbh_id := hbh_id,
1558 ete_id := ete_id,
1559 avps := {
1560 ts_AVP_SessionId(sess_id),
1561 ts_AVP_DestinationRealm(dest_realm),
Vadim Yanitskiyb57ef872021-12-12 04:14:18 +03001562 ts_AVP_OriginHost(orig_host),
1563 ts_AVP_OriginRealm(orig_realm),
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001564 ts_AVP_UserNameImsi(imsi),
1565 /* Requested EUTRAN Auth Info */
1566 ts_AVP_RequestedEutranAuthInfo,
Vadim Yanitskiyb57ef872021-12-12 04:14:18 +03001567 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001568 ts_AVP_3GPP_VisitedPlmnId(mcc_mnc)
Harald Welte6effabb2020-02-18 21:39:59 +01001569 });
Harald Welted27ab242019-07-26 13:45:18 +02001570template (present) PDU_DIAMETER
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001571tr_DIA_AIR(/* template (present) */ hexstring imsi,
1572 template (present) octetstring sess_id := ?,
1573 template (present) charstring dest_realm := ?,
1574 template (present) UINT32 hbh_id := ?,
1575 template (present) UINT32 ete_id := ?) :=
Vadim Yanitskiy21fd7db2021-12-15 05:29:35 +03001576 tr_DIAMETER(flags := '1???????'B,
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001577 cmd_code := Authentication_Information,
1578 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1579 hbh_id := hbh_id, ete_id := ete_id,
1580 avps := superset(
1581 tr_AVP_SessionId(sess_id),
1582 tr_AVP_DestinationRealm(dest_realm),
1583 tr_AVP_UserNameImsi(imsi),
1584 tr_AVP_3GPP_VisitedPlmnId
Harald Welted27ab242019-07-26 13:45:18 +02001585 ));
1586
Harald Welte40b1e002023-01-27 17:26:39 +01001587/* TS 29.272 5.2.3.1 + 7.2.6 Authentication Information Answer */
Harald Welted27ab242019-07-26 13:45:18 +02001588template (value) PDU_DIAMETER
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001589ts_DIA_AIA(template (value) AVP_list auth_info_contents,
1590 template (value) octetstring sess_id := c_def_sess_id,
1591 template (value) charstring orig_host := "hss.localdomain",
1592 template (value) charstring orig_realm := "localdomain",
1593 template (value) UINT32 hbh_id := '00000000'O,
1594 template (value) UINT32 ete_id := '00000000'O) :=
1595 ts_DIAMETER(flags := '01000000'B,
1596 cmd_code := Authentication_Information,
1597 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1598 hbh_id := hbh_id,
1599 ete_id := ete_id,
1600 avps := {
1601 ts_AVP_SessionId(sess_id),
1602 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1603 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1604 ts_AVP_OriginHost(orig_host),
1605 ts_AVP_OriginRealm(orig_realm),
1606 ts_AVP_3GPP_AuthInfo(auth_info_contents)
Harald Welted27ab242019-07-26 13:45:18 +02001607 });
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001608template (present) PDU_DIAMETER
1609tr_DIA_AIA(template (present) AVP_list auth_info_contents := ?,
1610 template (present) octetstring sess_id := ?,
1611 template (present) charstring orig_host := ?,
1612 template (present) charstring orig_realm := ?,
1613 template (present) UINT32 hbh_id := ?,
1614 template (present) UINT32 ete_id := ?) :=
1615 tr_DIAMETER(flags := '0???????'B,
1616 cmd_code := Authentication_Information,
1617 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1618 hbh_id := hbh_id,
1619 ete_id := ete_id,
1620 avps := superset(
1621 tr_AVP_SessionId(sess_id),
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001622 tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001623 tr_AVP_OriginHost(orig_host),
Pau Espin Pedrol7bedcf82023-08-24 19:33:49 +02001624 tr_AVP_OriginRealm(orig_realm),
1625 tr_AVP_ResultCode(DIAMETER_SUCCESS),
1626 tr_AVP_3GPP_AuthInfo(auth_info_contents)
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001627 ));
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +02001628template (present) PDU_DIAMETER
1629tr_DIA_AIA_ERR(template (present) GenericAVP err_avp := ?,
1630 template (present) octetstring sess_id := ?,
1631 template (present) charstring orig_host := ?,
1632 template (present) charstring orig_realm := ?,
1633 template (present) UINT32 hbh_id := ?,
1634 template (present) UINT32 ete_id := ?) :=
1635 tr_DIAMETER(flags := '0???????'B,
1636 cmd_code := Authentication_Information,
1637 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1638 hbh_id := hbh_id,
1639 ete_id := ete_id,
1640 avps := superset(
1641 tr_AVP_SessionId(sess_id),
1642 tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1643 tr_AVP_OriginHost(orig_host),
1644 tr_AVP_OriginRealm(orig_realm),
1645 err_avp
1646 ));
Harald Welted27ab242019-07-26 13:45:18 +02001647
1648
Harald Welte40b1e002023-01-27 17:26:39 +01001649/* TS 29.272 7.2.3 Update Location Request */
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001650template (value) PDU_DIAMETER
1651ts_DIA_ULR(/* template (value) */ hexstring imsi,
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001652 template (value) octetstring mcc_mnc := '111F11'O,
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001653 template (value) octetstring sess_id := c_def_sess_id,
1654 template (value) charstring orig_host := "ttcn3.localdomain",
1655 template (value) charstring orig_realm := "localdomain",
1656 template (value) charstring dest_realm := "localdomain",
1657 template (value) UINT32 hbh_id := '00000000'O,
1658 template (value) UINT32 ete_id := '00000000'O) :=
1659 ts_DIAMETER(flags := '11000000'B,
1660 cmd_code := Update_Location,
1661 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1662 hbh_id := hbh_id,
1663 ete_id := ete_id,
1664 avps := {
1665 ts_AVP_SessionId(sess_id),
1666 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1667 ts_AVP_UserNameImsi(imsi),
1668 ts_AVP_3GPP_UlrFlags('00000000'O),
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001669 ts_AVP_3GPP_VisitedPlmnId(mcc_mnc),
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001670 ts_AVP_PCC_3GPP_RatType(EUTRAN),
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001671 ts_AVP_OriginHost(orig_host),
1672 ts_AVP_OriginRealm(orig_realm),
1673 ts_AVP_DestinationRealm(dest_realm)
1674 });
Harald Welted27ab242019-07-26 13:45:18 +02001675template (present) PDU_DIAMETER
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +03001676tr_DIA_ULR(/* template (present) */ hexstring imsi,
1677 template (present) octetstring sess_id := ?,
1678 template (present) charstring orig_host := ?,
1679 template (present) charstring orig_realm := ?,
1680 template (present) charstring dest_realm := ?,
1681 template (present) UINT32 hbh_id := ?,
1682 template (present) UINT32 ete_id := ?) :=
1683 tr_DIAMETER(flags := '11000000'B,
1684 cmd_code := Update_Location,
1685 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1686 hbh_id := hbh_id,
1687 ete_id := ete_id,
1688 avps := superset(
1689 tr_AVP_SessionId(sess_id),
1690 tr_AVP_AuthSessionState,
1691 tr_AVP_OriginHost(orig_host),
1692 tr_AVP_OriginRealm(orig_realm),
1693 tr_AVP_DestinationRealm(dest_realm),
1694 tr_AVP_UserNameImsi(imsi),
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001695 tr_AVP_PCC_3GPP_RatType,
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +03001696 tr_AVP_3GPP_UlrFlags,
1697 tr_AVP_3GPP_VisitedPlmnId
Harald Welted27ab242019-07-26 13:45:18 +02001698 ));
1699
1700template (value) PDU_DIAMETER
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +03001701ts_DIA_ULA(template (value) AVP_list sub_data,
1702 template (value) octetstring sess_id := c_def_sess_id,
1703 template (value) charstring orig_host := "hss.localdomain",
1704 template (value) charstring orig_realm := "localdomain",
1705 template (value) UINT32 hbh_id := '00000000'O,
1706 template (value) UINT32 ete_id := '00000000'O) :=
1707 ts_DIAMETER(flags:='01000000'B,
1708 cmd_code := Update_Location,
1709 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1710 hbh_id := hbh_id,
1711 ete_id := ete_id,
1712 avps := {
1713 ts_AVP_SessionId(sess_id),
1714 ts_AVP_ResultCode(DIAMETER_SUCCESS), /* optional */
1715 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1716 ts_AVP_OriginHost(orig_host),
1717 ts_AVP_OriginRealm(orig_realm),
1718 ts_AVP_3GPP_UlaFlags('00000002'O),
1719 ts_AVP_3GPP_SubscriptionData(sub_data)
Harald Welted27ab242019-07-26 13:45:18 +02001720 });
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001721template (present) PDU_DIAMETER
1722tr_DIA_ULA(template (present) AVP_list sub_data := ?,
1723 template (present) octetstring sess_id := ?,
1724 template (present) charstring orig_host := ?,
1725 template (present) charstring orig_realm := ?,
1726 template (present) UINT32 hbh_id := ?,
1727 template (present) UINT32 ete_id := ?) :=
1728 tr_DIAMETER(flags := '0???????'B,
1729 cmd_code := Update_Location,
1730 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1731 hbh_id := hbh_id,
1732 ete_id := ete_id,
1733 avps := superset(
1734 tr_AVP_SessionId(sess_id),
1735 tr_AVP_ResultCode(DIAMETER_SUCCESS),
1736 tr_AVP_AuthSessionState,
1737 tr_AVP_OriginHost(orig_host),
1738 tr_AVP_OriginRealm(orig_realm),
1739 tr_AVP_3GPP_UlaFlags,
1740 tr_AVP_3GPP_SubscriptionData(sub_data)
1741 ));
Harald Welted27ab242019-07-26 13:45:18 +02001742
1743
1744
Harald Weltef4001512020-04-26 21:48:34 +02001745/* RFC 4006 3.1. Credit-Control-Request (CCR) Command */
1746template (present) PDU_DIAMETER
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001747tr_DIA_Gx_CCR(template (present) DCC_NONE_CC_Request_Type req_type := INITIAL_REQUEST)
Harald Weltef4001512020-04-26 21:48:34 +02001748:= tr_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control,
Harald Weltef4001512020-04-26 21:48:34 +02001749 avps := superset(
1750 tr_AVP_SessionId,
1751 tr_AVP_OriginHost,
1752 tr_AVP_OriginRealm,
1753 tr_AVP_DestinationRealm,
1754 tr_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),
1755 tr_AVP_CcReqType(req_type),
1756 tr_AVP_CcReqNum(?)
1757 ));
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001758template (present) PDU_DIAMETER
1759tr_DIA_Gy_CCR(template (present) DCC_NONE_CC_Request_Type req_type := INITIAL_REQUEST)
1760:= tr_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control,
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001761 avps := superset(
1762 tr_AVP_SessionId,
1763 tr_AVP_OriginHost,
1764 tr_AVP_OriginRealm,
1765 tr_AVP_DestinationRealm,
1766 tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1767 tr_AVP_CcReqType(req_type),
1768 tr_AVP_CcReqNum(?)
1769 ));
1770
Harald Weltef4001512020-04-26 21:48:34 +02001771
1772
1773/* RFC 4006 3.2. Credit-Control-Answer (CCA) Command */
1774template (value) PDU_DIAMETER
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001775ts_DIA_Gx_CCA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
Harald Weltef4001512020-04-26 21:48:34 +02001776 template (value) octetstring sess_id,
1777 template (value) DCC_NONE_CC_Request_Type req_type,
1778 template (value) AVP_Unsigned32 req_num)
Harald Weltef4001512020-04-26 21:48:34 +02001779:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1780 app_id:=int2oct(c_DIAMETER_3GPP_Gx_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1781 avps := {
1782 ts_AVP_SessionId(sess_id),
1783 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1784 ts_AVP_OriginHost("pcrf.localdomain"),
1785 ts_AVP_OriginRealm("localdomain"),
1786 ts_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),
1787 ts_AVP_CcReqType(req_type),
Pau Espin Pedrolee961c72022-06-03 12:06:07 +02001788 ts_AVP_CcReqNum(req_num),
1789 ts_AVP_PCC_3GPP_QoS_Information({
1790 ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL(33554432),
1791 ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL(52428800)
1792 }),
1793 ts_AVP_PCC_3GPP_Default_EPS_Bearer_QoS({
1794 ts_AVP_PCC_3GPP_QoS_Class_Identifier(9),
1795 ts_AVP_PCC_3GPP_AllocRetenPrio(2)
1796 })
Harald Weltef4001512020-04-26 21:48:34 +02001797 // supported features
1798 // origin
1799 });
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001800template (value) PDU_DIAMETER
1801ts_DIA_Gy_CCA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1802 template (value) octetstring sess_id,
1803 template (value) DCC_NONE_CC_Request_Type req_type,
1804 template (value) AVP_Unsigned32 req_num)
1805:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1806 app_id:=int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1807 avps := {
1808 ts_AVP_SessionId(sess_id),
1809 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1810 ts_AVP_OriginHost("ocs.localdomain"),
1811 ts_AVP_OriginRealm("localdomain"),
1812 ts_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1813 ts_AVP_CcReqType(req_type),
1814 ts_AVP_CcReqNum(req_num)//,
1815 // qos
1816 // default eps bearer qos
1817 // supported features
1818 // origin
1819 });
1820/* Same as ts_DIA_Gy_CCA, but with extra AVP to grant access for limited amount of seconds */
1821template (value) PDU_DIAMETER
1822ts_DIA_Gy_CCA_ValidityTime(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1823 template (value) octetstring sess_id,
1824 template (value) DCC_NONE_CC_Request_Type req_type,
1825 template (value) AVP_Unsigned32 req_num,
1826 uint32_t validity_time)
1827:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1828 app_id:=int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1829 avps := {
1830 ts_AVP_SessionId(sess_id),
1831 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1832 ts_AVP_OriginHost("ocs.localdomain"),
1833 ts_AVP_OriginRealm("localdomain"),
1834 ts_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1835 ts_AVP_CcReqType(req_type),
1836 ts_AVP_CcReqNum(req_num),
1837 ts_AVP_Multiple_Services_Credit_Control({
1838 ts_AVP_Validity_Time(validity_time),
1839 ts_AVP_Granted_Service_Unit({
1840 //ts_AVP_CC_Time(validity_time*2),
1841 ts_AVP_CC_Total_Octets(1000)
1842 })
1843 })
1844 //,
1845 // qos
1846 // default eps bearer qos
1847 // supported features
1848 // origin
1849 });
Pau Espin Pedrol52562c92022-05-23 15:45:46 +02001850/* Same as ts_DIA_Gy_CCA_ValidityTime, but with extra AVP to grant access for limited amount of octets */
1851template (value) PDU_DIAMETER
1852ts_DIA_Gy_CCA_ValidityTimeVolumeThreshold(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1853 template (value) octetstring sess_id,
1854 template (value) DCC_NONE_CC_Request_Type req_type,
1855 template (value) AVP_Unsigned32 req_num,
1856 uint32_t validity_time, uint32_t volume_threhsold)
1857:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1858 app_id:=int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1859 avps := {
1860 ts_AVP_SessionId(sess_id),
1861 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1862 ts_AVP_OriginHost("ocs.localdomain"),
1863 ts_AVP_OriginRealm("localdomain"),
1864 ts_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1865 ts_AVP_CcReqType(req_type),
1866 ts_AVP_CcReqNum(req_num),
1867 ts_AVP_Multiple_Services_Credit_Control({
1868 ts_AVP_Validity_Time(validity_time),
1869 ts_AVP_Granted_Service_Unit({
1870 ts_AVP_CC_Total_Octets(volume_threhsold*100)
1871 }),
1872 ts_AVP_3GPP_VolumeQuotaThreshold(volume_threhsold)
1873 })
1874 //,
1875 // qos
1876 // default eps bearer qos
1877 // supported features
1878 // origin
1879 });
Harald Weltef4001512020-04-26 21:48:34 +02001880
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +03001881/* RFC 6733, section 5.5.1 "Device-Watchdog-Request" */
1882template (value) PDU_DIAMETER
1883ts_DIA_DWR(template (value) OCTET4 state_id := '00000000'O,
1884 template (value) charstring orig_host := "ttcn3.localdomain",
1885 template (value) charstring orig_realm := "localdomain",
1886 template (value) UINT32 hbh_id := '00000000'O,
1887 template (value) UINT32 ete_id := '00000000'O) :=
1888 ts_DIAMETER(flags := '10000000'B,
1889 cmd_code := Device_Watchdog,
1890 app_id := '00000000'O,
1891 hbh_id := hbh_id,
1892 ete_id := ete_id,
1893 avps := {
1894 ts_AVP_OriginHost(orig_host),
1895 ts_AVP_OriginRealm(orig_realm),
1896 ts_AVP_OriginStateId(state_id)
1897 });
1898template (present) PDU_DIAMETER
1899tr_DIA_DWR(template (present) OCTET4 state_id := ?,
1900 template (present) charstring orig_host := ?,
1901 template (present) charstring orig_realm := ?,
1902 template (present) UINT32 hbh_id := ?,
1903 template (present) UINT32 ete_id := ?) :=
1904 tr_DIAMETER(flags := '1???????'B,
1905 cmd_code := Device_Watchdog,
1906 app_id := '00000000'O,
1907 hbh_id := hbh_id,
1908 ete_id := ete_id,
1909 avps := superset(
1910 tr_AVP_OriginHost(orig_host),
Pau Espin Pedrol8dcb0612023-08-28 19:16:29 +02001911 tr_AVP_OriginRealm(orig_realm)
1912 /* tr_AVP_OriginStateId(state_id) is optional */
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +03001913 ));
1914
1915/* RFC 6733, section 5.5.2 "Device-Watchdog-Answer" */
1916template (value) PDU_DIAMETER
1917ts_DIA_DWA(template (value) OCTET4 state_id := '00000000'O,
1918 template (value) charstring orig_host := "ttcn3.localdomain",
1919 template (value) charstring orig_realm := "localdomain",
1920 template (value) UINT32 hbh_id := '00000000'O,
1921 template (value) UINT32 ete_id := '00000000'O) :=
1922 ts_DIAMETER(flags := '00000000'B,
1923 cmd_code := Device_Watchdog,
1924 app_id := '00000000'O,
1925 hbh_id := hbh_id,
1926 ete_id := ete_id,
1927 avps := {
1928 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1929 ts_AVP_OriginHost(orig_host),
1930 ts_AVP_OriginRealm(orig_realm),
1931 ts_AVP_OriginStateId(state_id)
1932 });
1933template (present) PDU_DIAMETER
1934tr_DIA_DWA(template (present) OCTET4 state_id := ?,
1935 template (present) charstring orig_host := ?,
1936 template (present) charstring orig_realm := ?,
1937 template (present) UINT32 hbh_id := ?,
1938 template (present) UINT32 ete_id := ?) :=
1939 tr_DIAMETER(flags := '0???????'B,
1940 cmd_code := Device_Watchdog,
1941 app_id := '00000000'O,
1942 hbh_id := hbh_id,
1943 ete_id := ete_id,
1944 avps := superset(
1945 tr_AVP_ResultCode(DIAMETER_SUCCESS),
1946 tr_AVP_OriginHost(orig_host),
Pau Espin Pedrol8dcb0612023-08-28 19:16:29 +02001947 tr_AVP_OriginRealm(orig_realm)
1948 /* tr_AVP_OriginStateId(state_id) is optional */
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +03001949 ));
1950
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02001951function f_DIAMETER_get_avp(PDU_DIAMETER pdu, template (present) AVP_Code avp_code)
1952return template (omit) AVP
1953{
1954 var integer i;
1955
1956 for (i := 0; i < lengthof(pdu.avps); i := i+1) {
1957 if (not ispresent(pdu.avps[i].avp)) {
1958 continue;
1959 }
1960 var AVP_Header hdr := pdu.avps[i].avp.avp_header;
1961 if (match(hdr.avp_code, avp_code)) {
1962 return pdu.avps[i].avp;
1963 }
1964 }
1965 return omit;
1966}
1967function f_DIAMETER_get_avp_or_fail(PDU_DIAMETER pdu, template (present) AVP_Code avp_code)
1968return AVP
1969{
1970 var template (omit) AVP avp;
1971 avp := f_DIAMETER_get_avp(pdu, avp_code);
1972 if (istemplatekind(avp, "omit")) {
1973 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1974 log2str("AVP ", avp_code, " not found in ", pdu));
1975 }
1976 return valueof(avp);
1977}
1978
1979function f_AVP_Grouped_get_avp(AVP_Grouped avp_grp, template (present) AVP_Code avp_code)
1980return template (omit) AVP
1981{
1982 var integer i;
1983
1984 for (i := 0; i < lengthof(avp_grp); i := i+1) {
1985 if (not ispresent(avp_grp[i].avp)) {
1986 continue;
1987 }
1988 var AVP_Header hdr := avp_grp[i].avp.avp_header;
1989 if (match(hdr.avp_code, avp_code)) {
1990 return avp_grp[i].avp;
1991 }
1992 }
1993 return omit;
1994}
1995function f_AVP_Grouped_get_avp_or_fail(AVP_Grouped avp_grp, template (present) AVP_Code avp_code)
1996return AVP
1997{
1998 var template (omit) AVP avp;
1999 avp := f_AVP_Grouped_get_avp(avp_grp, avp_code);
2000 if (istemplatekind(avp, "omit")) {
2001 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
2002 log2str("AVP ", avp_code, " not found in ", avp_grp));
2003 }
2004 return valueof(avp);
2005}
2006
2007function f_validate_gy_cc_report(PDU_DIAMETER rx_dia, template (present) DCA_3GPP_Reporting_Reason repreason_exp := ?,
2008 template (present) integer cc_time_exp := ?,
2009 template (present) integer cc_in_oct_exp := ?,
2010 template (present) integer cc_out_oct_exp := ?)
2011{
2012 var AVP multi_services_cc, used_service_unit;
2013 var AVP_Grouped multi_services_cc_data, used_service_unit_data;
Pau Espin Pedrolcba0f6d2022-05-24 13:49:46 +02002014 var template (omit) AVP repreason_tpl;
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02002015 var AVP repreason, cc_time, cc_in_oct, cc_out_oct;
2016
2017 multi_services_cc := f_DIAMETER_get_avp_or_fail(rx_dia, c_AVP_Code_DCC_NONE_Multiple_Services_Credit_Control);
2018 multi_services_cc_data := valueof(multi_services_cc.avp_data.avp_DCC_NONE_Multiple_Services_Credit_Control);
2019
Pau Espin Pedrolcba0f6d2022-05-24 13:49:46 +02002020 used_service_unit := f_AVP_Grouped_get_avp_or_fail(multi_services_cc_data, c_AVP_Code_DCC_NONE_Used_Service_Unit);
2021 used_service_unit_data := valueof(used_service_unit.avp_data.avp_DCC_NONE_Used_Service_Unit);
2022
2023 /* Reporting-Reason can be either inside Multiple-Services-Credit-Control or inside Used-Service-Unit */
2024 repreason_tpl := f_AVP_Grouped_get_avp(multi_services_cc_data, c_AVP_Code_DCA_3GPP_Reporting_Reason);
2025 if (istemplatekind(repreason_tpl, "omit")) {
2026 repreason := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCA_3GPP_Reporting_Reason);
2027 } else {
2028 repreason := valueof(repreason_tpl);
2029 }
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02002030 if (not match(repreason.avp_data.avp_DCA_3GPP_Reporting_Reason, repreason_exp)) {
2031 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
2032 log2str("3GPP-Reporting-Reason mismatch ", repreason, " vs exp ", repreason_exp));
2033 }
2034
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02002035 cc_time := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCC_NONE_CC_Time);
2036 if (not match(oct2int(cc_time.avp_data.avp_DCC_NONE_CC_Time), cc_time_exp)) {
2037 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
2038 log2str("3GPP-CC-Time mismatch ", cc_time, " vs exp ", cc_time_exp));
2039 }
2040
2041 cc_in_oct := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCC_NONE_CC_Input_Octets);
2042 if (not match(oct2int(cc_in_oct.avp_data.avp_DCC_NONE_CC_Input_Octets), cc_in_oct_exp)) {
2043 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
2044 log2str("3GPP-CC-Input-Octets mismatch ", cc_in_oct, " vs exp ", cc_in_oct_exp));
2045 }
2046
2047 cc_out_oct := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCC_NONE_CC_Output_Octets);
2048 if (not match(oct2int(cc_out_oct.avp_data.avp_DCC_NONE_CC_Output_Octets), cc_out_oct_exp)) {
2049 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
2050 log2str("3GPP-CC-Output-Octets mismatch ", cc_out_oct, " vs exp ", cc_out_oct_exp));
2051 }
2052}
2053
Harald Welted27ab242019-07-26 13:45:18 +02002054}