blob: 1e29120c609a826b69b148b717d9940c4dce8b52 [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 */
Harald Welted27ab242019-07-26 13:45:18 +0200855template (value) GenericAVP ts_AVP_3GPP_ContextId(uint32_t ctx) := {
856 avp := {
857 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Context_Identifier),
858 avp_data := {
859 avp_AAA_3GPP_Context_Identifier := int2oct(ctx, 4)
860 }
861 }
862}
863
Harald Welte40b1e002023-01-27 17:26:39 +0100864/* Ts 29.272 7.3.29 Subscriber-Status */
Harald Welted27ab242019-07-26 13:45:18 +0200865template (value) GenericAVP ts_AVP_3GPP_SubscriberStatus(template (value) AAA_3GPP_Subscriber_Status sts) := {
866 avp := {
867 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscriber_Status),
868 avp_data := {
869 avp_AAA_3GPP_Subscriber_Status := sts
870 }
871 }
872}
873
874template (value) GenericAVP ts_AVP_3GPP_SubscrRauTauTmr(uint32_t tmr) := {
875 avp := {
876 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer),
877 avp_data := {
878 avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer := int2oct(tmr, 4)
879 }
880 }
881}
882
Harald Welte40b1e002023-01-27 17:26:39 +0100883/* TS 29.272 7.3.33 All-APN-Configurations-Included-Indicator */
Harald Welted27ab242019-07-26 13:45:18 +0200884template (value) GenericAVP ts_AVP_3GPP_AllApnConfigsIncl(template (value) AAA_3GPP_All_APN_Configurations_Included_Indicator ind := All_APN_CONFIGURATIONS_INCLUDED) := {
885 avp := {
886 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_All_APN_Configurations_Included_Indicator),
887 avp_data := {
888 avp_AAA_3GPP_All_APN_Configurations_Included_Indicator := ind
889 }
890 }
891}
892
Harald Welte40b1e002023-01-27 17:26:39 +0100893/* TS 29.272 7.3.34 APN-Configuration-Profile */
Harald Welted27ab242019-07-26 13:45:18 +0200894template (value) GenericAVP ts_AVP_3GPP_ApnConfigProfile(template (value) AVP_list content) := {
895 avp := {
896 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
897 avp_data := {
898 avp_AAA_3GPP_APN_Configuration_Profile := content
899 }
900 }
901}
902
Harald Welte40b1e002023-01-27 17:26:39 +0100903/* TS 29.272 7.3.35 APN-Configuration */
Harald Welted27ab242019-07-26 13:45:18 +0200904template (value) GenericAVP ts_AVP_3GPP_ApnConfig(uint32_t ctx, AAA_3GPP_PDN_Type pdn_type,
905 charstring apn) := {
906 avp := {
Pau Espin Pedrolaaad2762023-10-11 17:35:20 +0200907 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration),
Harald Welted27ab242019-07-26 13:45:18 +0200908 avp_data := {
909 avp_AAA_3GPP_APN_Configuration := {
910 ts_AVP_3GPP_ContextId(ctx),
911 ts_AVP_3GPP_PdnType(pdn_type),
Pau Espin Pedrolaaad2762023-10-11 17:35:20 +0200912 ts_AVP_ServiceSelection(apn),
913 ts_AVP_3GPP_EpsSubscrQosProfile(1, 1)
Harald Welted27ab242019-07-26 13:45:18 +0200914 }
915 }
916 }
917}
918
Harald Welte40b1e002023-01-27 17:26:39 +0100919/* TS 29.272 7.3.36 Service-Selection (refers to RFC 5778) */
Harald Welted27ab242019-07-26 13:45:18 +0200920template (value) GenericAVP ts_AVP_ServiceSelection(charstring apn) := {
921 avp := {
922 avp_header := ts_DIA_Hdr(c_AVP_Code_MIPv6_NONE_Service_Selection),
923 avp_data := {
924 avp_MIPv6_NONE_Service_Selection := char2oct(apn)
925 }
926 }
927}
928
Pau Espin Pedrol6477d732022-06-03 12:04:40 +0200929template (present) GenericAVP tr_AVP_PCC_3GPP_QoS_Information(template (present) AVP_list list := ?) := {
Pau Espin Pedrola2af5782022-05-18 16:34:29 +0200930 avp := {
931 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Information),
932 avp_data := {
933 avp_PCC_3GPP_QoS_Information := list
934 }
935 }
936}
937
Pau Espin Pedrol6477d732022-06-03 12:04:40 +0200938template (value) GenericAVP ts_AVP_PCC_3GPP_QoS_Information(template (value) AVP_list list) := {
939 avp := {
940 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Information),
941 avp_data := {
942 avp_PCC_3GPP_QoS_Information := list
943 }
944 }
945}
946
947template (value) GenericAVP ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL(uint32_t val) := {
948 avp := {
949 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL),
950 avp_data := {
951 avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL := int2oct(val, 4)
952 }
953 }
954}
955
956template (value) GenericAVP ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL(uint32_t val) := {
957 avp := {
958 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL),
959 avp_data := {
960 avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL := int2oct(val, 4)
961 }
962 }
963}
964
965template (value) GenericAVP ts_AVP_PCC_3GPP_Default_EPS_Bearer_QoS(template (value) AVP_list list) := {
966 avp := {
967 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Default_EPS_Bearer_QoS),
968 avp_data := {
969 avp_PCC_3GPP_Default_EPS_Bearer_QoS := list
970 }
971 }
972}
973
974template (value) GenericAVP ts_AVP_PCC_3GPP_QoS_Class_Identifier(uint32_t val) := {
Harald Welted27ab242019-07-26 13:45:18 +0200975 avp := {
976 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Class_Identifier),
977 avp_data := {
Pau Espin Pedrol6477d732022-06-03 12:04:40 +0200978 avp_PCC_3GPP_QoS_Class_Identifier := int2oct(val, 4)
Harald Welted27ab242019-07-26 13:45:18 +0200979 }
980 }
981}
982
983template (value) GenericAVP ts_AVP_3GPP_PriorityLevel(uint32_t prio) := {
984 avp := {
985 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Priority_Level),
986 avp_data := {
987 avp_PCC_3GPP_Priority_Level := int2oct(prio, 4)
988 }
989 }
990}
991
Pau Espin Pedrol6477d732022-06-03 12:04:40 +0200992template (value) GenericAVP ts_AVP_PCC_3GPP_AllocRetenPrio(uint32_t prio) := {
Harald Welted27ab242019-07-26 13:45:18 +0200993 avp := {
994 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Allocation_Retention_Priority),
995 avp_data := {
996 avp_PCC_3GPP_Allocation_Retention_Priority := {
997 ts_AVP_3GPP_PriorityLevel(prio)
998 /* pre-emption capability */
999 /* pre-emption vulnerability */
1000 }
1001 }
1002 }
1003}
1004
1005template (value) GenericAVP ts_AVP_3GPP_EpsSubscrQosProfile(uint32_t qos_class, uint32_t prio) := {
1006 avp := {
1007 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_EPS_Subscribed_QoS_Profile),
1008 avp_data := {
1009 avp_AAA_3GPP_EPS_Subscribed_QoS_Profile := {
Pau Espin Pedrol6477d732022-06-03 12:04:40 +02001010 ts_AVP_PCC_3GPP_QoS_Class_Identifier(qos_class),
1011 ts_AVP_PCC_3GPP_AllocRetenPrio(prio)
Harald Welted27ab242019-07-26 13:45:18 +02001012 }
1013 }
1014 }
1015}
1016
1017
Harald Welte40b1e002023-01-27 17:26:39 +01001018/* TS 29.272 7.3.41 AMBR */
Harald Welted27ab242019-07-26 13:45:18 +02001019template (value) GenericAVP ts_AVP_3GPP_AMBR(uint32_t ul, uint32_t dl) := {
1020 avp := {
1021 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AMBR),
1022 avp_data := {
1023 avp_AAA_3GPP_AMBR := {
1024 ts_AVP_3GPP_MaxReqBwUL(ul),
1025 ts_AVP_3GPP_MaxReqBwDL(dl)
1026 }
1027 }
1028 }
1029}
1030
1031template (value) GenericAVP ts_AVP_3GPP_MaxReqBwUL(uint32_t bw) := {
1032 avp := {
1033 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_UL),
1034 avp_data := {
1035 avp_RX_3GPP_Max_Requested_Bandwidth_UL := int2oct(bw, 4)
1036 }
1037 }
1038}
1039
1040template (value) GenericAVP ts_AVP_3GPP_MaxReqBwDL(uint32_t bw) := {
1041 avp := {
1042 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_DL),
1043 avp_data := {
1044 avp_RX_3GPP_Max_Requested_Bandwidth_DL := int2oct(bw, 4)
1045 }
1046 }
1047}
1048
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001049template (present) GenericAVP tr_AVP_3GPP_Reporting_Reason(template (present) DCA_3GPP_Reporting_Reason r := ?) := {
1050 avp := {
1051 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_Reporting_Reason),
1052 avp_data := {
1053 avp_DCA_3GPP_Reporting_Reason := r
1054 }
1055 }
1056}
Harald Welted27ab242019-07-26 13:45:18 +02001057
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001058template (present) GenericAVP tr_AVP_3GPP_AoCRequestType(template (present) DCA_3GPP_AoC_Request_Type t := ?) := {
1059 avp := {
1060 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_AoC_Request_Type),
1061 avp_data := {
1062 avp_DCA_3GPP_AoC_Request_Type := t
1063 }
1064 }
1065}
1066
1067template (present) GenericAVP tr_AVP_3GPP_ServiceInformation(template (present) AVP_list content := ?) := {
1068 avp := {
1069 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_Service_Information),
1070 avp_data := {
1071 avp_DCA_3GPP_Service_Information := content
1072 }
1073 }
1074}
1075
1076template (present) GenericAVP tr_AVP_3GPP_PSInformation(template (present) AVP_list content := ?) := {
1077 avp := {
1078 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_PS_Information),
1079 avp_data := {
1080 avp_DCA_3GPP_PS_Information := content
1081 }
1082 }
1083}
1084
1085template (present) GenericAVP tr_AVP_3GPP_ChargingId(template (present) AVP_OctetString id := ?) := {
1086 avp := {
1087 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_Charging_Id),
1088 avp_data := {
1089 avp_GI_3GPP_3GPP_Charging_Id := id
1090 }
1091 }
1092}
1093
1094template (present) GenericAVP tr_AVP_3GPP_PDPType(template (present) GI_3GPP_3GPP_PDP_Type t := ?) := {
1095 avp := {
1096 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_PDP_Type),
1097 avp_data := {
1098 avp_GI_3GPP_3GPP_PDP_Type := t
1099 }
1100 }
1101}
1102
1103template (present) GenericAVP tr_AVP_3GPP_PDPAddress(template (present) DCA_3GPP_PDP_Address addr := ?) := {
1104 avp := {
1105 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_PDP_Address),
1106 avp_data := {
1107 avp_DCA_3GPP_PDP_Address := addr
1108 }
1109 }
1110}
1111
1112template (present) GenericAVP tr_AVP_3GPP_SGSNAddress(template (present) DCA_3GPP_SGSN_Address addr := ?) := {
1113 avp := {
1114 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_SGSN_Address),
1115 avp_data := {
1116 avp_DCA_3GPP_SGSN_Address := addr
1117 }
1118 }
1119}
1120
1121template (present) GenericAVP tr_AVP_3GPP_GGSNAddress(template (present) DCA_3GPP_GGSN_Address addr := ?) := {
1122 avp := {
1123 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_GGSN_Address),
1124 avp_data := {
1125 avp_DCA_3GPP_GGSN_Address := addr
1126 }
1127 }
1128}
1129
1130template (present) GenericAVP tr_AVP_3GPP_SelectionMode(template (present) GI_3GPP_3GPP_Selection_Mode sm := ?) := {
1131 avp := {
1132 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_Selection_Mode),
1133 avp_data := {
1134 avp_GI_3GPP_3GPP_Selection_Mode := sm
1135 }
1136 }
1137}
1138
1139template (present) GenericAVP tr_AVP_3GPP_ChargingCharacteristics(template (present) GI_3GPP_3GPP_Charging_Characteristics cc := ?) := {
1140 avp := {
1141 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_Charging_Characteristics),
1142 avp_data := {
1143 avp_GI_3GPP_3GPP_Charging_Characteristics := cc
1144 }
1145 }
1146}
1147
1148template (present) GenericAVP tr_AVP_3GPP_SGSNMCCMNC(template (present) GI_3GPP_3GPP_SGSN_MCC_MNC smn := ?) := {
1149 avp := {
1150 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_SGSN_MCC_MNC),
1151 avp_data := {
1152 avp_GI_3GPP_3GPP_SGSN_MCC_MNC := smn
1153 }
1154 }
1155}
1156
1157template (present) GenericAVP tr_AVP_3GPP_NSAPI(template (present) GI_3GPP_3GPP_NSAPI nsapi := ?) := {
1158 avp := {
1159 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_NSAPI),
1160 avp_data := {
1161 avp_GI_3GPP_3GPP_NSAPI := nsapi
1162 }
1163 }
1164}
1165
1166template (present) GenericAVP tr_AVP_3GPP_MS_TimeZone(template (present) GI_3GPP_3GPP_MS_TimeZone ms_tz := ?) := {
1167 avp := {
1168 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_MS_TimeZone),
1169 avp_data := {
1170 avp_GI_3GPP_3GPP_MS_TimeZone := ms_tz
1171 }
1172 }
1173}
1174
1175template (present) GenericAVP tr_AVP_3GPP_ULI(template (present) GI_3GPP_3GPP_User_Location_Info uli := ?) := {
1176 avp := {
1177 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_GI_3GPP_3GPP_User_Location_Info),
1178 avp_data := {
1179 avp_GI_3GPP_3GPP_User_Location_Info := uli
1180 }
1181 }
1182}
1183
1184template (present) GenericAVP tr_AVP_UserEquipmentInfo(template (present) DCC_NONE_User_Equipment_Info uei := ?) := {
1185 avp := {
1186 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_User_Equipment_Info),
1187 avp_data := {
1188 avp_DCC_NONE_User_Equipment_Info := uei
1189 }
1190 }
1191}
1192
1193template (present) GenericAVP tr_AVP_UserEquipmentInfoType(template (present) DCC_NONE_User_Equipment_Info_Type ueit := ?) := {
1194 avp := {
1195 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_User_Equipment_Info_Type),
1196 avp_data := {
1197 avp_DCC_NONE_User_Equipment_Info_Type := ueit
1198 }
1199 }
1200}
1201
1202template (present) GenericAVP tr_AVP_UserEquipmentInfoValue(template (present) DCC_NONE_User_Equipment_Info_Value ueiv := ?) := {
1203 avp := {
1204 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_User_Equipment_Info_Value),
1205 avp_data := {
1206 avp_DCC_NONE_User_Equipment_Info_Value := ueiv
1207 }
1208 }
1209}
Harald Welted27ab242019-07-26 13:45:18 +02001210
Harald Welte40b1e002023-01-27 17:26:39 +01001211/* TS 29.272 7.3.62 PDN-Type */
Harald Welted27ab242019-07-26 13:45:18 +02001212template (value) GenericAVP ts_AVP_3GPP_PdnType(template (value) AAA_3GPP_PDN_Type pdn_type) := {
1213 avp := {
1214 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_PDN_Type),
1215 avp_data := {
1216 avp_AAA_3GPP_PDN_Type := pdn_type
1217 }
1218 }
1219}
1220
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001221/* RFC4006 8.16 Multiple-Services-Credit-Control AVP */
1222template (value) GenericAVP ts_AVP_Multiple_Services_Credit_Control(template (value) AVP_list content) := {
1223 avp := {
1224 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Multiple_Services_Credit_Control),
1225 avp_data := {
1226 avp_DCC_NONE_Multiple_Services_Credit_Control := content
1227 }
1228 }
1229}
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001230template (present) GenericAVP tr_AVP_Multiple_Services_Credit_Control(template (present) AVP_list content := ?) := {
1231 avp := {
1232 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Multiple_Services_Credit_Control),
1233 avp_data := {
1234 avp_DCC_NONE_Multiple_Services_Credit_Control := content
1235 }
1236 }
1237}
1238
1239/* Requested-Service-Unit AVP */
1240template (present) GenericAVP tr_AVP_Requested_Service_Unit(template (present) AVP_list content := ?) := {
1241 avp := {
1242 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Requested_Service_Unit),
1243 avp_data := {
1244 avp_DCC_NONE_Requested_Service_Unit := content
1245 }
1246 }
1247}
1248
1249/* Used-Service-Unit AVP */
1250template (present) GenericAVP tr_AVP_Used_Service_Unit(template (present) AVP_list content := ?) := {
1251 avp := {
1252 avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Used_Service_Unit),
1253 avp_data := {
1254 avp_DCC_NONE_Used_Service_Unit := content
1255 }
1256 }
1257}
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001258
1259/* RFC4006 8.17 Granted-Service-Unit AVP */
1260template (value) GenericAVP ts_AVP_Granted_Service_Unit(template (value) AVP_list content) := {
1261 avp := {
1262 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Granted_Service_Unit),
1263 avp_data := {
1264 avp_DCC_NONE_Granted_Service_Unit := content
1265 }
1266 }
1267}
1268
1269/* RFC4006 8.21 CC-Time AVP */
1270template (value) GenericAVP ts_AVP_CC_Time(uint32_t cc_time_val) := {
1271 avp := {
1272 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Time),
1273 avp_data := {
1274 avp_DCC_NONE_CC_Time := int2oct(cc_time_val, 4)
1275 }
1276 }
1277}
1278
1279/* RFC4006 8.23 CC-Total-Octets AVP */
1280template (value) GenericAVP ts_AVP_CC_Total_Octets(uint64_t cc_total_octets_val) := {
1281 avp := {
1282 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Total_Octets),
1283 avp_data := {
1284 avp_DCC_NONE_CC_Total_Octets := int2oct(cc_total_octets_val, 8)
1285 }
1286 }
1287}
1288
1289/* RFC4006 8.33 Validity-Time AVP */
1290template (value) GenericAVP ts_AVP_Validity_Time(uint32_t validity_time_val) := {
1291 avp := {
1292 avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Validity_Time),
1293 avp_data := {
1294 avp_DCC_NONE_Validity_Time := int2oct(validity_time_val, 4)
1295 }
1296 }
1297}
1298
Pau Espin Pedrol52562c92022-05-23 15:45:46 +02001299template (value) GenericAVP ts_AVP_3GPP_VolumeQuotaThreshold(uint32_t volume_quota_thresh_val) := {
1300 avp := {
1301 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_DCA_3GPP_Volume_Quota_Threshold),
1302 avp_data := {
1303 avp_DCA_3GPP_Volume_Quota_Threshold := int2oct(volume_quota_thresh_val, 4)
1304 }
1305 }
1306}
1307
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001308template (present) GenericAVP tr_AVP_3GPP_CalledStationId(template (present) DNAS_NONE_Called_Station_Id id := ?) := {
1309 avp := {
1310 avp_header := tr_DIA_Hdr(c_AVP_Code_DNAS_NONE_Called_Station_Id),
1311 avp_data := {
1312 avp_DNAS_NONE_Called_Station_Id := id
1313 }
1314 }
1315}
Harald Welted27ab242019-07-26 13:45:18 +02001316
1317
Vadim Yanitskiy0d6cbd32023-02-11 08:07:27 +07001318/* 5.3.1 Capabilities Exchange Request */
1319template (value) PDU_DIAMETER
1320ts_DIA_CER(octetstring host_ip, uint32_t vendor_app_id,
1321 template (value) charstring orig_host := "ttcn3.localdomain",
1322 template (value) charstring orig_realm := "localdomain",
1323 template (value) UINT32 hbh_id := '00000000'O,
1324 template (value) UINT32 ete_id := '00000000'O) :=
1325 ts_DIAMETER(flags := '10000000'B,
1326 cmd_code := Capabilities_Exchange,
1327 hbh_id := hbh_id,
1328 ete_id := ete_id,
1329 avps := {
1330 ts_AVP_OriginHost(orig_host),
1331 ts_AVP_OriginRealm(orig_realm),
1332 ts_AVP_HostIpAddr(host_ip),
1333 ts_AVP_VendorId(vendor_id_3GPP),
1334 ts_AVP_ProductName("TTCN-3 Testsuite"),
1335 ts_AVP_FwRevision('00000000'O),
1336 ts_AVP_InbSecId('00000000'O),
1337 ts_AVP_AuthAppId('FFFFFFFF'O),
1338 ts_AVP_VendorSpecAppId(vendor_id_3GPP, vendor_app_id)
1339 });
1340
1341
Harald Welted27ab242019-07-26 13:45:18 +02001342/* 5.3.2 Capabilities Exchange Answer */
1343template (value) PDU_DIAMETER
Pau Espin Pedrol33b47492022-03-08 17:43:01 +01001344ts_DIA_CEA_AUTH_APP_ID(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1345 template (value) charstring origin_host,
1346 template (value) charstring origin_realm,
1347 template (value) octetstring host_ip, uint32_t auth_app_id)
1348:= ts_DIAMETER(flags:='00000000'B, cmd_code:=Capabilities_Exchange, hbh_id:=hbh_id, ete_id:=ete_id,
1349 avps := {
1350 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1351 ts_AVP_OriginHost(origin_host),
1352 ts_AVP_OriginRealm(origin_realm),
1353 ts_AVP_HostIpAddr(host_ip),
1354 ts_AVP_VendorId(vendor_id_3GPP),
1355 ts_AVP_ProductName("TTCN-3 Testsuite"),
1356 ts_AVP_OriginStateId('00000001'O),
1357 ts_AVP_SuppVendorIdRaw(5535), /* 3GPP2 */
1358 ts_AVP_SuppVendorId(vendor_id_3GPP),
1359 ts_AVP_SuppVendorIdRaw(13019), /* ETSI */
Pau Espin Pedrol33b47492022-03-08 17:43:01 +01001360 ts_AVP_AuthAppId(int2oct(auth_app_id, 4)),
1361 ts_AVP_InbSecId('00000000'O)
1362 });
1363template (value) PDU_DIAMETER
1364ts_DIA_CEA_VENDOR_APP_ID(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1365 template (value) charstring origin_host,
1366 template (value) charstring origin_realm,
1367 template (value) octetstring host_ip, uint32_t vendor_app_id)
Harald Welted27ab242019-07-26 13:45:18 +02001368:= ts_DIAMETER(flags:='00000000'B, cmd_code:=Capabilities_Exchange, hbh_id:=hbh_id, ete_id:=ete_id,
1369 avps := {
1370 ts_AVP_ResultCode(DIAMETER_SUCCESS),
Harald Welte61f73d52020-04-26 21:41:12 +02001371 ts_AVP_OriginHost(origin_host),
1372 ts_AVP_OriginRealm(origin_realm),
1373 ts_AVP_HostIpAddr(host_ip),
Harald Welted27ab242019-07-26 13:45:18 +02001374 ts_AVP_VendorId(vendor_id_3GPP),
1375 ts_AVP_ProductName("TTCN-3 Testsuite"),
1376 ts_AVP_OriginStateId('00000001'O),
1377 ts_AVP_SuppVendorIdRaw(5535), /* 3GPP2 */
1378 ts_AVP_SuppVendorId(vendor_id_3GPP),
1379 ts_AVP_SuppVendorIdRaw(13019), /* ETSI */
Harald Welted27ab242019-07-26 13:45:18 +02001380 ts_AVP_InbSecId('00000000'O),
Harald Welte61f73d52020-04-26 21:41:12 +02001381 ts_AVP_VendorSpecAppId(vendor_id_3GPP, vendor_app_id)
Harald Welted27ab242019-07-26 13:45:18 +02001382 });
Pau Espin Pedrol33b47492022-03-08 17:43:01 +01001383function f_ts_DIA_CEA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1384 template (value) charstring origin_host,
1385 template (value) charstring origin_realm,
1386 template (value) octetstring host_ip, template (omit) uint32_t auth_app_id,
1387 template (omit) uint32_t vendor_app_id)
1388 return template (value) PDU_DIAMETER
1389{
1390 var template (value) PDU_DIAMETER diam_pdu;
1391 if (istemplatekind(vendor_app_id, "omit")) {
1392 diam_pdu := ts_DIA_CEA_AUTH_APP_ID(hbh_id, ete_id, origin_host, origin_realm, host_ip, valueof(auth_app_id));
1393 } else {
1394 diam_pdu := ts_DIA_CEA_VENDOR_APP_ID(hbh_id, ete_id, origin_host, origin_realm, host_ip, valueof(vendor_app_id));
1395 }
1396 return diam_pdu;
1397}
Harald Welted27ab242019-07-26 13:45:18 +02001398
Harald Welte6effabb2020-02-18 21:39:59 +01001399
1400template (value) PDU_DIAMETER
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001401ts_DIA_AIR(/* template (value) */ hexstring imsi,
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001402 template (value) octetstring mcc_mnc := '111F11'O,
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001403 template (value) octetstring sess_id := c_def_sess_id,
Vadim Yanitskiyb57ef872021-12-12 04:14:18 +03001404 template (value) charstring orig_host := "ttcn3.localdomain",
1405 template (value) charstring orig_realm := "localdomain",
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001406 template (value) charstring dest_realm := "localdomain",
1407 template (value) UINT32 hbh_id := '00000000'O,
1408 template (value) UINT32 ete_id := '00000000'O) :=
Vadim Yanitskiy21fd7db2021-12-15 05:29:35 +03001409 ts_DIAMETER(flags := '11000000'B,
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001410 cmd_code := Authentication_Information,
Vadim Yanitskiy463d8262021-12-11 16:50:46 +03001411 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001412 hbh_id := hbh_id,
1413 ete_id := ete_id,
1414 avps := {
1415 ts_AVP_SessionId(sess_id),
1416 ts_AVP_DestinationRealm(dest_realm),
Vadim Yanitskiyb57ef872021-12-12 04:14:18 +03001417 ts_AVP_OriginHost(orig_host),
1418 ts_AVP_OriginRealm(orig_realm),
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001419 ts_AVP_UserNameImsi(imsi),
1420 /* Requested EUTRAN Auth Info */
1421 ts_AVP_RequestedEutranAuthInfo,
Vadim Yanitskiyb57ef872021-12-12 04:14:18 +03001422 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001423 ts_AVP_3GPP_VisitedPlmnId(mcc_mnc)
Harald Welte6effabb2020-02-18 21:39:59 +01001424 });
Harald Welted27ab242019-07-26 13:45:18 +02001425template (present) PDU_DIAMETER
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001426tr_DIA_AIR(/* template (present) */ hexstring imsi,
1427 template (present) octetstring sess_id := ?,
1428 template (present) charstring dest_realm := ?,
1429 template (present) UINT32 hbh_id := ?,
1430 template (present) UINT32 ete_id := ?) :=
Vadim Yanitskiy21fd7db2021-12-15 05:29:35 +03001431 tr_DIAMETER(flags := '1???????'B,
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001432 cmd_code := Authentication_Information,
1433 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1434 hbh_id := hbh_id, ete_id := ete_id,
1435 avps := superset(
1436 tr_AVP_SessionId(sess_id),
1437 tr_AVP_DestinationRealm(dest_realm),
1438 tr_AVP_UserNameImsi(imsi),
1439 tr_AVP_3GPP_VisitedPlmnId
Harald Welted27ab242019-07-26 13:45:18 +02001440 ));
1441
Harald Welte40b1e002023-01-27 17:26:39 +01001442/* TS 29.272 5.2.3.1 + 7.2.6 Authentication Information Answer */
Harald Welted27ab242019-07-26 13:45:18 +02001443template (value) PDU_DIAMETER
Vadim Yanitskiy2dba4942021-12-11 15:46:30 +03001444ts_DIA_AIA(template (value) AVP_list auth_info_contents,
1445 template (value) octetstring sess_id := c_def_sess_id,
1446 template (value) charstring orig_host := "hss.localdomain",
1447 template (value) charstring orig_realm := "localdomain",
1448 template (value) UINT32 hbh_id := '00000000'O,
1449 template (value) UINT32 ete_id := '00000000'O) :=
1450 ts_DIAMETER(flags := '01000000'B,
1451 cmd_code := Authentication_Information,
1452 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1453 hbh_id := hbh_id,
1454 ete_id := ete_id,
1455 avps := {
1456 ts_AVP_SessionId(sess_id),
1457 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1458 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1459 ts_AVP_OriginHost(orig_host),
1460 ts_AVP_OriginRealm(orig_realm),
1461 ts_AVP_3GPP_AuthInfo(auth_info_contents)
Harald Welted27ab242019-07-26 13:45:18 +02001462 });
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001463template (present) PDU_DIAMETER
1464tr_DIA_AIA(template (present) AVP_list auth_info_contents := ?,
1465 template (present) octetstring sess_id := ?,
1466 template (present) charstring orig_host := ?,
1467 template (present) charstring orig_realm := ?,
1468 template (present) UINT32 hbh_id := ?,
1469 template (present) UINT32 ete_id := ?) :=
1470 tr_DIAMETER(flags := '0???????'B,
1471 cmd_code := Authentication_Information,
1472 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1473 hbh_id := hbh_id,
1474 ete_id := ete_id,
1475 avps := superset(
1476 tr_AVP_SessionId(sess_id),
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001477 tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001478 tr_AVP_OriginHost(orig_host),
Pau Espin Pedrol7bedcf82023-08-24 19:33:49 +02001479 tr_AVP_OriginRealm(orig_realm),
1480 tr_AVP_ResultCode(DIAMETER_SUCCESS),
1481 tr_AVP_3GPP_AuthInfo(auth_info_contents)
Vadim Yanitskiy446edae2021-12-12 04:33:08 +03001482 ));
Pau Espin Pedrol7aa4ad82023-08-28 18:24:24 +02001483template (present) PDU_DIAMETER
1484tr_DIA_AIA_ERR(template (present) GenericAVP err_avp := ?,
1485 template (present) octetstring sess_id := ?,
1486 template (present) charstring orig_host := ?,
1487 template (present) charstring orig_realm := ?,
1488 template (present) UINT32 hbh_id := ?,
1489 template (present) UINT32 ete_id := ?) :=
1490 tr_DIAMETER(flags := '0???????'B,
1491 cmd_code := Authentication_Information,
1492 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1493 hbh_id := hbh_id,
1494 ete_id := ete_id,
1495 avps := superset(
1496 tr_AVP_SessionId(sess_id),
1497 tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1498 tr_AVP_OriginHost(orig_host),
1499 tr_AVP_OriginRealm(orig_realm),
1500 err_avp
1501 ));
Harald Welted27ab242019-07-26 13:45:18 +02001502
1503
Harald Welte40b1e002023-01-27 17:26:39 +01001504/* TS 29.272 7.2.3 Update Location Request */
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001505template (value) PDU_DIAMETER
1506ts_DIA_ULR(/* template (value) */ hexstring imsi,
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001507 template (value) octetstring mcc_mnc := '111F11'O,
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001508 template (value) octetstring sess_id := c_def_sess_id,
1509 template (value) charstring orig_host := "ttcn3.localdomain",
1510 template (value) charstring orig_realm := "localdomain",
1511 template (value) charstring dest_realm := "localdomain",
1512 template (value) UINT32 hbh_id := '00000000'O,
1513 template (value) UINT32 ete_id := '00000000'O) :=
1514 ts_DIAMETER(flags := '11000000'B,
1515 cmd_code := Update_Location,
1516 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1517 hbh_id := hbh_id,
1518 ete_id := ete_id,
1519 avps := {
1520 ts_AVP_SessionId(sess_id),
1521 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1522 ts_AVP_UserNameImsi(imsi),
1523 ts_AVP_3GPP_UlrFlags('00000000'O),
Vadim Yanitskiy59ef8e52023-02-07 23:38:29 +07001524 ts_AVP_3GPP_VisitedPlmnId(mcc_mnc),
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001525 ts_AVP_PCC_3GPP_RatType(EUTRAN),
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001526 ts_AVP_OriginHost(orig_host),
1527 ts_AVP_OriginRealm(orig_realm),
1528 ts_AVP_DestinationRealm(dest_realm)
1529 });
Harald Welted27ab242019-07-26 13:45:18 +02001530template (present) PDU_DIAMETER
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +03001531tr_DIA_ULR(/* template (present) */ hexstring imsi,
1532 template (present) octetstring sess_id := ?,
1533 template (present) charstring orig_host := ?,
1534 template (present) charstring orig_realm := ?,
1535 template (present) charstring dest_realm := ?,
1536 template (present) UINT32 hbh_id := ?,
1537 template (present) UINT32 ete_id := ?) :=
1538 tr_DIAMETER(flags := '11000000'B,
1539 cmd_code := Update_Location,
1540 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1541 hbh_id := hbh_id,
1542 ete_id := ete_id,
1543 avps := superset(
1544 tr_AVP_SessionId(sess_id),
1545 tr_AVP_AuthSessionState,
1546 tr_AVP_OriginHost(orig_host),
1547 tr_AVP_OriginRealm(orig_realm),
1548 tr_AVP_DestinationRealm(dest_realm),
1549 tr_AVP_UserNameImsi(imsi),
Pau Espin Pedrola2af5782022-05-18 16:34:29 +02001550 tr_AVP_PCC_3GPP_RatType,
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +03001551 tr_AVP_3GPP_UlrFlags,
1552 tr_AVP_3GPP_VisitedPlmnId
Harald Welted27ab242019-07-26 13:45:18 +02001553 ));
1554
1555template (value) PDU_DIAMETER
Vadim Yanitskiy0e8f5162021-12-15 05:00:32 +03001556ts_DIA_ULA(template (value) AVP_list sub_data,
1557 template (value) octetstring sess_id := c_def_sess_id,
1558 template (value) charstring orig_host := "hss.localdomain",
1559 template (value) charstring orig_realm := "localdomain",
1560 template (value) UINT32 hbh_id := '00000000'O,
1561 template (value) UINT32 ete_id := '00000000'O) :=
1562 ts_DIAMETER(flags:='01000000'B,
1563 cmd_code := Update_Location,
1564 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1565 hbh_id := hbh_id,
1566 ete_id := ete_id,
1567 avps := {
1568 ts_AVP_SessionId(sess_id),
1569 ts_AVP_ResultCode(DIAMETER_SUCCESS), /* optional */
1570 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
1571 ts_AVP_OriginHost(orig_host),
1572 ts_AVP_OriginRealm(orig_realm),
1573 ts_AVP_3GPP_UlaFlags('00000002'O),
1574 ts_AVP_3GPP_SubscriptionData(sub_data)
Harald Welted27ab242019-07-26 13:45:18 +02001575 });
Vadim Yanitskiy5e1bdc02021-12-12 02:33:59 +03001576template (present) PDU_DIAMETER
1577tr_DIA_ULA(template (present) AVP_list sub_data := ?,
1578 template (present) octetstring sess_id := ?,
1579 template (present) charstring orig_host := ?,
1580 template (present) charstring orig_realm := ?,
1581 template (present) UINT32 hbh_id := ?,
1582 template (present) UINT32 ete_id := ?) :=
1583 tr_DIAMETER(flags := '0???????'B,
1584 cmd_code := Update_Location,
1585 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
1586 hbh_id := hbh_id,
1587 ete_id := ete_id,
1588 avps := superset(
1589 tr_AVP_SessionId(sess_id),
1590 tr_AVP_ResultCode(DIAMETER_SUCCESS),
1591 tr_AVP_AuthSessionState,
1592 tr_AVP_OriginHost(orig_host),
1593 tr_AVP_OriginRealm(orig_realm),
1594 tr_AVP_3GPP_UlaFlags,
1595 tr_AVP_3GPP_SubscriptionData(sub_data)
1596 ));
Harald Welted27ab242019-07-26 13:45:18 +02001597
1598
1599
Harald Weltef4001512020-04-26 21:48:34 +02001600/* RFC 4006 3.1. Credit-Control-Request (CCR) Command */
1601template (present) PDU_DIAMETER
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001602tr_DIA_Gx_CCR(template (present) DCC_NONE_CC_Request_Type req_type := INITIAL_REQUEST)
Harald Weltef4001512020-04-26 21:48:34 +02001603:= tr_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control,
Harald Weltef4001512020-04-26 21:48:34 +02001604 avps := superset(
1605 tr_AVP_SessionId,
1606 tr_AVP_OriginHost,
1607 tr_AVP_OriginRealm,
1608 tr_AVP_DestinationRealm,
1609 tr_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),
1610 tr_AVP_CcReqType(req_type),
1611 tr_AVP_CcReqNum(?)
1612 ));
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001613template (present) PDU_DIAMETER
1614tr_DIA_Gy_CCR(template (present) DCC_NONE_CC_Request_Type req_type := INITIAL_REQUEST)
1615:= tr_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control,
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001616 avps := superset(
1617 tr_AVP_SessionId,
1618 tr_AVP_OriginHost,
1619 tr_AVP_OriginRealm,
1620 tr_AVP_DestinationRealm,
1621 tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1622 tr_AVP_CcReqType(req_type),
1623 tr_AVP_CcReqNum(?)
1624 ));
1625
Harald Weltef4001512020-04-26 21:48:34 +02001626
1627
1628/* RFC 4006 3.2. Credit-Control-Answer (CCA) Command */
1629template (value) PDU_DIAMETER
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001630ts_DIA_Gx_CCA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
Harald Weltef4001512020-04-26 21:48:34 +02001631 template (value) octetstring sess_id,
1632 template (value) DCC_NONE_CC_Request_Type req_type,
1633 template (value) AVP_Unsigned32 req_num)
Harald Weltef4001512020-04-26 21:48:34 +02001634:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1635 app_id:=int2oct(c_DIAMETER_3GPP_Gx_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1636 avps := {
1637 ts_AVP_SessionId(sess_id),
1638 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1639 ts_AVP_OriginHost("pcrf.localdomain"),
1640 ts_AVP_OriginRealm("localdomain"),
1641 ts_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),
1642 ts_AVP_CcReqType(req_type),
Pau Espin Pedrolee961c72022-06-03 12:06:07 +02001643 ts_AVP_CcReqNum(req_num),
1644 ts_AVP_PCC_3GPP_QoS_Information({
1645 ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL(33554432),
1646 ts_AVP_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL(52428800)
1647 }),
1648 ts_AVP_PCC_3GPP_Default_EPS_Bearer_QoS({
1649 ts_AVP_PCC_3GPP_QoS_Class_Identifier(9),
1650 ts_AVP_PCC_3GPP_AllocRetenPrio(2)
1651 })
Harald Weltef4001512020-04-26 21:48:34 +02001652 // supported features
1653 // origin
1654 });
Pau Espin Pedrol77fdd0b2022-03-08 14:03:33 +01001655template (value) PDU_DIAMETER
1656ts_DIA_Gy_CCA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1657 template (value) octetstring sess_id,
1658 template (value) DCC_NONE_CC_Request_Type req_type,
1659 template (value) AVP_Unsigned32 req_num)
1660:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1661 app_id:=int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1662 avps := {
1663 ts_AVP_SessionId(sess_id),
1664 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1665 ts_AVP_OriginHost("ocs.localdomain"),
1666 ts_AVP_OriginRealm("localdomain"),
1667 ts_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1668 ts_AVP_CcReqType(req_type),
1669 ts_AVP_CcReqNum(req_num)//,
1670 // qos
1671 // default eps bearer qos
1672 // supported features
1673 // origin
1674 });
1675/* Same as ts_DIA_Gy_CCA, but with extra AVP to grant access for limited amount of seconds */
1676template (value) PDU_DIAMETER
1677ts_DIA_Gy_CCA_ValidityTime(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1678 template (value) octetstring sess_id,
1679 template (value) DCC_NONE_CC_Request_Type req_type,
1680 template (value) AVP_Unsigned32 req_num,
1681 uint32_t validity_time)
1682:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1683 app_id:=int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1684 avps := {
1685 ts_AVP_SessionId(sess_id),
1686 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1687 ts_AVP_OriginHost("ocs.localdomain"),
1688 ts_AVP_OriginRealm("localdomain"),
1689 ts_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1690 ts_AVP_CcReqType(req_type),
1691 ts_AVP_CcReqNum(req_num),
1692 ts_AVP_Multiple_Services_Credit_Control({
1693 ts_AVP_Validity_Time(validity_time),
1694 ts_AVP_Granted_Service_Unit({
1695 //ts_AVP_CC_Time(validity_time*2),
1696 ts_AVP_CC_Total_Octets(1000)
1697 })
1698 })
1699 //,
1700 // qos
1701 // default eps bearer qos
1702 // supported features
1703 // origin
1704 });
Pau Espin Pedrol52562c92022-05-23 15:45:46 +02001705/* Same as ts_DIA_Gy_CCA_ValidityTime, but with extra AVP to grant access for limited amount of octets */
1706template (value) PDU_DIAMETER
1707ts_DIA_Gy_CCA_ValidityTimeVolumeThreshold(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
1708 template (value) octetstring sess_id,
1709 template (value) DCC_NONE_CC_Request_Type req_type,
1710 template (value) AVP_Unsigned32 req_num,
1711 uint32_t validity_time, uint32_t volume_threhsold)
1712:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
1713 app_id:=int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
1714 avps := {
1715 ts_AVP_SessionId(sess_id),
1716 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1717 ts_AVP_OriginHost("ocs.localdomain"),
1718 ts_AVP_OriginRealm("localdomain"),
1719 ts_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
1720 ts_AVP_CcReqType(req_type),
1721 ts_AVP_CcReqNum(req_num),
1722 ts_AVP_Multiple_Services_Credit_Control({
1723 ts_AVP_Validity_Time(validity_time),
1724 ts_AVP_Granted_Service_Unit({
1725 ts_AVP_CC_Total_Octets(volume_threhsold*100)
1726 }),
1727 ts_AVP_3GPP_VolumeQuotaThreshold(volume_threhsold)
1728 })
1729 //,
1730 // qos
1731 // default eps bearer qos
1732 // supported features
1733 // origin
1734 });
Harald Weltef4001512020-04-26 21:48:34 +02001735
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +03001736/* RFC 6733, section 5.5.1 "Device-Watchdog-Request" */
1737template (value) PDU_DIAMETER
1738ts_DIA_DWR(template (value) OCTET4 state_id := '00000000'O,
1739 template (value) charstring orig_host := "ttcn3.localdomain",
1740 template (value) charstring orig_realm := "localdomain",
1741 template (value) UINT32 hbh_id := '00000000'O,
1742 template (value) UINT32 ete_id := '00000000'O) :=
1743 ts_DIAMETER(flags := '10000000'B,
1744 cmd_code := Device_Watchdog,
1745 app_id := '00000000'O,
1746 hbh_id := hbh_id,
1747 ete_id := ete_id,
1748 avps := {
1749 ts_AVP_OriginHost(orig_host),
1750 ts_AVP_OriginRealm(orig_realm),
1751 ts_AVP_OriginStateId(state_id)
1752 });
1753template (present) PDU_DIAMETER
1754tr_DIA_DWR(template (present) OCTET4 state_id := ?,
1755 template (present) charstring orig_host := ?,
1756 template (present) charstring orig_realm := ?,
1757 template (present) UINT32 hbh_id := ?,
1758 template (present) UINT32 ete_id := ?) :=
1759 tr_DIAMETER(flags := '1???????'B,
1760 cmd_code := Device_Watchdog,
1761 app_id := '00000000'O,
1762 hbh_id := hbh_id,
1763 ete_id := ete_id,
1764 avps := superset(
1765 tr_AVP_OriginHost(orig_host),
Pau Espin Pedrol8dcb0612023-08-28 19:16:29 +02001766 tr_AVP_OriginRealm(orig_realm)
1767 /* tr_AVP_OriginStateId(state_id) is optional */
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +03001768 ));
1769
1770/* RFC 6733, section 5.5.2 "Device-Watchdog-Answer" */
1771template (value) PDU_DIAMETER
1772ts_DIA_DWA(template (value) OCTET4 state_id := '00000000'O,
1773 template (value) charstring orig_host := "ttcn3.localdomain",
1774 template (value) charstring orig_realm := "localdomain",
1775 template (value) UINT32 hbh_id := '00000000'O,
1776 template (value) UINT32 ete_id := '00000000'O) :=
1777 ts_DIAMETER(flags := '00000000'B,
1778 cmd_code := Device_Watchdog,
1779 app_id := '00000000'O,
1780 hbh_id := hbh_id,
1781 ete_id := ete_id,
1782 avps := {
1783 ts_AVP_ResultCode(DIAMETER_SUCCESS),
1784 ts_AVP_OriginHost(orig_host),
1785 ts_AVP_OriginRealm(orig_realm),
1786 ts_AVP_OriginStateId(state_id)
1787 });
1788template (present) PDU_DIAMETER
1789tr_DIA_DWA(template (present) OCTET4 state_id := ?,
1790 template (present) charstring orig_host := ?,
1791 template (present) charstring orig_realm := ?,
1792 template (present) UINT32 hbh_id := ?,
1793 template (present) UINT32 ete_id := ?) :=
1794 tr_DIAMETER(flags := '0???????'B,
1795 cmd_code := Device_Watchdog,
1796 app_id := '00000000'O,
1797 hbh_id := hbh_id,
1798 ete_id := ete_id,
1799 avps := superset(
1800 tr_AVP_ResultCode(DIAMETER_SUCCESS),
1801 tr_AVP_OriginHost(orig_host),
Pau Espin Pedrol8dcb0612023-08-28 19:16:29 +02001802 tr_AVP_OriginRealm(orig_realm)
1803 /* tr_AVP_OriginStateId(state_id) is optional */
Vadim Yanitskiyf28b2552021-12-11 03:49:14 +03001804 ));
1805
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02001806function f_DIAMETER_get_avp(PDU_DIAMETER pdu, template (present) AVP_Code avp_code)
1807return template (omit) AVP
1808{
1809 var integer i;
1810
1811 for (i := 0; i < lengthof(pdu.avps); i := i+1) {
1812 if (not ispresent(pdu.avps[i].avp)) {
1813 continue;
1814 }
1815 var AVP_Header hdr := pdu.avps[i].avp.avp_header;
1816 if (match(hdr.avp_code, avp_code)) {
1817 return pdu.avps[i].avp;
1818 }
1819 }
1820 return omit;
1821}
1822function f_DIAMETER_get_avp_or_fail(PDU_DIAMETER pdu, template (present) AVP_Code avp_code)
1823return AVP
1824{
1825 var template (omit) AVP avp;
1826 avp := f_DIAMETER_get_avp(pdu, avp_code);
1827 if (istemplatekind(avp, "omit")) {
1828 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1829 log2str("AVP ", avp_code, " not found in ", pdu));
1830 }
1831 return valueof(avp);
1832}
1833
1834function f_AVP_Grouped_get_avp(AVP_Grouped avp_grp, template (present) AVP_Code avp_code)
1835return template (omit) AVP
1836{
1837 var integer i;
1838
1839 for (i := 0; i < lengthof(avp_grp); i := i+1) {
1840 if (not ispresent(avp_grp[i].avp)) {
1841 continue;
1842 }
1843 var AVP_Header hdr := avp_grp[i].avp.avp_header;
1844 if (match(hdr.avp_code, avp_code)) {
1845 return avp_grp[i].avp;
1846 }
1847 }
1848 return omit;
1849}
1850function f_AVP_Grouped_get_avp_or_fail(AVP_Grouped avp_grp, template (present) AVP_Code avp_code)
1851return AVP
1852{
1853 var template (omit) AVP avp;
1854 avp := f_AVP_Grouped_get_avp(avp_grp, avp_code);
1855 if (istemplatekind(avp, "omit")) {
1856 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1857 log2str("AVP ", avp_code, " not found in ", avp_grp));
1858 }
1859 return valueof(avp);
1860}
1861
1862function f_validate_gy_cc_report(PDU_DIAMETER rx_dia, template (present) DCA_3GPP_Reporting_Reason repreason_exp := ?,
1863 template (present) integer cc_time_exp := ?,
1864 template (present) integer cc_in_oct_exp := ?,
1865 template (present) integer cc_out_oct_exp := ?)
1866{
1867 var AVP multi_services_cc, used_service_unit;
1868 var AVP_Grouped multi_services_cc_data, used_service_unit_data;
Pau Espin Pedrolcba0f6d2022-05-24 13:49:46 +02001869 var template (omit) AVP repreason_tpl;
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02001870 var AVP repreason, cc_time, cc_in_oct, cc_out_oct;
1871
1872 multi_services_cc := f_DIAMETER_get_avp_or_fail(rx_dia, c_AVP_Code_DCC_NONE_Multiple_Services_Credit_Control);
1873 multi_services_cc_data := valueof(multi_services_cc.avp_data.avp_DCC_NONE_Multiple_Services_Credit_Control);
1874
Pau Espin Pedrolcba0f6d2022-05-24 13:49:46 +02001875 used_service_unit := f_AVP_Grouped_get_avp_or_fail(multi_services_cc_data, c_AVP_Code_DCC_NONE_Used_Service_Unit);
1876 used_service_unit_data := valueof(used_service_unit.avp_data.avp_DCC_NONE_Used_Service_Unit);
1877
1878 /* Reporting-Reason can be either inside Multiple-Services-Credit-Control or inside Used-Service-Unit */
1879 repreason_tpl := f_AVP_Grouped_get_avp(multi_services_cc_data, c_AVP_Code_DCA_3GPP_Reporting_Reason);
1880 if (istemplatekind(repreason_tpl, "omit")) {
1881 repreason := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCA_3GPP_Reporting_Reason);
1882 } else {
1883 repreason := valueof(repreason_tpl);
1884 }
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02001885 if (not match(repreason.avp_data.avp_DCA_3GPP_Reporting_Reason, repreason_exp)) {
1886 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1887 log2str("3GPP-Reporting-Reason mismatch ", repreason, " vs exp ", repreason_exp));
1888 }
1889
Pau Espin Pedrol8fa22842022-05-20 14:47:55 +02001890 cc_time := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCC_NONE_CC_Time);
1891 if (not match(oct2int(cc_time.avp_data.avp_DCC_NONE_CC_Time), cc_time_exp)) {
1892 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1893 log2str("3GPP-CC-Time mismatch ", cc_time, " vs exp ", cc_time_exp));
1894 }
1895
1896 cc_in_oct := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCC_NONE_CC_Input_Octets);
1897 if (not match(oct2int(cc_in_oct.avp_data.avp_DCC_NONE_CC_Input_Octets), cc_in_oct_exp)) {
1898 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1899 log2str("3GPP-CC-Input-Octets mismatch ", cc_in_oct, " vs exp ", cc_in_oct_exp));
1900 }
1901
1902 cc_out_oct := f_AVP_Grouped_get_avp_or_fail(used_service_unit_data, c_AVP_Code_DCC_NONE_CC_Output_Octets);
1903 if (not match(oct2int(cc_out_oct.avp_data.avp_DCC_NONE_CC_Output_Octets), cc_out_oct_exp)) {
1904 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
1905 log2str("3GPP-CC-Output-Octets mismatch ", cc_out_oct, " vs exp ", cc_out_oct_exp));
1906 }
1907}
1908
Harald Welted27ab242019-07-26 13:45:18 +02001909}