blob: 277953626bc5a44d777bda589f4c6f6b9536caf2 [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;
14
15/* https://www.iana.org/assignments/aaa-parameters/aaa-parameters.xhtml#aaa-parameters-4 */
16type enumerated DIAMETER_Resultcode {
17 /* Informational */
18 DIAMETER_MULTI_ROUND_AUTH (1001),
19
20 /* Success */
21 DIAMETER_SUCCESS (2001),
22 DIAMETER_LIMITED_SUCCESS (2002),
23 DIAMETER_FIRST_REGISTRATION (2003),
24 DIAMETER_SUBSEQUENT_REGISTRATION (2004),
25 DIAMETER_UNREGISTERED_SERVICE (2005),
26 DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED (2006),
27 DIAMETER_SERVER_SELECTION (2007),
28 DIAMETER_SUCCESS_AUTH_SENT_SERVER_NOT_STORED (2008),
29 DIAMETER_SUCCESS_RELOCATE_HA (2009),
30
31 /* Protocol Errors */
32 DIAMETER_COMMAND_UNSUPPORTED (3001),
33 DIAMETER_UNABLE_TO_DELIVER (3002),
34 DIAMETER_REALM_NOT_SERVED (3003),
35 DIAMETER_TOO_BUSY (3004),
36 DIAMETER_LOOP_DETECTED (3005),
37 DIAMETER_REDIRECT_INDICATION (3006),
38 DIAMETER_APPLICATION_UNSUPPORTED (3007),
39 DIAMETER_INVALID_HDR_BITS (3008),
40 DIAMETER_INVALID_AVP_BITS (3009),
41 DIAMETER_UNKNOWN_PEER (3010),
42 DIAMETER_REALM_REDIRECT_INDICATION (3011),
43
44 /* Transient Failures */
45 DIAMETER_AUTHENTICATION_REJECTED (4001),
46 DIAMETER_OUT_OF_SPACE (4002),
47 ELECTION_LOST (4003),
48 DIAMETER_ERROR_MIP_REPLY_FAILURE (4005),
49 DIAMETER_ERROR_HA_NOT_AVAILABLE (4006),
50 DIAMETER_ERROR_BAD_KEY (4007),
51 DIAMETER_ERROR_MIP_FILTER_NOT_SUPPORTED (4008),
52 DIAMETER_END_USER_SERVICE_DENIED (4010),
53 DIAMETER_CREDIT_CONTROL_NOT_APPLICABLE (4011),
54 DIAMETER_CREDIT_LIMIT_REACHED (4012),
55 DIAMETER_USER_NAME_REQUIRED (4013),
56 RESOURCE_FAILURE (4014),
57
58 DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181),
59 DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT (4882),
60
61 /* Permanent Failure */
62 DIAMETER_AVP_UNSUPPORTED (5001),
63 DIAMETER_UNKNOWN_SESSION_ID (5002),
64 DIAMETER_AUTHORIZATION_REJECTED (5003),
65 DIAMETER_INVALID_AVP_VALUE (5004),
66 DIAMETER_MISSING_AVP (5005),
67 DIAMETER_RESOURCES_EXCEEDED (5006),
68 DIAMETER_CONTRADICTING_AVPS (5007),
69 DIAMETER_AVP_NOT_ALLOWED (5008),
70 DIAMETER_AVP_OCCURS_TOO_MANY_TIMES (5009),
71 DIAMETER_NO_COMMON_APPLICATION (5010),
72 DIAMETER_UNSUPPORTED_VERSION (5011),
73 DIAMETER_UNABLE_TO_COMPLY (5012),
74 DIAMETER_INVALID_BIT_IN_HEADER (5013),
75 DIAMETER_INVALID_AVP_LENGTH (5014),
76 DIAMETER_INVALID_MESSAGE_LENGTH (5015),
77 DIAMETER_INVALID_AVP_BIT_COMBO (5016),
78 DIAMETER_NO_COMMON_SECURITY (5017),
79 DIAMETER_RADIUS_AVP_UNTRANSLATABLE (5018),
80 DIAMETER_ERROR_NO_FOREIGN_HA_SERVICE (5024),
81 DIAMETER_ERROR_END_TO_END_MIP_KEY_ENCRYPTION (5025),
82 DIAMETER_USER_UNKNOWN (5030),
83 DIAMETER_RATING_FAILED (5031),
84 DIAMETER_ERROR_USER_UNKNOWN (5032),
85 DIAMETER_ERROR_IDENTITIES_DONT_MATCH (5033),
86 DIAMETER_ERROR_IDENTITY_NOT_REGISTERED (5034),
87 DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5035),
88 DIAMETER_ERROR_IDENTITY_ALREADY_REGISTERED (5036),
89 DIAMETER_ERROR_AUTH_SCHEME_NOT_SUPPORTED (5037),
90 DIAMETER_ERROR_IN_ASSIGNMENT_TYPE (5038),
91 DIAMETER_ERROR_TOO_MUCH_DATA (5039),
92 DIAMETER_ERROR_NOT_SUPPORTED_USER_DATA (5040),
93 DIAMETER_ERROR_MIP6_AUTH_MODE (5041),
94 UNKNOWN_BINDING_TEMPLATE_NAME (5042),
95 BINDING_FAILURE (5043),
96 MAX_BINDINGS_SET_FAILURE (5044),
97 MAXIMUM_BINDINGS_REACHED_FOR_ENDPOINT (5045),
98 SESSION_EXISTS (5046),
99 INSUFFICIENT_CLASSIFIERS (5047),
100 DIAMETER_ERROR_EAP_CODE_UNKNOWN (5048)
101};
102
103/* 3GPP TS 29.272 Section 7.1.8 */
104const uint32_t c_DIAMETER_3GPP_S6_AID := 16777251;
105const uint32_t c_DIAMETER_3GPP_S13_AID := 16777252;
106const uint32_t c_DIAMETER_3GPP_S7_AID := 16777308;
107
108template (value) PDU_DIAMETER
109ts_DIAMETER(template (value) BIT8 flags,
110 template (value) Command_Code cmd_code,
111 template (value) OCTET4 app_id := '00000000'O,
112 template (value) UINT32 hbh_id,
113 template (value) UINT32 ete_id,
114 template (value) AVP_list avps := {}
115) := {
116 version := 1,
117 message_length := 0, /* overwritten */
118 RPETxxxx := flags,
119 command_code := cmd_code,
120 application_id := app_id,
121 hop_by_hop_id := hbh_id,
122 end_to_end_id := ete_id,
123 avps := avps
124}
125template (present) PDU_DIAMETER
126tr_DIAMETER(template (present) BIT8 flags := ?,
127 template (present) Command_Code cmd_code := ?,
128 template (present) OCTET4 app_id := ?,
129 template (present) UINT32 hbh_id := ?,
130 template (present) UINT32 ete_id := ?,
131 template (present) AVP_list avps := ?) := {
132 version := 1,
133 message_length := ?,
134 RPETxxxx := flags,
135 command_code := cmd_code,
136 application_id := app_id,
137 hop_by_hop_id := hbh_id,
138 end_to_end_id := ete_id,
139 avps := avps
140}
141template (present) PDU_DIAMETER
142tr_DIAMETER_A(
143 template (present) Command_Code cmd_code := ?,
144 template (present) OCTET4 app_id := ?,
145 template (present) UINT32 hbh_id := ?,
146 template (present) UINT32 ete_id := ?,
147 template (present) AVP_list avps := ?) :=
148 tr_DIAMETER('0???????'B, cmd_code, app_id, hbh_id, ete_id, avps);
149template (present) PDU_DIAMETER
150tr_DIAMETER_R(
151 template (present) Command_Code cmd_code := ?,
152 template (present) OCTET4 app_id := ?,
153 template (present) UINT32 hbh_id := ?,
154 template (present) UINT32 ete_id := ?,
155 template (present) AVP_list avps := ?) :=
156 tr_DIAMETER('1???????'B, cmd_code, app_id, hbh_id, ete_id, avps);
157
158
159template (value) AVP_Header
160ts_DIA_Hdr(template (value) AVP_Code avp_code,
161 template (value) BIT8 flags := '01000000'B) := {
162 avp_code := avp_code,
163 VMPxxxxx := flags,
164 avp_length := 0, /* overwritten */
165 vendor_id := omit
166}
167template (present) AVP_Header
168tr_DIA_Hdr(template (present) AVP_Code avp_code,
169 template (present) BIT8 flags := '0???????'B) := {
170 avp_code := avp_code,
171 VMPxxxxx := flags,
172 avp_length := ?, /* overwritten */
173 vendor_id := omit
174}
175
176template (value) AVP_Header
177ts_DIA_Hdr_3GPP(template (value) AVP_Code avp_code,
178 template (value) BIT8 flags := '11000000'B) := {
179 avp_code := avp_code,
180 VMPxxxxx := flags,
181 avp_length := 0, /* overwritten */
182 vendor_id := vendor_id_3GPP
183}
184template (present) AVP_Header
185tr_DIA_Hdr_3GPP(template (present) AVP_Code avp_code,
186 template (present) BIT8 flags := '1???????'B) := {
187 avp_code := avp_code,
188 VMPxxxxx := flags,
189 avp_length := ?, /* overwritten */
190 vendor_id := vendor_id_3GPP
191}
192
193
194template (value) GenericAVP ts_AVP_OriginHost(template (value) charstring host) := {
195 avp := {
196 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Host),
197 avp_data := {
198 avp_BASE_NONE_Origin_Host := host
199 }
200 }
201}
202template (present) GenericAVP tr_AVP_OriginHost(template (present) charstring host := ?) := {
203 avp := {
204 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Host),
205 avp_data := {
206 avp_BASE_NONE_Origin_Host := host
207 }
208 }
209}
210
211
212template (value) GenericAVP ts_AVP_OriginRealm(template (value) charstring realm) := {
213 avp := {
214 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Realm),
215 avp_data := {
216 avp_BASE_NONE_Origin_Realm := realm
217 }
218 }
219}
220template (present) GenericAVP tr_AVP_OriginRealm(template (present) charstring realm := ?) := {
221 avp := {
222 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Realm),
223 avp_data := {
224 avp_BASE_NONE_Origin_Realm := realm
225 }
226 }
227}
228
229
230template (value) GenericAVP ts_AVP_OriginStateId(template (value) OCTET4 state_id) := {
231 avp := {
232 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_State_Id),
233 avp_data := {
234 avp_BASE_NONE_Origin_State_Id := state_id
235 }
236 }
237}
238
239template (value) GenericAVP ts_AVP_HostIpAddr(template (value) OCTET4 ipv4_addr) := {
240 avp := {
241 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Host_IP_Address),
242 avp_data := {
243 avp_BASE_NONE_Host_IP_Address := {
244 address_type := IP,
245 address_data := ipv4_addr
246 }
247 }
248 }
249}
250
251template (value) GenericAVP ts_AVP_VendorId(Vendor_Id vendor_id) := {
252 avp := {
253 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id, '00000000'B),
254 avp_data := {
255 avp_BASE_NONE_Vendor_Id := int2oct(enum2int(vendor_id), 4)
256 }
257 }
258}
259
260template (value) GenericAVP ts_AVP_ProductName(charstring name) := {
261 avp := {
262 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Product_Name, '00000000'B),
263 avp_data := {
264 avp_BASE_NONE_Product_Name := char2oct(name)
265 }
266 }
267}
268
269template (value) GenericAVP ts_AVP_FwRevision(octetstring fw_version) := {
270 avp := {
271 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Firmware_Revision, '00000000'B),
272 avp_data := {
273 avp_BASE_NONE_Firmware_Revision := fw_version
274 }
275 }
276}
277
278template (value) GenericAVP ts_AVP_InbSecId(template (value) OCTET4 inb_sec_id) := {
279 avp := {
280 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Inband_Security_Id),
281 avp_data := {
282 avp_BASE_NONE_Inband_Security_Id := inb_sec_id
283 }
284 }
285}
286
287template (value) GenericAVP ts_AVP_VendorSpecAppId(Vendor_Id vendor_id, uint32_t auth_app_id) := {
288 avp := {
289 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Specific_Application_Id),
290 avp_data := {
291 avp_BASE_NONE_Vendor_Specific_Application_Id := {
292 {
293 avp := {
294 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id),
295 avp_data := {
296 avp_BASE_NONE_Vendor_Id := int2oct(enum2int(vendor_id), 4)
297 }
298 }
299 }, {
300 avp := {
301 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
302 avp_data := {
303 avp_BASE_NONE_Auth_Application_Id := int2oct(auth_app_id, 4)
304 }
305 }
306 }
307 }
308 }
309 }
310}
311
312template (value) GenericAVP ts_AVP_AuthAppId(template (value) OCTET4 auth_app_id) := {
313 avp := {
314 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
315 avp_data := {
316 avp_BASE_NONE_Auth_Application_Id := auth_app_id
317 }
318 }
319}
320
321template (value) GenericAVP ts_AVP_SuppVendorIdRaw(uint32_t vendor_id) := {
322 avp := {
323 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Supported_Vendor_Id),
324 avp_data := {
325 avp_BASE_NONE_Supported_Vendor_Id := int2oct(vendor_id, 4)
326 }
327 }
328}
329template (value) GenericAVP ts_AVP_SuppVendorId(Vendor_Id vendor_id) :=
330 ts_AVP_SuppVendorIdRaw(enum2int(vendor_id));
331
332template (value) GenericAVP ts_AVP_ResultCode(DIAMETER_Resultcode res_code) := {
333 avp := {
334 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Result_Code),
335 avp_data := {
336 avp_BASE_NONE_Result_Code := int2oct(enum2int(res_code), 4)
337 }
338 }
339}
340
341template (value) GenericAVP ts_AVP_AuthSessionState(template (value) BASE_NONE_Auth_Session_State ass := NO_STATE_MAINTAINED) := {
342 avp := {
343 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Session_State),
344 avp_data := {
345 avp_BASE_NONE_Auth_Session_State := ass
346 }
347 }
348}
349template (present) GenericAVP tr_AVP_AuthSessionState(template (present) BASE_NONE_Auth_Session_State ass := ?) := {
350 avp := {
351 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Session_State),
352 avp_data := {
353 avp_BASE_NONE_Auth_Session_State := ass
354 }
355 }
356}
357
358template (value) GenericAVP ts_AVP_SessionId(template (value) octetstring session_id) := {
359 avp := {
360 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Session_Id),
361 avp_data := {
362 avp_BASE_NONE_Session_Id := session_id
363 }
364 }
365}
366template (present) GenericAVP tr_AVP_SessionId(template (present) octetstring session_id := ?) := {
367 avp := {
368 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Session_Id),
369 avp_data := {
370 avp_BASE_NONE_Session_Id := session_id
371 }
372 }
373}
374
375/* 3.3 Destination Realm */
376template (value) GenericAVP ts_AVP_DestinationRealm(template (value) charstring dest_realm) := {
377 avp := {
378 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Realm),
379 avp_data := {
380 avp_BASE_NONE_Destination_Realm := dest_realm
381 }
382 }
383}
384template (present) GenericAVP tr_AVP_DestinationRealm(template (present) charstring dest_realm := ?) := {
385 avp := {
386 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Realm),
387 avp_data := {
388 avp_BASE_NONE_Destination_Realm := dest_realm
389 }
390 }
391}
392
393/* 8.14 User-Name */
394template (value) GenericAVP ts_AVP_UserName(template (value) octetstring uid) := {
395 avp := {
396 avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_User_Name),
397 avp_data := {
398 avp_BASE_NONE_User_Name := uid
399 }
400 }
401}
402template (present) GenericAVP tr_AVP_UserName(template (present) octetstring uid := ?) := {
403 avp := {
404 avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_User_Name),
405 avp_data := {
406 avp_BASE_NONE_User_Name := uid
407 }
408 }
409}
410template (value) GenericAVP ts_AVP_UserNameImsi(hexstring imsi) := ts_AVP_UserName(char2oct(hex2str(imsi)));
411template (present) GenericAVP tr_AVP_UserNameImsi(hexstring imsi) := tr_AVP_UserName(char2oct(hex2str(imsi)));
412
413
414
415/* TS 29.262 7.3.53 RAND */
416template (value) GenericAVP ts_AVP_RAND(template (value) octetstring rand) := {
417 avp := {
418 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_RAND),
419 avp_data := {
420 avp_AAA_3GPP_RAND := rand
421 }
422 }
423}
424
425/* TS 29.262 7.3.54 XRES */
426template (value) GenericAVP ts_AVP_XRES(template (value) octetstring xres) := {
427 avp := {
428 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_XRES),
429 avp_data := {
430 avp_AAA_3GPP_XRES := xres
431 }
432 }
433}
434
435/* TS 29.262 7.3.55 XRES */
436template (value) GenericAVP ts_AVP_AUTN(template (value) octetstring autn) := {
437 avp := {
438 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AUTN),
439 avp_data := {
440 avp_AAA_3GPP_AUTN := autn
441 }
442 }
443}
444
445/* TS 29.262 7.3.56 KASME */
446template (value) GenericAVP ts_AVP_KASME(template (value) octetstring kasme) := {
447 avp := {
448 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_KASME),
449 avp_data := {
450 avp_AAA_3GPP_KASME := kasme
451 }
452 }
453}
454
455/* TS 29.262 7.3.23 Item-Number */
456template (value) GenericAVP ts_AVP_ItemNumber(uint32_t num) := {
457 avp := {
458 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_KASME),
459 avp_data := {
460 avp_AAA_3GPP_Item_Number := int2oct(num, 4)
461 }
462 }
463}
464
465/* TS 29.262 7.3.18 E-UTRAN Vector */
466template (value) GenericAVP ts_AVP_EutranVec(uint32_t item_num, octetstring rand, octetstring xres,
467 octetstring autn, octetstring kasme) := {
468 avp := {
469 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_E_UTRAN_Vector),
470 avp_data := {
471 avp_AAA_3GPP_E_UTRAN_Vector := {
472 ts_AVP_ItemNumber(item_num),
473 ts_AVP_RAND(rand),
474 ts_AVP_XRES(xres),
475 ts_AVP_AUTN(autn),
476 ts_AVP_KASME(kasme)
477 }
478 }
479 }
480}
481
482/* TS 29.262 7.3.2 Subscription-Data */
483template (value) GenericAVP ts_AVP_3GPP_SubscriptionData(template (value) AVP_list content) := {
484 avp := {
485 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscription_Data),
486 avp_data := {
487 avp_AAA_3GPP_Subscription_Data := content
488 }
489 }
490}
491
492
493/* TS 29.262 7.3.17 Authentication-Info */
494template (value) GenericAVP ts_AVP_3GPP_AuthInfo(template (value) AVP_list content) := {
495 avp := {
496 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Authentication_Info),
497 avp_data := {
498 avp_AAA_3GPP_Authentication_Info := content
499 }
500 }
501}
502
503/* TS 29.262 7.3.9 Visited-PLMN-Id */
504template (value) GenericAVP ts_AVP_3GPP_VisitedPlmnId(template (value) octetstring id) := {
505 avp := {
506 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Visited_PLMN_Id),
507 avp_data := {
508 avp_AAA_3GPP_Visited_PLMN_Id := id
509 }
510 }
511}
512template (present) GenericAVP tr_AVP_3GPP_VisitedPlmnId(template (present) octetstring id := ?) := {
513 avp := {
514 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Visited_PLMN_Id),
515 avp_data := {
516 avp_AAA_3GPP_Visited_PLMN_Id := id
517 }
518 }
519}
520
521/* TS 29.262 7.3.13 RAT-Type */
522template (value) GenericAVP ts_AVP_3GPP_RatType(template (value) PCC_3GPP_RAT_Type rat_type) := {
523 avp := {
524 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_RAT_Type),
525 avp_data := {
526 avp_PCC_3GPP_RAT_Type := rat_type
527 }
528 }
529}
530template (present) GenericAVP tr_AVP_3GPP_RatType(template (present) PCC_3GPP_RAT_Type rat_type := ?) := {
531 avp := {
532 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_RAT_Type),
533 avp_data := {
534 avp_PCC_3GPP_RAT_Type := rat_type
535 }
536 }
537}
538
539/* TS 29.262 7.3.7 ULR-Flags */
540template (value) GenericAVP ts_AVP_3GPP_UlrFlags(template (value) UINT32 flags) := {
541 avp := {
542 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULR_Flags),
543 avp_data := {
544 avp_AAA_3GPP_ULR_Flags := flags
545 }
546 }
547}
548template (present) GenericAVP tr_AVP_3GPP_UlrFlags(template (present) UINT32 flags := ?) := {
549 avp := {
550 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULR_Flags),
551 avp_data := {
552 avp_AAA_3GPP_ULR_Flags := flags
553 }
554 }
555}
556
557/* TS 29.262 7.3.8 ULA-Flags */
558template (value) GenericAVP ts_AVP_3GPP_UlaFlags(template (value) UINT32 flags) := {
559 avp := {
560 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULA_Flags),
561 avp_data := {
562 avp_AAA_3GPP_ULA_Flags := flags
563 }
564 }
565}
566template (present) GenericAVP tr_AVP_3GPP_UlaFlags(template (present) UINT32 flags := ?) := {
567 avp := {
568 avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULA_Flags),
569 avp_data := {
570 avp_AAA_3GPP_ULA_Flags := flags
571 }
572 }
573}
574
575/* TS 29.262 7.3.27 Context-Identifier */
576template (value) GenericAVP ts_AVP_3GPP_ContextId(uint32_t ctx) := {
577 avp := {
578 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Context_Identifier),
579 avp_data := {
580 avp_AAA_3GPP_Context_Identifier := int2oct(ctx, 4)
581 }
582 }
583}
584
585/* Ts 29.262 7.3.29 Subscriber-Status */
586template (value) GenericAVP ts_AVP_3GPP_SubscriberStatus(template (value) AAA_3GPP_Subscriber_Status sts) := {
587 avp := {
588 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscriber_Status),
589 avp_data := {
590 avp_AAA_3GPP_Subscriber_Status := sts
591 }
592 }
593}
594
595template (value) GenericAVP ts_AVP_3GPP_SubscrRauTauTmr(uint32_t tmr) := {
596 avp := {
597 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer),
598 avp_data := {
599 avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer := int2oct(tmr, 4)
600 }
601 }
602}
603
604/* TS 29.262 7.3.33 All-APN-Configurations-Included-Indicator */
605template (value) GenericAVP ts_AVP_3GPP_AllApnConfigsIncl(template (value) AAA_3GPP_All_APN_Configurations_Included_Indicator ind := All_APN_CONFIGURATIONS_INCLUDED) := {
606 avp := {
607 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_All_APN_Configurations_Included_Indicator),
608 avp_data := {
609 avp_AAA_3GPP_All_APN_Configurations_Included_Indicator := ind
610 }
611 }
612}
613
614/* TS 29.262 7.3.34 APN-Configuration-Profile */
615template (value) GenericAVP ts_AVP_3GPP_ApnConfigProfile(template (value) AVP_list content) := {
616 avp := {
617 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
618 avp_data := {
619 avp_AAA_3GPP_APN_Configuration_Profile := content
620 }
621 }
622}
623
624/* TS 29.262 7.3.35 APN-Configuration */
625template (value) GenericAVP ts_AVP_3GPP_ApnConfig(uint32_t ctx, AAA_3GPP_PDN_Type pdn_type,
626 charstring apn) := {
627 avp := {
628 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
629 avp_data := {
630 avp_AAA_3GPP_APN_Configuration := {
631 ts_AVP_3GPP_ContextId(ctx),
632 ts_AVP_3GPP_PdnType(pdn_type),
633 ts_AVP_3GPP_EpsSubscrQosProfile(1, 1),
634 ts_AVP_ServiceSelection(apn)
635 }
636 }
637 }
638}
639
640/* TS 29.262 7.3.36 Service-Selection (refers to RFC 5778) */
641template (value) GenericAVP ts_AVP_ServiceSelection(charstring apn) := {
642 avp := {
643 avp_header := ts_DIA_Hdr(c_AVP_Code_MIPv6_NONE_Service_Selection),
644 avp_data := {
645 avp_MIPv6_NONE_Service_Selection := char2oct(apn)
646 }
647 }
648}
649
650template (value) GenericAVP ts_AVP_3GPP_QosClassId(uint32_t id) := {
651 avp := {
652 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Class_Identifier),
653 avp_data := {
654 avp_PCC_3GPP_QoS_Class_Identifier := int2oct(id, 4)
655 }
656 }
657}
658
659template (value) GenericAVP ts_AVP_3GPP_PriorityLevel(uint32_t prio) := {
660 avp := {
661 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Priority_Level),
662 avp_data := {
663 avp_PCC_3GPP_Priority_Level := int2oct(prio, 4)
664 }
665 }
666}
667
668
669template (value) GenericAVP ts_AVP_3GPP_AllocRetenPrio(uint32_t prio) := {
670 avp := {
671 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Allocation_Retention_Priority),
672 avp_data := {
673 avp_PCC_3GPP_Allocation_Retention_Priority := {
674 ts_AVP_3GPP_PriorityLevel(prio)
675 /* pre-emption capability */
676 /* pre-emption vulnerability */
677 }
678 }
679 }
680}
681
682template (value) GenericAVP ts_AVP_3GPP_EpsSubscrQosProfile(uint32_t qos_class, uint32_t prio) := {
683 avp := {
684 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_EPS_Subscribed_QoS_Profile),
685 avp_data := {
686 avp_AAA_3GPP_EPS_Subscribed_QoS_Profile := {
687 ts_AVP_3GPP_QosClassId(qos_class),
688 ts_AVP_3GPP_AllocRetenPrio(prio)
689 }
690 }
691 }
692}
693
694
695/* TS 29.262 7.3.41 AMBR */
696template (value) GenericAVP ts_AVP_3GPP_AMBR(uint32_t ul, uint32_t dl) := {
697 avp := {
698 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AMBR),
699 avp_data := {
700 avp_AAA_3GPP_AMBR := {
701 ts_AVP_3GPP_MaxReqBwUL(ul),
702 ts_AVP_3GPP_MaxReqBwDL(dl)
703 }
704 }
705 }
706}
707
708template (value) GenericAVP ts_AVP_3GPP_MaxReqBwUL(uint32_t bw) := {
709 avp := {
710 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_UL),
711 avp_data := {
712 avp_RX_3GPP_Max_Requested_Bandwidth_UL := int2oct(bw, 4)
713 }
714 }
715}
716
717template (value) GenericAVP ts_AVP_3GPP_MaxReqBwDL(uint32_t bw) := {
718 avp := {
719 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_DL),
720 avp_data := {
721 avp_RX_3GPP_Max_Requested_Bandwidth_DL := int2oct(bw, 4)
722 }
723 }
724}
725
726
727
728/* TS 29.262 7.3.62 PDN-Type */
729template (value) GenericAVP ts_AVP_3GPP_PdnType(template (value) AAA_3GPP_PDN_Type pdn_type) := {
730 avp := {
731 avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_PDN_Type),
732 avp_data := {
733 avp_AAA_3GPP_PDN_Type := pdn_type
734 }
735 }
736}
737
738
739
740/* 5.3.2 Capabilities Exchange Answer */
741template (value) PDU_DIAMETER
742ts_DIA_CEA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id)
743:= ts_DIAMETER(flags:='00000000'B, cmd_code:=Capabilities_Exchange, hbh_id:=hbh_id, ete_id:=ete_id,
744 avps := {
745 ts_AVP_ResultCode(DIAMETER_SUCCESS),
746 ts_AVP_OriginHost("hss.localdomain"),
747 ts_AVP_OriginRealm("localdomain"),
748 ts_AVP_HostIpAddr('7E000004'O),
749 ts_AVP_VendorId(vendor_id_3GPP),
750 ts_AVP_ProductName("TTCN-3 Testsuite"),
751 ts_AVP_OriginStateId('00000001'O),
752 ts_AVP_SuppVendorIdRaw(5535), /* 3GPP2 */
753 ts_AVP_SuppVendorId(vendor_id_3GPP),
754 ts_AVP_SuppVendorIdRaw(13019), /* ETSI */
755 ts_AVP_AuthAppId('FFFFFFFF'O),
756 ts_AVP_InbSecId('00000000'O),
757 ts_AVP_VendorSpecAppId(vendor_id_3GPP, c_DIAMETER_3GPP_S6_AID)
758 });
759
760template (present) PDU_DIAMETER
761tr_DIA_AIR(hexstring imsi) := tr_DIAMETER(flags := '11000000'B, cmd_code:=Authentication_Information,
762 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
763 avps := superset(
764 tr_AVP_SessionId,
765 tr_AVP_DestinationRealm,
766 tr_AVP_UserNameImsi(imsi),
767 tr_AVP_3GPP_VisitedPlmnId
768 ));
769
770/* TS 29.262 5.2.3.1 + 7.2.6 Authentication Information Answer */
771template (value) PDU_DIAMETER
772ts_DIA_AIA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
773 template (value) octetstring sess_id,
774 template (value) AVP_list auth_info_contents)
775:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Authentication_Information,
776 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
777 avps := {
778 ts_AVP_SessionId(sess_id),
779 ts_AVP_ResultCode(DIAMETER_SUCCESS),
780 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
781 ts_AVP_OriginHost("hss.localdomain"),
782 ts_AVP_OriginRealm("localdomain"),
783 ts_AVP_3GPP_AuthInfo(auth_info_contents)
784 });
785
786
787/* TS 29.262 7.2.3 Update Location Request */
788template (present) PDU_DIAMETER
789tr_DIA_ULR(hexstring imsi) := tr_DIAMETER(flags:='11000000'B, cmd_code:=Update_Location,
790 app_id:=int2oct(c_DIAMETER_3GPP_S6_AID, 4),
791 avps := superset(
792 tr_AVP_SessionId,
793 tr_AVP_AuthSessionState,
794 tr_AVP_OriginHost,
795 tr_AVP_OriginRealm,
796 tr_AVP_DestinationRealm,
797 tr_AVP_UserNameImsi(imsi),
798 tr_AVP_3GPP_RatType(EUTRAN),
799 tr_AVP_3GPP_UlrFlags,
800 tr_AVP_3GPP_VisitedPlmnId
801 ));
802
803template (value) PDU_DIAMETER
804ts_DIA_ULA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
805 template (value) octetstring sess_id,
806 template (value) AVP_list sub_data_content)
807:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Update_Location,
808 app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
809 avps := {
810 ts_AVP_SessionId(sess_id),
811 ts_AVP_ResultCode(DIAMETER_SUCCESS), /* optional */
812 ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
813 ts_AVP_OriginHost("hss.localdomain"),
814 ts_AVP_OriginRealm("localdomain"),
815 ts_AVP_3GPP_UlaFlags('00000002'O),
816 ts_AVP_3GPP_SubscriptionData(sub_data_content)
817 });
818
819
820
821}