diff options
105 files changed, 30162 insertions, 12948 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 55d6c42..b275cc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(FD_PROJECT_COPYRIGHT "Copyright (c) 2008-2015, WIDE Project (www.wide.ad.jp) # Version of the source code SET(FD_PROJECT_VERSION_MAJOR 1) -SET(FD_PROJECT_VERSION_MINOR 3) -SET(FD_PROJECT_VERSION_REV 2) +SET(FD_PROJECT_VERSION_MINOR 5) +SET(FD_PROJECT_VERSION_REV 0) # Version of the API with the library SET(FD_PROJECT_VERSION_API 6) @@ -71,6 +71,12 @@ IF (CMAKE_BUILD_TYPE MATCHES "Debug|Profiling|DebugValgrind") SET(DEBUG 1) ENDIF (CMAKE_BUILD_TYPE MATCHES "Debug|Profiling|DebugValgrind") +# Build with fatal warnings? +IF (ERRORS_ON_WARNINGS) + SET(CMAKE_C_FLAGS "-Wall -Werror ${CMAKE_C_FLAGS}") + SET(CMAKE_REQUIRED_FLAGS "-Wno-error ${CMAKE_REQUIRED_FLAGS}") +ENDIF (ERRORS_ON_WARNINGS) + # some subfolders use yacc and lex parsers SET(BISON_GENERATE_DEFINES TRUE) SET(BISON_PREFIX_OUTPUTS TRUE) @@ -109,4 +115,3 @@ SUBDIRS(extensions) IF ( BUILD_TESTING ) SUBDIRS(tests) ENDIF ( BUILD_TESTING ) - @@ -52,3 +52,6 @@ The following authors have contributed the following files. See source files for * Thomas Klausner: several extensions and numerous fixes / improvements. + + * Luke Mewburn: + numerous fixes / improvements. diff --git a/contrib/PKI/ca_script2/Makefile b/contrib/PKI/ca_script2/Makefile index 845176e..c40ea1e 100644 --- a/contrib/PKI/ca_script2/Makefile +++ b/contrib/PKI/ca_script2/Makefile @@ -25,7 +25,7 @@ all: help # Help message help: - @echo "\n\ + @printf -- "\n\ Available commands:\n\ make init topca=name\n\ Creates the initial top-level CA structure\n\ @@ -172,7 +172,7 @@ gencrl: @if [ -z "$(ca)" ]; then echo "Missing parameter. Ex: make gencrl ca=ca.testbed.aaa"; exit 1; fi # Create the CRL @CA_ROOT_DIR=$(DATA_DIR)/$(ca) openssl ca $(CONFIG) -gencrl -out $(DATA_DIR)/$(ca)/public/crl/$(ca).pem - @ln -s crl/$(ca).pem $(DATA_DIR)/$(ca)/public/local.pem - @ln -s local.pem $(DATA_DIR)/$(ca)/public/`openssl crl -noout -hash < $(DATA_DIR)/$(ca)/public/crl/$(ca).pem`.r0 + @ln -f -s crl/$(ca).pem $(DATA_DIR)/$(ca)/public/local.pem + @ln -f -s local.pem $(DATA_DIR)/$(ca)/public/`openssl crl -noout -hash < $(DATA_DIR)/$(ca)/public/crl/$(ca).pem`.r0 # End of file... diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 526d9ef..2ef9f32 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,4 +1,174 @@ -freediameter (1.2.1) UNRELEASED; urgency=low +freediameter (UNRELEASED) UNRELEASED; urgency=low + + * + +freediameter (1.5.0) RELEASED; urgency=low + + * freeDiameter: + - Add -g to help + - Change -d and -q to control syslog level, as per stdout logging. + - Syslog to LOG_DAEMON. + - Actually syslog to LOG_DEBUG, now that -d/-q are used. + - Add -p pidfile + - SCTP client: bind to local endpoints configured with ListenOn so + that the SCTP INIT only contains those local endpoint addresses, + matching what is advertised in the CER. + * Base dictionary: Add rules for Experimental-Result. + * All extensions: Hide symbols except for fd_ext_init(), fd_ext_fini(), + and fd_ext_depends. + * dbg_dict_dump.fdx: add extension to write the dictionary + to the given file or to the log. + * dbg_dict_dump_json.fdx: add extension to write the dictionary as JSON + to the given file or stdout. + * dict_dcca_3gpp.fdx: Update to 3GPP Release 15, adding many standards. + This adds 96 TYPEs, 145 ENUMVALs, 791 AVPs, 52 RULEs. + There are various breaking changes (documented below). + * contrib/dictionary_dcca_3gpp.json: Remove non-3GPP AVPs that are + actually from base IETF RFCs: + - MIP6-Feature-Vector (124). IETF RFC 5447 + - Service-Selection (493). IETF RFC 5778 + - Mobile-Node-Identifier (506). IETF RFC 5779 + - QoS-Capability (578). IETF RFC 5777. + * New API: fd_msg_add_result(): set Result-Code or Experimental-Result. + * New API: log level FD_LOG_INFO. + * fd_conf_dump(): fix formatting of local endpoints. + * fd_msg_search_avp(): support searching avp as well as msg. + * Fix compiler warnings. + * Add ERRORS_ON_WARNINGS cmake boolean to enable fatal compiler warnings. + * New tool: grep_fd_dict_dump: cleanup fd_dict_dump() output in logs. + * New tool: csv_to_fd: convert .csv with AVP tables to freeDiameter C or JSON. + * New tool: org_to_csv: convert .org files into .csv files. + + * dict_dcca_3gpp.fdx changes per update to 3GPP Release 15 as at 2019-12: + - AVP changes: + - 3GPP-CG-IPv6-Address (14) renamed to 3GPP-CG-Ipv6-Address (14). + - 3GPP-GGSN-IPv6-Address (16) renamed to 3GPP-GGSN-Ipv6-Address (16). + - 3GPP-IPv6-DNS-Servers (17) renamed to 3GPP-Ipv6-DNS-Servers (17). + - 3GPP-SGSN-IPv6-Address (15) renamed to 3GPP-SGSN-Ipv6-Address (15). + - 3GPP2-BSID (9010) flag M MUST. + - 3GPP2-BSID (9010) type changed from OctetString to UTF8String. + - ADC-Revalidation-Time (2801) Time removed in 3GPP TS 29.212 V12.1.0 (2013-06). + - ADC-Rule-Base-Name (1095) flag M MUST. + - ADC-Rule-Definition (1094) flag M MUST. + - ADC-Rule-Install (1092) flag M MUST. + - ADC-Rule-Name (1096) flag M MUST. + - ADC-Rule-Remove (1093) flag M MUST. + - ADC-Rule-Report (1097) flag M MUST. + - Application-Service-Type (2102) type changed from UTF8String to Enumerated. + - Application-Session-Id (2103) type changed from UTF8String to Unsigned32. + - Call-Barring-Infor-List (1488) renamed to Call-Barring-Info (1488). + - External-Identifier (28) OctetString replaced by External-Identifier (3111) UTF8String. + - LCS-Requestor-Id (1239) renamed to LCS-Requestor-ID (1239). + - LCS-Requestor-Id-String (1240) renamed to LCS-Requestor-ID-String (1240). + - MBMS-BMSC-SSM-IPv6-Address (919) renamed to MBMS-BMSC-SSM-Ipv6-Address (919). + - MBMS-GGSN-IPv6-Address (917) renamed to MBMS-GGSN-Ipv6-Address (917). + - MBMSGW-Address (2307) renamed to MBMS-GW-Address (2307). + - Measurement-Period-LTE (1656) code changed to Measurement-Period-LTE (1655). + - Measurement-Period-UMTS (1655) code changed to Measurement-Period-UMTS (1656). + - MME-LocationInformation (1600) renamed to MME-Location-Information(1600). + - PDG-Address (895) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - PDG-Charging-Id (896) Unsigned32 removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - PDN-Connection-ID (1065) flag M MUST NOT. + - PoC-User-Role-info-Units (1254) renamed to PoC-User-Role-Info-Units (1254). + - PS-to-CS-Session-Continuity (1099) flag M MUST NOT. + - SS-Status (1477) type changed from Grouped to OctetString. + - Status (2702) renamed to Status-AS-Code (2702). + - WAG-Address (890) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - WAG-PLMN-Id (891) OctetString removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - WLAN-Information (875) Grouped removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - WLAN-Radio-Container (892) Grouped removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - WLAN-Session-Id (1246) UTF8String removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - WLAN-Technology (893) Unsigned32 removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - WLAN-UE-Local-IPAddress (894) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09). + - AVP renames: + - Rename Call-Barring-Infor-List (1488) to Call-Barring-Info (1488). + - Rename LCS-Requestor-Id (1239) to LCS-Requestor-ID (1239). + - Rename LCS-Requestor-Id-String (1240) to LCS-Requestor-ID-String (1240). + - Rename MBMSGW-Address (2307) to MBMS-GW-Address (2307). + - Rename MME-LocationInformation (1600) to MME-Location-Information(1600). + - Rename PoC-User-Role-info-Units (1254) to PoC-User-Role-Info-Units (1254). + - Rename Status (2702) to Status-AS-Code (2702). + - AVP name conflicts: + - Time-Window (3818) in 3GPP TS 29.345 V12.1.0 (2014-12) predates + Time-Window-29.154 (4204) in 3GPP TS 29.154 V13.1.0 (2016-03). + - Add Enumerated(3GPP/Experimental-Result-Code). 145 values. + - Update standards: + - 3GPP TS 29.061 V15.5.0 (2018-12). 15 AVPs. + - 3GPP TS 29.173 V15.0.0 (2018-06). 1 AVP. + - 3GPP TS 29.212 V15.9.0 (2019-12). 46 AVPs. + - 3GPP TS 29.214 V15.7.0 (2019-09). 27 AVPs. + - 3GPP TS 29.229 V15.2.0 (2019-09). 8 AVPs. + - 3GPP TS 29.272 V15.10.0 (2019-12). 44 AVPs. + - 3GPP TS 29.329 V15.2.0 (2019-09). 5 AVPs. + - 3GPP TS 32.299 V15.7.0 (2019-06). 154 AVPs. + - Add standards: + - 3GPP TS 29.109 V15.0.0 (2017-06). 21 AVPs. + - 3GPP TS 29.128 V15.6.0 (2019-09). 25 AVPs. + - 3GPP TS 29.153 V15.1.0 (2019-09). 2 AVPs. + - 3GPP TS 29.154 V15.3.0 (2019-09). 16 AVPs. + - 3GPP TS 29.172 V15.2.0 (2019-12). 66 AVPs. + - 3GPP TS 29.209 V6.8.0 (2011-09). 2 AVPs. + - 3GPP TS 29.215 V15.2.0 (2019-09). 9 AVPs. + - 3GPP TS 29.217 V15.1.0 (2019-09). 14 AVPs. + - 3GPP TS 29.219 V15.3.0 (2019-09). 7 AVPs. + - 3GPP TS 29.234 V11.2.0 (2013-06). 19 AVPs. + - 3GPP TS 29.273 V15.4.0 (2019-09). 40 AVPs. + - 3GPP TS 29.283 V15.1.0 (2019-09). 16 AVPs. + - 3GPP TS 29.336 V15.7.0 (2019-09). 79 AVPs. + - 3GPP TS 29.337 V15.0.0 (2018-06). 4 AVPs. + - 3GPP TS 29.338 V15.1.0 (2018-12). 34 AVPs. + - 3GPP TS 29.343 V15.1.0 (2019-09). 13 AVPs. + - 3GPP TS 29.344 V15.1.0 (2019-09). 7 AVPs. + - 3GPP TS 29.345 V15.1.0 (2019-09). 68 AVPs. + - 3GPP TS 29.368 V15.1.0 (2019-09). 12 AVPs. + - 3GPP TS 29.388 V15.1.0 (2019-09). 3 AVPs. + - 3GPP TS 29.389 V15.1.0 (2019-09). 3 AVPs. + - 3GPP TS 29.468 V15.8.0 (2019-12). 33 AVPs. + - 3GPP TS 29.561 V16.3.0 (2020-03). 9 AVPs. + +freediameter (1.4.0) RELEASED; urgency=low + + * New API: fd_fifo_set_max to change the capacity of a queue. + * New configuration stanza for Relays: ProcessingPeersPattern and ProcessingPeersMinimum + * New configuration stanza for scalability: RoutingInThreads and RoutingOutThreads + * some coding style cleanups + * Improvements on rt_load_balance algorithm + * Improvements on logging & locking behaviors + * More tolerant to invalid messages and answers. + * Improvements on shutdown behaviors. + * test_ccload: new extension: generates random + Credit-Control-Requests and counts how many are answered/give an + error/get no answer. Start it with SIGUSR2, stop it with a second + SIGUSR2. Statistics are printed on exit. + * test_cc: new extension. Automatically replies to + Credit-Control-Requests. Copies minimally necessary data from + the Request. + * Fixed testcnx failing due to expired CA certificate + +freediameter (1.3.2) RELEASED; urgency=low + + * acl_wl: add configuration reload support (using SIGUSR1). + * Reduce deprecation warnings. + +freediameter (1.3.1) RELEASED; urgency=low + + * test_as: new extension. Automatically replies to Abort-Session-Requests + with a diameter success message. + * dbg_loglevel: new extension. Reads debug level from config file + and supports configuration reload using SIGUSR1; this allows + changing the loglevel at runtime. + * rt_rewrite: new extension. Modify messages - move data from one + AVP to another or drop AVPs completely. + * rt_deny_by_size: new extension. discard Diameter messages that are + larger than a configurable size. Has reload support (using + SIGUSR1). + * freeDiameterd: add syslog() support ('-s' command line flag) + * rt_ereg: add configuration reload support (using SIGUSR1). Support + grouped AVPs. Support multiple separate AVPs. + * rt_default: add configuration reload support (using SIGUSR1) + * Various bugfixes + +freediameter (1.2.1) RELEASED; urgency=low * New extension: rt_randomize (load-balancing on possible destinations) * New contrib: Gx extension. @@ -18,7 +188,7 @@ freediameter (1.2.1) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@freediameter.net> Sat, 30 Jan 2016 23:38:03 +0800 -freediameter (1.2.0) UNRELEASED; urgency=low +freediameter (1.2.0) RELEASED; urgency=low * Major changes in the logging system to be more syslog and production friendly * New extension: dict_dcca_3gpp @@ -56,7 +226,7 @@ freediameter (1.2.0) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@freediameter.net> Sat, 14 Sep 2013 18:08:07 +0800 -freediameter (1.1.6) UNRELEASED; urgency=low +freediameter (1.1.6) RELEASED; urgency=low * Fix major issue in 1.1.5 preventing to send answers to a received message. * New command-line option: --enable_msg_log=( DROPPED | RECEIVED | SENT | NODELIVER | TIMING ) @@ -71,7 +241,7 @@ freediameter (1.1.6) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@freediameter.net> Sun, 03 Mar 2013 07:40:43 +0100 -freediameter (1.1.5) UNRELEASED; urgency=low +freediameter (1.1.5) RELEASED; urgency=low * Added compatibility with MAC OS X * Fix behavior of timeout whe nsending messages to allow re-send. @@ -80,7 +250,7 @@ freediameter (1.1.5) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@freediameter.net> Sat, 03 Nov 2012 17:58:11 +0100 -freediameter (1.1.4) UNRELEASED; urgency=low +freediameter (1.1.4) RELEASED; urgency=low * Compatibility with GnuTLS 3.x versions / updated packaging files accordingly * Fix crash on Sparc 64 (possibly other 64b machines) @@ -89,14 +259,14 @@ freediameter (1.1.4) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@freediameter.net> Fri, 24 Aug 2012 00:17:05 +0200 -freediameter (1.1.3) UNRELEASED; urgency=low +freediameter (1.1.3) RELEASED; urgency=low * Fixed a memory leak * Clean-up of some extensions -- Sebastien Decugis <sdecugis@freediameter.net> Tue, 03 Jul 2012 08:15:49 +0200 -freediameter (1.1.2) UNRELEASED; urgency=low +freediameter (1.1.2) RELEASED; urgency=low * FIFO queues are now capped to avoid memory exhaustion. * Cleanups in MIPv6 dictionaries. @@ -108,7 +278,7 @@ freediameter (1.1.2) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@freediameter.net> Tue, 21 Feb 2012 18:38:10 +0100 -freediameter (1.1.1) UNRELEASED; urgency=low +freediameter (1.1.1) RELEASED; urgency=low * Bug fix release * Supports newer GNUTLS versions @@ -117,9 +287,9 @@ freediameter (1.1.1) UNRELEASED; urgency=low -- Sebastien Decugis <sdecugis@nict.go.jp> Fri, 30 Sep 2011 21:56:50 +0200 -freediameter (1.1.0) UNRELEASED; urgency=low +freediameter (1.1.0) RELEASED; urgency=low - * Source package restructured. Most of the + * Source package restructured. Most of the framework now contained in the libfdcore library. libfreeDiameter renamed as libfdproto. This closes #15. @@ -131,52 +301,52 @@ freediameter (1.1.0) UNRELEASED; urgency=low to RADIUS (closes #25) * Allow default signals such as SIGTSTP (ctrl-z) to be used with freeDiameterd - * Improved DiameterIdentity handling (esp. interationalization issues), - and improve efficiency of some string operations in peers, sessions, + * Improved DiameterIdentity handling (esp. interationalization issues), + and improve efficiency of some string operations in peers, sessions, and dictionary modules (closes #7) * Cleanup in the session module to free only unreferenced sessions (#16) * Removed fd_cpu_flush_cache(), replaced by more robust alternatives. - * Improved peer state machine algorithm to counter SCTP multistream race + * Improved peer state machine algorithm to counter SCTP multistream race condition. * New extension rt_redirect.fdx that handles the Diameter Redirect errors. - * New extension app_redirect that allows sending Redirect indications to + * New extension app_redirect that allows sending Redirect indications to other peers. See doc/app_redirect.conf.sample for more information. * Added incomplete dictionary extension for rfc4006 (DCCA), courtesy of Konstantin Chekushin <koch@lmt.lv> -- Sebastien Decugis <sdecugis@freediameter.net> Tue, 29 Mar 2011 10:41:19 +0900 -freediameter (1.0.4) UNRELEASED; urgency=low +freediameter (1.0.4) RELEASED; urgency=low - * Added new API to specify timeout on receiving answer (#10) + * Added new API to specify timeout on receiving answer (#10) * Bumped API version number accordingly. * New test_netemul extension (simple network emulator proxy) * Improved API compatibility to C++ compilers -- Sebastien Decugis <sdecugis@nict.go.jp> Tue, 11 Jan 2011 12:28:22 +0900 -freediameter (1.0.3) UNRELEASED; urgency=low +freediameter (1.0.3) RELEASED; urgency=low * Fixed a couple of issues for portability (#21, #22, #23) * Fixed issue with ListenOn bit ordering (#20) * Added dictionary support for MIPv6 application objects. * Added dictionary support for legacy XML files. - * Added python interface dbg_interactive (experimental). + * Added python interface dbg_interactive (experimental). * Added parameters to fd_disp_register() and fd_sess_handler_create(), Bumped API version number accordingly. -- Sebastien Decugis <sdecugis@nict.go.jp> Tue, 14 Dec 2010 11:39:29 +0900 -freediameter (1.0.2) UNRELEASED; urgency=low +freediameter (1.0.2) RELEASED; urgency=low * Fix an issue in app_diameap.fdx with user names (#18) - * Allow DH parameters loaded from a file (#17) + * Allow DH parameters loaded from a file (#17) * Fixed a few compilation warnings on 64bits architectures. * New ALL_EXTENSIONS build option. -- Sebastien Decugis <sdecugis@nict.go.jp> Wed, 27 Oct 2010 11:17:32 +0900 -freediameter (1.0.1) UNRELEASED; urgency=low +freediameter (1.0.1) RELEASED; urgency=low * app_acct.fdx: new set of PHP scripts available in source contrib/app_acct_tools @@ -198,12 +368,12 @@ freediameter (1.0.1) UNRELEASED; urgency=low freediameter (1.0.0-2) experimental; urgency=low - * Official release 1.0.0 + * Official release 1.0.0 -- Sebastien Decugis <sdecugis@nict.go.jp> Thu, 29 Jul 2010 17:27:13 +0900 freediameter (1.0.0-1) experimental; urgency=low * Initial Release. - + -- Sebastien Decugis <sdecugis@nict.go.jp> Wed, 19 May 2010 15:36:54 +0900 diff --git a/contrib/dict_json/dictionary_dcca_3gpp.json b/contrib/dict_json/dictionary_dcca_3gpp.json index d8de49f..d829c16 100644 --- a/contrib/dict_json/dictionary_dcca_3gpp.json +++ b/contrib/dict_json/dictionary_dcca_3gpp.json @@ -33,21 +33,21 @@ "Max": 1 }, { - "AVP": "Used-Service-Unit", + "AVP": "Used-Service-Unit" }, { "AVP": "Tariff-Change-Usage", "Max": 1 }, { - "AVP": "Service-Identifier", + "AVP": "Service-Identifier" }, { "AVP": "Rating-Group", "Max": 1 }, { - "AVP": "G-S-U-Pool-Reference", + "AVP": "G-S-U-Pool-Reference" }, { "AVP": "Validity-Time", @@ -2930,36 +2930,6 @@ "Vendor": 10415 }, { - "Code": 28, - "Flags": { - "Must": "V", - "MustNot": "M" - }, - "Name": "External-Identifier", - "Type": "OctetString", - "Vendor": 10415 - }, - { - "Code": 124, - "Flags": { - "Must": "M", - "MustNot": "VP" - }, - "Name": "MIP6-Feature-Vector", - "Type": "Unsigned64", - "Vendor": 10415 - }, - { - "Code": 493, - "Flags": { - "Must": "M", - "MustNot": "VP" - }, - "Name": "Service-Selection", - "Type": "UTF8String", - "Vendor": 10415 - }, - { "Code": 500, "Flags": { "Must": "VM", @@ -3020,16 +2990,6 @@ "Vendor": 10415 }, { - "Code": 506, - "Flags": { - "Must": "M", - "MustNot": "VP" - }, - "Name": "Mobile-Node-Identifier", - "Type": "UTF8String", - "Vendor": 10415 - }, - { "Code": 507, "Flags": { "Must": "VM", @@ -3560,16 +3520,6 @@ "Vendor": 10415 }, { - "Code": 578, - "Flags": { - "Must": "M", - "MustNot": "VP" - }, - "Name": "QoS-Capability", - "Type": "Grouped", - "Vendor": 10415 - }, - { "Code": 600, "Flags": { "Must": "VM", @@ -7956,7 +7906,7 @@ "MustNot": "" }, "Name": "SS-Status", - "Type": "Grouped", + "Type": "OctetString", "Vendor": 10415 }, { @@ -8065,7 +8015,7 @@ "Must": "VM", "MustNot": "" }, - "Name": "Call-Barring-Infor-List", + "Name": "Call-Barring-Info", "Type": "Grouped", "Vendor": 10415 }, @@ -8435,7 +8385,7 @@ "Must": "V", "MustNot": "M" }, - "Name": "MME-LocationInformation", + "Name": "MME-Location-Information", "Type": "Grouped", "Vendor": 10415 }, @@ -10850,6 +10800,16 @@ "Vendor": 10415 }, { + "Code": 3111, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "External-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { "Code": 3401, "Flags": { "Must": "VM", @@ -12588,7 +12548,7 @@ }, { "AVP": "Event-Trigger", - "Vendor": 10415, + "Vendor": 10415 }, { "AVP": "Event-Report-Indication", @@ -12686,7 +12646,7 @@ "Vendor": 10415 }, { - "AVP": "Subscription-Id", + "AVP": "Subscription-Id" }, { "AVP": "Abort-Cause", @@ -12753,7 +12713,7 @@ "Max": 1 }, { - "AVP": "Class", + "AVP": "Class" } ] }, @@ -12848,11 +12808,11 @@ "Max": 1 }, { - "AVP": "Class", - }, + "AVP": "Class" + } ] - }, + } ], "Vendors": [ { diff --git a/contrib/test_Gx/main_gx.c b/contrib/test_Gx/main_gx.c index 7811661..7faff5f 100644 --- a/contrib/test_Gx/main_gx.c +++ b/contrib/test_Gx/main_gx.c @@ -700,53 +700,6 @@ out: } -/* Search a given AVP model in an AVP (extracted from libfreediameter/message.c ) */ -int fd_avp_search_avp ( struct avp * groupedavp, struct dict_object * what, struct avp ** avp ) -{ - struct avp * nextavp; - struct avp_hdr * nextavphdr; - struct dict_avp_data dictdata; - - - TRACE_ENTRY("%p %p %p", groupedavp, what, avp); - - CHECK_FCT( fd_dict_getval(what, &dictdata) ); - - // Loop only in the group AVP - CHECK_FCT( fd_msg_browse(groupedavp, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL) ); - CHECK_FCT( fd_msg_avp_hdr( nextavp, &nextavphdr ) ); - - while (nextavphdr) { - - if ( (nextavphdr->avp_code == dictdata.avp_code) && (nextavphdr->avp_vendor == dictdata.avp_vendor) ) // always 0 if no Vendor flag - { - break; - } - - // Otherwise move to next AVP in the grouped AVP - CHECK_FCT( fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL) ); - - if(nextavp!=NULL) - { - CHECK_FCT( fd_msg_avp_hdr( nextavp, &nextavphdr ) ); - } - else - nextavphdr=NULL; - } - if (avp) - *avp = nextavp; - - if (avp && nextavp) { - struct dictionary * dict; - CHECK_FCT( fd_dict_getdict( what, &dict) ); - CHECK_FCT_DO( fd_msg_parse_dict( nextavp, dict, NULL ), ); - } - - if (avp || nextavp) - return 0; - else - return ENOENT; -} static int cca_cb( struct msg ** msg, struct avp * t_avp , @@ -784,7 +737,7 @@ static int cca_cb( struct msg ** msg, CHECK_FCT(fd_msg_search_avp ( *msg, chrg_rule_grp, &g_avp )); - CHECK_FCT(fd_avp_search_avp(g_avp, chrg_rule_name, &avp)); + CHECK_FCT(fd_msg_search_avp(g_avp, chrg_rule_name, &avp)); if(avp) { CHECK_FCT(fd_msg_avp_hdr(avp, &avpdata)); diff --git a/contrib/tools/README b/contrib/tools/README index bbb235d..11f5bad 100644 --- a/contrib/tools/README +++ b/contrib/tools/README @@ -1,2 +1,11 @@ +csv_to_fd converts CSV files containing RADIUS or Diameter AVP tables +into various formats, including freeDiameter C code and JSON documents. + +grep_fd_dict_dump processes stdin for the output of fd_dict_dump() +or dbg_dict_dump.fdx and reformats to remove pointer addresses, +to allow diff of output between freeDiameter invocations. + +org_to_csv converts org files into CSV files, suitable for csv_to_fd. + org_to_fd.pl converts org files like diameter-rfcs.org to C fragments that can be included in freeDiameter code. diff --git a/contrib/tools/csv_to_fd b/contrib/tools/csv_to_fd new file mode 100755 index 0000000..d39fc0a --- /dev/null +++ b/contrib/tools/csv_to_fd @@ -0,0 +1,662 @@ +#!/usr/bin/env python + +""" +Convert 8 column CSV files containing RADIUS or Diameter AVP tables +into various formats. + +Format of the CSV files is one of: +- Row per 3GPP AVP tables: + Name, Code, Section, DataType, Must, May, ShouldNot, MustNot + - Name: + AVP Name. String, validated as ALPHA *(ALPHA / DIGIT / "-") + per RFC 6733 section 3.2. + May start with a DIGIT (e.g., "3GPP-IMSI"). + - Code: + AVP Code. Integer, 0..4294967295. + - Section: + Section in relevant standard. String. + - DataType: + AVP Data Type. String, validated per basic and derived types in: + - RFC 6733 section 4.2 + - RFC 6733 section 4.3 + - RFC 7155 section 4.1 + - Must, May, ShouldNot, MustNot: + Flags, possibly comma or space separated: M, P, V + +- Comment row. First cell: + # Comment text 'Comment text' + #= '/*========*/' + # Blank line + +- Parameter row: + @Parameter,Value [, ...] + Supported Parameter terms: + standard Standard name. E.g. '3GPP TS 29.272', 'RFC 6733'. + vendor Vendor number. + +""" + +from __future__ import print_function +from __future__ import with_statement + +import abc +import csv +import collections +import json +import re +import optparse +import os +import sys + +CSV_COLUMN_NAMES = [ + 'name', + 'code', + 'section', + 'datatype', + 'must', + 'may', + 'shouldnot', + 'mustnot', +] + +DERIVED_TO_BASE = { + 'Address': 'OctetString', # RFC 6733 section 4.3.1 + 'Time': 'OctetString', # RFC 6733 section 4.3.1 + 'UTF8String': 'OctetString', # RFC 6733 section 4.3.1 + 'DiameterIdentity': 'OctetString', # RFC 6733 section 4.3.1 + 'DiameterURI': 'OctetString', # RFC 6733 section 4.3.1 + 'Enumerated': 'Integer32', # RFC 6733 section 4.3.1 + 'IPFilterRule': 'OctetString', # RFC 6733 section 4.3.1 + 'QoSFilterRule': 'OctetString', # RFC 7155 section 4.1.1 +} + +# See https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers +VENDOR_TO_NAME = { + 0: '', + 193: 'Ericsson', + 8164: 'Starent', + 10415: '3GPP', +} + + +class Avp(object): + """Store an AVP row.""" + + # Regex to validate avp-name per RFC 6733 section 3.2, + # with changes: + # - Allow avp-name to start with numbers (for 3GPP) + # - Allow '.' in avp-name, for existing dict_dcca_3gpp usage. +# TODO: if starts with digit, ensure contains a letter somewhere? + _name_re = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9-\.]*$') + + # Regex to validate flags: M, P, V, comma, space + _flags_re = re.compile(r'^[MPV, ]*$') + + __slots__ = CSV_COLUMN_NAMES + [ + 'filename', 'line_num', 'standard', 'vendor', ] + + def __init__(self, name, code, section, datatype, + must, may, shouldnot, mustnot, extra_cells=[], + filename='', line_num=0, standard='', vendor=0): + # Members from CSV row + self.name = name + self.code = int(code) + self.section = section + self.datatype = datatype + self.must = must + self.may = may + self.shouldnot = shouldnot + self.mustnot = mustnot + # Members from file state + self.filename = filename + self.line_num = line_num + self.standard = standard + self.vendor = vendor + # Validate CSV fields + if not self._name_re.match(self.name): + raise ValueError('Invalid AVP name "{}"'.format(self.name)) + if (self.code < 0 or self.code > 4294967295): + raise ValueError('AVP "{}" invalid code {}'.format( + self.name, self.code)) + if (self.datatype not in ( + 'OctetString', 'Integer32', 'Integer64', 'Unsigned32', + 'Unsigned64', 'Float32', 'Float64', 'Grouped') + and self.datatype not in DERIVED_TO_BASE): + raise ValueError('{} invalid data type "{}"'.format( + self.description(), self.datatype)) + # Validate flags + flags = collections.Counter() + for val, desc in [ + (self.must, 'Must'), + (self.may, 'May'), + (self.shouldnot, 'Should Not'), + (self.mustnot, 'Must Not'), + ]: + if not self._flags_re.match(val): + raise ValueError('{} invalid {} Flags "{}"'.format( + self.description(), desc, val)) + flags.update(val) + # Check occurrence of M,V in Must,May,ShouldNot,MustNot + for flag in 'MV': + # TODO: can AVP flags not appear at all? + # if flags[flag] == 0: + # raise ValueError('{} Flag "{}" not set'.format( + # self.description(), flag)) + if flags[flag] > 1: + raise ValueError('{} Flag "{}" set {} times'.format( + self.description(), flag, flags[flag])) + # Compare V presence against vendor + if 'V' in self.must: + if self.vendor == 0: + raise ValueError('{} Flag "V" set for vendor 0'.format( + self.description())) + else: + if self.vendor != 0: + raise ValueError('{} Flag "V" not set for vendor {}'.format( + self.description(), self.vendor)) + + @property + def __dict__(self): + return {s: getattr(self, s) for s in self.__slots__} + + def __eq__(self, other): + """Equality comparison of Avp instances. + Considered equal if name, vendor, code, datatype, and flags are equal. + """ + if other is self: + return True + if type(other) is not type(self): + return NotImplemented + return ( + other.name, other.vendor, other.code, other.datatype, + other.must, other.may, other.shouldnot, other.mustnot, + ) == ( + self.name, self.vendor, self.code, self.datatype, + self.must, self.may, self.shouldnot, self.mustnot, + ) + + def __ne__(self, other): + return not self == other + + def description(self): + return 'AVP "{}" ({})'.format(self.name, self.code) + + +class Processor(object): + """Interface for processor of Avp.""" + + __metaclass__ = abc.ABCMeta + + @classmethod + def cls_name(cls): + """Return the name, lower-case, without "processor" suffix.""" + suffix = 'processor' + name = cls.__name__.lower() + if name.endswith(suffix): + return name[:-len(suffix)] + return name + + @classmethod + def cls_desc(cls): + """Return the first line of the docstring.""" + if cls.__doc__ is None: + return "" + return cls.__doc__.split('\n')[0] + + @abc.abstractmethod + def filename(self, filename): + """Called when a file is opened.""" + pass + + @abc.abstractmethod + def avp(self, avp): + """Process a validated Avp.""" + pass + + @abc.abstractmethod + def comment(self, comment, filename, line_num): + """Process a comment row: + #comment, + """ + pass + + @abc.abstractmethod + def generate(self): + """Invoked after all rows processed.""" + pass + + @abc.abstractmethod + def parameter(self, name, value): + """Process a parameter row: + @name,value. + """ + pass + + +class DebugProcessor(Processor): + """Display the CSV parsing.""" + + def filename(self, filename): + print('File: {}'.format(filename)) + + def avp(self, avp): + avpdict = vars(avp) + print('AVP: {name}, {code}, {datatype}'.format(**avpdict)) + + def comment(self, comment, filename, line_num): + print('Comment: {}'.format(comment)) + + def generate(self): + print('Generate') + + def parameter(self, name, value): + print('Parameter: {} {}'.format(name, value)) + + +class NoopProcessor(Processor): + """Validate the CSV; no other output.""" + + def filename(self, filename): + pass + + def avp(self, avp): + pass + + def comment(self, comment, filename, line_num): + pass + + def generate(self): + pass + + def parameter(self, name, value): + pass + + +class FdcProcessor(Processor): + """Generate freeDiameter C code. + + Comment cells are parsed as: + # text comment /* text comment */ + #= /*==============*/ + # [blank line] + """ + + COMMENT_WIDTH = 64 + + class AvpFunction(object): + """Maintain per-function state to create DICT_AVP entries. + """ + + def __init__(self, name): + self.__name = name + self.__lines = [] + self.__derived = set() + + @property + def name(self): + """Return name.""" + return self.__name + + @property + def lines(self): + """Return all lines.""" + return self.__lines + + @lines.setter + def lines(self, value): + """Set to append a line.""" + self.__lines.append(value) + + @property + def derived(self): + """Return list of all derived values.""" + return list(self.__derived) + + @derived.setter + def derived(self, value): + """Set to store a derived type.""" + self.__derived.add(value) + + def __init__(self): + self._filenames = [] + self._functions = collections.OrderedDict() + + def filename(self, filename): + self._filenames.append(os.path.basename(filename)) + + def avp(self, avp): + comment = '{name}, {datatype}, code {code}'.format(**vars(avp)) + if avp.section != '': + comment += ', section {}'.format(avp.section) + self.add_comment(comment) + self.add('\t{') + self.add('\t\tstruct dict_avp_data data = {') +# TODO: remove comments? + self.add('\t\t\t{},\t/* Code */'.format(avp.code)) + self.add('\t\t\t{},\t/* Vendor */'.format(avp.vendor)) + self.add('\t\t\t\"{}\",\t/* Name */'.format(avp.name)) + self.add('\t\t\t{},\t/* Fixed flags */'.format( + self.build_flags(', '.join([avp.must, avp.mustnot])))) + self.add('\t\t\t{},\t/* Fixed flag values */'.format( + self.build_flags(avp.must))) +# TODO: add trailing comma? + self.add('\t\t\tAVP_TYPE_{}\t/* base type of data */'.format( + DERIVED_TO_BASE.get(avp.datatype, avp.datatype).upper())) + self.add('\t\t};') + avp_type = 'NULL' + if avp.datatype == 'Enumerated': + self.add('\t\tstruct dict_object\t*type;') + vendor_prefix = '' + if avp.vendor != 0: + vendor_prefix = '{}/'.format(VENDOR_TO_NAME[avp.vendor]) + self.add( + '\t\tstruct dict_type_data\t tdata = {{ AVP_TYPE_INTEGER32, ' + '"Enumerated({prefix}{name})", NULL, NULL, NULL }};'.format( + prefix=vendor_prefix, name=avp.name)) +# XXX: add enumerated values + self.add('\t\tCHECK_dict_new(DICT_TYPE, &tdata, NULL, &type);') + avp_type = "type" + elif avp.datatype in DERIVED_TO_BASE: + avp_type = '{}_type'.format(avp.datatype) + self.derived(avp.datatype) + self.add('\t\tCHECK_dict_new(DICT_AVP, &data, {}, NULL);'.format( + avp_type)) +# TODO: remove ; on scope brace + self.add('\t};') + self.add('') + + def comment(self, comment, filename, line_num): + if comment == '': + self.add('') + elif comment == '=': + self.add_header() + elif comment.startswith(' '): + self.add_comment(comment[1:]) + else: + raise ValueError('Unsupported comment "{}"'.format(comment)) + + def generate(self): + fp = sys.stdout + self.write_introduction(fp) + for func in self._functions: + self.write_function(fp, self._functions[func]) + + def parameter(self, name, value): + pass + + # internal methods + + def current_avpfunction(self): + """Return current AvpFunction to update. + + Note: allows for easier future enhancement to generate separate + C functions per AVP groups such as: by csv file, standard, or vendor. + """ + name = 'add_avps' + if name not in self._functions: + self._functions[name] = self.AvpFunction(name) + return self._functions[name] + + def add(self, line): + self.current_avpfunction().lines = line + + def derived(self, value): + self.current_avpfunction().derived = value + + def build_c_token(self, value): + """Convert a string into a valid C token.""" + return re.sub(r'[^\w]', '_', value) + + def build_flags(self, flags): + result = [] + if 'V' in flags: + result.append('AVP_FLAG_VENDOR') + if 'M' in flags: + result.append('AVP_FLAG_MANDATORY') + if not result: + return '0'; + return ' |'.join(result) + + def add_comment(self, comment): + self.add(self.format_comment(comment)) + + def add_header(self): + self.add(self.format_header()) + + def format_comment(self, comment): + return '\t/* {:<{width}} */'.format(comment, width=self.COMMENT_WIDTH) + + def format_header(self): + return '\t/*={:=<{width}}=*/'.format('', width=self.COMMENT_WIDTH) + + def write_introduction(self, fp): + """Write the introduction to the generated file.""" + fp.write('''\ +/* +Generated by: +\tcsv_to_fd -p {processor} {files} + +Do not modify; modify the source .csv files instead. +*/ + +#include <freeDiameter/extension.h> + +#define CHECK_dict_new( _type, _data, _parent, _ref ) \\ +\tCHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, \ +(_type), (_data), (_parent), (_ref)) ); + +#define CHECK_dict_search( _type, _criteria, _what, _result ) \\ +\tCHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, \ +(_type), (_criteria), (_what), (_result), ENOENT) ); +'''.format( + processor=self.cls_name(), + files=' '.join(self._filenames))) + + def write_function(self, fp, avpfunction): + """Generate a function from AvpFunction.""" + function = self.build_c_token(avpfunction.name) + # Function start + fp.write('''\ + +int {}() +{{ +'''.format(function)) + + # Create variables used by derived type validation + for derived in avpfunction.derived: + fp.write('''\ +\tstruct dict_object * {name}_type = NULL; +\tCHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "{name}", &{name}_type); + +'''.format(name=derived)) + + # Write generated DICT_AVP creation + fp.write('\n'.join(avpfunction.lines)) + + # Write function end + fp.write('''\ + +\treturn 0; +}} /* {}() */ +'''.format(function)) + + +class JsonProcessor(Processor): + """Generate freeDiameter JSON object. + """ + + def __init__(self): + self.avps = [] + + def filename(self, filename): + pass + + def avp(self, avp): + flags = collections.OrderedDict([ + ('Must', self.build_flags(avp.must)), + ('MustNot', self.build_flags(avp.mustnot)), + ]) + row = collections.OrderedDict([ + ('Code', avp.code), + ('Flags', flags), + ('Name', avp.name), + ('Type', avp.datatype), + ('Vendor', avp.vendor), + ]) + self.avps.append(row) + + def comment(self, comment, filename, line_num): + pass + + def generate(self): + doc = {"AVPs": self.avps} + print(json.dumps(doc, indent=2)) + + def parameter(self, name, value): + pass + + def build_flags(self, flags): + result = [] + if 'V' in flags: + result.append('V') + if 'M' in flags: + result.append('M') + return ''.join(result) + + +def avp_conflict(description, avp, conflict): + """Raise error for duplicate or conflicting AVPs. + """ + if avp == conflict: + raise ValueError( + '{} {} duplicated in' + ' file "{}" line {}'.format( + avp.description(), description, + conflict.filename, conflict.line_num)) + else: + raise ValueError( + '{} {} conflicts with {}' + ' in file "{}" line {}'.format( + avp.description(), description, + conflict.description(), + conflict.filename, conflict.line_num)) + + +def main(): + """Main application entry. + """ + + # Build dict of name: NameProcessor + processors = { + cls.cls_name(): cls + for cls in Processor.__subclasses__() + } + + # Build Processor name to desc + processor_help = '\n'.join( + [' {:8} {}'.format(key, processors[key].cls_desc()) + for key in sorted(processors)]) + + # Custom OptionParser with improved help + class MyParser(optparse.OptionParser): + """Custom OptionParser without epilog formatting.""" + def format_help(self, formatter=None): + return """\ +{} +Supported PROCESSOR options: +{} +""".format( + optparse.OptionParser.format_help(self, formatter), + processor_help) + + # Parse options + parser = MyParser( + usage='%prog [-h] [-p PROCESSOR] FILE ...', + description="""\ +Convert CSV files FILE ... containing RADIUS or Diameter AVP tables +into various formats using the specified processor PROCESSOR. +""") + parser.add_option( + '-p', '--processor', + default='noop', + help='AVP processor. One of: {}. [%default]'.format( + ', '.join(processors.keys()))) + (opts, args) = parser.parse_args() + if len(args) < 1: + parser.error('Incorrect number of arguments. Use -h for help.') + + # Find processor + try: + avpproc = processors[opts.processor]() + except KeyError as e: + parser.error('Unknown processor "{}".'.format(opts.processor)) + + # dict of [vendor][code] : Avp + avp_codes = collections.defaultdict(dict) + + # dict of [vendor][name] : Avp + avp_names = collections.defaultdict(dict) + + # Process files + for filename in args: + avpproc.filename(filename) + with open(filename, 'r') as csvfile: + csvdata = csv.DictReader(csvfile, CSV_COLUMN_NAMES, + restkey='extra_cells', restval='') + standard = '' + vendor = 0 + errors = [] + for row in csvdata: + try: + if csvdata.restkey in row: + raise ValueError('Extra cells: {}'.format( + ','.join(row[csvdata.restkey]))) + if row['name'] in (None, '', 'Attribute Name'): + continue + elif row['name'].startswith('#'): + comment = row['name'][1:] + avpproc.comment(comment, filename, csvdata.line_num) + elif row['name'].startswith('@'): + parameter = row['name'][1:] + value = row['code'] + if False: + pass + elif parameter == 'standard': + standard = value + elif parameter == 'vendor': + vendor = int(value) + else: + raise ValueError('Unknown parameter "{}"'.format( + parameter)) + avpproc.parameter(parameter, value) + else: + avp = Avp(filename=filename, line_num=csvdata.line_num, + standard=standard, vendor=vendor, + **row) + # Ensure AVP vendor/code not already defined + if avp.code in avp_codes[avp.vendor]: + conflict = avp_codes[avp.vendor][avp.code] + avp_conflict('Code', avp, conflict) + avp_codes[avp.vendor][avp.code] = avp + # Ensure AVP vendor/name not already defined + if avp.name in avp_names[avp.vendor]: + conflict = avp_names[avp.vendor][avp.name] + avp_conflict('Name', avp, conflict) + avp_names[avp.vendor][avp.name] = avp + # Process AVP + avpproc.avp(avp) + except (TypeError, ValueError) as e: + errors.append('CSV file "{}" line {}: {}\n'.format( + filename, csvdata.line_num, e)) + if errors: + sys.stderr.write(''.join(errors)) + sys.exit(1) + + # Generate result + avpproc.generate() + + +if __name__ == '__main__': + main() + +# vim: set et sw=4 sts=4 : diff --git a/contrib/tools/diameter-rfcs.csv b/contrib/tools/diameter-rfcs.csv new file mode 100644 index 0000000..ed25e4b --- /dev/null +++ b/contrib/tools/diameter-rfcs.csv @@ -0,0 +1,202 @@ +Attribute Name,Code,Section defined,Value Type,MUST,MAY,SHOULD NOT,MUST NOT
+@vendor,0,,,,,,
+@standard,RFC 3588,,,,,,
+#=,,,,,,,
+# RFC 3588 - Diameter #,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Acct-Interim-Interval,85,9.8.2,Unsigned32,M,P,,V
+Accounting-Realtime-Required,483,9.8.7,Enumerated,M,P,,V
+Acct-Multi-Session-Id,50,9.8.5,UTF8String,M,P,,V
+Accounting-Record-Number,485,9.8.3,Unsigned32,M,P,,V
+Accounting-Record-Type,480,9.8.1,Enumerated,M,P,,V
+Accounting-Session-Id,44,9.8.4,OctetString,M,P,,V
+Accounting-Sub-Session-Id,287,9.8.6,Unsigned64,M,P,,V
+Acct-Application-Id,259,6.9,Unsigned32,M,P,,V
+Auth-Application-Id,258,6.8,Unsigned32,M,P,,V
+Auth-Request-Type,274,8.7,Enumerated,M,P,,V
+Authorization-Lifetime,291,8.9,Unsigned32,M,P,,V
+Auth-Grace-Period,276,8.10,Unsigned32,M,P,,V
+Auth-Session-State,277,8.11,Enumerated,M,P,,V
+Re-Auth-Request-Type,285,8.12,Enumerated,M,P,,V
+Class,25,8.20,OctetString,M,P,,V
+Destination-Host,293,6.5,DiameterIdentity,M,P,,V
+Destination-Realm,283,6.6,DiameterIdentity,M,P,,V
+Disconnect-Cause,273,5.4.3,Enumerated,M,P,,V
+E2E-Sequence-AVP,300,6.15,Grouped,M,P,,V
+Error-Message,281,7.3,UTF8String,,P,,"V,M"
+Error-Reporting-Host,294,7.4,DiameterIdentity,,P,,"V,M"
+Event-Timestamp,55,8.21,Time,M,P,,V
+Experimental-Result,297,7.6,Grouped,M,P,,V
+Experimental-Result-Code,298,7.7,Unsigned32,M,P,,V
+Failed-AVP,279,7.5,Grouped,M,P,,V
+Firmware-Revision,267,5.3.4,Unsigned32,,,,"P,V,M"
+Host-IP-Address,257,5.3.5,Address,M,P,,V
+Inband-Security-Id,299,6.10,Unsigned32,M,P,,V
+Multi-Round-Time-Out,272,8.19,Unsigned32,M,P,,V
+Origin-Host,264,6.3,DiameterIdentity,M,P,,V
+Origin-Realm,296,6.4,DiameterIdentity,M,P,,V
+Origin-State-Id,278,8.16,Unsigned32,M,P,,V
+Product-Name,269,5.3.7,UTF8String,,,,"P,V,M"
+Proxy-Host,280,6.7.3,DiameterIdentity,M,,,"P,V"
+Proxy-Info,284,6.7.2,Grouped,M,,,"P,V"
+Proxy-State,33,6.7.4,OctetString,M,,,"P,V"
+Redirect-Host,292,6.12,DiameterURI,M,P,,V
+Redirect-Host-Usage,261,6.13,Enumerated,M,P,,V
+Redirect-Max-Cache-Time,262,6.14,Unsigned32,M,P,,V
+Result-Code,268,7.1,Unsigned32,M,P,,V
+Route-Record,282,6.7.1,DiameterIdentity,M,,,"P,V"
+Session-Id,263,8.8,UTF8String,M,P,,V
+Session-Timeout,27,8.13,Unsigned32,M,P,,V
+Session-Binding,270,8.17,Unsigned32,M,P,,V
+Session-Server-Failover,271,8.18,Enumerated,M,P,,V
+Supported-Vendor-Id,265,5.3.6,Unsigned32,M,P,,V
+Termination-Cause,295,8.15,Enumerated,M,P,,V
+User-Name,1,8.14,UTF8String,M,P,,V
+Vendor-Id,266,5.3.3,Unsigned32,M,P,,V
+Vendor-Specific-Application-Id,260,6.11,Grouped,M,P,,V
+@standard,RFC 4005,,,,,,
+#=,,,,,,,
+# RFC 4005 - NAS #,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+NAS-Port,5,4.2,Unsigned32,M,P,,V
+NAS-Port-Id,87,4.3,UTF8String,M,P,,V
+NAS-Port-Type,61,4.4,Enumerated,M,P,,V
+Called-Station-Id,30,4.5,UTF8String,M,P,,V
+Calling-Station-Id,31,4.6,UTF8String,M,P,,V
+Connect-Info,77,4.7,UTF8String,M,P,,V
+Originating-Line-Info,94,4.8,OctetString,,"M,P",,V
+Reply-Message,18,4.9,UTF8String,M,P,,V
+User-Password,2,5.1,OctetString,M,P,,V
+Password-Retry,75,5.2,Unsigned32,M,P,,V
+Prompt,76,5.3,Enumerated,M,P,,V
+CHAP-Auth,402,5.4,Grouped,M,P,,V
+CHAP-Algorithm,403,5.5,Enumerated,M,P,,V
+CHAP-Ident,404,5.6,OctetString,M,P,,V
+CHAP-Response,405,5.7,OctetString,M,P,,V
+CHAP-Challenge,60,5.8,OctetString,M,P,,V
+ARAP-Password,70,5.9,OctetString,M,P,,V
+ARAP-Challenge-Response,84,5.10,OctetString,M,P,,V
+ARAP-Security,73,5.11,Unsigned32,M,P,,V
+ARAP-Security-Data,74,5.12,OctetString,M,P,,V
+Service-Type,6,6.1,Enumerated,M,P,,V
+Callback-Number,19,6.2,UTF8String,M,P,,V
+Callback-Id,20,6.3,UTF8String,M,P,,V
+Idle-Timeout,28,6.4,Unsigned32,M,P,,V
+Port-Limit,62,6.5,Unsigned32,M,P,,V
+NAS-Filter-Rule,400,6.6,IPFilterRule,M,P,,V
+Filter-Id,11,6.7,UTF8String,M,P,,V
+Configuration-Token,78,6.8,OctetString,M,,,"P,V"
+QoS-Filter-Rule,407,6.9,QoSFilterRule,,,,
+Framed-Protocol,7,6.10.1,Enumerated,M,P,,V
+Framed-Routing,10,6.10.2,Enumerated,M,P,,V
+Framed-MTU,12,6.10.3,Unsigned32,M,P,,V
+Framed-Compression,13,6.10.4,Enumerated,M,P,,V
+Framed-IP-Address,8,6.11.1,OctetString,M,P,,V
+Framed-IP-Netmask,9,6.11.2,OctetString,M,P,,V
+Framed-Route,22,6.11.3,UTF8String,M,P,,V
+Framed-Pool,88,6.11.4,OctetString,M,P,,V
+Framed-Interface-Id,96,6.11.5,Unsigned64,M,P,,V
+Framed-IPv6-Prefix,97,6.11.6,OctetString,M,P,,V
+Framed-IPv6-Route,99,6.11.7,UTF8String,M,P,,V
+Framed-IPv6-Pool,100,6.11.8,OctetString,M,P,,V
+Framed-IPX-Network,23,6.12.1,UTF8String,M,P,,V
+Framed-Appletalk-Link,37,6.13.1,Unsigned32,M,P,,V
+Framed-Appletalk-Network,38,6.13.2,Unsigned32,M,P,,V
+Framed-Appletalk-Zone,39,6.13.3,OctetString,M,P,,V
+ARAP-Features,71,6.14.1,OctetString,M,P,,V
+ARAP-Zone-Access,72,6.14.2,Enumerated,M,P,,V
+Login-IP-Host,14,6.15.1,OctetString,M,P,,V
+Login-IPv6-Host,98,6.15.2,OctetString,M,P,,V
+Login-Service,15,6.15.3,Enumerated,M,P,,V
+Login-TCP-Port,16,6.16.1,Unsigned32,M,P,,V
+Login-LAT-Service,34,6.17.1,OctetString,M,P,,V
+Login-LAT-Node,35,6.17.2,OctetString,M,P,,V
+Login-LAT-Group,36,6.17.3,OctetString,M,P,,V
+Login-LAT-Port,63,6.17.4,OctetString,M,P,,V
+Tunneling,401,7.1,Grouped,M,P,,V
+Tunnel-Type,64,7.2,Enumerated,M,P,,V
+Tunnel-Medium-Type,65,7.3,Enumerated,M,P,,V
+Tunnel-Client-Endpoint,66,7.4,UTF8String,M,P,,V
+Tunnel-Server-Endpoint,67,7.5,UTF8String,M,P,,V
+Tunnel-Password,69,7.6,OctetString,M,P,,V
+Tunnel-Private-Group-Id,81,7.7,OctetString,M,P,,V
+Tunnel-Assignment-Id,82,7.8,OctetString,M,P,,V
+Tunnel-Preference,83,7.9,Unsigned32,M,P,,V
+Tunnel-Client-Auth-Id,90,7.10,UTF8String,M,P,,V
+Tunnel-Server-Auth-Id,91,7.11,UTF8String,M,P,,V
+Accounting-Input-Octets,363,8.1,Unsigned64,M,P,,V
+Accounting-Output-Octets,364,8.2,Unsigned64,M,P,,V
+Accounting-Input-Packets,365,8.3,Unsigned64,M,P,,V
+Accounting-Output-Packets,366,8.4,Unsigned64,M,P,,V
+Acct-Session-Time,46,8.5,Unsigned32,M,P,,V
+Acct-Authentic,45,8.6,Enumerated,M,P,,V
+Acounting-Auth-Method,406,8.7,Enumerated,M,P,,V
+Acct-Delay-Time,41,8.8,Unsigned32,M,P,,V
+Acct-Link-Count,51,8.9,Unsigned32,M,P,,V
+Acct-Tunnel-Connection,68,8.10,OctetString,M,P,,V
+Acct-Tunnel-Packets-Lost,86,8.11,Unsigned32,M,P,,V
+NAS-Identifier,32,9.3.1,UTF8String,M,P,,V
+NAS-IP-Address,4,9.3.2,OctetString,M,P,,V
+NAS-IPv6-Address,95,9.3.3,OctetString,M,P,,V
+State,24,9.3.4,OctetString,M,P,,V
+# Termination-Cause already in RFC 3588,295,9.3.5,Enumerated,M,P,,V
+#,,,,,,,
+Origin-AAA-Protocol,408,9.3.6,Enumerated,M,P,,V
+@standard,RFC 4006,,,,,,
+#=,,,,,,,
+# RFC 4006 - DCCA #,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+CC-Correlation-Id,411,8.1,OctetString,,"P,M",,V
+CC-Input-Octets,412,8.24,Unsigned64,M,P,,V
+CC-Money,413,8.22,Grouped,M,P,,V
+CC-Output-Octets,414,8.25,Unsigned64,M,P,,V
+CC-Request-Number,415,8.2,Unsigned32,M,P,,V
+CC-Request-Type,416,8.3,Enumerated,M,P,,V
+CC-Service-Specific-Units,417,8.26,Unsigned64,M,P,,V
+CC-Session-Failover,418,8.4,Enumerated,M,P,,V
+CC-Sub-Session-Id,419,8.5,Unsigned64,M,P,,V
+CC-Time,420,8.21,Unsigned32,M,P,,V
+CC-Total-Octets,421,8.23,Unsigned64,M,P,,V
+CC-Unit-Type,454,8.32,Enumerated,M,P,,V
+Check-Balance-Result,422,8.6,Enumerated,M,P,,V
+Cost-Information,423,8.7,Grouped,M,P,,V
+Cost-Unit,424,8.12,UTF8String,M,P,,V
+Credit-Control,426,8.13,Enumerated,M,P,,V
+Credit-Control-Failure-Handling,427,8.14,Enumerated,M,P,,V
+Currency-Code,425,8.11,Unsigned32,M,P,,V
+Direct-Debiting-Failure-Handling,428,8.15,Enumerated,M,P,,V
+Exponent,429,8.9,Integer32,M,P,,V
+Final-Unit-Action,449,8.35,Enumerated,M,P,,V
+Final-Unit-Indication,430,8.34,Grouped,M,P,,V
+Granted-Service-Unit,431,8.17,Grouped,M,P,,V
+G-S-U-Pool-Identifier,453,8.31,Unsigned32,M,P,,V
+G-S-U-Pool-Reference,457,8.30,Grouped,M,P,,V
+Multiple-Services-Credit-Control,456,8.16,Grouped,M,P,,V
+Multiple-Services-Indicator,455,8.40,Enumerated,M,P,,V
+Rating-Group,432,8.29,Unsigned32,M,P,,V
+Redirect-Address-Type,433,8.38,Enumerated,M,P,,V
+Redirect-Server,434,8.37,Grouped,M,P,,V
+Redirect-Server-Address,435,8.39,UTF8String,M,P,,V
+Requested-Action,436,8.41,Enumerated,M,P,,V
+Requested-Service-Unit,437,8.18,Grouped,M,P,,V
+Restriction-Filter-Rule,438,8.36,IPFilterRule,M,P,,V
+Service-Context-Id,461,8.42,UTF8String,M,P,,V
+Service-Identifier,439,8.28,Unsigned32,M,P,,V
+Service-Parameter-Info,440,8.43,Grouped,,"P,M",,V
+Service-Parameter-Type,441,8.44,Unsigned32,,"P,M",,V
+Service-Parameter-Value,442,8.45,OctetString,,"P,M",,V
+Subscription-Id,443,8.46,Grouped,M,P,,V
+Subscription-Id-Data,444,8.48,UTF8String,M,P,,V
+Subscription-Id-Type,450,8.47,Enumerated,M,P,,V
+Tariff-Change-Usage,452,8.27,Enumerated,M,P,,V
+Tariff-Time-Change,451,8.20,Time,M,P,,V
+Unit-Value,445,8.8,Grouped,M,P,,V
+Used-Service-Unit,446,8.19,Grouped,M,P,,V
+User-Equipment-Info,458,8.49,Grouped,,"P,M",,V
+User-Equipment-Info-Type,459,8.50,Enumerated,,"P,M",,V
+User-Equipment-Info-Value,460,8.51,OctetString,,"P,M",,V
+Value-Digits,447,8.10,Integer64,M,P,,V
+Validity-Time,448,8.33,Unsigned32,M,P,,V
diff --git a/contrib/tools/grep_fd_dict_dump b/contrib/tools/grep_fd_dict_dump new file mode 100755 index 0000000..375fb5e --- /dev/null +++ b/contrib/tools/grep_fd_dict_dump @@ -0,0 +1,11 @@ +#!/bin/sh + +# Grep stdin for the output of fd_dict_dump() and reformat to remove +# pointer addresses. Use to post-process the output of dict_dump.fdx +# into a format that's diff-able between freeDiameter invocations. + +egrep '^ *{dict|VENDOR|APPLICATION|TYPE|ENUMVAL|AVP|COMMAND|RULE' \ + | sed \ + -e 's/{dict.*}(@0x[^ ]*): //' \ + -e 's/{dict(0x[^ ]*) : \(.*\)}/\1/' \ + -e 's/p:[^ ]* //' diff --git a/contrib/tools/org_to_csv b/contrib/tools/org_to_csv new file mode 100755 index 0000000..e87f6ad --- /dev/null +++ b/contrib/tools/org_to_csv @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +""" +Convert |-separated 11-column .org files to CSV, +with first and last empty columns ignored. +""" + +import csv +import fileinput +import re +import sys + +csvout = csv.writer(sys.stdout) +for line in fileinput.input(): + row = re.split(r'\s*\|\s*', line) + row.extend([''] * (10 - len(row))) + csvout.writerow(row[1:10]) + +# vim: set et sw=4 sts=4 : diff --git a/contrib/tools/org_to_fd.pl b/contrib/tools/org_to_fd.pl index 96c06b7..a0825d6 100755 --- a/contrib/tools/org_to_fd.pl +++ b/contrib/tools/org_to_fd.pl @@ -1,12 +1,15 @@ #!/usr/bin/env perl use strict; +use File::Basename; use Getopt::Std; +my ($progname) = basename($0); + our ($opt_V, $opt_v); -# default to 3GPP -my ($vendor) = 10415; -my ($vendor_name) = "3GPP"; +# default to Base +my ($vendor) = 0; +my ($vendor_name) = ""; sub convert_must_to_flags($) { my ($allmust) = @_; @@ -21,7 +24,7 @@ sub base_type($) { my ($type) = @_; return "AVP_TYPE_GROUPED" if ($type =~ m/Grouped/); - return "AVP_TYPE_OCTETSTRING" if ($type =~ m/(Address|DiameterIdentity|DiameterURI|OctetString|IPFilterRule|Time|UTF8String)/); + return "AVP_TYPE_OCTETSTRING" if ($type =~ m/(Address|DiameterIdentity|DiameterURI|OctetString|IPFilterRule|Time|UTF8String|QoSFilterRule)/); return "AVP_TYPE_INTEGER32" if ($type =~ m/Enumerated|Integer32/); return "AVP_TYPE_INTEGER64" if ($type =~ m/Integer64/); return "AVP_TYPE_UNSIGNED32" if ($type =~ m/Unsigned32/); @@ -29,7 +32,19 @@ sub base_type($) { return "AVP_TYPE_FLOAT32" if ($type =~ m/Float32/); return "AVP_TYPE_FLOAT64" if ($type =~ m/Float64/); - return "UNKNOWN TYPE: $type"; + die("unknown type '$type'"); +} + + +my ($comment_width) = 64; + +sub print_header() { + printf "\t/*=%s=*/\n", '=' x $comment_width; +} + +sub print_comment($) { + my ($str) = @_; + printf "\t/* %-*s */\n", $comment_width, $str; } sub print_insert($$) { @@ -39,8 +54,8 @@ sub print_insert($$) { if ($type =~ m/(Grouped|OctetString|Integer32|Integer64|Unsigned32|Unsigned64|Float32|Float64)/) { $avp_type = "NULL"; } elsif ($type =~ m/Enumerated/) { - print "\t\tstruct dict_object *type;\n"; - print "\t\tstruct dict_type_data tdata = { AVP_TYPE_INTEGER32, \"Enumerated(" . ($vendor_name ? "$vendor_name/" : "") ."$name)\", NULL, NULL, NULL };\n"; + print "\t\tstruct dict_object\t*type;\n"; + print "\t\tstruct dict_type_data\t tdata = { AVP_TYPE_INTEGER32, \"Enumerated(" . ($vendor_name ? "$vendor_name/" : "") ."$name)\", NULL, NULL, NULL };\n"; # XXX: add enumerated values print "\t\tCHECK_dict_new(DICT_TYPE, &tdata, NULL, &type);\n"; $avp_type = "type"; @@ -52,8 +67,8 @@ sub print_insert($$) { } sub usage($) { - die("usage: org_to_fd.pl [-V vendor_name -v vendor_code] [file ...]\n"); - exit(@_); + print STDERR "usage: $progname [-V vendor_name] [-v vendor_code] [file ...]\n"; + exit(1); } getopts("V:v:") || usage(1); @@ -61,29 +76,45 @@ getopts("V:v:") || usage(1); if (defined($opt_v)) { $vendor = $opt_v; if (!defined($opt_V)) { - usage(1); + usage(1); } $vendor_name = $opt_V; } -print "\t/* The following is created automatically. Do not modify. */\n"; -print "\t/* Changes will be lost during the next update. Modify the source org file instead. */\n\n"; +print_header(); +print_comment("Start of generated data."); +print_comment(""); +print_comment("The following is created automatically with:"); +print_comment(" org_to_fd.pl -V '$vendor_name' -v $vendor"); +print_comment("Changes will be lost during the next update."); +print_comment("Do not modify; modify the source .org file instead."); +print_header(); +print "\n"; while (<>) { - my ($dummy, $name, $code, $section, $type, $must, $may, $shouldnot, $mustnot, $encr) = split /\|/; + my ($dummy, $name, $code, $section, $type, $must, $may, $shouldnot, $mustnot, $encr) = split /\s*\|\s*/; next if ($name =~ m/Attribute Name/); - if ($name =~ m/ # (.*)/) { - print "\t/* $1 */\n"; + if ($name =~ m/# (.*)/) { + print_comment($1); + next; + } + if ($name =~ m/#/) { + print("\n"); next; } - - $name =~ s/ *//g; - $code =~ s/ *//g; - $type =~ s/ *//g; + if ($name =~ m/\s/) { + die("name '$name' contains space"); + } - print "\t/* $name */\n\t{\n\t\tstruct dict_avp_data data = {\n"; + my ($desc) = $name; + $desc .= ", " . $type; + $desc .= ", code " . $code; + $desc .= ", section " . $section if $section ne ""; + print_comment($desc); + print "\t{\n"; + print "\t\tstruct dict_avp_data data = {\n"; print "\t\t\t$code,\t/* Code */\n"; print "\t\t\t$vendor,\t/* Vendor */\n"; print "\t\t\t\"$name\",\t/* Name */\n"; @@ -94,3 +125,7 @@ while (<>) { print_insert($type, $name); print "\t};\n\n"; } + +print_header(); +print_comment("End of generated data."); +print_header(); diff --git a/doc/freediameter.conf.sample b/doc/freediameter.conf.sample index dc7d0d7..e6a6146 100644 --- a/doc/freediameter.conf.sample +++ b/doc/freediameter.conf.sample @@ -5,12 +5,12 @@ # It is possible to use "include" keyword to import additional files # e.g.: include "/etc/freeDiameter.d/*.conf" -# This is exactly equivalent as copy & paste the content of the included file(s) +# This is exactly equivalent as copy & paste the content of the included file(s) # where the "include" keyword is found. ############################################################## -## Peer identity and realm +## Peer identity and realm # The Diameter Identity of this daemon. # This must be a valid FQDN that resolves to the local host. @@ -34,10 +34,10 @@ # Default: 5868. Use 0 to disable. #SecPort = 5868; -# Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed -# on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the +# Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed +# on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the # CER/CEA exchange on a dedicated secure port. -# This parameter only affects outgoing connections. +# This parameter only affects outgoing connections. # The setting can be also defined per-peer (see Peers configuration section). # Default: use RFC6733 method with separate port for TLS. #TLS_old_method; @@ -88,6 +88,19 @@ # Default: 5 unidentified clients in paralel. #ThreadsPerServer = 5; +# If this host is used as relay or proxy, it can be useful to limit +# connections from "outside" until enough processing nodes are available. +# This parameter defines a regex pattern for recognizing such nodes; +# Default: NO DEFAULT +#ProcessingPeersPattern = "worker[0-9]*.example.com"; + +# This next parameter defines how many of these processing peers +# must be connected before CERs from other hosts are accepted. +# If this is set, ProcessingPeersPattern must also be defined. +# If unset or less than 1, ProcessingPeersPattern and this variable do nothing. +# Default: 0 +#ProcessingPeersMinimum = 0; + ############################################################## ## TLS Configuration @@ -113,14 +126,14 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # Certificate Revocation List file # The information about revoked certificates. -# The file contains a list of trusted CRLs in PEM format. They should have been verified before. +# The file contains a list of trusted CRLs in PEM format. They should have been verified before. # (This parameter is passed to gnutls_certificate_set_x509_crl_file function) # Note: openssl CRL format might have interoperability issue with GNUTLS format. # Default : GNUTLS default behavior #TLS_CRL = "<file.PEM>"; # GNU TLS Priority string -# This string allows to configure the behavior of GNUTLS key exchanges +# This string allows to configure the behavior of GNUTLS key exchanges # algorithms. See gnutls_priority_init function documentation for information. # You should also refer to the Diameter required TLS support here: # http://tools.ietf.org/html/rfc6733#section-13.1 @@ -131,13 +144,13 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # Diffie-Hellman parameters size # Set the number of bits for generated DH parameters # Valid value should be 768, 1024, 2048, 3072 or 4096. -# (This parameter is passed to gnutls_dh_params_generate2 function, +# (This parameter is passed to gnutls_dh_params_generate2 function, # it usually should match RSA key size) # Default : 1024 #TLS_DH_Bits = 1024; # Alternatively, you can specify a file to load the PKCS#3 encoded -# DH parameters directly from. This accelerates the daemon start +# DH parameters directly from. This accelerates the daemon start # but is slightly less secure. If this file is provided, the # TLS_DH_Bits parameters has no effect. # Default : no default. @@ -165,8 +178,8 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # Disable the relaying of Diameter messages? # For messages not handled locally, the default behavior is to forward the -# message to another peer if any is available, according to the routing -# algorithms. In addition the "0xffffff" application is advertised in CER/CEA +# message to another peer if any is available, according to the routing +# algorithms. In addition the "0xffffff" application is advertised in CER/CEA # exchanges. # Default: Relaying is enabled. #NoRelay; @@ -175,6 +188,29 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # Default: 4 #AppServThreads = 4; +# Number of server threads that can handle incoming message routing at the same time. +# Default: 1 +#RoutingInThreads = 1; + +# Number of server threads that can handle outgoing message routing at the same time. +# Default: 1 +#RoutingOutThreads= 1; + +# Maximum size of the incoming queue (messages queued after accepting +# them from the network) before blocking +# Default: 20 +#IncomingQueueLimit = 20; + +# Maximum size of the outgoing queue (messages queued for sending to +# the network) before blocking +# Default: 30 +#OutgoingQueueLimit = 30; + +# Maximum size of the local queue (messages queued for local handling) +# before blocking +# Default: 25 +#LocalQueueLimit = 25; + # Other applications are configured by loaded extensions. ############################################################## @@ -184,7 +220,7 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # Diameter Base Protocol. The specific application behaviors, # as well as advanced functions, are provided # by loadable extensions (plug-ins). -# These extensions may in addition receive the name of a +# These extensions may in addition receive the name of a # configuration file, the format of which is extension-specific. # # Format: @@ -223,9 +259,9 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # The local server listens for incoming connections. By default, # all unknown connecting peers are rejected. Extensions can override this behavior (e.g., acl_wl). -# +# # In addition to incoming connections, the local peer can -# be configured to establish and maintain connections to some +# be configured to establish and maintain connections to some # Diameter nodes and allow connections from these nodes. # This is achieved with the ConnectPeer directive described below. # @@ -256,3 +292,4 @@ TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key # Possible values: Always, Never # Default: Always #RouteRecordInAnswers = Never; + diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 46f5c30..4331bf4 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -10,6 +10,8 @@ MACRO(FD_ADD_EXTENSION EXTNAME) ADD_LIBRARY(${EXTNAME} MODULE ${ARGN}) SET_TARGET_PROPERTIES(${EXTNAME} PROPERTIES PREFIX "" ) SET_TARGET_PROPERTIES(${EXTNAME} PROPERTIES SUFFIX ".fdx" ) + SET_TARGET_PROPERTIES(${EXTNAME} PROPERTIES C_VISIBILITY_PRESET hidden ) + SET_TARGET_PROPERTIES(${EXTNAME} PROPERTIES CXX_VISIBILITY_PRESET hidden ) ENDMACRO(FD_ADD_EXTENSION) # Use the macro FD_EXTENSION_SUBDIR(extmacroname subdir descr default) to @@ -88,6 +90,8 @@ FD_EXTENSION_SUBDIR(acl_wl "White-list based authorization of incoming connectio #### # Debug & test extensions +FD_EXTENSION_SUBDIR(dbg_dict_dump "Log dictionary dump" ON) +FD_EXTENSION_SUBDIR(dbg_dict_dump_json "Dump dictionary as JSON" OFF) FD_EXTENSION_SUBDIR(dbg_loglevel "Read loglevel from file -- allows runtime change" ON) FD_EXTENSION_SUBDIR(dbg_monitor "Outputs periodical status information" ON) FD_EXTENSION_SUBDIR(dbg_msg_timings "Show some timing information for messages" ON) @@ -95,7 +99,8 @@ FD_EXTENSION_SUBDIR(dbg_msg_dumps "Show human-readable content of the received FD_EXTENSION_SUBDIR(dbg_rt "Routing extension for debugging the routing module" ON) FD_EXTENSION_SUBDIR(test_app "Testing application to send dummy message to another peer, like a Diameter 'ping'" OFF) FD_EXTENSION_SUBDIR(test_as "Receive Abort-Session-Requests and display the data" OFF) -FD_EXTENSION_SUBDIR(test_cc "Receive Credit-Control-Requests and display the data" OFF) +FD_EXTENSION_SUBDIR(test_cc "Receive Credit-Control-Requests and display the data" ON) +FD_EXTENSION_SUBDIR(test_ccload "Generate Credit-Control-Requests and count replies" ON) FD_EXTENSION_SUBDIR(test_sip "Testing application to simulate Diameter-SIP client (RFC4740)" OFF) FD_EXTENSION_SUBDIR(dbg_interactive "Python-interpreter based module" OFF) FD_EXTENSION_SUBDIR(test_netemul "Simple Diameter network emulator proxy extension (latency, PDV, duplicates)" OFF) diff --git a/extensions/acl_wl/acl_wl.c b/extensions/acl_wl/acl_wl.c index 97d970b..39c7339 100644 --- a/extensions/acl_wl/acl_wl.c +++ b/extensions/acl_wl/acl_wl.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2011, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/acl_wl/acl_wl.h b/extensions/acl_wl/acl_wl.h index 6ac2cce..56ae203 100644 --- a/extensions/acl_wl/acl_wl.h +++ b/extensions/acl_wl/acl_wl.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2011, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/acl_wl/aw_conf.l b/extensions/acl_wl/aw_conf.l index cfcd324..b74cc20 100644 --- a/extensions/acl_wl/aw_conf.l +++ b/extensions/acl_wl/aw_conf.l @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/acl_wl/aw_conf.y b/extensions/acl_wl/aw_conf.y index 5594aa4..3825aa2 100644 --- a/extensions/acl_wl/aw_conf.y +++ b/extensions/acl_wl/aw_conf.y @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/acl_wl/aw_tree.c b/extensions/acl_wl/aw_tree.c index 3ae170a..82e79f4 100644 --- a/extensions/acl_wl/aw_tree.c +++ b/extensions/acl_wl/aw_tree.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -339,7 +339,7 @@ int aw_tree_lookup(char * name, int * result) { struct split_name sn; int lbl, found; - struct tree_item * ti; + struct tree_item * ti = NULL; struct fd_list * senti, *li; TRACE_ENTRY("%p %p", name, result); diff --git a/extensions/app_diameap/CMakeLists.txt b/extensions/app_diameap/CMakeLists.txt index f463022..8844286 100644 --- a/extensions/app_diameap/CMakeLists.txt +++ b/extensions/app_diameap/CMakeLists.txt @@ -1,11 +1,26 @@ # The Diameter EAP Application extension PROJECT("Diameter EAP Application extension" C) +INCLUDE (CheckCSourceCompiles) + # Find MySQL FIND_PACKAGE(MySQL REQUIRED) FIND_PACKAGE(Gcrypt REQUIRED) INCLUDE_DIRECTORIES(${MySQL_INCLUDE_DIR}) +# Check for my_bool, deprecated in MySQL 8.0 +SET(CHECK_MYSQL_MY_BOOL " +#include <mysql.h> +int main() { +my_bool f; +}") +SET(CMAKE_REQUIRED_INCLUDES ${MySQL_INCLUDE_DIR}) +SET(CMAKE_REQUIRED_LIBRARIES ${MySQL_LIBRARY}) +CHECK_C_SOURCE_COMPILES("${CHECK_MYSQL_MY_BOOL}" HAVE_MYSQL_MY_BOOL) +IF (HAVE_MYSQL_MY_BOOL) + ADD_DEFINITIONS(-DHAVE_MYSQL_MY_BOOL) +ENDIF() + # Parse plugins ADD_SUBDIRECTORY(plugins) diff --git a/extensions/app_diameap/diameap_eap.c b/extensions/app_diameap/diameap_eap.c index 72885ea..d7b235c 100644 --- a/extensions/app_diameap/diameap_eap.c +++ b/extensions/app_diameap/diameap_eap.c @@ -59,7 +59,7 @@ static void diameap_ba_policyupdate(struct eap_state_machine * eap_sm, struct eap_packet *eapPacket) { TRACE_ENTRY("%p %p",eap_sm, eapPacket); - if ((eap_sm->respMethod == TYPE_NAK)) + if (eap_sm->respMethod == TYPE_NAK) { int id; eap_sm->user.pmethods = 0; @@ -100,7 +100,7 @@ static int diameap_ba_policygetnextmethod(struct eap_state_machine * eap_sm, if (eap_sm->user.userid == NULL) { - if ((eap_sm->currentMethod == TYPE_NONE)) + if (eap_sm->currentMethod == TYPE_NONE) { *vendor = VENDOR_IETF; *eaptype = TYPE_IDENTITY; diff --git a/extensions/app_diameap/diameap_init.c b/extensions/app_diameap/diameap_init.c index e3b8cc9..59a0bbb 100644 --- a/extensions/app_diameap/diameap_init.c +++ b/extensions/app_diameap/diameap_init.c @@ -38,6 +38,11 @@ #include "diameap_common.h" +#ifndef HAVE_MYSQL_MY_BOOL +#include <stdbool.h> +typedef bool my_bool; +#endif /* HAVE_MYSQL_MY_BOOL */ + /* Dictionary Object templates */ struct dict_object * dataobj_diameap_cmd = NULL; /* Diameter-EAP-Request Command Code */ struct dict_object * dataobj_diameap_app = NULL; /* Diameter EAP Application object */ diff --git a/extensions/app_diameap/diameap_server.c b/extensions/app_diameap/diameap_server.c index b93f6bb..329d6a2 100644 --- a/extensions/app_diameap/diameap_server.c +++ b/extensions/app_diameap/diameap_server.c @@ -1674,6 +1674,7 @@ union avp_value diameap_get_num(char * num, enum dict_avp_basetype datatype) break; default: TRACE_DEBUG(INFO, "%sUnknown AVP Base Type.",DIAMEAP_EXTENSION) + memset(&val, 0, sizeof(val)); ; } return val; @@ -1959,22 +1960,16 @@ char * diameap_attribute_operator(char * op, int * toadd, boolean *isrule) switch (*toadd) { case 1: - attribute_op = malloc(strlen(op)); - memset(attribute_op, 0, strlen(op)); - strncpy(attribute_op, op + 1, strlen(op) - 1); - attribute_op[strlen(op)] = '\0'; + attribute_op = calloc(strlen(op), sizeof(char *)); + memcpy(attribute_op, op + 1, strlen(op) - 1); break; case 2: - attribute_op = malloc(strlen(op)); - memset(attribute_op, 0, strlen(op)); - strncpy(attribute_op, op, strlen(op) - 1); - attribute_op[strlen(op)] = '\0'; + attribute_op = calloc(strlen(op), sizeof(char *)); + memcpy(attribute_op, op, strlen(op) - 1); break; default: - attribute_op = malloc(strlen(op) + 1); - memset(attribute_op, 0, strlen(op) + 1); - strcpy(attribute_op, op); - attribute_op[strlen(op) + 1] = '\0'; + attribute_op = calloc(strlen(op) + 1, sizeof(char *)); + memcpy(attribute_op, op, strlen(op)); } if (strcmp(attribute_op, "=") == 0) { @@ -3064,7 +3059,7 @@ static int diameap_server_callback(struct msg ** rmsg, struct avp * ravp, struct sess_state * diameap_sess_data = NULL; struct diameap_state_machine * diameap_sm = NULL; struct diameap_eap_interface eap_i; - struct msg *req, *ans; + struct msg *req, *ans = NULL; boolean non_fatal_error = FALSE; if (rmsg == NULL) diff --git a/extensions/app_radgw/md5.c b/extensions/app_radgw/md5.c index 055fcf0..88995f6 100644 --- a/extensions/app_radgw/md5.c +++ b/extensions/app_radgw/md5.c @@ -286,8 +286,7 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) byteReverse(ctx->in, 14); /* Append length in bits and transform */ - ((u32 *) ctx->in)[14] = ctx->bits[0]; - ((u32 *) ctx->in)[15] = ctx->bits[1]; + os_memcpy(&ctx->in[56], &ctx->bits[0], 8); MD5Transform(ctx->buf, (u32 *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); diff --git a/extensions/app_radgw/rgw_clients.c b/extensions/app_radgw/rgw_clients.c index 10922ce..1954f7f 100644 --- a/extensions/app_radgw/rgw_clients.c +++ b/extensions/app_radgw/rgw_clients.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -548,7 +548,7 @@ int rgw_clients_create_origin(struct rgw_radius_msg_meta *msg, struct rgw_client int idx; int valid_nas_info = 0; struct radius_attr_hdr *nas_ip = NULL, *nas_ip6 = NULL, *nas_id = NULL; - size_t nas_id_len; + size_t nas_id_len = 0; char * oh_str = NULL; size_t oh_strlen = 0; int oh_free = 0; char * or_str = NULL; size_t or_strlen = 0; char * rr_str = NULL; size_t rr_strlen = 0; @@ -710,7 +710,7 @@ int rgw_clients_create_origin(struct rgw_radius_msg_meta *msg, struct rgw_client ASSERT(nas_id); { - int found, ret; + int found = 0, ret; struct addrinfo hint, *res, *ptr; /* @@ -763,7 +763,7 @@ int rgw_clients_create_origin(struct rgw_radius_msg_meta *msg, struct rgw_client hint.ai_flags = AI_CANONNAME; ret = getaddrinfo(buf, NULL, &hint, &res); if (ret == 0) { - strncpy(buf, res->ai_canonname, sizeof(buf)); + snprintf(buf, sizeof(buf), "%s", res->ai_canonname); /* The name was resolved correctly, does it match the IP of the client? */ for (ptr = res; ptr != NULL; ptr = ptr->ai_next) { if (cli->sa->sa_family != ptr->ai_family) diff --git a/extensions/app_sip/TODO b/extensions/app_sip/TODO index 661face..bef88f7 100644 --- a/extensions/app_sip/TODO +++ b/extensions/app_sip/TODO @@ -49,6 +49,10 @@ TODO List * add mutex on mysql writing * check multithreading of mysql! * get destination host in database for RTR and PPR +* libapp_sip.c: fix username_pure memory leaks +* app_sip_MAR_cb: + - too much mysql_real_escape_string() use, both within the function and functions it calls + - on error, leaks allocated: sipuri, username, query. diff --git a/extensions/app_sip/app_sip.h b/extensions/app_sip/app_sip.h index a6532b7..09960c6 100644 --- a/extensions/app_sip/app_sip.h +++ b/extensions/app_sip/app_sip.h @@ -110,8 +110,6 @@ void DigestCalcHA1(char * pszAlg,char * pszUserName,char * pszRealm,char * pszPa void DigestCalcResponse(HASHHEX HA1,char * pszNonce,char * pszNonceCount,char * pszCNonce,char * pszQop,char * pszMethod,char * pszDigestUri,HASHHEX HEntity,HASHHEX Response); void DigestCalcResponseAuth(HASHHEX HA1,char * pszNonce,char * pszNonceCount,char * pszCNonce,char * pszQop,char * pszMethod,char * pszDigestUri,HASHHEX HEntity,HASHHEX Response); -int fd_avp_search_avp ( struct avp * groupedavp, struct dict_object * what, struct avp ** avp ); - //thread procedure void *rtr_socket(void *); void *ppr_socket(void *); diff --git a/extensions/app_sip/libapp_sip.c b/extensions/app_sip/libapp_sip.c index 6442ff4..ffe1c80 100644 --- a/extensions/app_sip/libapp_sip.c +++ b/extensions/app_sip/libapp_sip.c @@ -66,54 +66,6 @@ void calc_md5(char *clearDigest, char * data) return; } - -/* Search a given AVP model in an AVP (extracted from libfreediameter/message.c ) */ -int fd_avp_search_avp ( struct avp * groupedavp, struct dict_object * what, struct avp ** avp ) -{ - struct avp * nextavp; - struct avp_hdr * nextavphdr; - struct dict_avp_data dictdata; - - - TRACE_ENTRY("%p %p %p", groupedavp, what, avp); - - CHECK_FCT( fd_dict_getval(what, &dictdata) ); - - // Loop only in the group AVP - CHECK_FCT( fd_msg_browse(groupedavp, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL) ); - CHECK_FCT( fd_msg_avp_hdr( nextavp, &nextavphdr ) ); - - while (nextavphdr) { - - if ( (nextavphdr->avp_code == dictdata.avp_code) && (nextavphdr->avp_vendor == dictdata.avp_vendor) ) // always 0 if no Vendor flag - { - break; - } - - // Otherwise move to next AVP in the grouped AVP - CHECK_FCT( fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL) ); - - if(nextavp!=NULL) - { - CHECK_FCT( fd_msg_avp_hdr( nextavp, &nextavphdr ) ); - } - else - nextavphdr=NULL; - } - if (avp) - *avp = nextavp; - - if (avp && nextavp) { - struct dictionary * dict; - CHECK_FCT( fd_dict_getdict( what, &dict) ); - CHECK_FCT_DO( fd_msg_parse_dict( nextavp, dict, NULL ), ); - } - - if (avp || nextavp) - return 0; - else - return ENOENT; -} struct avp_hdr *walk_digest(struct avp *avp, int avp_code) { struct avp_hdr *temphdr=NULL; diff --git a/extensions/app_sip/md5.c b/extensions/app_sip/md5.c index 4079bda..11b18f5 100644 --- a/extensions/app_sip/md5.c +++ b/extensions/app_sip/md5.c @@ -309,8 +309,7 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) byteReverse(ctx->in, 14); /* Append length in bits and transform */ - ((u32 *) ctx->in)[14] = ctx->bits[0]; - ((u32 *) ctx->in)[15] = ctx->bits[1]; + os_memcpy(&ctx->in[56], &ctx->bits[0], 8); MD5Transform(ctx->buf, (u32 *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); diff --git a/extensions/app_sip/multimediaauth.c b/extensions/app_sip/multimediaauth.c index 12c1bcb..cb368da 100644 --- a/extensions/app_sip/multimediaauth.c +++ b/extensions/app_sip/multimediaauth.c @@ -50,7 +50,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s union avp_value val; int found_cnonce=0; struct avp * tempavp=NULL,*sipAuthentication=NULL,*sipAuthenticate=NULL; - char * result; + char * result = NULL; char password[51]; int idx=0, number_of_auth_items=0,i=0, ret=0; //Flags and variables for Database @@ -148,7 +148,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s if(not_found) { - TRACE_DEBUG(FULL,"The user %s doesn't exist!",username); + TRACE_DEBUG(FULL,"The user %s doesn't exist!", avphdr->avp_value->os.data); result="DIAMETER_ERROR_USER_UNKNOWN"; free(username); goto out; @@ -320,7 +320,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s //CHECK_FCT(fd_msg_browse ( avp, MSG_BRW_WALK, &avp, NULL) ); - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); if(a2!=NULL) found_cnonce=1; @@ -457,7 +457,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s char * digest_username=NULL, *digest_uri=NULL, *digest_response=NULL, *digest_realm=NULL, *digest_nonce=NULL, *digest_method=NULL, *digest_qop=NULL, *digest_algorithm=NULL, *digest_cnonce=NULL, *digest_noncecount=NULL; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Nonce, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Nonce, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -486,7 +486,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Response, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Response, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -500,7 +500,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Realm, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Realm, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -514,7 +514,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Method, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Method, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -530,7 +530,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s else digest_method=""; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_URI, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_URI, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -544,7 +544,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_QOP, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_QOP, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -559,7 +559,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } else digest_qop=NULL; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Algorithm, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Algorithm, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -574,7 +574,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } else digest_algorithm=NULL; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -589,7 +589,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } else digest_cnonce=""; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Nonce_Count, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Nonce_Count, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -604,7 +604,7 @@ int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * s } else digest_noncecount=""; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Username, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Username, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); diff --git a/extensions/app_sip/registrationtermination.c b/extensions/app_sip/registrationtermination.c index 9300467..7f43c28 100644 --- a/extensions/app_sip/registrationtermination.c +++ b/extensions/app_sip/registrationtermination.c @@ -114,7 +114,7 @@ int app_sip_RTR_cb(struct rtrsipaor *structure) } } - if(structure->strreason!='\0') + if(structure->strreason[0]!='\0') got_streason=1; diff --git a/extensions/dbg_dict_dump/CMakeLists.txt b/extensions/dbg_dict_dump/CMakeLists.txt new file mode 100644 index 0000000..c193666 --- /dev/null +++ b/extensions/dbg_dict_dump/CMakeLists.txt @@ -0,0 +1,12 @@ +# Dictionary dump extension +PROJECT("Dictionary dump extension" C) +FD_ADD_EXTENSION(dbg_dict_dump dbg_dict_dump.c) + + +#### +## INSTALL section ## + +INSTALL(TARGETS dbg_dict_dump + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-debug-tools) + diff --git a/extensions/dbg_dict_dump/dbg_dict_dump.c b/extensions/dbg_dict_dump/dbg_dict_dump.c new file mode 100644 index 0000000..2fa0b5e --- /dev/null +++ b/extensions/dbg_dict_dump/dbg_dict_dump.c @@ -0,0 +1,87 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Luke Mewburn <luke@mewburn.net> * +* * +* Copyright (c) 2020, WIDE Project and NICT * +* All rights reserved. * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the WIDE Project or NICT nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of WIDE Project and * +* NICT. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + +/* + * Dump Diameter dictionary (using fd_dict_dump()) to a file or the log. + * + * If conffile is provided, write the dump to that file, + * otherwise write to log. + */ + +#include <freeDiameter/extension.h> + +static int dbg_dict_dump_entry(char * conffile) +{ + TRACE_ENTRY("%p", conffile); + + FILE * out = NULL; + if (conffile) { + LOG_N("Dictionary dump to file '%s'", conffile); + out = fopen(conffile, "w"); + if (NULL == out) { + LOG_E("Cannot open output file '%s' for writing", conffile); + return EINVAL; + } + } else { + LOG_N("Dictionary dump to log"); + } + + char * tbuf = NULL; size_t tbuflen = 0; + if (NULL == fd_dict_dump(&tbuf, &tbuflen, NULL, fd_g_config->cnf_dict)) { + LOG_E("Cannot dump dictionary"); + } else if (out) { + fprintf(out, "%s\n", tbuf); + } else { + LOG_N("%s", fd_dict_dump(&tbuf, &tbuflen, NULL, fd_g_config->cnf_dict)); + } + free(tbuf); + if (out) { + fclose(out); + out = NULL; + } + + LOG_N("Dictionary dump completed"); + return 0; +} + +void fd_ext_fini(void) +{ + TRACE_ENTRY(); + + /* Nothing to do */ + return; +} + +EXTENSION_ENTRY("dbg_dict_dump", dbg_dict_dump_entry); diff --git a/extensions/dbg_dict_dump_json/CMakeLists.txt b/extensions/dbg_dict_dump_json/CMakeLists.txt new file mode 100644 index 0000000..e02306b --- /dev/null +++ b/extensions/dbg_dict_dump_json/CMakeLists.txt @@ -0,0 +1,21 @@ +PROJECT("Dictionary dump to JSON extension" C) +FD_ADD_EXTENSION(dbg_dict_dump_json dbg_dict_dump_json.cc) + +# sneakily uses dictionary-internal.h +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../libfdproto) + +INCLUDE(FindPkgConfig) + +# Uses JSONCPP to write JSON files +PKG_CHECK_MODULES(JSONCPP REQUIRED jsoncpp) +INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIRS}) +LINK_DIRECTORIES(${JSONCPP_LIBDIR}) +TARGET_LINK_LIBRARIES(dbg_dict_dump_json ${JSONCPP_LIBRARIES}) + +#### +## INSTALL section ## + +INSTALL(TARGETS dbg_dict_dump_json + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-debug-tools) + diff --git a/extensions/dbg_dict_dump_json/dbg_dict_dump_json.cc b/extensions/dbg_dict_dump_json/dbg_dict_dump_json.cc new file mode 100644 index 0000000..6fd2539 --- /dev/null +++ b/extensions/dbg_dict_dump_json/dbg_dict_dump_json.cc @@ -0,0 +1,441 @@ +/********************************************************************************************************** + * Software License Agreement (BSD License) * + * Author: Thomas Klausner <tk@giga.or.at> * + * * + * Copyright (c) 2020 Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by nfotex IT GmbH, http://nfotex.com/ * + * * + * Redistribution and use of this software in source and binary forms, with or without modification, are * + * permitted provided that the following conditions are met: * + * * + * * Redistributions of source code must retain the above * + * copyright notice, this list of conditions and the * + * following disclaimer. * + * * + * * Redistributions in binary form must reproduce the above * + * copyright notice, this list of conditions and the * + * following disclaimer in the documentation and/or other * + * materials provided with the distribution. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + **********************************************************************************************************/ + + +/* + * Dump Diameter dictionary to JSON file. + */ + +#include <freeDiameter/extension.h> +#include "dictionary-internal.h" +#include <json/json.h> +#include <sys/stat.h> + +#include <iomanip> +#include <sstream> + + +void +dump_vendor(dict_object *self, struct dict_vendor_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + Json::Value vendor; + + vendor["Code"] = Json::Value(data->vendor_id); + vendor["Name"] = Json::Value(data->vendor_name); + main["Vendors"].append(vendor); +} + +void +dump_application(dict_object *self, struct dict_application_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + Json::Value application; + + application["Code"] = Json::Value(data->application_id); + application["Name"] = Json::Value(data->application_name); + main["Applications"].append(application); +} + +void +dump_enumval(dict_object *self, struct dict_enumval_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + enum dict_avp_basetype type; + struct dict_type_data type_data; + Json::Value enumval; + bool is_printable; + + type = parent->data.type.type_base; + + /* Standard only allows Integer32 Enumerated values, but freeDiameter is more permissive */ + switch (type) { + case AVP_TYPE_OCTETSTRING: + is_printable = true; + for (size_t i = 0; i < data->enum_value.os.len; i++) { + if (isprint(data->enum_value.os.data[i]) == 0) { + is_printable = false; + break; + } + } + if (is_printable) { + std::string output((const char*)data->enum_value.os.data, (size_t)data->enum_value.os.len); + enumval["Code"] = Json::Value(output); + } else { + std::stringstream quoted_string; + quoted_string << "<"; + for (size_t i = 0; i < data->enum_value.os.len; i++) { + quoted_string << std::hex << std::setfill('0') << std::setw(2) << (int)data->enum_value.os.data[i]; + } + quoted_string << ">"; + enumval["Code"] = Json::Value(quoted_string.str()); + } + break; + + case AVP_TYPE_INTEGER32: + enumval["Code"] = Json::Value(data->enum_value.i32); + break; + + case AVP_TYPE_INTEGER64: + enumval["Code"] = Json::Value(static_cast<Json::Int64>(data->enum_value.i64)); + break; + + case AVP_TYPE_UNSIGNED32: + enumval["Code"] = Json::Value(data->enum_value.u32); + break; + + case AVP_TYPE_UNSIGNED64: + enumval["Code"] = Json::Value(static_cast<Json::UInt64>(data->enum_value.u64)); + break; + + case AVP_TYPE_FLOAT32: + enumval["Code"] = Json::Value(data->enum_value.f32); + break; + + case AVP_TYPE_FLOAT64: + enumval["Code"] = Json::Value(data->enum_value.f64); + break; + + default: + printf("??? (ERROR unknown type %d)", type); + break; + } + if (fd_dict_getval(parent, &type_data) != 0) { + /* TODO: fd_dict_getval error */ + return; + } + if (!main.isMember("Types") || !main["Types"].isMember(type_data.type_name)) { + /* TODO: missing type error */ + return; + } + + enumval["Name"] = Json::Value(data->enum_name); + main["Types"][type_data.type_name]["EnumValues"].append(enumval); +} + +void +dump_type(dict_object *self, struct dict_type_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + Json::Value type; + + type["Name"] = Json::Value(data->type_name); + type["Base"] = Json::Value(type_base_name[data->type_base]); + main["Types"][data->type_name] = type; +} + +#define AVPFL_str "%s%s" +#define AVPFL_val(_val) (_val & AVP_FLAG_VENDOR)?"V":"" , (_val & AVP_FLAG_MANDATORY)?"M":"" + +void +dump_avp(dict_object *self, struct dict_avp_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + struct dict_object *type = NULL; + struct dict_type_data type_data; + Json::Value avp; + char flags[10]; + + if (fd_dict_search(fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, self, &type, 0) != 0) { + /* TODO: fd_dict_search error */ + return; + } + + if ((type == NULL) || (fd_dict_getval(type, &type_data) != 0)) { + avp["Type"] = Json::Value(type_base_name[data->avp_basetype]); + } else { + if (strstr(type_data.type_name, "Enumerated") != 0) { + if (data->avp_basetype == AVP_TYPE_INTEGER32) { + avp["Type"] = "Enumerated"; + } else { + /* freeDiameter allows enumerated types not based on integer32; + * write those out with their basic type for dict_json */ + avp["Type"] = Json::Value(type_base_name[data->avp_basetype]); + } + } else { + avp["Type"] = Json::Value(type_data.type_name); + } + if (main["Types"].isMember(type_data.type_name) && main["Types"][type_data.type_name].isMember("EnumValues")) { + avp["EnumValues"] = main["Types"][type_data.type_name]["EnumValues"]; + } + } + + avp["Code"] = Json::Value(data->avp_code); + if (data->avp_vendor != 0) { + avp["Vendor"] = Json::Value(data->avp_vendor); + } + avp["Name"] = Json::Value(data->avp_name); + snprintf(flags, sizeof(flags), AVPFL_str, AVPFL_val(data->avp_flag_val)); + avp["Flags"]["Must"] = Json::Value(flags); + snprintf(flags, sizeof(flags), AVPFL_str, AVPFL_val(data->avp_flag_mask & ~data->avp_flag_val)); + avp["Flags"]["MustNot"] = Json::Value(flags); + + main["AVPs"].append(avp); +} + +#define CMDFL_str "%s%s%s%s" +#define CMDFL_val(_val) (_val & CMD_FLAG_REQUEST)?"R":"" , (_val & CMD_FLAG_PROXIABLE)?"P":"" , (_val & CMD_FLAG_ERROR)?"E":"" , (_val & CMD_FLAG_RETRANSMIT)?"T":"" + +void +dump_command(dict_object *self, struct dict_cmd_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + Json::Value command; + char flags[10]; + + command["Code"] = Json::Value(data->cmd_code); + command["Name"] = Json::Value(data->cmd_name); + snprintf(flags, sizeof(flags), CMDFL_str, CMDFL_val(data->cmd_flag_val)); + command["Flags"]["Must"] = Json::Value(flags); + snprintf(flags, sizeof(flags), CMDFL_str, CMDFL_val(data->cmd_flag_mask & ~data->cmd_flag_val)); + command["Flags"]["MustNot"] = Json::Value(flags); + main["Commands"].append(command); +} + +bool dump_object(dict_object *self, int depth, Json::Value &main); + +void +dump_rule(dict_object *self, struct dict_rule_data *data, struct dict_object *parent, int depth, Json::Value &main) +{ + Json::Value avp_rule; + struct dict_avp_data avp_data; + const char *slot, *entry, *parent_avp_name; + vendor_id_t parent_avp_vendor; + unsigned int i; + bool found = false; + enum dict_object_type parent_type; + + if (fd_dict_getval(data->rule_avp, &avp_data) != 0) { + /* TODO: fd_dict_getval error */ + return; + } + + if (avp_data.avp_vendor != 0) { + avp_rule["Vendor"] = Json::Value(avp_data.avp_vendor); + } + avp_rule["AVP"] = Json::Value(avp_data.avp_name); + /* TODO is this correct? what does rule_order specify? */ + if (data->rule_position == RULE_FIXED_HEAD) { + avp_rule["First"] = Json::Value(true); + } + /* TODO: insert "unbounded" for -1? */ + if (data->rule_min != -1) { + avp_rule["Min"] = Json::Value(data->rule_min); + } + if (data->rule_max != -1) { + avp_rule["Max"] = Json::Value(data->rule_max); + } + + int ret = fd_dict_gettype(parent, &parent_type); + if (ret != 0) { + /* TODO: fd_dict_gettype error */ + return; + } + + if (parent_type == DICT_AVP) { + struct dict_avp_data parent_data; + + slot = "AVPRules"; + entry = "AVP"; + if (fd_dict_getval(parent, &parent_data) != 0) { + /* TODO: fd_dict_getval error */ + return; + } + parent_avp_name = parent_data.avp_name; + parent_avp_vendor = parent_data.avp_vendor; + } else if (parent_type == DICT_COMMAND) { + struct dict_cmd_data parent_data; + + slot = "CommandRules"; + entry = "Command"; + if (fd_dict_getval(parent, &parent_data) != 0) { + /* TODO: fd_dict_getval error */ + return; + } + parent_avp_name = parent_data.cmd_name; + parent_avp_vendor = 0; + } else { + /* TODO: error, unknown case */ + return; + } + + for (i=0; i<main[slot].size(); i++) { + if (main[slot][i][entry] == parent_avp_name + && (parent_avp_vendor == 0 || !main[slot][i].isMember("Vendor") || parent_avp_vendor == main[slot][i]["Vendor"].asUInt())) { + found = true; + main[slot][i]["Content"].append(avp_rule); + break; + } + } + if (!found) { + Json::Value parent_avp; + parent_avp[entry] = parent_avp_name; + if (parent_avp_vendor != 0) { + parent_avp["Vendor"] = Json::Value(parent_avp_vendor); + } + parent_avp["Content"].append(avp_rule); + main[slot].append(parent_avp); + } + +} + +bool +dump_list(struct fd_list *list, const char *type, int depth, Json::Value &main) { + fd_list *li; + for (li = list->next; li != list; li = li->next) { + if (!dump_object((dict_object *)li->o, depth, main)) { + LOG_E("error dumping %s", type); + return false; + } + } + return true; +} + +bool +dump_object(dict_object *self, int depth, Json::Value &main) +{ + enum dict_object_type t; + int ret = fd_dict_gettype (self, &t); + if (ret != 0) { + return false; + } + + switch (t) { +#define DUMP_OBJECT_CASE(TYPE, STRUCT, DUMP_FUNCTION) \ + case TYPE: { \ + struct STRUCT * data = NULL; \ + int i; \ + data = (struct STRUCT *)malloc(sizeof(struct STRUCT)); \ + if (!data) { \ + /* TODO: malloc error */ \ + return false; \ + } \ + ret = fd_dict_getval(self, data); \ + if (ret != 0) { \ + /* TODO: fd_dict_getval error */ \ + free(data); \ + return false; \ + } \ + DUMP_FUNCTION(self, data, self->parent, depth, main); \ + if (depth > 0) { \ + for (i=0; i<NB_LISTS_PER_OBJ; i++) { \ + if ((self->list[i].o == NULL) && (self->list[i].next != &self->list[i])) { \ + dump_list(&self->list[i], 0, depth-1, main); \ + break; \ + } \ + } \ + } \ + } \ + break; + + DUMP_OBJECT_CASE(DICT_VENDOR, dict_vendor_data, dump_vendor); + DUMP_OBJECT_CASE(DICT_APPLICATION, dict_application_data, dump_application); + DUMP_OBJECT_CASE(DICT_TYPE, dict_type_data, dump_type); + DUMP_OBJECT_CASE(DICT_ENUMVAL, dict_enumval_data, dump_enumval); + DUMP_OBJECT_CASE(DICT_AVP, dict_avp_data, dump_avp); + DUMP_OBJECT_CASE(DICT_COMMAND, dict_cmd_data, dump_command); + DUMP_OBJECT_CASE(DICT_RULE, dict_rule_data, dump_rule); + default: + /* TODO: unhandled type error */ + return false; + } + return true; +} + +bool +dump_dictionary_to_json(dictionary *dict, Json::Value &main) +{ + if (dict == NULL) { + return false; + } + + if (pthread_rwlock_rdlock(&dict->dict_lock) != 0) { + return false; + } + + dump_list(&(dict->dict_types), "types", 2, main); + dump_object(&(dict->dict_vendors), 3, main); + dump_list(&(dict->dict_vendors.list[0]), "vendors", 3, main); + dump_object(&(dict->dict_applications), 1, main); + dump_list(&(dict->dict_applications.list[0]), "applications", 1, main); + dump_list(&(dict->dict_cmd_code), "commands", 1, main); + + if (pthread_rwlock_unlock( &dict->dict_lock) != 0) { + return false; + } + + return true; +} + + +static int +dbg_dict_dump_json_entry(char * conffile) +{ + TRACE_ENTRY("%p", conffile); + Json::Value main; + Json::Value types = Json::Value::null; + Json::StyledWriter writer; + FILE *out = stdout; + + if (conffile) { + if ((out=fopen(conffile, "w")) == NULL) { + LOG_E("cannot open output file '%s' for writing", conffile); + return EINVAL; + } + } + + /* get main dictionary */ + struct dictionary * dict = fd_g_config->cnf_dict; + if (!dump_dictionary_to_json(dict, main)) { + LOG_E("error dumping dictionary to JSON"); + return EINVAL; + } + /* remove enumerated types before dumping, they are in AVPs */ + /* convert remaining ones to array */ + Json::Value::Members members = main["Types"].getMemberNames(); + for (Json::Value::Members::const_iterator it = members.begin() ; it != members.end(); ++it) { + if (strncmp("Enumerated", main["Types"][*it]["Name"].asCString(), strlen("Enumerated")) == 0) { + main["Types"].removeMember(*it); + } else { + types.append(main["Types"][*it]); + } + } + main.removeMember("Types"); + main["Types"] = types; + + std::string value_str = writer.write(main); + fprintf(out, "%s\n", value_str.c_str()); + + if (conffile) { + fclose(out); + } + + LOG_N("Extension 'Dump dictionaries to JSON' initialized"); + return 0; +} + +extern "C" { + EXTENSION_ENTRY("dbg_dict_dump_json", dbg_dict_dump_json_entry); +} diff --git a/extensions/dbg_loglevel/dbg_loglevel_conf.l b/extensions/dbg_loglevel/dbg_loglevel_conf.l index 0a8d206..038e50a 100644 --- a/extensions/dbg_loglevel/dbg_loglevel_conf.l +++ b/extensions/dbg_loglevel/dbg_loglevel_conf.l @@ -3,7 +3,7 @@ * Authors: Thomas Klausner <tk@giga.or.at> based on code by Sebastien Decugis <sdecugis@freediameter.net>* * * * Copyright (c) 2019, Thomas Klausner * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Written under contract by Effortel Technologies SA, http://effortel.com/ * diff --git a/extensions/dbg_monitor/dbg_monitor.c b/extensions/dbg_monitor/dbg_monitor.c index de7c13a..f5d8f09 100644 --- a/extensions/dbg_monitor/dbg_monitor.c +++ b/extensions/dbg_monitor/dbg_monitor.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -75,7 +75,9 @@ static void display_info(char * queue_desc, char * peer, int current_count, int static pthread_t thr; static void * mn_thr(void * arg) { +#ifdef DEBUG int i = 0; +#endif fd_log_threadname("Monitor thread"); char * buf = NULL; size_t len; diff --git a/extensions/dbg_msg_dumps/dbg_msg_dumps.c b/extensions/dbg_msg_dumps/dbg_msg_dumps.c index a26b14c..238f2b0 100644 --- a/extensions/dbg_msg_dumps/dbg_msg_dumps.c +++ b/extensions/dbg_msg_dumps/dbg_msg_dumps.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2016, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/dbg_rt/dbg_rt.c b/extensions/dbg_rt/dbg_rt.c index 906e18e..0aefcbe 100644 --- a/extensions/dbg_rt/dbg_rt.c +++ b/extensions/dbg_rt/dbg_rt.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -33,8 +33,8 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *********************************************************************************************************/ -/* - * Debug-only extension for routing module; +/* + * Debug-only extension for routing module; * displays state information at the end of routing information process. */ #include <freeDiameter/extension.h> @@ -47,7 +47,7 @@ static int dbgrt_fwd_cb(void * cbdata, struct msg ** msg) { char * buf = NULL; size_t buflen; TRACE_ENTRY("%p %p", cbdata, msg); - + LOG_D("[dbg_rt] FWD routing message: %p", msg ? *msg : NULL); if (msg) { CHECK_MALLOC( fd_msg_dump_treeview(&buf, &buflen, NULL, *msg, NULL, 0, 1) ); @@ -63,19 +63,20 @@ static int dbgrt_out_cb(void * cbdata, struct msg ** pmsg, struct fd_list * cand struct fd_list * li; struct msg * msg = *pmsg; char * buf = NULL; size_t buflen; - + TRACE_ENTRY("%p %p %p", cbdata, msg, candidates); - + LOG_D("[dbg_rt] OUT routing message: %p", msg); CHECK_MALLOC( fd_msg_dump_treeview(&buf, &buflen, NULL, msg, NULL, 0, 1) ); LOG_D("%s", buf); + free(buf); LOG_D("[dbg_rt] Current list of candidates (%p): (score - id)", msg); - + for (li = candidates->next; li != candidates; li = li->next) { struct rtd_candidate *c = (struct rtd_candidate *) li; LOG_D("[dbg_rt] %d -\t%s", c->score, c->diamid); } - + return 0; } @@ -83,7 +84,7 @@ static int dbgrt_out_cb(void * cbdata, struct msg ** pmsg, struct fd_list * cand static int dbgrt_main(char * conffile) { TRACE_ENTRY("%p", conffile); - + CHECK_FCT( fd_rt_fwd_register ( dbgrt_fwd_cb, NULL, RT_FWD_ALL, &fwd_hdl ) ); CHECK_FCT( fd_rt_out_register ( dbgrt_out_cb, NULL, -1 /* so that it is called late */, &out_hdl ) ); @@ -94,11 +95,11 @@ static int dbgrt_main(char * conffile) void fd_ext_fini(void) { TRACE_ENTRY(); - + /* Unregister the modules */ CHECK_FCT_DO( fd_rt_fwd_unregister ( fwd_hdl, NULL ), /* continue */ ); CHECK_FCT_DO( fd_rt_out_unregister ( out_hdl, NULL ), /* continue */ ); - + return ; } diff --git a/extensions/dict_dcca_3gpp/CMakeLists.txt b/extensions/dict_dcca_3gpp/CMakeLists.txt index 7105c15..b4cc5ba 100644 --- a/extensions/dict_dcca_3gpp/CMakeLists.txt +++ b/extensions/dict_dcca_3gpp/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT("Diameter DCCA (Diameter Credit Control Application) 3GPP dictionary definitions" C) # Compile as a module -FD_ADD_EXTENSION(dict_dcca_3gpp dict_dcca_3gpp.c) +FD_ADD_EXTENSION(dict_dcca_3gpp dict_dcca_3gpp.c add_avps.c) #### diff --git a/extensions/dict_dcca_3gpp/add_avps.c b/extensions/dict_dcca_3gpp/add_avps.c new file mode 100644 index 0000000..60d3c64 --- /dev/null +++ b/extensions/dict_dcca_3gpp/add_avps.c @@ -0,0 +1,21454 @@ +/* +Generated by: + csv_to_fd -p fdc dict_dcca_3gpp.csv + +Do not modify; modify the source .csv files instead. +*/ + +#include <freeDiameter/extension.h> + +#define CHECK_dict_new( _type, _data, _parent, _ref ) \ + CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) ); + +#define CHECK_dict_search( _type, _criteria, _what, _result ) \ + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); + +int add_avps() +{ + struct dict_object * DiameterIdentity_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "DiameterIdentity", &DiameterIdentity_type); + + struct dict_object * DiameterURI_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "DiameterURI", &DiameterURI_type); + + struct dict_object * Time_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); + + struct dict_object * UTF8String_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); + + struct dict_object * IPFilterRule_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "IPFilterRule", &IPFilterRule_type); + + struct dict_object * Address_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); + + /*==================================================================*/ + /* 3GPP TS 29.061 V15.5.0 (2018-12) */ + /* Interworking between the Public Land Mobile Network (PLMN) */ + /* supporting packet based services and */ + /* Packet Data Networks (PDN) */ + /* */ + /* From 3GPP 29061-f50.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.061 Table 9a: Gi/Sgi specific AVPs */ + + /* Note: 3GPP TS 29.061 is unclear and inconsistent about M. */ + /* For this reason, other sources are assumed more trustworthy. */ + /*==================================================================*/ + + /* Fix: 3GPP-IMSI (1) changed to Must M. */ + /* 3GPP-IMSI, UTF8String, code 1, section 16.4.7 */ + { + struct dict_avp_data data = { + 1, /* Code */ + 10415, /* Vendor */ + "3GPP-IMSI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Fix: 3GPP-Charging-Id (2) type changed from OctetString to Unsigned32, */ + /* per 3GPP TS 29.061 clause 16.4.7.2/2 and packet dumps. */ + /* 3GPP-Charging-Id, Unsigned32, code 2, section 16.4.7 */ + { + struct dict_avp_data data = { + 2, /* Code */ + 10415, /* Vendor */ + "3GPP-Charging-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-PDP-Type (3) changed to Must M. */ + /* 3GPP-PDP-Type, Enumerated, code 3, section 16.4.7 */ + { + struct dict_avp_data data = { + 3, /* Code */ + 10415, /* Vendor */ + "3GPP-PDP-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/3GPP-PDP-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* 3GPP-CG-Address, OctetString, code 4, section 16.4.7 */ + { + struct dict_avp_data data = { + 4, /* Code */ + 10415, /* Vendor */ + "3GPP-CG-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-GPRS-Negotiated-QoS-Profile (5) changed to Must M per contrib/3gpp. */ + /* 3GPP-GPRS-Negotiated-QoS-Profile, UTF8String, code 5, section 16.4.7 */ + { + struct dict_avp_data data = { + 5, /* Code */ + 10415, /* Vendor */ + "3GPP-GPRS-Negotiated-QoS-Profile", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* 3GPP-SGSN-Address, OctetString, code 6, section 16.4.7 */ + { + struct dict_avp_data data = { + 6, /* Code */ + 10415, /* Vendor */ + "3GPP-SGSN-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-GGSN-Address, OctetString, code 7, section 16.4.7 */ + { + struct dict_avp_data data = { + 7, /* Code */ + 10415, /* Vendor */ + "3GPP-GGSN-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-IMSI-MCC-MNC (8) changed to Must M per packet dumps. */ + /* 3GPP-IMSI-MCC-MNC, UTF8String, code 8, section 16.4.7 */ + { + struct dict_avp_data data = { + 8, /* Code */ + 10415, /* Vendor */ + "3GPP-IMSI-MCC-MNC", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Fix: 3GPP-GGSN-MCC-MNC (9) changed to Must M per contrib/3gpp. */ + /* 3GPP-GGSN-MCC-MNC, UTF8String, code 9, section 16.4.7 */ + { + struct dict_avp_data data = { + 9, /* Code */ + 10415, /* Vendor */ + "3GPP-GGSN-MCC-MNC", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Fix: 3GPP-NSAPI (10) changed to Must M per contrib/3gpp. */ + /* 3GPP-NSAPI, OctetString, code 10, section 16.4.7 */ + { + struct dict_avp_data data = { + 10, /* Code */ + 10415, /* Vendor */ + "3GPP-NSAPI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 Table 9a does not define */ + /* 3GPP-Session-Stop-Indicator (11) even when it is referenced */ + /* by other 3GPP Diameter AVPs including PS-Information (874). */ + /* */ + /* Fix: Add 3GPP-Session-Stop-Indicator (11) OctetString. */ + /* 3GPP-Session-Stop-Indicator, OctetString, code 11, section 16.4.7 */ + { + struct dict_avp_data data = { + 11, /* Code */ + 10415, /* Vendor */ + "3GPP-Session-Stop-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-Selection-Mode (12) changed to Must M per contrib/3gpp. */ + /* 3GPP-Selection-Mode, UTF8String, code 12, section 16.4.7 */ + { + struct dict_avp_data data = { + 12, /* Code */ + 10415, /* Vendor */ + "3GPP-Selection-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Fix: 3GPP-Charging-Characteristics (13) changed to Must M per contrib/3gpp. */ + /* 3GPP-Charging-Characteristics, UTF8String, code 13, section 16.4.7 */ + { + struct dict_avp_data data = { + 13, /* Code */ + 10415, /* Vendor */ + "3GPP-Charging-Characteristics", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* 3GPP-CG-IPv6-Address (14) to 3GPP-CG-Ipv6-Address. */ + /* */ + /* Fix: 3GPP-CG-Ipv6-Address (14) changed to Must M per contrib/3gpp. */ + /* Change-1.4.0: 3GPP-CG-IPv6-Address (14) renamed to 3GPP-CG-Ipv6-Address (14). */ + /* 3GPP-CG-Ipv6-Address, OctetString, code 14, section 16.4.7 */ + { + struct dict_avp_data data = { + 14, /* Code */ + 10415, /* Vendor */ + "3GPP-CG-Ipv6-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* 3GPP-SGSN-IPv6-Address (15) to 3GPP-SGSN-Ipv6-Address. */ + /* */ + /* Fix: 3GPP-SGSN-Ipv6-Address (15) changed to Must M per contrib/3gpp. */ + /* Change-1.4.0: 3GPP-SGSN-IPv6-Address (15) renamed to 3GPP-SGSN-Ipv6-Address (15). */ + /* 3GPP-SGSN-Ipv6-Address, OctetString, code 15, section 16.4.7 */ + { + struct dict_avp_data data = { + 15, /* Code */ + 10415, /* Vendor */ + "3GPP-SGSN-Ipv6-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* 3GPP-GGSN-IPv6-Address (16) to 3GPP-GGSN-Ipv6-Address. */ + /* */ + /* Fix: 3GPP-GGSN-Ipv6-Address (16) changed to Must M per contrib/3gpp. */ + /* Change-1.4.0: 3GPP-GGSN-IPv6-Address (16) renamed to 3GPP-GGSN-Ipv6-Address (16). */ + /* 3GPP-GGSN-Ipv6-Address, OctetString, code 16, section 16.4.7 */ + { + struct dict_avp_data data = { + 16, /* Code */ + 10415, /* Vendor */ + "3GPP-GGSN-Ipv6-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* 3GPP-IPv6-DNS-Servers (17) to 3GPP-Ipv6-DNS-Servers. */ + /* */ + /* Fix: 3GPP-Ipv6-DNS-Servers (17) changed to Must M per contrib/3gpp. */ + /* Change-1.4.0: 3GPP-IPv6-DNS-Servers (17) renamed to 3GPP-Ipv6-DNS-Servers (17). */ + /* 3GPP-Ipv6-DNS-Servers, OctetString, code 17, section 16.4.7 */ + { + struct dict_avp_data data = { + 17, /* Code */ + 10415, /* Vendor */ + "3GPP-Ipv6-DNS-Servers", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-SGSN-MCC-MNC (18) changed to Must M per contrib/3gpp. */ + /* 3GPP-SGSN-MCC-MNC, UTF8String, code 18, section 16.4.7 */ + { + struct dict_avp_data data = { + 18, /* Code */ + 10415, /* Vendor */ + "3GPP-SGSN-MCC-MNC", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Fix: 3GPP-IMEISV (20) changed to Must M. */ + /* 3GPP-IMEISV, OctetString, code 20, section 16.4.7 */ + { + struct dict_avp_data data = { + 20, /* Code */ + 10415, /* Vendor */ + "3GPP-IMEISV", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-RAT-Type (21) changed to Must M. */ + /* 3GPP-RAT-Type, OctetString, code 21, section 16.4.7 */ + { + struct dict_avp_data data = { + 21, /* Code */ + 10415, /* Vendor */ + "3GPP-RAT-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-User-Location-Info (22) changed to Must M. */ + /* 3GPP-User-Location-Info, OctetString, code 22, section 16.4.7 */ + { + struct dict_avp_data data = { + 22, /* Code */ + 10415, /* Vendor */ + "3GPP-User-Location-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fix: 3GPP-MS-TimeZone (23) changed to Must M. */ + /* 3GPP-MS-TimeZone, OctetString, code 23, section 16.4.7 */ + { + struct dict_avp_data data = { + 23, /* Code */ + 10415, /* Vendor */ + "3GPP-MS-TimeZone", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-CAMEL-Charging-Info, OctetString, code 24, section 16.4.7 */ + { + struct dict_avp_data data = { + 24, /* Code */ + 10415, /* Vendor */ + "3GPP-CAMEL-Charging-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Packet-Filter, OctetString, code 25, section 16.4.7 */ + { + struct dict_avp_data data = { + 25, /* Code */ + 10415, /* Vendor */ + "3GPP-Packet-Filter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Negotiated-DSCP, OctetString, code 26, section 16.4.7 */ + { + struct dict_avp_data data = { + 26, /* Code */ + 10415, /* Vendor */ + "3GPP-Negotiated-DSCP", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Allocate-IP-Type, OctetString, code 27, section 16.4.7 */ + { + struct dict_avp_data data = { + 27, /* Code */ + 10415, /* Vendor */ + "3GPP-Allocate-IP-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 Table 9a does not define */ + /* External-Identifier (28) for Diameter; it is RADIUS only. */ + /* 3GPP TS 29.061 Table 9b refers to 3GPP TS 29.336 */ + /* for External-Identifier (3111). */ + /* */ + /* Change-1.4.0: External-Identifier (28) OctetString replaced by External-Identifier (3111) UTF8String. */ + + /* TWAN-Identifier, OctetString, code 29, section 16.4.7 */ + { + struct dict_avp_data data = { + 29, /* Code */ + 10415, /* Vendor */ + "TWAN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-User-Location-Info-Time, OctetString, code 30, section 16.4.7 */ + { + struct dict_avp_data data = { + 30, /* Code */ + 10415, /* Vendor */ + "3GPP-User-Location-Info-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Secondary-RAT-Usage, OctetString, code 31, section 16.4.7 */ + { + struct dict_avp_data data = { + 31, /* Code */ + 10415, /* Vendor */ + "3GPP-Secondary-RAT-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.061 Table 10: Gmb specific AVPs */ + /*==================================================================*/ + + /* TMGI, OctetString, code 900, section 17.7.2 */ + { + struct dict_avp_data data = { + 900, /* Code */ + 10415, /* Vendor */ + "TMGI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Required-MBMS-Bearer-Capabilities, UTF8String, code 901, section 17.7.3 */ + { + struct dict_avp_data data = { + 901, /* Code */ + 10415, /* Vendor */ + "Required-MBMS-Bearer-Capabilities", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* MBMS-StartStop-Indication, Enumerated, code 902, section 17.7.5 */ + { + struct dict_avp_data data = { + 902, /* Code */ + 10415, /* Vendor */ + "MBMS-StartStop-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-StartStop-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-Service-Area, OctetString, code 903, section 17.7.6 */ + { + struct dict_avp_data data = { + 903, /* Code */ + 10415, /* Vendor */ + "MBMS-Service-Area", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Session-Duration, OctetString, code 904, section 17.7.7 */ + { + struct dict_avp_data data = { + 904, /* Code */ + 10415, /* Vendor */ + "MBMS-Session-Duration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Alternative-APN, UTF8String, code 905, section 17.7.8 */ + { + struct dict_avp_data data = { + 905, /* Code */ + 10415, /* Vendor */ + "Alternative-APN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* MBMS-Service-Type, Enumerated, code 906, section 17.7.9 */ + { + struct dict_avp_data data = { + 906, /* Code */ + 10415, /* Vendor */ + "MBMS-Service-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-Service-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-2G-3G-Indicator, Enumerated, code 907, section 17.7.10 */ + { + struct dict_avp_data data = { + 907, /* Code */ + 10415, /* Vendor */ + "MBMS-2G-3G-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-2G-3G-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-Session-Identity, OctetString, code 908, section 17.7.11 */ + { + struct dict_avp_data data = { + 908, /* Code */ + 10415, /* Vendor */ + "MBMS-Session-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RAI, UTF8String, code 909, section 17.7.12 */ + { + struct dict_avp_data data = { + 909, /* Code */ + 10415, /* Vendor */ + "RAI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Additional-MBMS-Trace-Info, OctetString, code 910, section 17.7.13 */ + { + struct dict_avp_data data = { + 910, /* Code */ + 10415, /* Vendor */ + "Additional-MBMS-Trace-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Time-To-Data-Transfer, OctetString, code 911, section 17.7.14 */ + { + struct dict_avp_data data = { + 911, /* Code */ + 10415, /* Vendor */ + "MBMS-Time-To-Data-Transfer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Session-Repetition-Number, OctetString, code 912, section 17.7.15 */ + { + struct dict_avp_data data = { + 912, /* Code */ + 10415, /* Vendor */ + "MBMS-Session-Repetition-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Required-QoS, UTF8String, code 913, section 17.7.16 */ + { + struct dict_avp_data data = { + 913, /* Code */ + 10415, /* Vendor */ + "MBMS-Required-QoS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* MBMS-Counting-Information, Enumerated, code 914, section 17.7.17 */ + { + struct dict_avp_data data = { + 914, /* Code */ + 10415, /* Vendor */ + "MBMS-Counting-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-Counting-Information)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-User-Data-Mode-Indication, Enumerated, code 915, section 17.7.18 */ + { + struct dict_avp_data data = { + 915, /* Code */ + 10415, /* Vendor */ + "MBMS-User-Data-Mode-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-User-Data-Mode-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-GGSN-Address, OctetString, code 916, section 17.7.19 */ + { + struct dict_avp_data data = { + 916, /* Code */ + 10415, /* Vendor */ + "MBMS-GGSN-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* MBMS-GGSN-IPv6-Address (917) to MBMS-GGSN-Ipv6-Address. */ + /* */ + /* Change-1.4.0: MBMS-GGSN-IPv6-Address (917) renamed to MBMS-GGSN-Ipv6-Address (917). */ + /* MBMS-GGSN-Ipv6-Address, OctetString, code 917, section 17.7.20 */ + { + struct dict_avp_data data = { + 917, /* Code */ + 10415, /* Vendor */ + "MBMS-GGSN-Ipv6-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-BMSC-SSM-IP-Address, OctetString, code 918, section 17.7.21 */ + { + struct dict_avp_data data = { + 918, /* Code */ + 10415, /* Vendor */ + "MBMS-BMSC-SSM-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* MBMS-BMSC-SSM-IPv6-Address (919) to MBMS-BMSC-SSM-Ipv6-Address. */ + /* */ + /* Change-1.4.0: MBMS-BMSC-SSM-IPv6-Address (919) renamed to MBMS-BMSC-SSM-Ipv6-Address (919). */ + /* MBMS-BMSC-SSM-Ipv6-Address, OctetString, code 919, section 17.7.22 */ + { + struct dict_avp_data data = { + 919, /* Code */ + 10415, /* Vendor */ + "MBMS-BMSC-SSM-Ipv6-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Flow-Identifier, OctetString, code 920, section 17.7.23 */ + { + struct dict_avp_data data = { + 920, /* Code */ + 10415, /* Vendor */ + "MBMS-Flow-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CN-IP-Multicast-Distribution, Enumerated, code 921, section 17.7.24 */ + { + struct dict_avp_data data = { + 921, /* Code */ + 10415, /* Vendor */ + "CN-IP-Multicast-Distribution", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CN-IP-Multicast-Distribution)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-HC-Indicator, Enumerated, code 922, section 17.7.25 */ + { + struct dict_avp_data data = { + 922, /* Code */ + 10415, /* Vendor */ + "MBMS-HC-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-HC-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.061 Table 20.5a.1: SGmb specific AVPs */ + /*==================================================================*/ + + /* MBMS-Access-Indicator, Enumerated, code 923, section 20.5a.1 */ + { + struct dict_avp_data data = { + 923, /* Code */ + 10415, /* Vendor */ + "MBMS-Access-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-Access-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IP-Address (3522). */ + /* 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IP-Address (924). */ + /* 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IP-Address (3522). */ + /* MBMS-GW-SSM-IP-Address, OctetString, code 924, section 20.5a.2 */ + { + struct dict_avp_data data = { + 924, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-SSM-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* MBMS-GW-SSM-IPv6-Address (925) to MBMS-GW-SSM-Ipv6-Address. */ + /* Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IPv6-Address (3523). */ + /* 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IPv6-Address (925). */ + /* 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* MBMS-GW-SSM-IPv6-Address (925) to MBMS-GW-SSM-Ipv6-Address. */ + /* 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IPv6-Address (3523). */ + /* MBMS-GW-SSM-IPv6-Address, OctetString, code 925, section 20.5a.3 */ + { + struct dict_avp_data data = { + 925, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-SSM-IPv6-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-BMSC-SSM-UDP-Port, OctetString, code 926, section 20.5a.4 */ + { + struct dict_avp_data data = { + 926, /* Code */ + 10415, /* Vendor */ + "MBMS-BMSC-SSM-UDP-Port", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-GW-UDP-Port, OctetString, code 927, section 20.5a.5 */ + { + struct dict_avp_data data = { + 927, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-UDP-Port", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-GW-UDP-Port-Indicator, Enumerated, code 928, section 20.5a.6 */ + { + struct dict_avp_data data = { + 928, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-UDP-Port-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-GW-UDP-Port-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-Data-Transfer-Start, Unsigned64, code 929, section 20.5a.7 */ + { + struct dict_avp_data data = { + 929, /* Code */ + 10415, /* Vendor */ + "MBMS-Data-Transfer-Start", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Data-Transfer-Stop, Unsigned64, code 930, section 20.5a.8 */ + { + struct dict_avp_data data = { + 930, /* Code */ + 10415, /* Vendor */ + "MBMS-Data-Transfer-Stop", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 Table 20.5a.1 row MBMS-Flag (931) has */ + /* incorrect name and should be "MBMS-Flags" per clause 20.5a.9. */ + /* */ + /* Fix: MBMS-Flag (931) renamed to MBMS-Flags (931). */ + /* MBMS-Flags, Unsigned32, code 931, section 20.5a.9 */ + { + struct dict_avp_data data = { + 931, /* Code */ + 10415, /* Vendor */ + "MBMS-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Restart-Counter, Unsigned32, code 932, section 20.5a.10 */ + { + struct dict_avp_data data = { + 932, /* Code */ + 10415, /* Vendor */ + "Restart-Counter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Diagnostic-Info, Unsigned32, code 933, section 20.5a.11 */ + { + struct dict_avp_data data = { + 933, /* Code */ + 10415, /* Vendor */ + "Diagnostic-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Cell-List, OctetString, code 934, section 20.5a.12 */ + { + struct dict_avp_data data = { + 934, /* Code */ + 10415, /* Vendor */ + "MBMS-Cell-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.109 V15.0.0 (2017-06) */ + /* Generic Authentication Architecture (GAA); */ + /* Zh and Zn Interfaces based on the Diameter protocol; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29109-f00.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.109 Table 6.1: New Diameter Multimedia Application AVPs */ + /*==================================================================*/ + + /* GBA-UserSecSettings, OctetString, code 400, section 6.3.1.1 */ + { + struct dict_avp_data data = { + 400, /* Code */ + 10415, /* Vendor */ + "GBA-UserSecSettings", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transaction-Identifier, OctetString, code 401, section 6.3.1.2 */ + { + struct dict_avp_data data = { + 401, /* Code */ + 10415, /* Vendor */ + "Transaction-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NAF-Id, OctetString, code 402, section 6.3.1.3 */ + { + struct dict_avp_data data = { + 402, /* Code */ + 10415, /* Vendor */ + "NAF-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GAA-Service-Identifier, OctetString, code 403, section 6.3.1.4 */ + { + struct dict_avp_data data = { + 403, /* Code */ + 10415, /* Vendor */ + "GAA-Service-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Key-ExpiryTime, Time, code 404, section 6.3.1.5 */ + { + struct dict_avp_data data = { + 404, /* Code */ + 10415, /* Vendor */ + "Key-ExpiryTime", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* ME-Key-Material, OctetString, code 405, section 6.3.1.6 */ + { + struct dict_avp_data data = { + 405, /* Code */ + 10415, /* Vendor */ + "ME-Key-Material", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UICC-Key-Material, OctetString, code 406, section 6.3.1.7 */ + { + struct dict_avp_data data = { + 406, /* Code */ + 10415, /* Vendor */ + "UICC-Key-Material", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.109 Table 6.1 row GBA_U-Awareness-Indicator (407) */ + /* has an underscore in the name (contrary to RFC 6733 section 4.1). */ + /* */ + /* Fix: GBA_U-Awareness-Indicator (407) renamed to GBA-U-Awareness-Indicator (407). */ + /* GBA-U-Awareness-Indicator, Enumerated, code 407, section 6.3.1.8 */ + { + struct dict_avp_data data = { + 407, /* Code */ + 10415, /* Vendor */ + "GBA-U-Awareness-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/GBA-U-Awareness-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* BootstrapInfoCreationTime, Time, code 408, section 6.3.1.9 */ + { + struct dict_avp_data data = { + 408, /* Code */ + 10415, /* Vendor */ + "BootstrapInfoCreationTime", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* GUSS-Timestamp, Time, code 409, section 6.3.1.10 */ + { + struct dict_avp_data data = { + 409, /* Code */ + 10415, /* Vendor */ + "GUSS-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* GBA-Type, Enumerated, code 410, section 6.3.1.11 */ + { + struct dict_avp_data data = { + 410, /* Code */ + 10415, /* Vendor */ + "GBA-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/GBA-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* UE-Id, OctetString, code 411, section 6.3.1.12 */ + { + struct dict_avp_data data = { + 411, /* Code */ + 10415, /* Vendor */ + "UE-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UE-Id-Type, Enumerated, code 412, section 6.3.1.13 */ + { + struct dict_avp_data data = { + 412, /* Code */ + 10415, /* Vendor */ + "UE-Id-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/UE-Id-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* UICC-App-Label, OctetString, code 413, section 6.3.1.14 */ + { + struct dict_avp_data data = { + 413, /* Code */ + 10415, /* Vendor */ + "UICC-App-Label", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UICC-ME, Enumerated, code 414, section 6.3.1.15 */ + { + struct dict_avp_data data = { + 414, /* Code */ + 10415, /* Vendor */ + "UICC-ME", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/UICC-ME)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Requested-Key-Lifetime, Time, code 415, section 6.3.1.16 */ + { + struct dict_avp_data data = { + 415, /* Code */ + 10415, /* Vendor */ + "Requested-Key-Lifetime", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Private-Identity-Request, Enumerated, code 416, section 6.3.1.17 */ + { + struct dict_avp_data data = { + 416, /* Code */ + 10415, /* Vendor */ + "Private-Identity-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Private-Identity-Request)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* GBA-Push-Info, OctetString, code 417, section 6.3.1.18 */ + { + struct dict_avp_data data = { + 417, /* Code */ + 10415, /* Vendor */ + "GBA-Push-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NAF-SA-Identifier, OctetString, code 418, section 6.3.1.19 */ + { + struct dict_avp_data data = { + 418, /* Code */ + 10415, /* Vendor */ + "NAF-SA-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Security-Feature-Request, OctetString, code 419, section 6.3.1.20 */ + { + struct dict_avp_data data = { + 419, /* Code */ + 10415, /* Vendor */ + "Security-Feature-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Security-Feature-Response, OctetString, code 420, section 6.3.1.21 */ + { + struct dict_avp_data data = { + 420, /* Code */ + 10415, /* Vendor */ + "Security-Feature-Response", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.128 V15.6.0 (2019-09) */ + /* Mobility Management Entity (MME) and Serving GPRS Support */ + /* Node (SGSN) interfaces for interworking with packet data */ + /* networks and applications */ + /* */ + /* From 3GPP 29128-f60.docx */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.128 Table 6.4.1-1: T6a/T6b specific Diameter AVPs */ + /*==================================================================*/ + + /* Communication-Failure-Information, Grouped, code 4300, section 6.4.4 */ + { + struct dict_avp_data data = { + 4300, /* Code */ + 10415, /* Vendor */ + "Communication-Failure-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Cause-Type, Unsigned32, code 4301, section 6.4.5 */ + { + struct dict_avp_data data = { + 4301, /* Code */ + 10415, /* Vendor */ + "Cause-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* S1AP-Cause, Unsigned32, code 4302, section 6.4.6 */ + { + struct dict_avp_data data = { + 4302, /* Code */ + 10415, /* Vendor */ + "S1AP-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RANAP-Cause, Unsigned32, code 4303, section 6.4.7 */ + { + struct dict_avp_data data = { + 4303, /* Code */ + 10415, /* Vendor */ + "RANAP-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* BSSGP-Cause, Unsigned32, code 4309, section 6.4.8 */ + { + struct dict_avp_data data = { + 4309, /* Code */ + 10415, /* Vendor */ + "BSSGP-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GMM-Cause, Unsigned32, code 4304, section 6.4.9 */ + { + struct dict_avp_data data = { + 4304, /* Code */ + 10415, /* Vendor */ + "GMM-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Cause, Unsigned32, code 4305, section 6.4.10 */ + { + struct dict_avp_data data = { + 4305, /* Code */ + 10415, /* Vendor */ + "SM-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-UE-Per-Location-Configuration, Grouped, code 4306, section 6.4.11 */ + { + struct dict_avp_data data = { + 4306, /* Code */ + 10415, /* Vendor */ + "Number-Of-UE-Per-Location-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-UE-Per-Location-Report, Grouped, code 4307, section 6.4.12 */ + { + struct dict_avp_data data = { + 4307, /* Code */ + 10415, /* Vendor */ + "Number-Of-UE-Per-Location-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UE-Count, Unsigned32, code 4308, section 6.4.13 */ + { + struct dict_avp_data data = { + 4308, /* Code */ + 10415, /* Vendor */ + "UE-Count", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Connection-Action, Unsigned32, code 4314, section 6.4.18 */ + { + struct dict_avp_data data = { + 4314, /* Code */ + 10415, /* Vendor */ + "Connection-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Non-IP-Data, OctetString, code 4315, section 6.4.19 */ + { + struct dict_avp_data data = { + 4315, /* Code */ + 10415, /* Vendor */ + "Non-IP-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Serving-PLMN-Rate-Control, Grouped, code 4310, section 6.4.21 */ + { + struct dict_avp_data data = { + 4310, /* Code */ + 10415, /* Vendor */ + "Serving-PLMN-Rate-Control", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Uplink-Rate-Limit, Unsigned32, code 4311, section 6.4.23 */ + { + struct dict_avp_data data = { + 4311, /* Code */ + 10415, /* Vendor */ + "Uplink-Rate-Limit", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Downlink-Rate-Limit, Unsigned32, code 4312, section 6.4.22 */ + { + struct dict_avp_data data = { + 4312, /* Code */ + 10415, /* Vendor */ + "Downlink-Rate-Limit", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-PCO, OctetString, code 4313, section 6.4.26 */ + { + struct dict_avp_data data = { + 4313, /* Code */ + 10415, /* Vendor */ + "Extended-PCO", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SCEF-Wait-Time, Time, code 4316, section 6.4.24 */ + { + struct dict_avp_data data = { + 4316, /* Code */ + 10415, /* Vendor */ + "SCEF-Wait-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* CMR-Flags, Unsigned32, code 4317, section 6.4.25 */ + { + struct dict_avp_data data = { + 4317, /* Code */ + 10415, /* Vendor */ + "CMR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RRC-Cause-Counter, Grouped, code 4318, section 6.4.27 */ + { + struct dict_avp_data data = { + 4318, /* Code */ + 10415, /* Vendor */ + "RRC-Cause-Counter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Counter-Value, Unsigned32, code 4319, section 6.4.28 */ + { + struct dict_avp_data data = { + 4319, /* Code */ + 10415, /* Vendor */ + "Counter-Value", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RRC-Counter-Timestamp, Time, code 4320, section 6.4.29 */ + { + struct dict_avp_data data = { + 4320, /* Code */ + 10415, /* Vendor */ + "RRC-Counter-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* TDA-Flags, Unsigned32, code 4321, section 6.4.31 */ + { + struct dict_avp_data data = { + 4321, /* Code */ + 10415, /* Vendor */ + "TDA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Idle-Status-Indication, Grouped, code 4322, section 6.4.32 */ + { + struct dict_avp_data data = { + 4322, /* Code */ + 10415, /* Vendor */ + "Idle-Status-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Idle-Status-Timestamp, Time, code 4323, section 6.4.33 */ + { + struct dict_avp_data data = { + 4323, /* Code */ + 10415, /* Vendor */ + "Idle-Status-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Active-Time, Unsigned32, code 4324, section 6.4.34 */ + { + struct dict_avp_data data = { + 4324, /* Code */ + 10415, /* Vendor */ + "Active-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.140 V7.0.0 (2007-06) */ + /* MM10 interface based on Diameter protocol; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29140-700.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.140 Table 6.3.1: Diameter MM10 Application AVPs */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* Served-User-Identity, Grouped, code 1100, section 6.3.1 */ + { + struct dict_avp_data data = { + 1100, /* Code */ + 10415, /* Vendor */ + "Served-User-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* VASP-ID, UTF8String, code 1101, section 6.3.3 */ + { + struct dict_avp_data data = { + 1101, /* Code */ + 10415, /* Vendor */ + "VASP-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* VAS-ID, UTF8String, code 1102, section 6.3.4 */ + { + struct dict_avp_data data = { + 1102, /* Code */ + 10415, /* Vendor */ + "VAS-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Trigger-Event, Enumerated, code 1103, section 6.3.5 */ + { + struct dict_avp_data data = { + 1103, /* Code */ + 10415, /* Vendor */ + "Trigger-Event", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Trigger-Event)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Sender-Address, UTF8String, code 1104, section 6.3.7 */ + { + struct dict_avp_data data = { + 1104, /* Code */ + 10415, /* Vendor */ + "Sender-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Initial-Recipient-Address, Grouped, code 1105, section 6.3.8 */ + { + struct dict_avp_data data = { + 1105, /* Code */ + 10415, /* Vendor */ + "Initial-Recipient-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Result-Recipient-Address, Grouped, code 1106, section 6.3.9 */ + { + struct dict_avp_data data = { + 1106, /* Code */ + 10415, /* Vendor */ + "Result-Recipient-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.329 Sequence-Number (716) */ + /* and 3GPP TS 29.283 Sequence-Number (4512). */ + /* 3GPP TS 29.140 V6.1.0 (2005-06) allocated Sequence-Number (1107). */ + /* 3GPP TS 29.329 V10.0.0 (2010-09) CR 0163 added Sequence-Number (716). */ + /* 3GPP TS 29.283 V13.1.0 (2016-06) allocated Sequence-Number (4512). */ + /* */ + /* Fix: Sequence-Number (1107) renamed to Sequence-Number-29.140 (1107). */ + /* Sequence-Number-29.140, Unsigned32, code 1107, section 6.3.10 */ + { + struct dict_avp_data data = { + 1107, /* Code */ + 10415, /* Vendor */ + "Sequence-Number-29.140", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 32.299 Recipient-Address (1201); */ + /* 3GPP TS 29.140 V6.1.0 (2005-06) allocated Recipient-Address (1108). */ + /* 3GPP TS 32.299 V6.4.0 (2005-09) CR 0028 added Recipient-Address (1201). */ + /* */ + /* Fix: Recipient-Address (1108) renamed to Recipient-Address-29.140 (1108). */ + /* Recipient-Address-29.140, UTF8String, code 1108, section 6.3.11 */ + { + struct dict_avp_data data = { + 1108, /* Code */ + 10415, /* Vendor */ + "Recipient-Address-29.140", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Routeing-Address, UTF8String, code 1109, section 6.3.12 */ + { + struct dict_avp_data data = { + 1109, /* Code */ + 10415, /* Vendor */ + "Routeing-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Originating-Interface, Enumerated, code 1110, section 6.3.13 */ + { + struct dict_avp_data data = { + 1110, /* Code */ + 10415, /* Vendor */ + "Originating-Interface", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Originating-Interface)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Delivery-Report, Enumerated, code 1111, section 6.3.14 */ + { + struct dict_avp_data data = { + 1111, /* Code */ + 10415, /* Vendor */ + "Delivery-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Delivery-Report)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Read-Reply, Enumerated, code 1112, section 6.3.15 */ + { + struct dict_avp_data data = { + 1112, /* Code */ + 10415, /* Vendor */ + "Read-Reply", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Read-Reply)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Sender-Visibility, Enumerated, code 1113, section 6.3.16 */ + { + struct dict_avp_data data = { + 1113, /* Code */ + 10415, /* Vendor */ + "Sender-Visibility", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Sender-Visibility)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Service-Key, UTF8String, code 1114, section 6.3.17 */ + { + struct dict_avp_data data = { + 1114, /* Code */ + 10415, /* Vendor */ + "Service-Key", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Billing-Information, UTF8String, code 1115, section 6.3.18 */ + { + struct dict_avp_data data = { + 1115, /* Code */ + 10415, /* Vendor */ + "Billing-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 32.299 V11.6.0 Status (2702). */ + /* 3GPP TS 32.299 V11.10.0 (2013-12) CR 0566 renamed */ + /* Status (2702) to Status-Code (2702). */ + /* 3GPP TS 32.299 V11.14.0 (2014-12) CR 0617 renamed */ + /* Status-Code (2702) to Status-AS-Code (2702). */ + /* */ + /* TODO: rename back to Status ? */ + /* Fix: Status (1116) renamed to Status-29.140 (1116). */ + /* Status-29.140, Grouped, code 1116, section 6.3.19 */ + { + struct dict_avp_data data = { + 1116, /* Code */ + 10415, /* Vendor */ + "Status-29.140", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Status-Code, UTF8String, code 1117, section 6.3.20 */ + { + struct dict_avp_data data = { + 1117, /* Code */ + 10415, /* Vendor */ + "Status-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Status-Text, UTF8String, code 1118, section 6.3.21 */ + { + struct dict_avp_data data = { + 1118, /* Code */ + 10415, /* Vendor */ + "Status-Text", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Routeing-Address-Resolution, Enumerated, code 1119, section 6.3.22 */ + { + struct dict_avp_data data = { + 1119, /* Code */ + 10415, /* Vendor */ + "Routeing-Address-Resolution", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Routeing-Address-Resolution)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.153 V15.1.0 (2019-09) */ + /* Service capability exposure functionality over Ns */ + /* reference point */ + /* */ + /* From 3GPP 29153-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.153 Table 5.3.1.1: Ns specific Diameter AVPs */ + /*==================================================================*/ + + /* Network-Congestion-Area-Report, Grouped, code 4101, section 5.3.2 */ + { + struct dict_avp_data data = { + 4101, /* Code */ + 10415, /* Vendor */ + "Network-Congestion-Area-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Ns-Request-Type, Unsigned32, code 4102, section 5.3.3 */ + { + struct dict_avp_data data = { + 4102, /* Code */ + 10415, /* Vendor */ + "Ns-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.154 V15.3.0 (2019-09) */ + /* Service capability exposure functionality over */ + /* Nt reference point */ + /* */ + /* From 3GPP 29154-f30.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.154 Table 5.3.1.1: Nt specific Diameter AVPs */ + /*==================================================================*/ + + /* Network-Area-Info-List, OctetString, code 4201, section 5.3.2 */ + { + struct dict_avp_data data = { + 4201, /* Code */ + 10415, /* Vendor */ + "Network-Area-Info-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-UEs, Unsigned32, code 4209, section 5.3.10 */ + { + struct dict_avp_data data = { + 4209, /* Code */ + 10415, /* Vendor */ + "Number-Of-UEs", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reference-Id, OctetString, code 4202, section 5.3.3 */ + { + struct dict_avp_data data = { + 4202, /* Code */ + 10415, /* Vendor */ + "Reference-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transfer-Request-Type, Unsigned32, code 4203, section 5.3.4 */ + { + struct dict_avp_data data = { + 4203, /* Code */ + 10415, /* Vendor */ + "Transfer-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.345 Time-Window (3818). */ + /* Time-Window (3818) in 3GPP TS 29.345 V12.1.0 (2014-12) predates */ + /* Time-Window (4204) in 3GPP TS 29.154 V13.1.0 (2016-03). */ + /* */ + /* Fix: Time-Window (4204) renamed to Time-Window-29.154 (4204). */ + /* Time-Window-29.154, Grouped, code 4204, section 5.3.5 */ + { + struct dict_avp_data data = { + 4204, /* Code */ + 10415, /* Vendor */ + "Time-Window-29.154", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transfer-End-Time, Time, code 4205, section 5.3.6 */ + { + struct dict_avp_data data = { + 4205, /* Code */ + 10415, /* Vendor */ + "Transfer-End-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Transfer-Policy, Grouped, code 4207, section 5.3.8 */ + { + struct dict_avp_data data = { + 4207, /* Code */ + 10415, /* Vendor */ + "Transfer-Policy", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transfer-Policy-Id, Unsigned32, code 4208, section 5.3.9 */ + { + struct dict_avp_data data = { + 4208, /* Code */ + 10415, /* Vendor */ + "Transfer-Policy-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transfer-Start-Time, Time, code 4206, section 5.3.7 */ + { + struct dict_avp_data data = { + 4206, /* Code */ + 10415, /* Vendor */ + "Transfer-Start-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.154 Table A.6.3.1-1: Nta specific Diameter AVPs */ + /*==================================================================*/ + + /* Access-Network-Reports, Grouped, code 4210, section A.6.3.2 */ + { + struct dict_avp_data data = { + 4210, /* Code */ + 10415, /* Vendor */ + "Access-Network-Reports", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Configuration, Grouped, code 4211, section A.6.3.3 */ + { + struct dict_avp_data data = { + 4211, /* Code */ + 10415, /* Vendor */ + "Event-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Configuration-State, Unsigned32, code 4212, section A.6.3.4 */ + { + struct dict_avp_data data = { + 4212, /* Code */ + 10415, /* Vendor */ + "Event-Configuration-State", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Configuration-Status, Grouped, code 4213, section A.6.3.5 */ + { + struct dict_avp_data data = { + 4213, /* Code */ + 10415, /* Vendor */ + "Event-Configuration-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Reporting-Results, Unsigned32, code 4214, section A.6.3.6 */ + { + struct dict_avp_data data = { + 4214, /* Code */ + 10415, /* Vendor */ + "Event-Reporting-Results", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Reports, Grouped, code 4215, section A.6.3.7 */ + { + struct dict_avp_data data = { + 4215, /* Code */ + 10415, /* Vendor */ + "Event-Reports", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-SCEF-Reference-ID, Unsigned64, code 4216, section A.6.3.8 */ + { + struct dict_avp_data data = { + 4216, /* Code */ + 10415, /* Vendor */ + "Extended-SCEF-Reference-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.172 V15.2.0 (2019-12) */ + /* Location Services (LCS); */ + /* Evolved Packet Core (EPC) LCS Protocol (ELP) between the */ + /* Gateway Mobile Location Centre (GMLC) and the */ + /* Mobile Management Entity (MME); */ + /* SLg interface */ + /* */ + /* From 3GPP 29172-f20.docx */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.172 Table 7.4.1-1: Diameter ELP Application AVPs */ + /*==================================================================*/ + + /* SLg-Location-Type, Enumerated, code 2500, section 7.4.2 */ + { + struct dict_avp_data data = { + 2500, /* Code */ + 10415, /* Vendor */ + "SLg-Location-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SLg-Location-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* LCS-EPS-Client-Name, Grouped, code 2501, section 7.4.3 */ + { + struct dict_avp_data data = { + 2501, /* Code */ + 10415, /* Vendor */ + "LCS-EPS-Client-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Requestor-Name, Grouped, code 2502, section 7.4.4 */ + { + struct dict_avp_data data = { + 2502, /* Code */ + 10415, /* Vendor */ + "LCS-Requestor-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Priority, Unsigned32, code 2503, section 7.4.5 */ + { + struct dict_avp_data data = { + 2503, /* Code */ + 10415, /* Vendor */ + "LCS-Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-QoS, Grouped, code 2504, section 7.4.6 */ + { + struct dict_avp_data data = { + 2504, /* Code */ + 10415, /* Vendor */ + "LCS-QoS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Horizontal-Accuracy, Unsigned32, code 2505, section 7.4.7 */ + { + struct dict_avp_data data = { + 2505, /* Code */ + 10415, /* Vendor */ + "Horizontal-Accuracy", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Vertical-Accuracy, Unsigned32, code 2506, section 7.4.8 */ + { + struct dict_avp_data data = { + 2506, /* Code */ + 10415, /* Vendor */ + "Vertical-Accuracy", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Vertical-Requested, Enumerated, code 2507, section 7.4.9 */ + { + struct dict_avp_data data = { + 2507, /* Code */ + 10415, /* Vendor */ + "Vertical-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Vertical-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Velocity-Requested, Enumerated, code 2508, section 7.4.10 */ + { + struct dict_avp_data data = { + 2508, /* Code */ + 10415, /* Vendor */ + "Velocity-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Velocity-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Response-Time, Enumerated, code 2509, section 7.4.11 */ + { + struct dict_avp_data data = { + 2509, /* Code */ + 10415, /* Vendor */ + "Response-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Response-Time)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Supported-GAD-Shapes, Unsigned32, code 2510, section 7.4.12 */ + { + struct dict_avp_data data = { + 2510, /* Code */ + 10415, /* Vendor */ + "Supported-GAD-Shapes", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Codeword, UTF8String, code 2511, section 7.4.13 */ + { + struct dict_avp_data data = { + 2511, /* Code */ + 10415, /* Vendor */ + "LCS-Codeword", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* LCS-Privacy-Check, Enumerated, code 2512, section 7.4.14 */ + { + struct dict_avp_data data = { + 2512, /* Code */ + 10415, /* Vendor */ + "LCS-Privacy-Check", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LCS-Privacy-Check)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Accuracy-Fulfilment-Indicator, Enumerated, code 2513, section 7.4.15 */ + { + struct dict_avp_data data = { + 2513, /* Code */ + 10415, /* Vendor */ + "Accuracy-Fulfilment-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Accuracy-Fulfilment-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Age-Of-Location-Estimate, Unsigned32, code 2514, section 7.4.16 */ + { + struct dict_avp_data data = { + 2514, /* Code */ + 10415, /* Vendor */ + "Age-Of-Location-Estimate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Velocity-Estimate, OctetString, code 2515, section 7.4.17 */ + { + struct dict_avp_data data = { + 2515, /* Code */ + 10415, /* Vendor */ + "Velocity-Estimate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* EUTRAN-Positioning-Data, OctetString, code 2516, section 7.4.18 */ + { + struct dict_avp_data data = { + 2516, /* Code */ + 10415, /* Vendor */ + "EUTRAN-Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ECGI, OctetString, code 2517, section 7.4.19 */ + { + struct dict_avp_data data = { + 2517, /* Code */ + 10415, /* Vendor */ + "ECGI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Event, Enumerated, code 2518, section 7.4.20 */ + { + struct dict_avp_data data = { + 2518, /* Code */ + 10415, /* Vendor */ + "Location-Event", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Location-Event)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Pseudonym-Indicator, Enumerated, code 2519, section 7.4.21 */ + { + struct dict_avp_data data = { + 2519, /* Code */ + 10415, /* Vendor */ + "Pseudonym-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Pseudonym-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* LCS-Service-Type-ID, Unsigned32, code 2520, section 7.4.22 */ + { + struct dict_avp_data data = { + 2520, /* Code */ + 10415, /* Vendor */ + "LCS-Service-Type-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Privacy-Check-Non-Session, Grouped, code 2521, section 7.4.23 */ + { + struct dict_avp_data data = { + 2521, /* Code */ + 10415, /* Vendor */ + "LCS-Privacy-Check-Non-Session", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Privacy-Check-Session, Grouped, code 2522, section 7.4.24 */ + { + struct dict_avp_data data = { + 2522, /* Code */ + 10415, /* Vendor */ + "LCS-Privacy-Check-Session", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-QoS-Class, Enumerated, code 2523, section 7.4.27 */ + { + struct dict_avp_data data = { + 2523, /* Code */ + 10415, /* Vendor */ + "LCS-QoS-Class", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LCS-QoS-Class)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* GERAN-Positioning-Info, Grouped, code 2524, section 7.4.29 */ + { + struct dict_avp_data data = { + 2524, /* Code */ + 10415, /* Vendor */ + "GERAN-Positioning-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GERAN-Positioning-Data, OctetString, code 2525, section 7.4.30 */ + { + struct dict_avp_data data = { + 2525, /* Code */ + 10415, /* Vendor */ + "GERAN-Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GERAN-GANSS-Positioning-Data, OctetString, code 2526, section 7.4.31 */ + { + struct dict_avp_data data = { + 2526, /* Code */ + 10415, /* Vendor */ + "GERAN-GANSS-Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UTRAN-Positioning-Info, Grouped, code 2527, section 7.4.32 */ + { + struct dict_avp_data data = { + 2527, /* Code */ + 10415, /* Vendor */ + "UTRAN-Positioning-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UTRAN-Positioning-Data, OctetString, code 2528, section 7.4.33 */ + { + struct dict_avp_data data = { + 2528, /* Code */ + 10415, /* Vendor */ + "UTRAN-Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UTRAN-GANSS-Positioning-Data, OctetString, code 2529, section 7.4.34 */ + { + struct dict_avp_data data = { + 2529, /* Code */ + 10415, /* Vendor */ + "UTRAN-GANSS-Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LRR-Flags, Unsigned32, code 2530, section 7.4.35 */ + { + struct dict_avp_data data = { + 2530, /* Code */ + 10415, /* Vendor */ + "LRR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Reference-Number, OctetString, code 2531, section 7.4.37 */ + { + struct dict_avp_data data = { + 2531, /* Code */ + 10415, /* Vendor */ + "LCS-Reference-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Deferred-Location-Type, Unsigned32, code 2532, section 7.4.36 */ + { + struct dict_avp_data data = { + 2532, /* Code */ + 10415, /* Vendor */ + "Deferred-Location-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Area-Event-Info, Grouped, code 2533, section 7.4.38 */ + { + struct dict_avp_data data = { + 2533, /* Code */ + 10415, /* Vendor */ + "Area-Event-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Area-Definition, Grouped, code 2534, section 7.4.39 */ + { + struct dict_avp_data data = { + 2534, /* Code */ + 10415, /* Vendor */ + "Area-Definition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Area, Grouped, code 2535, section 7.4.40 */ + { + struct dict_avp_data data = { + 2535, /* Code */ + 10415, /* Vendor */ + "Area", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Area-Type, Unsigned32, code 2536, section 7.4.41 */ + { + struct dict_avp_data data = { + 2536, /* Code */ + 10415, /* Vendor */ + "Area-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Area-Identification, Grouped, code 2537, section 7.4.42 */ + { + struct dict_avp_data data = { + 2537, /* Code */ + 10415, /* Vendor */ + "Area-Identification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Occurrence-Info, Enumerated, code 2538, section 7.4.43 */ + { + struct dict_avp_data data = { + 2538, /* Code */ + 10415, /* Vendor */ + "Occurrence-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Occurrence-Info)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Interval-Time, Unsigned32, code 2539, section 7.4.44 */ + { + struct dict_avp_data data = { + 2539, /* Code */ + 10415, /* Vendor */ + "Interval-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Periodic-LDR-Information, Grouped, code 2540, section 7.4.45 */ + { + struct dict_avp_data data = { + 2540, /* Code */ + 10415, /* Vendor */ + "Periodic-LDR-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-Amount, Unsigned32, code 2541, section 7.4.46 */ + { + struct dict_avp_data data = { + 2541, /* Code */ + 10415, /* Vendor */ + "Reporting-Amount", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-Interval, Unsigned32, code 2542, section 7.4.47 */ + { + struct dict_avp_data data = { + 2542, /* Code */ + 10415, /* Vendor */ + "Reporting-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-PLMN-List, Grouped, code 2543, section 7.4.48 */ + { + struct dict_avp_data data = { + 2543, /* Code */ + 10415, /* Vendor */ + "Reporting-PLMN-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PLMN-ID-List, Grouped, code 2544, section 7.4.49 */ + { + struct dict_avp_data data = { + 2544, /* Code */ + 10415, /* Vendor */ + "PLMN-ID-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PLR-Flags, Unsigned32, code 2545, section 7.4.52 */ + { + struct dict_avp_data data = { + 2545, /* Code */ + 10415, /* Vendor */ + "PLR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PLA-Flags, Unsigned32, code 2546, section 7.4.53 */ + { + struct dict_avp_data data = { + 2546, /* Code */ + 10415, /* Vendor */ + "PLA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Deferred-MT-LR-Data, Grouped, code 2547, section 7.4.54 */ + { + struct dict_avp_data data = { + 2547, /* Code */ + 10415, /* Vendor */ + "Deferred-MT-LR-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Termination-Cause, Unsigned32, code 2548, section 7.4.55 */ + { + struct dict_avp_data data = { + 2548, /* Code */ + 10415, /* Vendor */ + "Termination-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LRA-Flags, Unsigned32, code 2549, section 7.4.56 */ + { + struct dict_avp_data data = { + 2549, /* Code */ + 10415, /* Vendor */ + "LRA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Periodic-Location-Support-Indicator, Enumerated, code 2550, section 7.4.50 */ + { + struct dict_avp_data data = { + 2550, /* Code */ + 10415, /* Vendor */ + "Periodic-Location-Support-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Periodic-Location-Support-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Prioritized-List-Indicator, Enumerated, code 2551, section 7.4.51 */ + { + struct dict_avp_data data = { + 2551, /* Code */ + 10415, /* Vendor */ + "Prioritized-List-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Prioritized-List-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ESMLC-Cell-Info, Grouped, code 2552, section 7.4.57 */ + { + struct dict_avp_data data = { + 2552, /* Code */ + 10415, /* Vendor */ + "ESMLC-Cell-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Cell-Portion-ID, Unsigned32, code 2553, section 7.4.58 */ + { + struct dict_avp_data data = { + 2553, /* Code */ + 10415, /* Vendor */ + "Cell-Portion-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 1xRTT-RCID, OctetString, code 2554, section 7.4.59 */ + { + struct dict_avp_data data = { + 2554, /* Code */ + 10415, /* Vendor */ + "1xRTT-RCID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Delayed-Location-Reporting-Data, Grouped, code 2555, section 7.4.60 */ + { + struct dict_avp_data data = { + 2555, /* Code */ + 10415, /* Vendor */ + "Delayed-Location-Reporting-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Civic-Address, UTF8String, code 2556, section 7.4.61 */ + { + struct dict_avp_data data = { + 2556, /* Code */ + 10415, /* Vendor */ + "Civic-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Barometric-Pressure, Unsigned32, code 2557, section 7.4.62 */ + { + struct dict_avp_data data = { + 2557, /* Code */ + 10415, /* Vendor */ + "Barometric-Pressure", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UTRAN-Additional-Positioning-Data, OctetString, code 2558, section 7.4.63 */ + { + struct dict_avp_data data = { + 2558, /* Code */ + 10415, /* Vendor */ + "UTRAN-Additional-Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Motion-Event-Info, Grouped, code 2559, section 7.4.64 */ + { + struct dict_avp_data data = { + 2559, /* Code */ + 10415, /* Vendor */ + "Motion-Event-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Linear-Distance, Unsigned32, code 2560, section 7.4.65 */ + { + struct dict_avp_data data = { + 2560, /* Code */ + 10415, /* Vendor */ + "Linear-Distance", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-Interval, Unsigned32, code 2561, section 7.4.66 */ + { + struct dict_avp_data data = { + 2561, /* Code */ + 10415, /* Vendor */ + "Maximum-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Sampling-Interval, Unsigned32, code 2562, section 7.4.67 */ + { + struct dict_avp_data data = { + 2562, /* Code */ + 10415, /* Vendor */ + "Sampling-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-Duration, Unsigned32, code 2563, section 7.4.68 */ + { + struct dict_avp_data data = { + 2563, /* Code */ + 10415, /* Vendor */ + "Reporting-Duration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-Location-Requirements, Unsigned32, code 2564, section 7.4.69 */ + { + struct dict_avp_data data = { + 2564, /* Code */ + 10415, /* Vendor */ + "Reporting-Location-Requirements", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Additional-Area, Grouped, code 2565, section 7.4.70 */ + { + struct dict_avp_data data = { + 2565, /* Code */ + 10415, /* Vendor */ + "Additional-Area", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.173 V15.0.0 (2018-06) */ + /* Location Services (LCS); */ + /* Diameter-based SLh interface for Control Plane LCS */ + /* */ + /* From 3GPP 29173-f00.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.173 Table 6.4.1/1: SLh specific Diameter AVPs */ + /*==================================================================*/ + + /* LMSI, OctetString, code 2400, section 6.4.2 */ + { + struct dict_avp_data data = { + 2400, /* Code */ + 10415, /* Vendor */ + "LMSI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Serving-Node, Grouped, code 2401, section 6.4.3 */ + { + struct dict_avp_data data = { + 2401, /* Code */ + 10415, /* Vendor */ + "Serving-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MME-Name, DiameterIdentity, code 2402, section 6.4.4 */ + { + struct dict_avp_data data = { + 2402, /* Code */ + 10415, /* Vendor */ + "MME-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* MSC-Number, OctetString, code 2403, section 6.4.5 */ + { + struct dict_avp_data data = { + 2403, /* Code */ + 10415, /* Vendor */ + "MSC-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Capabilities-Sets, Unsigned32, code 2404, section 6.4.6 */ + { + struct dict_avp_data data = { + 2404, /* Code */ + 10415, /* Vendor */ + "LCS-Capabilities-Sets", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GMLC-Address, Address, code 2405, section 6.4.7 */ + { + struct dict_avp_data data = { + 2405, /* Code */ + 10415, /* Vendor */ + "GMLC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Additional-Serving-Node, Grouped, code 2406, section 6.4.8 */ + { + struct dict_avp_data data = { + 2406, /* Code */ + 10415, /* Vendor */ + "Additional-Serving-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PPR-Address, Address, code 2407, section 6.4.9 */ + { + struct dict_avp_data data = { + 2407, /* Code */ + 10415, /* Vendor */ + "PPR-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* MME-Realm, DiameterIdentity, code 2408, section 6.4.12 */ + { + struct dict_avp_data data = { + 2408, /* Code */ + 10415, /* Vendor */ + "MME-Realm", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* SGSN-Name, DiameterIdentity, code 2409, section 6.4.13 */ + { + struct dict_avp_data data = { + 2409, /* Code */ + 10415, /* Vendor */ + "SGSN-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* SGSN-Realm, DiameterIdentity, code 2410, section 6.4.14 */ + { + struct dict_avp_data data = { + 2410, /* Code */ + 10415, /* Vendor */ + "SGSN-Realm", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* RIA-Flags, Unsigned32, code 2411, section 6.4.15 */ + { + struct dict_avp_data data = { + 2411, /* Code */ + 10415, /* Vendor */ + "RIA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.209 V6.8.0 (2011-09) */ + /* Policy control over Gq interface */ + /* */ + /* From 3GPP 29209-680.doc */ + /* */ + /* Replaced by 3GPP TS 29.214. */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.209 Table 6.5.1: Gq specific Diameter AVPs */ + /* Note: Only AVPs not provided by 3GPP TS 29.214. */ + /*==================================================================*/ + + /* Authorization-Token, OctetString, code 506, section 6.5.7 */ + { + struct dict_avp_data data = { + 506, /* Code */ + 10415, /* Vendor */ + "Authorization-Token", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Flow-Grouping, Grouped, code 508, section 6.5.9 */ + { + struct dict_avp_data data = { + 508, /* Code */ + 10415, /* Vendor */ + "Flow-Grouping", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.210 V6.7.0 (2006-12) */ + /* Charging rule provisioning over Gx interface */ + /* */ + /* From 3GPP 29210-670.doc */ + /* */ + /* Replaced by 3GPP TS 29.212. */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.210 Table 5.2: Gx specific Diameter AVPs */ + /* Note: Only AVPs not provided by 3GPP TS 29.212. */ + /*==================================================================*/ + + /* PDP-Session-Operation, Enumerated, code 1015, section 5.2.21 */ + { + struct dict_avp_data data = { + 1015, /* Code */ + 10415, /* Vendor */ + "PDP-Session-Operation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDP-Session-Operation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.212 V15.9.0 (2019-12) */ + /* Policy and Charging Control (PCC); Reference points */ + /* */ + /* From 3GPP 29212-f90.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.212 Table 5.3.0.1: Gx specific Diameter AVPs */ + /*==================================================================*/ + + /* Change-1.4.0: ADC-Revalidation-Time (2801) Time removed in 3GPP TS 29.212 V12.1.0 (2013-06). */ + + /* Note: Name conflict with 3GPP TS 32.299 3GPP-PS-Data-Off-Status (4406). */ + /* 3GPP TS 29.212 V14.3.0 (2017-03) CR 1559 added 3GPP-PS-Data-Off-Status (2847). */ + /* 3GPP TS 32.299 V14.3.0 (2017-03) CR 0760 added 3GPP-PS-Data-Off-Status (4406). */ + /* 3GPP-PS-Data-Off-Status, Enumerated, code 2847, section 5.3.133 */ + { + struct dict_avp_data data = { + 2847, /* Code */ + 10415, /* Vendor */ + "3GPP-PS-Data-Off-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/3GPP-PS-Data-Off-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Access-Availability-Change-Reason, Unsigned32, code 2833, section 5.3.121 */ + { + struct dict_avp_data data = { + 2833, /* Code */ + 10415, /* Vendor */ + "Access-Availability-Change-Reason", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Network-Charging-Identifier-Gx, Grouped, code 1022, section 5.3.22 */ + { + struct dict_avp_data data = { + 1022, /* Code */ + 10415, /* Vendor */ + "Access-Network-Charging-Identifier-Gx", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Allocation-Retention-Priority, Grouped, code 1034, section 5.3.32 */ + { + struct dict_avp_data data = { + 1034, /* Code */ + 10415, /* Vendor */ + "Allocation-Retention-Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AN-GW-Address, Address, code 1050, section 5.3.49 */ + { + struct dict_avp_data data = { + 1050, /* Code */ + 10415, /* Vendor */ + "AN-GW-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* AN-GW-Status, Enumerated, code 2811, section 5.3.100 */ + { + struct dict_avp_data data = { + 2811, /* Code */ + 10415, /* Vendor */ + "AN-GW-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AN-GW-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* APN-Aggregate-Max-Bitrate-DL, Unsigned32, code 1040, section 5.3.39 */ + { + struct dict_avp_data data = { + 1040, /* Code */ + 10415, /* Vendor */ + "APN-Aggregate-Max-Bitrate-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-Aggregate-Max-Bitrate-UL, Unsigned32, code 1041, section 5.3.40 */ + { + struct dict_avp_data data = { + 1041, /* Code */ + 10415, /* Vendor */ + "APN-Aggregate-Max-Bitrate-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Application-Detection-Information, Grouped, code 1098, section 5.3.91 */ + { + struct dict_avp_data data = { + 1098, /* Code */ + 10415, /* Vendor */ + "Application-Detection-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Bearer-Control-Mode, Enumerated, code 1023, section 5.3.23 */ + { + struct dict_avp_data data = { + 1023, /* Code */ + 10415, /* Vendor */ + "Bearer-Control-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Bearer-Control-Mode)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Bearer-Identifier, OctetString, code 1020, section 5.3.20 */ + { + struct dict_avp_data data = { + 1020, /* Code */ + 10415, /* Vendor */ + "Bearer-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Bearer-Operation, Enumerated, code 1021, section 5.3.21 */ + { + struct dict_avp_data data = { + 1021, /* Code */ + 10415, /* Vendor */ + "Bearer-Operation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Bearer-Operation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Bearer-Usage, Enumerated, code 1000, section 5.3.1 */ + { + struct dict_avp_data data = { + 1000, /* Code */ + 10415, /* Vendor */ + "Bearer-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Bearer-Usage)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Charging-Correlation-Indicator, Enumerated, code 1073, section 5.3.67 */ + { + struct dict_avp_data data = { + 1073, /* Code */ + 10415, /* Vendor */ + "Charging-Correlation-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charging-Correlation-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Charging-Rule-Base-Name, UTF8String, code 1004, section 5.3.5 */ + { + struct dict_avp_data data = { + 1004, /* Code */ + 10415, /* Vendor */ + "Charging-Rule-Base-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Charging-Rule-Definition, Grouped, code 1003, section 5.3.4 */ + { + struct dict_avp_data data = { + 1003, /* Code */ + 10415, /* Vendor */ + "Charging-Rule-Definition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Rule-Install, Grouped, code 1001, section 5.3.2 */ + { + struct dict_avp_data data = { + 1001, /* Code */ + 10415, /* Vendor */ + "Charging-Rule-Install", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Rule-Name, OctetString, code 1005, section 5.3.6 */ + { + struct dict_avp_data data = { + 1005, /* Code */ + 10415, /* Vendor */ + "Charging-Rule-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Rule-Remove, Grouped, code 1002, section 5.3.3 */ + { + struct dict_avp_data data = { + 1002, /* Code */ + 10415, /* Vendor */ + "Charging-Rule-Remove", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Rule-Report, Grouped, code 1018, section 5.3.18 */ + { + struct dict_avp_data data = { + 1018, /* Code */ + 10415, /* Vendor */ + "Charging-Rule-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CoA-Information, Grouped, code 1039, section 5.3.37 */ + { + struct dict_avp_data data = { + 1039, /* Code */ + 10415, /* Vendor */ + "CoA-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CoA-IP-Address, Address, code 1035, section 5.3.33 */ + { + struct dict_avp_data data = { + 1035, /* Code */ + 10415, /* Vendor */ + "CoA-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Conditional-APN-Aggregate-Max-Bitrate, Grouped, code 2818, section 5.3.105 */ + { + struct dict_avp_data data = { + 2818, /* Code */ + 10415, /* Vendor */ + "Conditional-APN-Aggregate-Max-Bitrate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Conditional-Policy-Information, Grouped, code 2840, section 5.3.128 */ + { + struct dict_avp_data data = { + 2840, /* Code */ + 10415, /* Vendor */ + "Conditional-Policy-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Credit-Management-Status, Unsigned32, code 1082, section 5.3.102 */ + { + struct dict_avp_data data = { + 1082, /* Code */ + 10415, /* Vendor */ + "Credit-Management-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CSG-Information-Reporting, Enumerated, code 1071, section 5.3.64 */ + { + struct dict_avp_data data = { + 1071, /* Code */ + 10415, /* Vendor */ + "CSG-Information-Reporting", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CSG-Information-Reporting)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Default-Access, Enumerated, code 2829, section 5.3.120 */ + { + struct dict_avp_data data = { + 2829, /* Code */ + 10415, /* Vendor */ + "Default-Access", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Default-Access)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Default-Bearer-Indication, Enumerated, code 2844, section 5.3.132 */ + { + struct dict_avp_data data = { + 2844, /* Code */ + 10415, /* Vendor */ + "Default-Bearer-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Default-Bearer-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Default-EPS-Bearer-QoS, Grouped, code 1049, section 5.3.48 */ + { + struct dict_avp_data data = { + 1049, /* Code */ + 10415, /* Vendor */ + "Default-EPS-Bearer-QoS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Default-QoS-Information, Grouped, code 2816, section 5.3.103 */ + { + struct dict_avp_data data = { + 2816, /* Code */ + 10415, /* Vendor */ + "Default-QoS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Default-QoS-Name, UTF8String, code 2817, section 5.3.104 */ + { + struct dict_avp_data data = { + 2817, /* Code */ + 10415, /* Vendor */ + "Default-QoS-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Event-Report-Indication, Grouped, code 1033, section 5.3.30 */ + { + struct dict_avp_data data = { + 1033, /* Code */ + 10415, /* Vendor */ + "Event-Report-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Trigger, Enumerated, code 1006, section 5.3.7 */ + { + struct dict_avp_data data = { + 1006, /* Code */ + 10415, /* Vendor */ + "Event-Trigger", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Event-Trigger)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Execution-Time, Time, code 2839, section 5.3.127 */ + { + struct dict_avp_data data = { + 2839, /* Code */ + 10415, /* Vendor */ + "Execution-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Extended-APN-AMBR-DL, Unsigned32, code 2848, section 5.3.134 */ + { + struct dict_avp_data data = { + 2848, /* Code */ + 10415, /* Vendor */ + "Extended-APN-AMBR-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-APN-AMBR-UL, Unsigned32, code 2849, section 5.3.135 */ + { + struct dict_avp_data data = { + 2849, /* Code */ + 10415, /* Vendor */ + "Extended-APN-AMBR-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-GBR-DL, Unsigned32, code 2850, section 5.3.136 */ + { + struct dict_avp_data data = { + 2850, /* Code */ + 10415, /* Vendor */ + "Extended-GBR-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-GBR-UL, Unsigned32, code 2851, section 5.3.137 */ + { + struct dict_avp_data data = { + 2851, /* Code */ + 10415, /* Vendor */ + "Extended-GBR-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Flow-Direction, Enumerated, code 1080, section 5.3.65 */ + { + struct dict_avp_data data = { + 1080, /* Code */ + 10415, /* Vendor */ + "Flow-Direction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Flow-Direction)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Flow-Information, Grouped, code 1058, section 5.3.53 */ + { + struct dict_avp_data data = { + 1058, /* Code */ + 10415, /* Vendor */ + "Flow-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Flow-Label, OctetString, code 1057, section 5.3.52 */ + { + struct dict_avp_data data = { + 1057, /* Code */ + 10415, /* Vendor */ + "Flow-Label", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Fixed-User-Location-Info, Grouped, code 2825, section 5.3.112 */ + { + struct dict_avp_data data = { + 2825, /* Code */ + 10415, /* Vendor */ + "Fixed-User-Location-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Guaranteed-Bitrate-DL, Unsigned32, code 1025, section 5.3.25 */ + { + struct dict_avp_data data = { + 1025, /* Code */ + 10415, /* Vendor */ + "Guaranteed-Bitrate-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Guaranteed-Bitrate-UL, Unsigned32, code 1026, section 5.3.26 */ + { + struct dict_avp_data data = { + 1026, /* Code */ + 10415, /* Vendor */ + "Guaranteed-Bitrate-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: HeNB-BBF-FQDN (2803) UTF8String removed in 3GPP TS 29.212 V11.8.0 (2013-03). */ + + /* HeNB-Local-IP-Address, Address, code 2804, section 5.3.95 */ + { + struct dict_avp_data data = { + 2804, /* Code */ + 10415, /* Vendor */ + "HeNB-Local-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* IP-CAN-Session-Charging-Scope, Enumerated, code 2827, section 5.3.114 */ + { + struct dict_avp_data data = { + 2827, /* Code */ + 10415, /* Vendor */ + "IP-CAN-Session-Charging-Scope", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IP-CAN-Session-Charging-Scope)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* IP-CAN-Type, Enumerated, code 1027, section 5.3.27 */ + { + struct dict_avp_data data = { + 1027, /* Code */ + 10415, /* Vendor */ + "IP-CAN-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IP-CAN-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: 3GPP TS 29.212 Table 5.3.0.1 row Max-PLR-DL (2852) */ + /* incorrectly lists type as Unsigned32 instead of Float32. */ + /* 3GPP TS 29.212 clause 5.3.138 uses Float32. */ + /* */ + /* Fix: Max-PLR-DL (2852) type changed from Float32 to Unsigned32. */ + /* Max-PLR-DL, Unsigned32, code 2852, section 5.3.138 */ + { + struct dict_avp_data data = { + 2852, /* Code */ + 10415, /* Vendor */ + "Max-PLR-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.212 Table 5.3.0.1 row Max-PLR-UL (2853) */ + /* incorrectly lists type as Unsigned32 instead of Float32. */ + /* 3GPP TS 29.212 clause 5.3.139 uses Float32. */ + /* */ + /* Fix: Max-PLR-UL (2853) type changed from Float32 to Unsigned32. */ + /* Max-PLR-UL, Unsigned32, code 2853, section 5.3.139 */ + { + struct dict_avp_data data = { + 2853, /* Code */ + 10415, /* Vendor */ + "Max-PLR-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Metering-Method, Enumerated, code 1007, section 5.3.8 */ + { + struct dict_avp_data data = { + 1007, /* Code */ + 10415, /* Vendor */ + "Metering-Method", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Metering-Method)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Monitoring-Flags, Unsigned32, code 2828, section 5.3.115 */ + { + struct dict_avp_data data = { + 2828, /* Code */ + 10415, /* Vendor */ + "Monitoring-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Key, OctetString, code 1066, section 5.3.59 */ + { + struct dict_avp_data data = { + 1066, /* Code */ + 10415, /* Vendor */ + "Monitoring-Key", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Mute-Notification, Enumerated, code 2809, section 5.3.98 */ + { + struct dict_avp_data data = { + 2809, /* Code */ + 10415, /* Vendor */ + "Mute-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Mute-Notification)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Monitoring-Time, Time, code 2810, section 5.3.99 */ + { + struct dict_avp_data data = { + 2810, /* Code */ + 10415, /* Vendor */ + "Monitoring-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* NBIFOM-Mode, Enumerated, code 2830, section 5.3.117 */ + { + struct dict_avp_data data = { + 2830, /* Code */ + 10415, /* Vendor */ + "NBIFOM-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/NBIFOM-Mode)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* NBIFOM-Support, Enumerated, code 2831, section 5.3.116 */ + { + struct dict_avp_data data = { + 2831, /* Code */ + 10415, /* Vendor */ + "NBIFOM-Support", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/NBIFOM-Support)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* NetLoc-Access-Support, Unsigned32, code 2824, section 5.3.111 */ + { + struct dict_avp_data data = { + 2824, /* Code */ + 10415, /* Vendor */ + "NetLoc-Access-Support", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Network-Request-Support, Enumerated, code 1024, section 5.3.24 */ + { + struct dict_avp_data data = { + 1024, /* Code */ + 10415, /* Vendor */ + "Network-Request-Support", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Network-Request-Support)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Offline, Enumerated, code 1008, section 5.3.9 */ + { + struct dict_avp_data data = { + 1008, /* Code */ + 10415, /* Vendor */ + "Offline", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Offline)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Online, Enumerated, code 1009, section 5.3.10 */ + { + struct dict_avp_data data = { + 1009, /* Code */ + 10415, /* Vendor */ + "Online", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Online)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Packet-Filter-Content, IPFilterRule, code 1059, section 5.3.54 */ + { + struct dict_avp_data data = { + 1059, /* Code */ + 10415, /* Vendor */ + "Packet-Filter-Content", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); + }; + + /* Packet-Filter-Identifier, OctetString, code 1060, section 5.3.55 */ + { + struct dict_avp_data data = { + 1060, /* Code */ + 10415, /* Vendor */ + "Packet-Filter-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Packet-Filter-Information, Grouped, code 1061, section 5.3.56 */ + { + struct dict_avp_data data = { + 1061, /* Code */ + 10415, /* Vendor */ + "Packet-Filter-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Packet-Filter-Operation, Enumerated, code 1062, section 5.3.57 */ + { + struct dict_avp_data data = { + 1062, /* Code */ + 10415, /* Vendor */ + "Packet-Filter-Operation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Packet-Filter-Operation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Packet-Filter-Usage, Enumerated, code 1072, section 5.3.66 */ + { + struct dict_avp_data data = { + 1072, /* Code */ + 10415, /* Vendor */ + "Packet-Filter-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Packet-Filter-Usage)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PCC-Rule-Status, Enumerated, code 1019, section 5.3.19 */ + { + struct dict_avp_data data = { + 1019, /* Code */ + 10415, /* Vendor */ + "PCC-Rule-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PCC-Rule-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: 3GPP TS 29.212 Table 5.3.0.1 row PDN-Connection-ID (1065) */ + /* missing M, assume MUST NOT. */ + /* */ + /* Change-1.4.0: PDN-Connection-ID (1065) flag M MUST NOT. */ + /* PDN-Connection-ID, OctetString, code 1065, section 5.3.58 */ + { + struct dict_avp_data data = { + 1065, /* Code */ + 10415, /* Vendor */ + "PDN-Connection-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PRA-Install, Grouped, code 2845, section 5.3.130 */ + { + struct dict_avp_data data = { + 2845, /* Code */ + 10415, /* Vendor */ + "PRA-Install", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PRA-Remove, Grouped, code 2846, section 5.3.131 */ + { + struct dict_avp_data data = { + 2846, /* Code */ + 10415, /* Vendor */ + "PRA-Remove", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Precedence, Unsigned32, code 1010, section 5.3.11 */ + { + struct dict_avp_data data = { + 1010, /* Code */ + 10415, /* Vendor */ + "Precedence", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Pre-emption-Capability, Enumerated, code 1047, section 5.3.46 */ + { + struct dict_avp_data data = { + 1047, /* Code */ + 10415, /* Vendor */ + "Pre-emption-Capability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Pre-emption-Capability)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Pre-emption-Vulnerability, Enumerated, code 1048, section 5.3.47 */ + { + struct dict_avp_data data = { + 1048, /* Code */ + 10415, /* Vendor */ + "Pre-emption-Vulnerability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Pre-emption-Vulnerability)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Presence-Reporting-Area-Elements-List, OctetString, code 2820, section 5.3.107 */ + { + struct dict_avp_data data = { + 2820, /* Code */ + 10415, /* Vendor */ + "Presence-Reporting-Area-Elements-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Presence-Reporting-Area-Identifier, OctetString, code 2821, section 5.3.108 */ + { + struct dict_avp_data data = { + 2821, /* Code */ + 10415, /* Vendor */ + "Presence-Reporting-Area-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Presence-Reporting-Area-Information, Grouped, code 2822, section 5.3.109 */ + { + struct dict_avp_data data = { + 2822, /* Code */ + 10415, /* Vendor */ + "Presence-Reporting-Area-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Presence-Reporting-Area-Node, Unsigned32, code 2855, section 5.3.141 */ + { + struct dict_avp_data data = { + 2855, /* Code */ + 10415, /* Vendor */ + "Presence-Reporting-Area-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Presence-Reporting-Area-Status, Unsigned32, code 2823, section 5.3.110 */ + { + struct dict_avp_data data = { + 2823, /* Code */ + 10415, /* Vendor */ + "Presence-Reporting-Area-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Priority-Level, Unsigned32, code 1046, section 5.3.45 */ + { + struct dict_avp_data data = { + 1046, /* Code */ + 10415, /* Vendor */ + "Priority-Level", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.212 Table 5.3.0.1 row PS-to-CS-Session-Continuity (1099) */ + /* missing M, assume MUST NOT. */ + /* */ + /* Change-1.4.0: PS-to-CS-Session-Continuity (1099) flag M MUST NOT. */ + /* PS-to-CS-Session-Continuity, Enumerated, code 1099, section 5.3.84 */ + { + struct dict_avp_data data = { + 1099, /* Code */ + 10415, /* Vendor */ + "PS-to-CS-Session-Continuity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PS-to-CS-Session-Continuity)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* QoS-Class-Identifier, Enumerated, code 1028, section 5.3.17 */ + { + struct dict_avp_data data = { + 1028, /* Code */ + 10415, /* Vendor */ + "QoS-Class-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/QoS-Class-Identifier)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* QoS-Information, Grouped, code 1016, section 5.3.16 */ + { + struct dict_avp_data data = { + 1016, /* Code */ + 10415, /* Vendor */ + "QoS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* QoS-Negotiation, Enumerated, code 1029, section 5.3.28 */ + { + struct dict_avp_data data = { + 1029, /* Code */ + 10415, /* Vendor */ + "QoS-Negotiation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/QoS-Negotiation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* QoS-Upgrade, Enumerated, code 1030, section 5.3.29 */ + { + struct dict_avp_data data = { + 1030, /* Code */ + 10415, /* Vendor */ + "QoS-Upgrade", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/QoS-Upgrade)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* RAN-NAS-Release-Cause, OctetString, code 2819, section 5.3.106 */ + { + struct dict_avp_data data = { + 2819, /* Code */ + 10415, /* Vendor */ + "RAN-NAS-Release-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RAN-Rule-Support, Unsigned32, code 2832, section 5.3.122 */ + { + struct dict_avp_data data = { + 2832, /* Code */ + 10415, /* Vendor */ + "RAN-Rule-Support", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RAT-Type, Enumerated, code 1032, section 5.3.31 */ + { + struct dict_avp_data data = { + 1032, /* Code */ + 10415, /* Vendor */ + "RAT-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/RAT-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Redirect-Information, Grouped, code 1085, section 5.3.82 */ + { + struct dict_avp_data data = { + 1085, /* Code */ + 10415, /* Vendor */ + "Redirect-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Redirect-Support, Enumerated, code 1086, section 5.3.83 */ + { + struct dict_avp_data data = { + 1086, /* Code */ + 10415, /* Vendor */ + "Redirect-Support", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Redirect-Support)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Removal-Of-Access, Enumerated, code 2842, section 5.3.126 */ + { + struct dict_avp_data data = { + 2842, /* Code */ + 10415, /* Vendor */ + "Removal-Of-Access", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Removal-Of-Access)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Reporting-Level, Enumerated, code 1011, section 5.3.12 */ + { + struct dict_avp_data data = { + 1011, /* Code */ + 10415, /* Vendor */ + "Reporting-Level", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reporting-Level)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Resource-Allocation-Notification, Enumerated, code 1063, section 5.3.50 */ + { + struct dict_avp_data data = { + 1063, /* Code */ + 10415, /* Vendor */ + "Resource-Allocation-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Resource-Allocation-Notification)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Resource-Release-Notification, Enumerated, code 2841, section 5.3.125 */ + { + struct dict_avp_data data = { + 2841, /* Code */ + 10415, /* Vendor */ + "Resource-Release-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Resource-Release-Notification)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Revalidation-Time, Time, code 1042, section 5.3.41 */ + { + struct dict_avp_data data = { + 1042, /* Code */ + 10415, /* Vendor */ + "Revalidation-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Routing-Filter, Grouped, code 1078, section 5.3.72 */ + { + struct dict_avp_data data = { + 1078, /* Code */ + 10415, /* Vendor */ + "Routing-Filter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-IP-Address, Address, code 1079, section 5.3.73 */ + { + struct dict_avp_data data = { + 1079, /* Code */ + 10415, /* Vendor */ + "Routing-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Routing-Rule-Definition, Grouped, code 1076, section 5.3.70 */ + { + struct dict_avp_data data = { + 1076, /* Code */ + 10415, /* Vendor */ + "Routing-Rule-Definition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-Rule-Identifier, OctetString, code 1077, section 5.3.71 */ + { + struct dict_avp_data data = { + 1077, /* Code */ + 10415, /* Vendor */ + "Routing-Rule-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-Rule-Install, Grouped, code 1081, section 5.3.68 */ + { + struct dict_avp_data data = { + 1081, /* Code */ + 10415, /* Vendor */ + "Routing-Rule-Install", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-Rule-Remove, Grouped, code 1075, section 5.3.69 */ + { + struct dict_avp_data data = { + 1075, /* Code */ + 10415, /* Vendor */ + "Routing-Rule-Remove", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-Rule-Failure-Code, Unsigned32, code 2834, section 5.3.119 */ + { + struct dict_avp_data data = { + 2834, /* Code */ + 10415, /* Vendor */ + "Routing-Rule-Failure-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-Rule-Report, Grouped, code 2835, section 5.3.118 */ + { + struct dict_avp_data data = { + 2835, /* Code */ + 10415, /* Vendor */ + "Routing-Rule-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Rule-Activation-Time, Time, code 1043, section 5.3.42 */ + { + struct dict_avp_data data = { + 1043, /* Code */ + 10415, /* Vendor */ + "Rule-Activation-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Rule-Deactivation-Time, Time, code 1044, section 5.3.43 */ + { + struct dict_avp_data data = { + 1044, /* Code */ + 10415, /* Vendor */ + "Rule-Deactivation-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Rule-Failure-Code, Enumerated, code 1031, section 5.3.38 */ + { + struct dict_avp_data data = { + 1031, /* Code */ + 10415, /* Vendor */ + "Rule-Failure-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Rule-Failure-Code)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Security-Parameter-Index, OctetString, code 1056, section 5.3.51 */ + { + struct dict_avp_data data = { + 1056, /* Code */ + 10415, /* Vendor */ + "Security-Parameter-Index", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Session-Release-Cause, Enumerated, code 1045, section 5.3.44 */ + { + struct dict_avp_data data = { + 1045, /* Code */ + 10415, /* Vendor */ + "Session-Release-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Release-Cause)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* TCP-Source-Port, Unsigned32, code 2843, section 5.3.129 */ + { + struct dict_avp_data data = { + 2843, /* Code */ + 10415, /* Vendor */ + "TCP-Source-Port", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TDF-Information, Grouped, code 1087, section 5.3.78 */ + { + struct dict_avp_data data = { + 1087, /* Code */ + 10415, /* Vendor */ + "TDF-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TDF-Application-Identifier, OctetString, code 1088, section 5.3.77 */ + { + struct dict_avp_data data = { + 1088, /* Code */ + 10415, /* Vendor */ + "TDF-Application-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TDF-Application-Instance-Identifier, OctetString, code 2802, section 5.3.92 */ + { + struct dict_avp_data data = { + 2802, /* Code */ + 10415, /* Vendor */ + "TDF-Application-Instance-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TDF-Destination-Host, DiameterIdentity, code 1089, section 5.3.80 */ + { + struct dict_avp_data data = { + 1089, /* Code */ + 10415, /* Vendor */ + "TDF-Destination-Host", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* TDF-Destination-Realm, DiameterIdentity, code 1090, section 5.3.79 */ + { + struct dict_avp_data data = { + 1090, /* Code */ + 10415, /* Vendor */ + "TDF-Destination-Realm", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* TDF-IP-Address, Address, code 1091, section 5.3.81 */ + { + struct dict_avp_data data = { + 1091, /* Code */ + 10415, /* Vendor */ + "TDF-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* TFT-Filter, IPFilterRule, code 1012, section 5.3.13 */ + { + struct dict_avp_data data = { + 1012, /* Code */ + 10415, /* Vendor */ + "TFT-Filter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); + }; + + /* TFT-Packet-Filter-Information, Grouped, code 1013, section 5.3.14 */ + { + struct dict_avp_data data = { + 1013, /* Code */ + 10415, /* Vendor */ + "TFT-Packet-Filter-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Traffic-Steering-Policy-Identifier-DL, OctetString, code 2836, section 5.3.123 */ + { + struct dict_avp_data data = { + 2836, /* Code */ + 10415, /* Vendor */ + "Traffic-Steering-Policy-Identifier-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Traffic-Steering-Policy-Identifier-UL, OctetString, code 2837, section 5.3.124 */ + { + struct dict_avp_data data = { + 2837, /* Code */ + 10415, /* Vendor */ + "Traffic-Steering-Policy-Identifier-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ToS-Traffic-Class, OctetString, code 1014, section 5.3.15 */ + { + struct dict_avp_data data = { + 1014, /* Code */ + 10415, /* Vendor */ + "ToS-Traffic-Class", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Tunnel-Header-Filter, IPFilterRule, code 1036, section 5.3.34 */ + { + struct dict_avp_data data = { + 1036, /* Code */ + 10415, /* Vendor */ + "Tunnel-Header-Filter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); + }; + + /* Tunnel-Header-Length, Unsigned32, code 1037, section 5.3.35 */ + { + struct dict_avp_data data = { + 1037, /* Code */ + 10415, /* Vendor */ + "Tunnel-Header-Length", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Tunnel-Information, Grouped, code 1038, section 5.3.36 */ + { + struct dict_avp_data data = { + 1038, /* Code */ + 10415, /* Vendor */ + "Tunnel-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UDP-Source-Port, Unsigned32, code 2806, section 5.3.97 */ + { + struct dict_avp_data data = { + 2806, /* Code */ + 10415, /* Vendor */ + "UDP-Source-Port", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UE-Local-IP-Address, Address, code 2805, section 5.3.96 */ + { + struct dict_avp_data data = { + 2805, /* Code */ + 10415, /* Vendor */ + "UE-Local-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* UE-Status, Unsigned32, code 2854, section 5.3.140 */ + { + struct dict_avp_data data = { + 2854, /* Code */ + 10415, /* Vendor */ + "UE-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Usage-Monitoring-Information, Grouped, code 1067, section 5.3.60 */ + { + struct dict_avp_data data = { + 1067, /* Code */ + 10415, /* Vendor */ + "Usage-Monitoring-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Usage-Monitoring-Level, Enumerated, code 1068, section 5.3.61 */ + { + struct dict_avp_data data = { + 1068, /* Code */ + 10415, /* Vendor */ + "Usage-Monitoring-Level", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Usage-Monitoring-Level)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Usage-Monitoring-Report, Enumerated, code 1069, section 5.3.62 */ + { + struct dict_avp_data data = { + 1069, /* Code */ + 10415, /* Vendor */ + "Usage-Monitoring-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Usage-Monitoring-Report)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Usage-Monitoring-Support, Enumerated, code 1070, section 5.3.63 */ + { + struct dict_avp_data data = { + 1070, /* Code */ + 10415, /* Vendor */ + "Usage-Monitoring-Support", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Usage-Monitoring-Support)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* User-Location-Info-Time, Time, code 2812, section 5.3.101 */ + { + struct dict_avp_data data = { + 2812, /* Code */ + 10415, /* Vendor */ + "User-Location-Info-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* PCSCF-Restoration-Indication, Unsigned32, code 2826, section 5.3.113 */ + { + struct dict_avp_data data = { + 2826, /* Code */ + 10415, /* Vendor */ + "PCSCF-Restoration-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.212 Table 5a.3.0.1: Gxx specific Diameter AVPs */ + /*==================================================================*/ + + /* QoS-Rule-Install, Grouped, code 1051, section 5a.3.1 */ + { + struct dict_avp_data data = { + 1051, /* Code */ + 10415, /* Vendor */ + "QoS-Rule-Install", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* QoS-Rule-Remove, Grouped, code 1052, section 5a.3.2 */ + { + struct dict_avp_data data = { + 1052, /* Code */ + 10415, /* Vendor */ + "QoS-Rule-Remove", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* QoS-Rule-Definition, Grouped, code 1053, section 5a.3.3 */ + { + struct dict_avp_data data = { + 1053, /* Code */ + 10415, /* Vendor */ + "QoS-Rule-Definition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* QoS-Rule-Name, OctetString, code 1054, section 5a.3.4 */ + { + struct dict_avp_data data = { + 1054, /* Code */ + 10415, /* Vendor */ + "QoS-Rule-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* QoS-Rule-Base-Name, UTF8String, code 1074, section 5a.3.7 */ + { + struct dict_avp_data data = { + 1074, /* Code */ + 10415, /* Vendor */ + "QoS-Rule-Base-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* QoS-Rule-Report, Grouped, code 1055, section 5a.3.5 */ + { + struct dict_avp_data data = { + 1055, /* Code */ + 10415, /* Vendor */ + "QoS-Rule-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Session-Linking-Indicator, Enumerated, code 1064, section 5a.3.6 */ + { + struct dict_avp_data data = { + 1064, /* Code */ + 10415, /* Vendor */ + "Session-Linking-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Linking-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.212 Table 5b.3.0.1: Sd specific Diameter AVPs */ + /*==================================================================*/ + + /* Change-1.4.0: ADC-Rule-Base-Name (1095) flag M MUST. */ + /* ADC-Rule-Base-Name, UTF8String, code 1095, section 5b.3.4 */ + { + struct dict_avp_data data = { + 1095, /* Code */ + 10415, /* Vendor */ + "ADC-Rule-Base-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Change-1.4.0: ADC-Rule-Definition (1094) flag M MUST. */ + /* ADC-Rule-Definition, Grouped, code 1094, section 5b.3.3 */ + { + struct dict_avp_data data = { + 1094, /* Code */ + 10415, /* Vendor */ + "ADC-Rule-Definition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-1.4.0: ADC-Rule-Install (1092) flag M MUST. */ + /* ADC-Rule-Install, Grouped, code 1092, section 5b.3.1 */ + { + struct dict_avp_data data = { + 1092, /* Code */ + 10415, /* Vendor */ + "ADC-Rule-Install", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-1.4.0: ADC-Rule-Name (1096) flag M MUST. */ + /* ADC-Rule-Name, OctetString, code 1096, section 5b.3.5 */ + { + struct dict_avp_data data = { + 1096, /* Code */ + 10415, /* Vendor */ + "ADC-Rule-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-1.4.0: ADC-Rule-Remove (1093) flag M MUST. */ + /* ADC-Rule-Remove, Grouped, code 1093, section 5b.3.2 */ + { + struct dict_avp_data data = { + 1093, /* Code */ + 10415, /* Vendor */ + "ADC-Rule-Remove", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-1.4.0: ADC-Rule-Report (1097) flag M MUST. */ + /* ADC-Rule-Report, Grouped, code 1097, section 5b.3.6 */ + { + struct dict_avp_data data = { + 1097, /* Code */ + 10415, /* Vendor */ + "ADC-Rule-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.212 Table 5c.3.1.1: St specific Diameter AVPs */ + /*==================================================================*/ + + /* Request-Type, Unsigned32, code 2838, section 5c.3.2 */ + { + struct dict_avp_data data = { + 2838, /* Code */ + 10415, /* Vendor */ + "Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.212 Table E.6.3.1.1: S15 specific Diameter AVPs */ + /*==================================================================*/ + + /* CS-Service-Qos-Request-Identifier, OctetString, code 2807, section E.6.3.2 */ + { + struct dict_avp_data data = { + 2807, /* Code */ + 10415, /* Vendor */ + "CS-Service-Qos-Request-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CS-Service-QoS-Request-Operation, Enumerated, code 2808, section E.6.3.3 */ + { + struct dict_avp_data data = { + 2808, /* Code */ + 10415, /* Vendor */ + "CS-Service-QoS-Request-Operation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CS-Service-QoS-Request-Operation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* CS-Service-Resource-Report, Grouped, code 2813, section E.6.3.6 */ + { + struct dict_avp_data data = { + 2813, /* Code */ + 10415, /* Vendor */ + "CS-Service-Resource-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CS-Service-Resource-Failure-Cause, Enumerated, code 2814, section E.6.3.5 */ + { + struct dict_avp_data data = { + 2814, /* Code */ + 10415, /* Vendor */ + "CS-Service-Resource-Failure-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CS-Service-Resource-Failure-Cause)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* CS-Service-Resource-Result-Operation, Enumerated, code 2815, section E.6.3.4 */ + { + struct dict_avp_data data = { + 2815, /* Code */ + 10415, /* Vendor */ + "CS-Service-Resource-Result-Operation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CS-Service-Resource-Result-Operation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.214 V15.7.0 (2019-09) */ + /* Policy and Charging Control over Rx reference point */ + /* */ + /* From 3GPP 29214-f70.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.214 Table 5.3.0.1: Rx specific Diameter AVPs */ + /*==================================================================*/ + + /* Abort-Cause, Enumerated, code 500, section 5.3.1 */ + { + struct dict_avp_data data = { + 500, /* Code */ + 10415, /* Vendor */ + "Abort-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Abort-Cause)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Access-Network-Charging-Address, Address, code 501, section 5.3.2 */ + { + struct dict_avp_data data = { + 501, /* Code */ + 10415, /* Vendor */ + "Access-Network-Charging-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Access-Network-Charging-Identifier, Grouped, code 502, section 5.3.3 */ + { + struct dict_avp_data data = { + 502, /* Code */ + 10415, /* Vendor */ + "Access-Network-Charging-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Network-Charging-Identifier-Value, OctetString, code 503, section 5.3.4 */ + { + struct dict_avp_data data = { + 503, /* Code */ + 10415, /* Vendor */ + "Access-Network-Charging-Identifier-Value", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Acceptable-Service-Info, Grouped, code 526, section 5.3.24 */ + { + struct dict_avp_data data = { + 526, /* Code */ + 10415, /* Vendor */ + "Acceptable-Service-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AF-Application-Identifier, OctetString, code 504, section 5.3.5 */ + { + struct dict_avp_data data = { + 504, /* Code */ + 10415, /* Vendor */ + "AF-Application-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AF-Charging-Identifier, OctetString, code 505, section 5.3.6 */ + { + struct dict_avp_data data = { + 505, /* Code */ + 10415, /* Vendor */ + "AF-Charging-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AF-Requested-Data, Unsigned32, code 551, section 5.3.50 */ + { + struct dict_avp_data data = { + 551, /* Code */ + 10415, /* Vendor */ + "AF-Requested-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AF-Signalling-Protocol, Enumerated, code 529, section 5.3.26 */ + { + struct dict_avp_data data = { + 529, /* Code */ + 10415, /* Vendor */ + "AF-Signalling-Protocol", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AF-Signalling-Protocol)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Application-Service-Provider-Identity, UTF8String, code 532, section 5.3.29 */ + { + struct dict_avp_data data = { + 532, /* Code */ + 10415, /* Vendor */ + "Application-Service-Provider-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Codec-Data, OctetString, code 524, section 5.3.7 */ + { + struct dict_avp_data data = { + 524, /* Code */ + 10415, /* Vendor */ + "Codec-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Content-Version, Unsigned64, code 552, section 5.3.49 */ + { + struct dict_avp_data data = { + 552, /* Code */ + 10415, /* Vendor */ + "Content-Version", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Max-Requested-BW-DL, Unsigned32, code 554, section 5.3.52 */ + { + struct dict_avp_data data = { + 554, /* Code */ + 10415, /* Vendor */ + "Extended-Max-Requested-BW-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Max-Requested-BW-UL, Unsigned32, code 555, section 5.3.53 */ + { + struct dict_avp_data data = { + 555, /* Code */ + 10415, /* Vendor */ + "Extended-Max-Requested-BW-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Max-Supported-BW-DL, Unsigned32, code 556, section 5.3.54 */ + { + struct dict_avp_data data = { + 556, /* Code */ + 10415, /* Vendor */ + "Extended-Max-Supported-BW-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Max-Supported-BW-UL, Unsigned32, code 557, section 5.3.55 */ + { + struct dict_avp_data data = { + 557, /* Code */ + 10415, /* Vendor */ + "Extended-Max-Supported-BW-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Min-Desired-BW-DL, Unsigned32, code 558, section 5.3.56 */ + { + struct dict_avp_data data = { + 558, /* Code */ + 10415, /* Vendor */ + "Extended-Min-Desired-BW-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Min-Desired-BW-UL, Unsigned32, code 559, section 5.3.57 */ + { + struct dict_avp_data data = { + 559, /* Code */ + 10415, /* Vendor */ + "Extended-Min-Desired-BW-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Min-Requested-BW-DL, Unsigned32, code 560, section 5.3.58 */ + { + struct dict_avp_data data = { + 560, /* Code */ + 10415, /* Vendor */ + "Extended-Min-Requested-BW-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-Min-Requested-BW-UL, Unsigned32, code 561, section 5.3.59 */ + { + struct dict_avp_data data = { + 561, /* Code */ + 10415, /* Vendor */ + "Extended-Min-Requested-BW-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Flow-Description, IPFilterRule, code 507, section 5.3.8 */ + { + struct dict_avp_data data = { + 507, /* Code */ + 10415, /* Vendor */ + "Flow-Description", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); + }; + + /* Flow-Number, Unsigned32, code 509, section 5.3.9 */ + { + struct dict_avp_data data = { + 509, /* Code */ + 10415, /* Vendor */ + "Flow-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Flows, Grouped, code 510, section 5.3.10 */ + { + struct dict_avp_data data = { + 510, /* Code */ + 10415, /* Vendor */ + "Flows", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Flow-Status, Enumerated, code 511, section 5.3.11 */ + { + struct dict_avp_data data = { + 511, /* Code */ + 10415, /* Vendor */ + "Flow-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Flow-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Flow-Usage, Enumerated, code 512, section 5.3.12 */ + { + struct dict_avp_data data = { + 512, /* Code */ + 10415, /* Vendor */ + "Flow-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Flow-Usage)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* GCS-Identifier, OctetString, code 538, section 5.3.36 */ + { + struct dict_avp_data data = { + 538, /* Code */ + 10415, /* Vendor */ + "GCS-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.214 Table 5.3.0.1 row IMS-Content-Identifier (563) */ + /* missing M, assume MUST NOT. */ + /* */ + /* Fix: IMS-Content-Identifier (563) flag M MUST NOT. */ + /* IMS-Content-Identifier, OctetString, code 563, section 5.3.60 */ + { + struct dict_avp_data data = { + 563, /* Code */ + 10415, /* Vendor */ + "IMS-Content-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.214 Table 5.3.0.1 row IMS-Content (564) */ + /* missing M, assume MUST NOT. */ + /* */ + /* Fix: IMS-Content (564) flag M MUST NOT. */ + /* IMS-Content-Type, Enumerated, code 564, section 5.3.61 */ + { + struct dict_avp_data data = { + 564, /* Code */ + 10415, /* Vendor */ + "IMS-Content-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMS-Content-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* IP-Domain-Id, OctetString, code 537, section 5.3.35 */ + { + struct dict_avp_data data = { + 537, /* Code */ + 10415, /* Vendor */ + "IP-Domain-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Max-Requested-Bandwidth-DL, Unsigned32, code 515, section 5.3.14 */ + { + struct dict_avp_data data = { + 515, /* Code */ + 10415, /* Vendor */ + "Max-Requested-Bandwidth-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Max-Requested-Bandwidth-UL, Unsigned32, code 516, section 5.3.15 */ + { + struct dict_avp_data data = { + 516, /* Code */ + 10415, /* Vendor */ + "Max-Requested-Bandwidth-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Max-Supported-Bandwidth-DL, Unsigned32, code 543, section 5.3.41 */ + { + struct dict_avp_data data = { + 543, /* Code */ + 10415, /* Vendor */ + "Max-Supported-Bandwidth-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Max-Supported-Bandwidth-UL, Unsigned32, code 544, section 5.3.42 */ + { + struct dict_avp_data data = { + 544, /* Code */ + 10415, /* Vendor */ + "Max-Supported-Bandwidth-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MCPTT-Identifier, OctetString, code 547, section 5.3.45 */ + { + struct dict_avp_data data = { + 547, /* Code */ + 10415, /* Vendor */ + "MCPTT-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MCVideo-Identifier, OctetString, code 562, section 5.3.45a */ + { + struct dict_avp_data data = { + 562, /* Code */ + 10415, /* Vendor */ + "MCVideo-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Media-Component-Description, Grouped, code 517, section 5.3.16 */ + { + struct dict_avp_data data = { + 517, /* Code */ + 10415, /* Vendor */ + "Media-Component-Description", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Media-Component-Number, Unsigned32, code 518, section 5.3.17 */ + { + struct dict_avp_data data = { + 518, /* Code */ + 10415, /* Vendor */ + "Media-Component-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Media-Component-Status, Unsigned32, code 549, section 5.3.48 */ + { + struct dict_avp_data data = { + 549, /* Code */ + 10415, /* Vendor */ + "Media-Component-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Media-Sub-Component, Grouped, code 519, section 5.3.18 */ + { + struct dict_avp_data data = { + 519, /* Code */ + 10415, /* Vendor */ + "Media-Sub-Component", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Media-Type, Enumerated, code 520, section 5.3.19 */ + { + struct dict_avp_data data = { + 520, /* Code */ + 10415, /* Vendor */ + "Media-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Media-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MPS-Identifier, OctetString, code 528, section 5.3.30 */ + { + struct dict_avp_data data = { + 528, /* Code */ + 10415, /* Vendor */ + "MPS-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Min-Desired-Bandwidth-DL, Unsigned32, code 545, section 5.3.43 */ + { + struct dict_avp_data data = { + 545, /* Code */ + 10415, /* Vendor */ + "Min-Desired-Bandwidth-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Min-Desired-Bandwidth-UL, Unsigned32, code 546, section 5.3.44 */ + { + struct dict_avp_data data = { + 546, /* Code */ + 10415, /* Vendor */ + "Min-Desired-Bandwidth-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Min-Requested-Bandwidth-DL, Unsigned32, code 534, section 5.3.32 */ + { + struct dict_avp_data data = { + 534, /* Code */ + 10415, /* Vendor */ + "Min-Requested-Bandwidth-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Min-Requested-Bandwidth-UL, Unsigned32, code 535, section 5.3.33 */ + { + struct dict_avp_data data = { + 535, /* Code */ + 10415, /* Vendor */ + "Min-Requested-Bandwidth-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Priority-Sharing-Indicator, Enumerated, code 550, section 5.3.47 */ + { + struct dict_avp_data data = { + 550, /* Code */ + 10415, /* Vendor */ + "Priority-Sharing-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Priority-Sharing-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Pre-emption-Control-Info, Unsigned32, code 553, section 5.3.51 */ + { + struct dict_avp_data data = { + 553, /* Code */ + 10415, /* Vendor */ + "Pre-emption-Control-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Required-Access-Info, Enumerated, code 536, section 5.3.34 */ + { + struct dict_avp_data data = { + 536, /* Code */ + 10415, /* Vendor */ + "Required-Access-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Required-Access-Info)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Retry-Interval, Unsigned32, code 541, section 5.3.39 */ + { + struct dict_avp_data data = { + 541, /* Code */ + 10415, /* Vendor */ + "Retry-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Rx-Request-Type, Enumerated, code 533, section 5.3.31 */ + { + struct dict_avp_data data = { + 533, /* Code */ + 10415, /* Vendor */ + "Rx-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Rx-Request-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* RR-Bandwidth, Unsigned32, code 521, section 5.3.20 */ + { + struct dict_avp_data data = { + 521, /* Code */ + 10415, /* Vendor */ + "RR-Bandwidth", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RS-Bandwidth, Unsigned32, code 522, section 5.3.21 */ + { + struct dict_avp_data data = { + 522, /* Code */ + 10415, /* Vendor */ + "RS-Bandwidth", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Authorization-Info, Unsigned32, code 548, section 5.3.46 */ + { + struct dict_avp_data data = { + 548, /* Code */ + 10415, /* Vendor */ + "Service-Authorization-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-URN, OctetString, code 525, section 5.3.23 */ + { + struct dict_avp_data data = { + 525, /* Code */ + 10415, /* Vendor */ + "Service-URN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Info-Status, Enumerated, code 527, section 5.3.25 */ + { + struct dict_avp_data data = { + 527, /* Code */ + 10415, /* Vendor */ + "Service-Info-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Service-Info-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Sharing-Key-DL, Unsigned32, code 539, section 5.3.37 */ + { + struct dict_avp_data data = { + 539, /* Code */ + 10415, /* Vendor */ + "Sharing-Key-DL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Sharing-Key-UL, Unsigned32, code 540, section 5.3.38 */ + { + struct dict_avp_data data = { + 540, /* Code */ + 10415, /* Vendor */ + "Sharing-Key-UL", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Specific-Action, Enumerated, code 513, section 5.3.13 */ + { + struct dict_avp_data data = { + 513, /* Code */ + 10415, /* Vendor */ + "Specific-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Specific-Action)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SIP-Forking-Indication, Enumerated, code 523, section 5.3.22 */ + { + struct dict_avp_data data = { + 523, /* Code */ + 10415, /* Vendor */ + "SIP-Forking-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SIP-Forking-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Sponsor-Identity, UTF8String, code 531, section 5.3.28 */ + { + struct dict_avp_data data = { + 531, /* Code */ + 10415, /* Vendor */ + "Sponsor-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Sponsored-Connectivity-Data, Grouped, code 530, section 5.3.27 */ + { + struct dict_avp_data data = { + 530, /* Code */ + 10415, /* Vendor */ + "Sponsored-Connectivity-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Sponsoring-Action, Enumerated, code 542, section 5.3.40 */ + { + struct dict_avp_data data = { + 542, /* Code */ + 10415, /* Vendor */ + "Sponsoring-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Sponsoring-Action)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.215 V15.2.0 (2019-09) */ + /* Policy and Charging Control (PCC) over S9 reference point; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29215-f20.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.215 Table 5.3.0.1: S9 specific Diameter AVPs */ + /*==================================================================*/ + + /* DRA-Deployment, Enumerated, code 2206, section 5.3.7 */ + { + struct dict_avp_data data = { + 2206, /* Code */ + 10415, /* Vendor */ + "DRA-Deployment", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/DRA-Deployment)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Multiple-BBERF-Action, Enumerated, code 2204, section 5.3.6 */ + { + struct dict_avp_data data = { + 2204, /* Code */ + 10415, /* Vendor */ + "Multiple-BBERF-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Multiple-BBERF-Action)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Subsession-Decision-Info, Grouped, code 2200, section 5.3.1 */ + { + struct dict_avp_data data = { + 2200, /* Code */ + 10415, /* Vendor */ + "Subsession-Decision-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subsession-Enforcement-Info, Grouped, code 2201, section 5.3.2 */ + { + struct dict_avp_data data = { + 2201, /* Code */ + 10415, /* Vendor */ + "Subsession-Enforcement-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subsession-Id, Unsigned32, code 2202, section 5.3.3 */ + { + struct dict_avp_data data = { + 2202, /* Code */ + 10415, /* Vendor */ + "Subsession-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subsession-Operation, Enumerated, code 2203, section 5.3.4 */ + { + struct dict_avp_data data = { + 2203, /* Code */ + 10415, /* Vendor */ + "Subsession-Operation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subsession-Operation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* DRA-Binding, Enumerated, code 2208, section 5.3.x */ + { + struct dict_avp_data data = { + 2208, /* Code */ + 10415, /* Vendor */ + "DRA-Binding", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/DRA-Binding)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.215 Table A.7.3.1.1: S9a specific Diameter AVPs */ + /*==================================================================*/ + + /* PCRF-Address, DiameterIdentity, code 2207, section A.7.3.1.1 */ + { + struct dict_avp_data data = { + 2207, /* Code */ + 10415, /* Vendor */ + "PCRF-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.215 Table A.8.3.1.1: S9a* specific Diameter AVPs */ + /*==================================================================*/ + + /* UE-Local-IPv6-Prefix, OctetString, code 2205, section A.8.3.1 */ + { + struct dict_avp_data data = { + 2205, /* Code */ + 10415, /* Vendor */ + "UE-Local-IPv6-Prefix", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.217 V15.1.0 (2019-09) */ + /* Policy and Charging Control (PCC); */ + /* Congestion reporting over Np reference point */ + /* */ + /* From 3GPP 29217-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.217 Table 5.3.1.1: Np specific Diameter AVPs */ + /*==================================================================*/ + + /* Aggregated-Congestion-Info, Grouped, code 4000, section 5.3.2 */ + { + struct dict_avp_data data = { + 4000, /* Code */ + 10415, /* Vendor */ + "Aggregated-Congestion-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Aggregated-RUCI-Report, Grouped, code 4001, section 5.3.3 */ + { + struct dict_avp_data data = { + 4001, /* Code */ + 10415, /* Vendor */ + "Aggregated-RUCI-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Congestion-Level-Definition, Grouped, code 4002, section 5.3.4 */ + { + struct dict_avp_data data = { + 4002, /* Code */ + 10415, /* Vendor */ + "Congestion-Level-Definition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Congestion-Level-Range, Unsigned32, code 4003, section 5.3.5 */ + { + struct dict_avp_data data = { + 4003, /* Code */ + 10415, /* Vendor */ + "Congestion-Level-Range", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Congestion-Level-Set-Id, Unsigned32, code 4004, section 5.3.6 */ + { + struct dict_avp_data data = { + 4004, /* Code */ + 10415, /* Vendor */ + "Congestion-Level-Set-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Congestion-Level-Value, Unsigned32, code 4005, section 5.3.7 */ + { + struct dict_avp_data data = { + 4005, /* Code */ + 10415, /* Vendor */ + "Congestion-Level-Value", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Congestion-Location-Id, Grouped, code 4006, section 5.3.8 */ + { + struct dict_avp_data data = { + 4006, /* Code */ + 10415, /* Vendor */ + "Congestion-Location-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Conditional-Restriction, Unsigned32, code 4007, section 5.3.9 */ + { + struct dict_avp_data data = { + 4007, /* Code */ + 10415, /* Vendor */ + "Conditional-Restriction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* eNodeB-Id, OctetString, code 4008, section 5.3.10 */ + { + struct dict_avp_data data = { + 4008, /* Code */ + 10415, /* Vendor */ + "eNodeB-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IMSI-List, OctetString, code 4009, section 5.3.11 */ + { + struct dict_avp_data data = { + 4009, /* Code */ + 10415, /* Vendor */ + "IMSI-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RCAF-Id, DiameterIdentity, code 4010, section 5.3.12 */ + { + struct dict_avp_data data = { + 4010, /* Code */ + 10415, /* Vendor */ + "RCAF-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* Reporting-Restriction, Unsigned32, code 4011, section 5.3.13 */ + { + struct dict_avp_data data = { + 4011, /* Code */ + 10415, /* Vendor */ + "Reporting-Restriction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RUCI-Action, Unsigned32, code 4012, section 5.3.14 */ + { + struct dict_avp_data data = { + 4012, /* Code */ + 10415, /* Vendor */ + "RUCI-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Extended-eNodeB-Id, OctetString, code 4013, section 5.3.15 */ + { + struct dict_avp_data data = { + 4013, /* Code */ + 10415, /* Vendor */ + "Extended-eNodeB-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.219 V15.3.0 (2019-09) */ + /* Policy and Charging Control: Spending Limit Reporting over */ + /* Sy reference point */ + /* */ + /* From 3GPP 29219-f30.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.219 Table 5.3.0.1: Sy specific Diameter AVPs */ + /*==================================================================*/ + + /* Pending-Policy-Counter-Information, Grouped, code 2905, section 5.3.5 */ + { + struct dict_avp_data data = { + 2905, /* Code */ + 10415, /* Vendor */ + "Pending-Policy-Counter-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Pending-Policy-Counter-Change-Time, Time, code 2906, section 5.3.6 */ + { + struct dict_avp_data data = { + 2906, /* Code */ + 10415, /* Vendor */ + "Pending-Policy-Counter-Change-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Policy-Counter-Identifier, UTF8String, code 2901, section 5.3.1 */ + { + struct dict_avp_data data = { + 2901, /* Code */ + 10415, /* Vendor */ + "Policy-Counter-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Policy-Counter-Status, UTF8String, code 2902, section 5.3.2 */ + { + struct dict_avp_data data = { + 2902, /* Code */ + 10415, /* Vendor */ + "Policy-Counter-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Policy-Counter-Status-Report, Grouped, code 2903, section 5.3.3 */ + { + struct dict_avp_data data = { + 2903, /* Code */ + 10415, /* Vendor */ + "Policy-Counter-Status-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SL-Request-Type, Enumerated, code 2904, section 5.3.4 */ + { + struct dict_avp_data data = { + 2904, /* Code */ + 10415, /* Vendor */ + "SL-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SL-Request-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SN-Request-Type, Unsigned32, code 2907, section 5.3.7 */ + { + struct dict_avp_data data = { + 2907, /* Code */ + 10415, /* Vendor */ + "SN-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.229 V15.2.0 (2019-09) */ + /* Cx and Dx interfaces based on the Diameter protocol; */ + /* Protocol details */ + /* */ + /* From 3GPP 29229-f20.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.229 Table 6.3.1: Diameter Multimedia Application AVPs */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* Visited-Network-Identifier, OctetString, code 600, section 6.3.1 */ + { + struct dict_avp_data data = { + 600, /* Code */ + 10415, /* Vendor */ + "Visited-Network-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Public-Identity, UTF8String, code 601, section 6.3.2 */ + { + struct dict_avp_data data = { + 601, /* Code */ + 10415, /* Vendor */ + "Public-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Server-Name, UTF8String, code 602, section 6.3.3 */ + { + struct dict_avp_data data = { + 602, /* Code */ + 10415, /* Vendor */ + "Server-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Server-Capabilities, Grouped, code 603, section 6.3.4 */ + { + struct dict_avp_data data = { + 603, /* Code */ + 10415, /* Vendor */ + "Server-Capabilities", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Mandatory-Capability, Unsigned32, code 604, section 6.3.5 */ + { + struct dict_avp_data data = { + 604, /* Code */ + 10415, /* Vendor */ + "Mandatory-Capability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Optional-Capability, Unsigned32, code 605, section 6.3.6 */ + { + struct dict_avp_data data = { + 605, /* Code */ + 10415, /* Vendor */ + "Optional-Capability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.329 User-Data (702). */ + /* 3GPP TS 29.229 V6.2.0 (2004-09) allocated User-Data (606). */ + /* 3GPP TS 29.329 V6.2.0 (2004-09) allocated User-Data (702). */ + /* User-Data, OctetString, code 606, section 6.3.7 */ + { + struct dict_avp_data data = { + 606, /* Code */ + 10415, /* Vendor */ + "User-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Number-Auth-Items, Unsigned32, code 607, section 6.3.8 */ + { + struct dict_avp_data data = { + 607, /* Code */ + 10415, /* Vendor */ + "SIP-Number-Auth-Items", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Authentication-Scheme, UTF8String, code 608, section 6.3.9 */ + { + struct dict_avp_data data = { + 608, /* Code */ + 10415, /* Vendor */ + "SIP-Authentication-Scheme", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SIP-Authenticate, OctetString, code 609, section 6.3.10 */ + { + struct dict_avp_data data = { + 609, /* Code */ + 10415, /* Vendor */ + "SIP-Authenticate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Authorization, OctetString, code 610, section 6.3.11 */ + { + struct dict_avp_data data = { + 610, /* Code */ + 10415, /* Vendor */ + "SIP-Authorization", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Authentication-Context, OctetString, code 611, section 6.3.12 */ + { + struct dict_avp_data data = { + 611, /* Code */ + 10415, /* Vendor */ + "SIP-Authentication-Context", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Auth-Data-Item, Grouped, code 612, section 6.3.13 */ + { + struct dict_avp_data data = { + 612, /* Code */ + 10415, /* Vendor */ + "SIP-Auth-Data-Item", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Item-Number, Unsigned32, code 613, section 6.3.14 */ + { + struct dict_avp_data data = { + 613, /* Code */ + 10415, /* Vendor */ + "SIP-Item-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Server-Assignment-Type, Enumerated, code 614, section 6.3.15 */ + { + struct dict_avp_data data = { + 614, /* Code */ + 10415, /* Vendor */ + "Server-Assignment-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Server-Assignment-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Deregistration-Reason, Grouped, code 615, section 6.3.16 */ + { + struct dict_avp_data data = { + 615, /* Code */ + 10415, /* Vendor */ + "Deregistration-Reason", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reason-Code, Enumerated, code 616, section 6.3.17 */ + { + struct dict_avp_data data = { + 616, /* Code */ + 10415, /* Vendor */ + "Reason-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reason-Code)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Reason-Info, UTF8String, code 617, section 6.3.18 */ + { + struct dict_avp_data data = { + 617, /* Code */ + 10415, /* Vendor */ + "Reason-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Charging-Information, Grouped, code 618, section 6.3.19 */ + { + struct dict_avp_data data = { + 618, /* Code */ + 10415, /* Vendor */ + "Charging-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Primary-Event-Charging-Function-Name, DiameterURI, code 619, section 6.3.20 */ + { + struct dict_avp_data data = { + 619, /* Code */ + 10415, /* Vendor */ + "Primary-Event-Charging-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); + }; + + /* Secondary-Event-Charging-Function-Name, DiameterURI, code 620, section 6.3.21 */ + { + struct dict_avp_data data = { + 620, /* Code */ + 10415, /* Vendor */ + "Secondary-Event-Charging-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); + }; + + /* Primary-Charging-Collection-Function-Name, DiameterURI, code 621, section 6.3.22 */ + { + struct dict_avp_data data = { + 621, /* Code */ + 10415, /* Vendor */ + "Primary-Charging-Collection-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); + }; + + /* Secondary-Charging-Collection-Function-Name, DiameterURI, code 622, section 6.3.23 */ + { + struct dict_avp_data data = { + 622, /* Code */ + 10415, /* Vendor */ + "Secondary-Charging-Collection-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); + }; + + /* User-Authorization-Type, Enumerated, code 623, section 6.3.24 */ + { + struct dict_avp_data data = { + 623, /* Code */ + 10415, /* Vendor */ + "User-Authorization-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-Authorization-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* User-Data-Already-Available, Enumerated, code 624, section 6.3.26 */ + { + struct dict_avp_data data = { + 624, /* Code */ + 10415, /* Vendor */ + "User-Data-Already-Available", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-Data-Already-Available)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Confidentiality-Key, OctetString, code 625, section 6.3.27 */ + { + struct dict_avp_data data = { + 625, /* Code */ + 10415, /* Vendor */ + "Confidentiality-Key", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Integrity-Key, OctetString, code 626, section 6.3.28 */ + { + struct dict_avp_data data = { + 626, /* Code */ + 10415, /* Vendor */ + "Integrity-Key", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: User-Data-Request-Type (627) removed in 3GPP TS 29.229 V6.5.0 (2005-06). */ + + /* Supported-Features, Grouped, code 628, section 6.3.29 */ + { + struct dict_avp_data data = { + 628, /* Code */ + 10415, /* Vendor */ + "Supported-Features", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Feature-List-ID, Unsigned32, code 629, section 6.3.30 */ + { + struct dict_avp_data data = { + 629, /* Code */ + 10415, /* Vendor */ + "Feature-List-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Feature-List, Unsigned32, code 630, section 6.3.31 */ + { + struct dict_avp_data data = { + 630, /* Code */ + 10415, /* Vendor */ + "Feature-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Supported-Applications, Grouped, code 631, section 6.3.32 */ + { + struct dict_avp_data data = { + 631, /* Code */ + 10415, /* Vendor */ + "Supported-Applications", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Associated-Identities, Grouped, code 632, section 6.3.33 */ + { + struct dict_avp_data data = { + 632, /* Code */ + 10415, /* Vendor */ + "Associated-Identities", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Originating-Request, Enumerated, code 633, section 6.3.34 */ + { + struct dict_avp_data data = { + 633, /* Code */ + 10415, /* Vendor */ + "Originating-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Originating-Request)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Wildcarded-Public-Identity, UTF8String, code 634, section 6.3.35 */ + { + struct dict_avp_data data = { + 634, /* Code */ + 10415, /* Vendor */ + "Wildcarded-Public-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SIP-Digest-Authenticate, Grouped, code 635, section 6.3.36 */ + { + struct dict_avp_data data = { + 635, /* Code */ + 10415, /* Vendor */ + "SIP-Digest-Authenticate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Wildcarded-IMPU, UTF8String, code 636, section 6.3.43 */ + { + struct dict_avp_data data = { + 636, /* Code */ + 10415, /* Vendor */ + "Wildcarded-IMPU", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* UAR-Flags, Unsigned32, code 637, section 6.3.44 */ + { + struct dict_avp_data data = { + 637, /* Code */ + 10415, /* Vendor */ + "UAR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Loose-Route-Indication, Enumerated, code 638, section 6.3.45 */ + { + struct dict_avp_data data = { + 638, /* Code */ + 10415, /* Vendor */ + "Loose-Route-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Loose-Route-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SCSCF-Restoration-Info, Grouped, code 639, section 6.3.46 */ + { + struct dict_avp_data data = { + 639, /* Code */ + 10415, /* Vendor */ + "SCSCF-Restoration-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Path, OctetString, code 640, section 6.3.47 */ + { + struct dict_avp_data data = { + 640, /* Code */ + 10415, /* Vendor */ + "Path", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Contact, OctetString, code 641, section 6.3.48 */ + { + struct dict_avp_data data = { + 641, /* Code */ + 10415, /* Vendor */ + "Contact", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subscription-Info, Grouped, code 642, section 6.3.49 */ + { + struct dict_avp_data data = { + 642, /* Code */ + 10415, /* Vendor */ + "Subscription-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Call-ID-SIP-Header, OctetString, code 643, section 6.3.49.1 */ + { + struct dict_avp_data data = { + 643, /* Code */ + 10415, /* Vendor */ + "Call-ID-SIP-Header", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* From-SIP-Header, OctetString, code 644, section 6.3.49.2 */ + { + struct dict_avp_data data = { + 644, /* Code */ + 10415, /* Vendor */ + "From-SIP-Header", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* To-SIP-Header, OctetString, code 645, section 6.3.49.3 */ + { + struct dict_avp_data data = { + 645, /* Code */ + 10415, /* Vendor */ + "To-SIP-Header", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Record-Route, OctetString, code 646, section 6.3.49.4 */ + { + struct dict_avp_data data = { + 646, /* Code */ + 10415, /* Vendor */ + "Record-Route", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Associated-Registered-Identities, Grouped, code 647, section 6.3.50 */ + { + struct dict_avp_data data = { + 647, /* Code */ + 10415, /* Vendor */ + "Associated-Registered-Identities", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Multiple-Registration-Indication, Enumerated, code 648, section 6.3.51 */ + { + struct dict_avp_data data = { + 648, /* Code */ + 10415, /* Vendor */ + "Multiple-Registration-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Multiple-Registration-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Restoration-Info, Grouped, code 649, section 6.3.52 */ + { + struct dict_avp_data data = { + 649, /* Code */ + 10415, /* Vendor */ + "Restoration-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Session-Priority, Enumerated, code 650, section 6.3.56 */ + { + struct dict_avp_data data = { + 650, /* Code */ + 10415, /* Vendor */ + "Session-Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Priority)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Identity-with-Emergency-Registration, Grouped, code 651, section 6.3.57 */ + { + struct dict_avp_data data = { + 651, /* Code */ + 10415, /* Vendor */ + "Identity-with-Emergency-Registration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Priviledged-Sender-Indication, Enumerated, code 652, section 6.3.58 */ + { + struct dict_avp_data data = { + 652, /* Code */ + 10415, /* Vendor */ + "Priviledged-Sender-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Priviledged-Sender-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* LIA-Flags, Unsigned32, code 653, section 6.3.59 */ + { + struct dict_avp_data data = { + 653, /* Code */ + 10415, /* Vendor */ + "LIA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Initial-CSeq-Sequence-Number, Unsigned32, code 654, section 6.3.62 */ + { + struct dict_avp_data data = { + 654, /* Code */ + 10415, /* Vendor */ + "Initial-CSeq-Sequence-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SAR-Flags, Unsigned32, code 655, section 6.3.63 */ + { + struct dict_avp_data data = { + 655, /* Code */ + 10415, /* Vendor */ + "SAR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Allowed-WAF-WWSF-Identities, Grouped, code 656, section 6.3.64 */ + { + struct dict_avp_data data = { + 656, /* Code */ + 10415, /* Vendor */ + "Allowed-WAF-WWSF-Identities", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WebRTC-Authentication-Function-Name, UTF8String, code 657, section 6.3.65 */ + { + struct dict_avp_data data = { + 657, /* Code */ + 10415, /* Vendor */ + "WebRTC-Authentication-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* WebRTC-Web-Server-Function-Name, UTF8String, code 658, section 6.3.66 */ + { + struct dict_avp_data data = { + 658, /* Code */ + 10415, /* Vendor */ + "WebRTC-Web-Server-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* RTR-Flags, Unsigned32, code 659, section 6.3.69 */ + { + struct dict_avp_data data = { + 659, /* Code */ + 10415, /* Vendor */ + "RTR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.234 V11.2.0 (2013-06) */ + /* 3GPP system to Wireless Local Area Network (WLAN) */ + /* interworking; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29234-b20.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.234 Table 10.1.1: Diameter Multimedia Application AVPs */ + /*==================================================================*/ + + /* 3GPP-WLAN-APN-Id, OctetString, code 100, section 10.1.15 */ + { + struct dict_avp_data data = { + 100, /* Code */ + 10415, /* Vendor */ + "3GPP-WLAN-APN-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Authentication-Method, Enumerated, code 300, section 10.1.5 */ + { + struct dict_avp_data data = { + 300, /* Code */ + 10415, /* Vendor */ + "Authentication-Method", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Authentication-Method)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Authentication-Information-SIM, OctetString, code 301, section 10.1.6 */ + { + struct dict_avp_data data = { + 301, /* Code */ + 10415, /* Vendor */ + "Authentication-Information-SIM", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Authorization-Information-SIM, OctetString, code 302, section 10.1.7 */ + { + struct dict_avp_data data = { + 302, /* Code */ + 10415, /* Vendor */ + "Authorization-Information-SIM", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-User-Data, Grouped, code 303, section 10.1.8 */ + { + struct dict_avp_data data = { + 303, /* Code */ + 10415, /* Vendor */ + "WLAN-User-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Data, Grouped, code 304, section 10.1.10 */ + { + struct dict_avp_data data = { + 304, /* Code */ + 10415, /* Vendor */ + "Charging-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-Access, Enumerated, code 305, section 10.1.11 */ + { + struct dict_avp_data data = { + 305, /* Code */ + 10415, /* Vendor */ + "WLAN-Access", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/WLAN-Access)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* WLAN-3GPP-IP-Access, Enumerated, code 306, section 10.1.12 */ + { + struct dict_avp_data data = { + 306, /* Code */ + 10415, /* Vendor */ + "WLAN-3GPP-IP-Access", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/WLAN-3GPP-IP-Access)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* APN-Authorized, Grouped, code 307, section 10.1.14 */ + { + struct dict_avp_data data = { + 307, /* Code */ + 10415, /* Vendor */ + "APN-Authorized", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: APN-Id (308) OctetString removed in 3GPP TS 29.234 V6.5.0 (2005-12). */ + + /* APN-Barring-Type, Enumerated, code 309, section 10.1.16 */ + { + struct dict_avp_data data = { + 309, /* Code */ + 10415, /* Vendor */ + "APN-Barring-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/APN-Barring-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* WLAN-Direct-IP-Access, Enumerated, code 310, section 10.1.17 */ + { + struct dict_avp_data data = { + 310, /* Code */ + 10415, /* Vendor */ + "WLAN-Direct-IP-Access", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/WLAN-Direct-IP-Access)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Session-Request-Type, Enumerated, code 311, section 10.1.23 */ + { + struct dict_avp_data data = { + 311, /* Code */ + 10415, /* Vendor */ + "Session-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Request-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Routing-Policy, IPFilterRule, code 312, section 10.1.24 */ + { + struct dict_avp_data data = { + 312, /* Code */ + 10415, /* Vendor */ + "Routing-Policy", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); + }; + + /* Max-Requested-Bandwidth, OctetString, code 313, section 10.1.26 */ + { + struct dict_avp_data data = { + 313, /* Code */ + 10415, /* Vendor */ + "Max-Requested-Bandwidth", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Characteristics, Integer32, code 314, section 10.1.27 */ + { + struct dict_avp_data data = { + 314, /* Code */ + 10415, /* Vendor */ + "Charging-Characteristics", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Charging-Nodes, Grouped, code 315, section 10.1.28 */ + { + struct dict_avp_data data = { + 315, /* Code */ + 10415, /* Vendor */ + "Charging-Nodes", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Primary-OCS-Charging-Function-Name, DiameterIdentity, code 316, section 10.1.29 */ + { + struct dict_avp_data data = { + 316, /* Code */ + 10415, /* Vendor */ + "Primary-OCS-Charging-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* Secondary-OCS-Charging-Function-Name, DiameterIdentity, code 317, section 10.1.30 */ + { + struct dict_avp_data data = { + 317, /* Code */ + 10415, /* Vendor */ + "Secondary-OCS-Charging-Function-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* Note: 3GPP TS 29.273 from Release 12 now defines 3GPP-AAA-Server-Name (318). */ + /* */ + /* Maximum-Number-Accesses, Unsigned32, code 319, section 10.1.38 */ + { + struct dict_avp_data data = { + 319, /* Code */ + 10415, /* Vendor */ + "Maximum-Number-Accesses", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.272 V15.10.0 (2019-12) */ + /* Mobility Management Entity (MME) */ + /* and Serving GPRS Support Node (SGSN) related interfaces */ + /* based on Diameter protocol */ + /* */ + /* From 3GPP 29272-fa0.docx */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.272 Table 7.3.1/1: S6a/S6d, S7a/S7d and S13/S13' specific DiameterAVPs */ + /*==================================================================*/ + + /* Subscription-Data, Grouped, code 1400, section 7.3.2 */ + { + struct dict_avp_data data = { + 1400, /* Code */ + 10415, /* Vendor */ + "Subscription-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Terminal-Information, Grouped, code 1401, section 7.3.3 */ + { + struct dict_avp_data data = { + 1401, /* Code */ + 10415, /* Vendor */ + "Terminal-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IMEI, UTF8String, code 1402, section 7.3.4 */ + { + struct dict_avp_data data = { + 1402, /* Code */ + 10415, /* Vendor */ + "IMEI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Software-Version, UTF8String, code 1403, section 7.3.5 */ + { + struct dict_avp_data data = { + 1403, /* Code */ + 10415, /* Vendor */ + "Software-Version", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* QoS-Subscribed, OctetString, code 1404, section 7.3.77 */ + { + struct dict_avp_data data = { + 1404, /* Code */ + 10415, /* Vendor */ + "QoS-Subscribed", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ULR-Flags, Unsigned32, code 1405, section 7.3.7 */ + { + struct dict_avp_data data = { + 1405, /* Code */ + 10415, /* Vendor */ + "ULR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ULA-Flags, Unsigned32, code 1406, section 7.3.8 */ + { + struct dict_avp_data data = { + 1406, /* Code */ + 10415, /* Vendor */ + "ULA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Visited-PLMN-Id, OctetString, code 1407, section 7.3.9 */ + { + struct dict_avp_data data = { + 1407, /* Code */ + 10415, /* Vendor */ + "Visited-PLMN-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Requested-EUTRAN-Authentication-Info, Grouped, code 1408, section 7.3.11 */ + { + struct dict_avp_data data = { + 1408, /* Code */ + 10415, /* Vendor */ + "Requested-EUTRAN-Authentication-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Requested-UTRAN-GERAN-Authentication-Info, Grouped, code 1409, section 7.3.12 */ + { + struct dict_avp_data data = { + 1409, /* Code */ + 10415, /* Vendor */ + "Requested-UTRAN-GERAN-Authentication-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Requested-Vectors, Unsigned32, code 1410, section 7.3.14 */ + { + struct dict_avp_data data = { + 1410, /* Code */ + 10415, /* Vendor */ + "Number-Of-Requested-Vectors", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Re-Synchronization-Info, OctetString, code 1411, section 7.3.15 */ + { + struct dict_avp_data data = { + 1411, /* Code */ + 10415, /* Vendor */ + "Re-Synchronization-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Immediate-Response-Preferred, Unsigned32, code 1412, section 7.3.16 */ + { + struct dict_avp_data data = { + 1412, /* Code */ + 10415, /* Vendor */ + "Immediate-Response-Preferred", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Authentication-Info, Grouped, code 1413, section 7.3.17 */ + { + struct dict_avp_data data = { + 1413, /* Code */ + 10415, /* Vendor */ + "Authentication-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* E-UTRAN-Vector, Grouped, code 1414, section 7.3.18 */ + { + struct dict_avp_data data = { + 1414, /* Code */ + 10415, /* Vendor */ + "E-UTRAN-Vector", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UTRAN-Vector, Grouped, code 1415, section 7.3.19 */ + { + struct dict_avp_data data = { + 1415, /* Code */ + 10415, /* Vendor */ + "UTRAN-Vector", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GERAN-Vector, Grouped, code 1416, section 7.3.20 */ + { + struct dict_avp_data data = { + 1416, /* Code */ + 10415, /* Vendor */ + "GERAN-Vector", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Network-Access-Mode, Enumerated, code 1417, section 7.3.21 */ + { + struct dict_avp_data data = { + 1417, /* Code */ + 10415, /* Vendor */ + "Network-Access-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Network-Access-Mode)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* HPLMN-ODB, Unsigned32, code 1418, section 7.3.22 */ + { + struct dict_avp_data data = { + 1418, /* Code */ + 10415, /* Vendor */ + "HPLMN-ODB", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Item-Number, Unsigned32, code 1419, section 7.3.23 */ + { + struct dict_avp_data data = { + 1419, /* Code */ + 10415, /* Vendor */ + "Item-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Cancellation-Type, Enumerated, code 1420, section 7.3.24 */ + { + struct dict_avp_data data = { + 1420, /* Code */ + 10415, /* Vendor */ + "Cancellation-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Cancellation-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* DSR-Flags, Unsigned32, code 1421, section 7.3.25 */ + { + struct dict_avp_data data = { + 1421, /* Code */ + 10415, /* Vendor */ + "DSR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DSA-Flags, Unsigned32, code 1422, section 7.3.26 */ + { + struct dict_avp_data data = { + 1422, /* Code */ + 10415, /* Vendor */ + "DSA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Context-Identifier, Unsigned32, code 1423, section 7.3.27 */ + { + struct dict_avp_data data = { + 1423, /* Code */ + 10415, /* Vendor */ + "Context-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subscriber-Status, Enumerated, code 1424, section 7.3.29 */ + { + struct dict_avp_data data = { + 1424, /* Code */ + 10415, /* Vendor */ + "Subscriber-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subscriber-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Operator-Determined-Barring, Unsigned32, code 1425, section 7.3.30 */ + { + struct dict_avp_data data = { + 1425, /* Code */ + 10415, /* Vendor */ + "Operator-Determined-Barring", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Restriction-Data, Unsigned32, code 1426, section 7.3.31 */ + { + struct dict_avp_data data = { + 1426, /* Code */ + 10415, /* Vendor */ + "Access-Restriction-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-OI-Replacement, UTF8String, code 1427, section 7.3.32 */ + { + struct dict_avp_data data = { + 1427, /* Code */ + 10415, /* Vendor */ + "APN-OI-Replacement", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* All-APN-Configurations-Included-Indicator, Enumerated, code 1428, section 7.3.33 */ + { + struct dict_avp_data data = { + 1428, /* Code */ + 10415, /* Vendor */ + "All-APN-Configurations-Included-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/All-APN-Configurations-Included-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* APN-Configuration-Profile, Grouped, code 1429, section 7.3.34 */ + { + struct dict_avp_data data = { + 1429, /* Code */ + 10415, /* Vendor */ + "APN-Configuration-Profile", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-Configuration, Grouped, code 1430, section 7.3.35 */ + { + struct dict_avp_data data = { + 1430, /* Code */ + 10415, /* Vendor */ + "APN-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* EPS-Subscribed-QoS-Profile, Grouped, code 1431, section 7.3.37 */ + { + struct dict_avp_data data = { + 1431, /* Code */ + 10415, /* Vendor */ + "EPS-Subscribed-QoS-Profile", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* VPLMN-Dynamic-Address-Allowed, Enumerated, code 1432, section 7.3.38 */ + { + struct dict_avp_data data = { + 1432, /* Code */ + 10415, /* Vendor */ + "VPLMN-Dynamic-Address-Allowed", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/VPLMN-Dynamic-Address-Allowed)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* STN-SR, OctetString, code 1433, section 7.3.39 */ + { + struct dict_avp_data data = { + 1433, /* Code */ + 10415, /* Vendor */ + "STN-SR", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Alert-Reason, Enumerated, code 1434, section 7.3.83 */ + { + struct dict_avp_data data = { + 1434, /* Code */ + 10415, /* Vendor */ + "Alert-Reason", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Alert-Reason)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AMBR, Grouped, code 1435, section 7.3.41 */ + { + struct dict_avp_data data = { + 1435, /* Code */ + 10415, /* Vendor */ + "AMBR", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CSG-Subscription-Data, Grouped, code 1436, section 7.3.78 */ + { + struct dict_avp_data data = { + 1436, /* Code */ + 10415, /* Vendor */ + "CSG-Subscription-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CSG-Id, Unsigned32, code 1437, section 7.3.79 */ + { + struct dict_avp_data data = { + 1437, /* Code */ + 10415, /* Vendor */ + "CSG-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDN-GW-Allocation-Type, Enumerated, code 1438, section 7.3.44 */ + { + struct dict_avp_data data = { + 1438, /* Code */ + 10415, /* Vendor */ + "PDN-GW-Allocation-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDN-GW-Allocation-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Expiration-Date, Time, code 1439, section 7.3.80 */ + { + struct dict_avp_data data = { + 1439, /* Code */ + 10415, /* Vendor */ + "Expiration-Date", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* RAT-Frequency-Selection-Priority-ID, Unsigned32, code 1440, section 7.3.46 */ + { + struct dict_avp_data data = { + 1440, /* Code */ + 10415, /* Vendor */ + "RAT-Frequency-Selection-Priority-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IDA-Flags, Unsigned32, code 1441, section 7.3.47 */ + { + struct dict_avp_data data = { + 1441, /* Code */ + 10415, /* Vendor */ + "IDA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PUA-Flags, Unsigned32, code 1442, section 7.3.48 */ + { + struct dict_avp_data data = { + 1442, /* Code */ + 10415, /* Vendor */ + "PUA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NOR-Flags, Unsigned32, code 1443, section 7.3.49 */ + { + struct dict_avp_data data = { + 1443, /* Code */ + 10415, /* Vendor */ + "NOR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* User-Id, UTF8String, code 1444, section 7.3.50 */ + { + struct dict_avp_data data = { + 1444, /* Code */ + 10415, /* Vendor */ + "User-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Equipment-Status, Enumerated, code 1445, section 7.3.51 */ + { + struct dict_avp_data data = { + 1445, /* Code */ + 10415, /* Vendor */ + "Equipment-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Equipment-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Regional-Subscription-Zone-Code, OctetString, code 1446, section 7.3.52 */ + { + struct dict_avp_data data = { + 1446, /* Code */ + 10415, /* Vendor */ + "Regional-Subscription-Zone-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RAND, OctetString, code 1447, section 7.3.53 */ + { + struct dict_avp_data data = { + 1447, /* Code */ + 10415, /* Vendor */ + "RAND", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* XRES, OctetString, code 1448, section 7.3.54 */ + { + struct dict_avp_data data = { + 1448, /* Code */ + 10415, /* Vendor */ + "XRES", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AUTN, OctetString, code 1449, section 7.3.55 */ + { + struct dict_avp_data data = { + 1449, /* Code */ + 10415, /* Vendor */ + "AUTN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* KASME, OctetString, code 1450, section 7.3.56 */ + { + struct dict_avp_data data = { + 1450, /* Code */ + 10415, /* Vendor */ + "KASME", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trace-Collection-Entity, Address, code 1452, section 7.3.98 */ + { + struct dict_avp_data data = { + 1452, /* Code */ + 10415, /* Vendor */ + "Trace-Collection-Entity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Kc, OctetString, code 1453, section 7.3.59 */ + { + struct dict_avp_data data = { + 1453, /* Code */ + 10415, /* Vendor */ + "Kc", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SRES, OctetString, code 1454, section 7.3.60 */ + { + struct dict_avp_data data = { + 1454, /* Code */ + 10415, /* Vendor */ + "SRES", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDN-Type, Enumerated, code 1456, section 7.3.62 */ + { + struct dict_avp_data data = { + 1456, /* Code */ + 10415, /* Vendor */ + "PDN-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDN-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Roaming-Restricted-Due-To-Unsupported-Feature, Enumerated, code 1457, section 7.3.81 */ + { + struct dict_avp_data data = { + 1457, /* Code */ + 10415, /* Vendor */ + "Roaming-Restricted-Due-To-Unsupported-Feature", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Roaming-Restricted-Due-To-Unsupported-Feature)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Trace-Data, Grouped, code 1458, section 7.3.63 */ + { + struct dict_avp_data data = { + 1458, /* Code */ + 10415, /* Vendor */ + "Trace-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trace-Reference, OctetString, code 1459, section 7.3.64 */ + { + struct dict_avp_data data = { + 1459, /* Code */ + 10415, /* Vendor */ + "Trace-Reference", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trace-Depth, Enumerated, code 1462, section 7.3.67 */ + { + struct dict_avp_data data = { + 1462, /* Code */ + 10415, /* Vendor */ + "Trace-Depth", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Trace-Depth)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Trace-NE-Type-List, OctetString, code 1463, section 7.3.68 */ + { + struct dict_avp_data data = { + 1463, /* Code */ + 10415, /* Vendor */ + "Trace-NE-Type-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trace-Interface-List, OctetString, code 1464, section 7.3.69 */ + { + struct dict_avp_data data = { + 1464, /* Code */ + 10415, /* Vendor */ + "Trace-Interface-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trace-Event-List, OctetString, code 1465, section 7.3.70 */ + { + struct dict_avp_data data = { + 1465, /* Code */ + 10415, /* Vendor */ + "Trace-Event-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* OMC-Id, OctetString, code 1466, section 7.3.71 */ + { + struct dict_avp_data data = { + 1466, /* Code */ + 10415, /* Vendor */ + "OMC-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GPRS-Subscription-Data, Grouped, code 1467, section 7.3.72 */ + { + struct dict_avp_data data = { + 1467, /* Code */ + 10415, /* Vendor */ + "GPRS-Subscription-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Complete-Data-List-Included-Indicator, Enumerated, code 1468, section 7.3.73 */ + { + struct dict_avp_data data = { + 1468, /* Code */ + 10415, /* Vendor */ + "Complete-Data-List-Included-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Complete-Data-List-Included-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PDP-Context, Grouped, code 1469, section 7.3.74 */ + { + struct dict_avp_data data = { + 1469, /* Code */ + 10415, /* Vendor */ + "PDP-Context", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDP-Type, OctetString, code 1470, section 7.3.75 */ + { + struct dict_avp_data data = { + 1470, /* Code */ + 10415, /* Vendor */ + "PDP-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP2-MEID, OctetString, code 1471, section 7.3.6 */ + { + struct dict_avp_data data = { + 1471, /* Code */ + 10415, /* Vendor */ + "3GPP2-MEID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Specific-APN-Info, Grouped, code 1472, section 7.3.82 */ + { + struct dict_avp_data data = { + 1472, /* Code */ + 10415, /* Vendor */ + "Specific-APN-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Info, Grouped, code 1473, section 7.3.84 */ + { + struct dict_avp_data data = { + 1473, /* Code */ + 10415, /* Vendor */ + "LCS-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GMLC-Number, OctetString, code 1474, section 7.3.85 */ + { + struct dict_avp_data data = { + 1474, /* Code */ + 10415, /* Vendor */ + "GMLC-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-PrivacyException, Grouped, code 1475, section 7.3.86 */ + { + struct dict_avp_data data = { + 1475, /* Code */ + 10415, /* Vendor */ + "LCS-PrivacyException", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SS-Code, OctetString, code 1476, section 7.3.87 */ + { + struct dict_avp_data data = { + 1476, /* Code */ + 10415, /* Vendor */ + "SS-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.272 V12.5.0 (2014-06) Table 7.3.1/1 */ + /* changed row SS-Status (1477) to be OctetString instead of Grouped. */ + /* Clause 7.3.88 already described SS-Status (1147) as OctetString. */ + /* */ + /* Change-1.4.0: SS-Status (1477) type changed from Grouped to OctetString. */ + /* SS-Status, OctetString, code 1477, section 7.3.88 */ + { + struct dict_avp_data data = { + 1477, /* Code */ + 10415, /* Vendor */ + "SS-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Notification-To-UE-User, Enumerated, code 1478, section 7.3.89 */ + { + struct dict_avp_data data = { + 1478, /* Code */ + 10415, /* Vendor */ + "Notification-To-UE-User", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Notification-To-UE-User)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* External-Client, Grouped, code 1479, section 7.3.90 */ + { + struct dict_avp_data data = { + 1479, /* Code */ + 10415, /* Vendor */ + "External-Client", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Client-Identity, OctetString, code 1480, section 7.3.91 */ + { + struct dict_avp_data data = { + 1480, /* Code */ + 10415, /* Vendor */ + "Client-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* GMLC-Restriction, Enumerated, code 1481, section 7.3.92 */ + { + struct dict_avp_data data = { + 1481, /* Code */ + 10415, /* Vendor */ + "GMLC-Restriction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/GMLC-Restriction)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PLMN-Client, Enumerated, code 1482, section 7.3.93 */ + { + struct dict_avp_data data = { + 1482, /* Code */ + 10415, /* Vendor */ + "PLMN-Client", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PLMN-Client)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Service-Type, Grouped, code 1483, section 7.3.94 */ + { + struct dict_avp_data data = { + 1483, /* Code */ + 10415, /* Vendor */ + "Service-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ServiceTypeIdentity, Unsigned32, code 1484, section 7.3.95 */ + { + struct dict_avp_data data = { + 1484, /* Code */ + 10415, /* Vendor */ + "ServiceTypeIdentity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MO-LR, Grouped, code 1485, section 7.3.96 */ + { + struct dict_avp_data data = { + 1485, /* Code */ + 10415, /* Vendor */ + "MO-LR", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Teleservice-List, Grouped, code 1486, section 7.3.99 */ + { + struct dict_avp_data data = { + 1486, /* Code */ + 10415, /* Vendor */ + "Teleservice-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TS-Code, OctetString, code 1487, section 7.3.100 */ + { + struct dict_avp_data data = { + 1487, /* Code */ + 10415, /* Vendor */ + "TS-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.272 V12.4.0 (2014-03) renamed */ + /* Call-Barring-Infor-List (1488) to Call-Barring-Info (1488). */ + /* */ + /* Change-1.4.0: Call-Barring-Infor-List (1488) renamed to Call-Barring-Info (1488). */ + /* Call-Barring-Info, Grouped, code 1488, section 7.3.101 */ + { + struct dict_avp_data data = { + 1488, /* Code */ + 10415, /* Vendor */ + "Call-Barring-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SGSN-Number, OctetString, code 1489, section 7.3.102 */ + { + struct dict_avp_data data = { + 1489, /* Code */ + 10415, /* Vendor */ + "SGSN-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IDR-Flags, Unsigned32, code 1490, section 7.3.103 */ + { + struct dict_avp_data data = { + 1490, /* Code */ + 10415, /* Vendor */ + "IDR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ICS-Indicator, Enumerated, code 1491, section 7.3.104 */ + { + struct dict_avp_data data = { + 1491, /* Code */ + 10415, /* Vendor */ + "ICS-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ICS-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* IMS-Voice-Over-PS-Sessions-Supported, Enumerated, code 1492, section 7.3.106 */ + { + struct dict_avp_data data = { + 1492, /* Code */ + 10415, /* Vendor */ + "IMS-Voice-Over-PS-Sessions-Supported", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMS-Voice-Over-PS-Sessions-Supported)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions, Enumerated, code 1493, section 7.3.107 */ + { + struct dict_avp_data data = { + 1493, /* Code */ + 10415, /* Vendor */ + "Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Last-UE-Activity-Time, Time, code 1494, section 7.3.108 */ + { + struct dict_avp_data data = { + 1494, /* Code */ + 10415, /* Vendor */ + "Last-UE-Activity-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* EPS-User-State, Grouped, code 1495, section 7.3.110 */ + { + struct dict_avp_data data = { + 1495, /* Code */ + 10415, /* Vendor */ + "EPS-User-State", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* EPS-Location-Information, Grouped, code 1496, section 7.3.111 */ + { + struct dict_avp_data data = { + 1496, /* Code */ + 10415, /* Vendor */ + "EPS-Location-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MME-User-State, Grouped, code 1497, section 7.3.112 */ + { + struct dict_avp_data data = { + 1497, /* Code */ + 10415, /* Vendor */ + "MME-User-State", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SGSN-User-State, Grouped, code 1498, section 7.3.113 */ + { + struct dict_avp_data data = { + 1498, /* Code */ + 10415, /* Vendor */ + "SGSN-User-State", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* User-State, Enumerated, code 1499, section 7.3.114 */ + { + struct dict_avp_data data = { + 1499, /* Code */ + 10415, /* Vendor */ + "User-State", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-State)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: 3GPP TS 29.272 Table 7.3.1/1 row MME-Location-Information (1600) */ + /* incorrectly has a space instead of hyphen in the name. */ + /* */ + /* Change-1.4.0: MME-LocationInformation (1600) renamed to MME-Location-Information(1600). */ + /* MME-Location-Information, Grouped, code 1600, section 7.3.115 */ + { + struct dict_avp_data data = { + 1600, /* Code */ + 10415, /* Vendor */ + "MME-Location-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SGSN-Location-Information, Grouped, code 1601, section 7.3.116 */ + { + struct dict_avp_data data = { + 1601, /* Code */ + 10415, /* Vendor */ + "SGSN-Location-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* E-UTRAN-Cell-Global-Identity, OctetString, code 1602, section 7.3.117 */ + { + struct dict_avp_data data = { + 1602, /* Code */ + 10415, /* Vendor */ + "E-UTRAN-Cell-Global-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Tracking-Area-Identity, OctetString, code 1603, section 7.3.118 */ + { + struct dict_avp_data data = { + 1603, /* Code */ + 10415, /* Vendor */ + "Tracking-Area-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Cell-Global-Identity, OctetString, code 1604, section 7.3.119 */ + { + struct dict_avp_data data = { + 1604, /* Code */ + 10415, /* Vendor */ + "Cell-Global-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Routing-Area-Identity, OctetString, code 1605, section 7.3.120 */ + { + struct dict_avp_data data = { + 1605, /* Code */ + 10415, /* Vendor */ + "Routing-Area-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Area-Identity, OctetString, code 1606, section 7.3.121 */ + { + struct dict_avp_data data = { + 1606, /* Code */ + 10415, /* Vendor */ + "Location-Area-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Area-Identity, OctetString, code 1607, section 7.3.122 */ + { + struct dict_avp_data data = { + 1607, /* Code */ + 10415, /* Vendor */ + "Service-Area-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Geographical-Information, OctetString, code 1608, section 7.3.123 */ + { + struct dict_avp_data data = { + 1608, /* Code */ + 10415, /* Vendor */ + "Geographical-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Geodetic-Information, OctetString, code 1609, section 7.3.124 */ + { + struct dict_avp_data data = { + 1609, /* Code */ + 10415, /* Vendor */ + "Geodetic-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Current-Location-Retrieved, Enumerated, code 1610, section 7.3.125 */ + { + struct dict_avp_data data = { + 1610, /* Code */ + 10415, /* Vendor */ + "Current-Location-Retrieved", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Current-Location-Retrieved)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Age-Of-Location-Information, Unsigned32, code 1611, section 7.3.126 */ + { + struct dict_avp_data data = { + 1611, /* Code */ + 10415, /* Vendor */ + "Age-Of-Location-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Active-APN, Grouped, code 1612, section 7.3.127 */ + { + struct dict_avp_data data = { + 1612, /* Code */ + 10415, /* Vendor */ + "Active-APN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Error-Diagnostic, Enumerated, code 1614, section 7.3.128 */ + { + struct dict_avp_data data = { + 1614, /* Code */ + 10415, /* Vendor */ + "Error-Diagnostic", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Error-Diagnostic)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Ext-PDP-Address, Address, code 1621, section 7.3.129 */ + { + struct dict_avp_data data = { + 1621, /* Code */ + 10415, /* Vendor */ + "Ext-PDP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* UE-SRVCC-Capability, Enumerated, code 1615, section 7.3.130 */ + { + struct dict_avp_data data = { + 1615, /* Code */ + 10415, /* Vendor */ + "UE-SRVCC-Capability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/UE-SRVCC-Capability)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MPS-Priority, Unsigned32, code 1616, section 7.3.131 */ + { + struct dict_avp_data data = { + 1616, /* Code */ + 10415, /* Vendor */ + "MPS-Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* VPLMN-LIPA-Allowed, Enumerated, code 1617, section 7.3.132 */ + { + struct dict_avp_data data = { + 1617, /* Code */ + 10415, /* Vendor */ + "VPLMN-LIPA-Allowed", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/VPLMN-LIPA-Allowed)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* LIPA-Permission, Enumerated, code 1618, section 7.3.133 */ + { + struct dict_avp_data data = { + 1618, /* Code */ + 10415, /* Vendor */ + "LIPA-Permission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LIPA-Permission)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Subscribed-Periodic-RAU-TAU-Timer, Unsigned32, code 1619, section 7.3.134 */ + { + struct dict_avp_data data = { + 1619, /* Code */ + 10415, /* Vendor */ + "Subscribed-Periodic-RAU-TAU-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Ext-PDP-Type, OctetString, code 1620, section 7.3.75A */ + { + struct dict_avp_data data = { + 1620, /* Code */ + 10415, /* Vendor */ + "Ext-PDP-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIPTO-Permission, Enumerated, code 1613, section 7.3.135 */ + { + struct dict_avp_data data = { + 1613, /* Code */ + 10415, /* Vendor */ + "SIPTO-Permission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SIPTO-Permission)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MDT-Configuration, Grouped, code 1622, section 7.3.136 */ + { + struct dict_avp_data data = { + 1622, /* Code */ + 10415, /* Vendor */ + "MDT-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Job-Type, Enumerated, code 1623, section 7.3.137 */ + { + struct dict_avp_data data = { + 1623, /* Code */ + 10415, /* Vendor */ + "Job-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Job-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Area-Scope, Grouped, code 1624, section 7.3.138 */ + { + struct dict_avp_data data = { + 1624, /* Code */ + 10415, /* Vendor */ + "Area-Scope", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* List-Of-Measurements, Unsigned32, code 1625, section 7.3.139 */ + { + struct dict_avp_data data = { + 1625, /* Code */ + 10415, /* Vendor */ + "List-Of-Measurements", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-Trigger, Unsigned32, code 1626, section 7.3.140 */ + { + struct dict_avp_data data = { + 1626, /* Code */ + 10415, /* Vendor */ + "Reporting-Trigger", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Report-Interval, Enumerated, code 1627, section 7.3.141 */ + { + struct dict_avp_data data = { + 1627, /* Code */ + 10415, /* Vendor */ + "Report-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Report-Interval)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Report-Amount, Enumerated, code 1628, section 7.3.142 */ + { + struct dict_avp_data data = { + 1628, /* Code */ + 10415, /* Vendor */ + "Report-Amount", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Report-Amount)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Event-Threshold-RSRP, Unsigned32, code 1629, section 7.3.143 */ + { + struct dict_avp_data data = { + 1629, /* Code */ + 10415, /* Vendor */ + "Event-Threshold-RSRP", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Threshold-RSRQ, Unsigned32, code 1630, section 7.3.144 */ + { + struct dict_avp_data data = { + 1630, /* Code */ + 10415, /* Vendor */ + "Event-Threshold-RSRQ", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Logging-Interval, Enumerated, code 1631, section 7.3.145 */ + { + struct dict_avp_data data = { + 1631, /* Code */ + 10415, /* Vendor */ + "Logging-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Logging-Interval)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Logging-Duration, Enumerated, code 1632, section 7.3.146 */ + { + struct dict_avp_data data = { + 1632, /* Code */ + 10415, /* Vendor */ + "Logging-Duration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Logging-Duration)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Relay-Node-Indicator, Enumerated, code 1633, section 7.3.147 */ + { + struct dict_avp_data data = { + 1633, /* Code */ + 10415, /* Vendor */ + "Relay-Node-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Relay-Node-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MDT-User-Consent, Enumerated, code 1634, section 7.3.148 */ + { + struct dict_avp_data data = { + 1634, /* Code */ + 10415, /* Vendor */ + "MDT-User-Consent", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MDT-User-Consent)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PUR-Flags, Unsigned32, code 1635, section 7.3.149 */ + { + struct dict_avp_data data = { + 1635, /* Code */ + 10415, /* Vendor */ + "PUR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subscribed-VSRVCC, Enumerated, code 1636, section 7.3.150 */ + { + struct dict_avp_data data = { + 1636, /* Code */ + 10415, /* Vendor */ + "Subscribed-VSRVCC", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subscribed-VSRVCC)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Equivalent-PLMN-List, Grouped, code 1637, section 7.3.151 */ + { + struct dict_avp_data data = { + 1637, /* Code */ + 10415, /* Vendor */ + "Equivalent-PLMN-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CLR-Flags, Unsigned32, code 1638, section 7.3.152 */ + { + struct dict_avp_data data = { + 1638, /* Code */ + 10415, /* Vendor */ + "CLR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UVR-Flags, Unsigned32, code 1639, section 7.3.153 */ + { + struct dict_avp_data data = { + 1639, /* Code */ + 10415, /* Vendor */ + "UVR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UVA-Flags, Unsigned32, code 1640, section 7.3.154 */ + { + struct dict_avp_data data = { + 1640, /* Code */ + 10415, /* Vendor */ + "UVA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* VPLMN-CSG-Subscription-Data, Grouped, code 1641, section 7.3.155 */ + { + struct dict_avp_data data = { + 1641, /* Code */ + 10415, /* Vendor */ + "VPLMN-CSG-Subscription-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Time-Zone, UTF8String, code 1642, section 7.3.163 */ + { + struct dict_avp_data data = { + 1642, /* Code */ + 10415, /* Vendor */ + "Time-Zone", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* A-MSISDN, OctetString, code 1643, section 7.3.157 */ + { + struct dict_avp_data data = { + 1643, /* Code */ + 10415, /* Vendor */ + "A-MSISDN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MME-Number-for-MT-SMS, OctetString, code 1645, section 7.3.159 */ + { + struct dict_avp_data data = { + 1645, /* Code */ + 10415, /* Vendor */ + "MME-Number-for-MT-SMS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SMS-Register-Request, Enumerated, code 1648, section 7.3.162 */ + { + struct dict_avp_data data = { + 1648, /* Code */ + 10415, /* Vendor */ + "SMS-Register-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SMS-Register-Request)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Local-Time-Zone, Grouped, code 1649, section 7.3.156 */ + { + struct dict_avp_data data = { + 1649, /* Code */ + 10415, /* Vendor */ + "Local-Time-Zone", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Daylight-Saving-Time, Enumerated, code 1650, section 7.3.164 */ + { + struct dict_avp_data data = { + 1650, /* Code */ + 10415, /* Vendor */ + "Daylight-Saving-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Daylight-Saving-Time)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Subscription-Data-Flags, Unsigned32, code 1654, section 7.3.165 */ + { + struct dict_avp_data data = { + 1654, /* Code */ + 10415, /* Vendor */ + "Subscription-Data-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.272 V12.9.0 (2015-12) changed AVP code of */ + /* Measurement-Period-LTE (1655) from 1656. */ + /* */ + /* Change-1.4.0: Measurement-Period-LTE (1656) code changed to Measurement-Period-LTE (1655). */ + /* Measurement-Period-LTE, Enumerated, code 1655, section 7.3.166 */ + { + struct dict_avp_data data = { + 1655, /* Code */ + 10415, /* Vendor */ + "Measurement-Period-LTE", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Measurement-Period-LTE)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: 3GPP TS 29.272 V12.9.0 (2015-12) changed AVP code of */ + /* Measurement-Period-UMTS (1656) from 1655. */ + /* */ + /* Change-1.4.0: Measurement-Period-UMTS (1655) code changed to Measurement-Period-UMTS (1656). */ + /* Measurement-Period-UMTS, Enumerated, code 1656, section 7.3.167 */ + { + struct dict_avp_data data = { + 1656, /* Code */ + 10415, /* Vendor */ + "Measurement-Period-UMTS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Measurement-Period-UMTS)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Collection-Period-RRM-LTE, Enumerated, code 1657, section 7.3.168 */ + { + struct dict_avp_data data = { + 1657, /* Code */ + 10415, /* Vendor */ + "Collection-Period-RRM-LTE", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Collection-Period-RRM-LTE)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Collection-Period-RRM-UMTS, Enumerated, code 1658, section 7.3.169 */ + { + struct dict_avp_data data = { + 1658, /* Code */ + 10415, /* Vendor */ + "Collection-Period-RRM-UMTS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Collection-Period-RRM-UMTS)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Positioning-Method, OctetString, code 1659, section 7.3.170 */ + { + struct dict_avp_data data = { + 1659, /* Code */ + 10415, /* Vendor */ + "Positioning-Method", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Measurement-Quantity, OctetString, code 1660, section 7.3.171 */ + { + struct dict_avp_data data = { + 1660, /* Code */ + 10415, /* Vendor */ + "Measurement-Quantity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Threshold-Event-1F, Integer32, code 1661, section 7.3.172 */ + { + struct dict_avp_data data = { + 1661, /* Code */ + 10415, /* Vendor */ + "Event-Threshold-Event-1F", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Event-Threshold-Event-1I, Integer32, code 1662, section 7.3.173 */ + { + struct dict_avp_data data = { + 1662, /* Code */ + 10415, /* Vendor */ + "Event-Threshold-Event-1I", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Restoration-Priority, Unsigned32, code 1663, section 7.3.174 */ + { + struct dict_avp_data data = { + 1663, /* Code */ + 10415, /* Vendor */ + "Restoration-Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SGs-MME-Identity, UTF8String, code 1664, section 7.3.175 */ + { + struct dict_avp_data data = { + 1664, /* Code */ + 10415, /* Vendor */ + "SGs-MME-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SIPTO-Local-Network-Permission, Unsigned32, code 1665, section 7.3.176 */ + { + struct dict_avp_data data = { + 1665, /* Code */ + 10415, /* Vendor */ + "SIPTO-Local-Network-Permission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Coupled-Node-Diameter-ID, DiameterIdentity, code 1666, section 7.3.177 */ + { + struct dict_avp_data data = { + 1666, /* Code */ + 10415, /* Vendor */ + "Coupled-Node-Diameter-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* WLAN-offloadability, Grouped, code 1667, section 7.3.181 */ + { + struct dict_avp_data data = { + 1667, /* Code */ + 10415, /* Vendor */ + "WLAN-offloadability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-offloadability-EUTRAN, Unsigned32, code 1668, section 7.3.182 */ + { + struct dict_avp_data data = { + 1668, /* Code */ + 10415, /* Vendor */ + "WLAN-offloadability-EUTRAN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-offloadability-UTRAN, Unsigned32, code 1669, section 7.3.183 */ + { + struct dict_avp_data data = { + 1669, /* Code */ + 10415, /* Vendor */ + "WLAN-offloadability-UTRAN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reset-ID, OctetString, code 1670, section 7.3.184 */ + { + struct dict_avp_data data = { + 1670, /* Code */ + 10415, /* Vendor */ + "Reset-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MDT-Allowed-PLMN-Id, OctetString, code 1671, section 7.3.185 */ + { + struct dict_avp_data data = { + 1671, /* Code */ + 10415, /* Vendor */ + "MDT-Allowed-PLMN-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Adjacent-PLMNs, Grouped, code 1672, section 7.3.186 */ + { + struct dict_avp_data data = { + 1672, /* Code */ + 10415, /* Vendor */ + "Adjacent-PLMNs", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Adjacent-Access-Restriction-Data, Grouped, code 1673, section 7.3.187 */ + { + struct dict_avp_data data = { + 1673, /* Code */ + 10415, /* Vendor */ + "Adjacent-Access-Restriction-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DL-Buffering-Suggested-Packet-Count, Integer32, code 1674, section 7.3.188 */ + { + struct dict_avp_data data = { + 1674, /* Code */ + 10415, /* Vendor */ + "DL-Buffering-Suggested-Packet-Count", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IMSI-Group-Id, Grouped, code 1675, section 7.3.189 */ + { + struct dict_avp_data data = { + 1675, /* Code */ + 10415, /* Vendor */ + "IMSI-Group-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Group-Service-Id, Unsigned32, code 1676, section 7.3.190 */ + { + struct dict_avp_data data = { + 1676, /* Code */ + 10415, /* Vendor */ + "Group-Service-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Group-PLMN-Id, OctetString, code 1677, section 7.3.191 */ + { + struct dict_avp_data data = { + 1677, /* Code */ + 10415, /* Vendor */ + "Group-PLMN-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Local-Group-Id, OctetString, code 1678, section 7.3.192 */ + { + struct dict_avp_data data = { + 1678, /* Code */ + 10415, /* Vendor */ + "Local-Group-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AIR-Flags, Unsigned32, code 1679, section 7.3.201 */ + { + struct dict_avp_data data = { + 1679, /* Code */ + 10415, /* Vendor */ + "AIR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UE-Usage-Type, Unsigned32, code 1680, section 7.3.202 */ + { + struct dict_avp_data data = { + 1680, /* Code */ + 10415, /* Vendor */ + "UE-Usage-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Non-IP-PDN-Type-Indicator, Enumerated, code 1681, section 7.3.204 */ + { + struct dict_avp_data data = { + 1681, /* Code */ + 10415, /* Vendor */ + "Non-IP-PDN-Type-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Non-IP-PDN-Type-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Non-IP-Data-Delivery-Mechanism, Unsigned32, code 1682, section 7.3.205 */ + { + struct dict_avp_data data = { + 1682, /* Code */ + 10415, /* Vendor */ + "Non-IP-Data-Delivery-Mechanism", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.272 Table 7.3.1/1 row Additional-Context-ID (1683) has */ + /* incorrect name and should be "Additional-Context-Identifier" per clause 7.3.206. */ + /* */ + /* Fix: Additional-Context-ID (1683) renamed to Additional-Context-Identifier (1683). */ + /* Additional-Context-Identifier, Unsigned32, code 1683, section 7.3.206 */ + { + struct dict_avp_data data = { + 1683, /* Code */ + 10415, /* Vendor */ + "Additional-Context-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SCEF-Realm, DiameterIdentity, code 1684, section 7.3.207 */ + { + struct dict_avp_data data = { + 1684, /* Code */ + 10415, /* Vendor */ + "SCEF-Realm", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* Subscription-Data-Deletion, Grouped, code 1685, section 7.3.208 */ + { + struct dict_avp_data data = { + 1685, /* Code */ + 10415, /* Vendor */ + "Subscription-Data-Deletion", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.272 Table 7.3.1/1 row Preferred-Data-Mode (1686) */ + /* incorrectly has value type Grouped instead of Unsigned32, */ + /* conflicting with clause 7.3.209. */ + /* */ + /* Fix: Preferred-Data-Mode (1686) type changed from Grouped to Unsigned32. */ + /* Preferred-Data-Mode, Unsigned32, code 1686, section 7.3.209 */ + { + struct dict_avp_data data = { + 1686, /* Code */ + 10415, /* Vendor */ + "Preferred-Data-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Emergency-Info, Grouped, code 1687, section 7.3.210 */ + { + struct dict_avp_data data = { + 1687, /* Code */ + 10415, /* Vendor */ + "Emergency-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* V2X-Subscription-Data, Grouped, code 1688, section 7.3.212 */ + { + struct dict_avp_data data = { + 1688, /* Code */ + 10415, /* Vendor */ + "V2X-Subscription-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* V2X-Permission, Unsigned32, code 1689, section 7.3.213 */ + { + struct dict_avp_data data = { + 1689, /* Code */ + 10415, /* Vendor */ + "V2X-Permission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDN-Connection-Continuity, Unsigned32, code 1690, section 7.3.214 */ + { + struct dict_avp_data data = { + 1690, /* Code */ + 10415, /* Vendor */ + "PDN-Connection-Continuity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* eDRX-Cycle-Length, Grouped, code 1691, section 7.3.215 */ + { + struct dict_avp_data data = { + 1691, /* Code */ + 10415, /* Vendor */ + "eDRX-Cycle-Length", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* eDRX-Cycle-Length-Value, OctetString, code 1692, section 7.3.216 */ + { + struct dict_avp_data data = { + 1692, /* Code */ + 10415, /* Vendor */ + "eDRX-Cycle-Length-Value", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UE-PC5-AMBR, Unsigned32, code 1693, section 7.3.217 */ + { + struct dict_avp_data data = { + 1693, /* Code */ + 10415, /* Vendor */ + "UE-PC5-AMBR", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBSFN-Area, Grouped, code 1694, section 7.3.219 */ + { + struct dict_avp_data data = { + 1694, /* Code */ + 10415, /* Vendor */ + "MBSFN-Area", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBSFN-Area-ID, Unsigned32, code 1695, section 7.3.220 */ + { + struct dict_avp_data data = { + 1695, /* Code */ + 10415, /* Vendor */ + "MBSFN-Area-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Carrier-Frequency, Unsigned32, code 1696, section 7.3.221 */ + { + struct dict_avp_data data = { + 1696, /* Code */ + 10415, /* Vendor */ + "Carrier-Frequency", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RDS-Indicator, Enumerated, code 1697, section 7.3.222 */ + { + struct dict_avp_data data = { + 1697, /* Code */ + 10415, /* Vendor */ + "RDS-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/RDS-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Service-Gap-Time, Unsigned32, code 1698, section 7.3.223 */ + { + struct dict_avp_data data = { + 1698, /* Code */ + 10415, /* Vendor */ + "Service-Gap-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Aerial-UE-Subscription-Information, Unsigned32, code 1699, section 7.3.224 */ + { + struct dict_avp_data data = { + 1699, /* Code */ + 10415, /* Vendor */ + "Aerial-UE-Subscription-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Broadcast-Location-Assistance-Data-Types, Unsigned64, code 1700, section 7.3.225 */ + { + struct dict_avp_data data = { + 1700, /* Code */ + 10415, /* Vendor */ + "Broadcast-Location-Assistance-Data-Types", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Paging-Time-Window, Grouped, code 1701, section 7.3.226 */ + { + struct dict_avp_data data = { + 1701, /* Code */ + 10415, /* Vendor */ + "Paging-Time-Window", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Operation-Mode, Unsigned32, code 1702, section 7.3.227 */ + { + struct dict_avp_data data = { + 1702, /* Code */ + 10415, /* Vendor */ + "Operation-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Paging-Time-Window-Length, OctetString, code 1703, section 7.3.228 */ + { + struct dict_avp_data data = { + 1703, /* Code */ + 10415, /* Vendor */ + "Paging-Time-Window-Length", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Core-Network-Restrictions, Unsigned32, code 1704, section 7.3.230 */ + { + struct dict_avp_data data = { + 1704, /* Code */ + 10415, /* Vendor */ + "Core-Network-Restrictions", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* eDRX-Related-RAT, Grouped, code 1705, section 7.3.229 */ + { + struct dict_avp_data data = { + 1705, /* Code */ + 10415, /* Vendor */ + "eDRX-Related-RAT", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Interworking-5GS-Indicator, Enumerated, code 1706, section 7.3.231 */ + { + struct dict_avp_data data = { + 1706, /* Code */ + 10415, /* Vendor */ + "Interworking-5GS-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Interworking-5GS-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.273 V15.4.0 (2019-09) */ + /* Evolved Packet System (EPS); */ + /* 3GPP EPS AAA interfaces */ + /* */ + /* From 3GPP 29273-f40.docx */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 5.2.3.1/1: Diameter STa AVPs */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* ANID, UTF8String, code 1504, section 5.2.3.7 */ + { + struct dict_avp_data data = { + 1504, /* Code */ + 10415, /* Vendor */ + "ANID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* AN-Trusted, Enumerated, code 1503, section 5.2.3.9 */ + { + struct dict_avp_data data = { + 1503, /* Code */ + 10415, /* Vendor */ + "AN-Trusted", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AN-Trusted)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MIP-FA-RK, OctetString, code 1506, section 5.2.3.12 */ + { + struct dict_avp_data data = { + 1506, /* Code */ + 10415, /* Vendor */ + "MIP-FA-RK", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MIP-FA-RK-SPI, Unsigned32, code 1507, section 5.2.3.13 */ + { + struct dict_avp_data data = { + 1507, /* Code */ + 10415, /* Vendor */ + "MIP-FA-RK-SPI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Full-Network-Name, OctetString, code 1516, section 5.2.3.14 */ + { + struct dict_avp_data data = { + 1516, /* Code */ + 10415, /* Vendor */ + "Full-Network-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Short-Network-Name, OctetString, code 1517, section 5.2.3.15 */ + { + struct dict_avp_data data = { + 1517, /* Code */ + 10415, /* Vendor */ + "Short-Network-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-Identifier, Grouped, code 1509, section 5.2.3.18 */ + { + struct dict_avp_data data = { + 1509, /* Code */ + 10415, /* Vendor */ + "WLAN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AAA-Failure-Indication, Unsigned32, code 1518, section 8.2.3.21 */ + { + struct dict_avp_data data = { + 1518, /* Code */ + 10415, /* Vendor */ + "AAA-Failure-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transport-Access-Type, Enumerated, code 1519, section 5.2.3.19 */ + { + struct dict_avp_data data = { + 1519, /* Code */ + 10415, /* Vendor */ + "Transport-Access-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Transport-Access-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* DER-Flags, Unsigned32, code 1520, section 5.2.3.20 */ + { + struct dict_avp_data data = { + 1520, /* Code */ + 10415, /* Vendor */ + "DER-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DEA-Flags, Unsigned32, code 1521, section 5.2.3.21 */ + { + struct dict_avp_data data = { + 1521, /* Code */ + 10415, /* Vendor */ + "DEA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SSID, UTF8String, code 1524, section 5.2.3.22 */ + { + struct dict_avp_data data = { + 1524, /* Code */ + 10415, /* Vendor */ + "SSID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* HESSID, UTF8String, code 1525, section 5.2.3.23 */ + { + struct dict_avp_data data = { + 1525, /* Code */ + 10415, /* Vendor */ + "HESSID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Access-Network-Info, Grouped, code 1526, section 5.2.3.24 */ + { + struct dict_avp_data data = { + 1526, /* Code */ + 10415, /* Vendor */ + "Access-Network-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAN-Connection-Mode, Unsigned32, code 1527, section 5.2.3.25 */ + { + struct dict_avp_data data = { + 1527, /* Code */ + 10415, /* Vendor */ + "TWAN-Connection-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAN-Connectivity-Parameters, Grouped, code 1528, section 5.2.3.26 */ + { + struct dict_avp_data data = { + 1528, /* Code */ + 10415, /* Vendor */ + "TWAN-Connectivity-Parameters", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Connectivity-Flags, Unsigned32, code 1529, section 5.2.3.27 */ + { + struct dict_avp_data data = { + 1529, /* Code */ + 10415, /* Vendor */ + "Connectivity-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAN-PCO, OctetString, code 1530, section 5.2.3.28 */ + { + struct dict_avp_data data = { + 1530, /* Code */ + 10415, /* Vendor */ + "TWAN-PCO", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAG-CP-Address, Address, code 1531, section 5.2.3.29 */ + { + struct dict_avp_data data = { + 1531, /* Code */ + 10415, /* Vendor */ + "TWAG-CP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* TWAG-UP-Address, UTF8String, code 1532, section 5.2.3.30 */ + { + struct dict_avp_data data = { + 1532, /* Code */ + 10415, /* Vendor */ + "TWAG-UP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* TWAN-S2a-Failure-Cause, Unsigned32, code 1533, section 5.2.3.31 */ + { + struct dict_avp_data data = { + 1533, /* Code */ + 10415, /* Vendor */ + "TWAN-S2a-Failure-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Back-Off-Timer, Unsigned32, code 1534, section 5.2.3.32 */ + { + struct dict_avp_data data = { + 1534, /* Code */ + 10415, /* Vendor */ + "SM-Back-Off-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLCP-Key, OctetString, code 1535, section 5.2.3.33 */ + { + struct dict_avp_data data = { + 1535, /* Code */ + 10415, /* Vendor */ + "WLCP-Key", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Emergency-Services, Unsigned32, code 1538, section 7.2.3.4 */ + { + struct dict_avp_data data = { + 1538, /* Code */ + 10415, /* Vendor */ + "Emergency-Services", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IMEI-Check-In-VPLMN-Result, Unsigned32, code 1540, section 5.2.3.35 */ + { + struct dict_avp_data data = { + 1540, /* Code */ + 10415, /* Vendor */ + "IMEI-Check-In-VPLMN-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 6.2.3.1/1: Diameter SWd AVPs */ + /* */ + /* Note: No AVPs are first defined in this table. */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 7.2.3.1/1: Diameter SWm AVPs */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* Trace-Info, Grouped, code 1505, section 8.2.3.1.3 */ + { + struct dict_avp_data data = { + 1505, /* Code */ + 10415, /* Vendor */ + "Trace-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AAR-Flags, Unsigned32, code 1539, section 7.2.3.5 */ + { + struct dict_avp_data data = { + 1539, /* Code */ + 10415, /* Vendor */ + "AAR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 8.2.3.0/1: Diameter SWx AVPs */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* Non-3GPP-User-Data, Grouped, code 1500, section 8.2.3.1 */ + { + struct dict_avp_data data = { + 1500, /* Code */ + 10415, /* Vendor */ + "Non-3GPP-User-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Non-3GPP-IP-Access, Enumerated, code 1501, section 8.2.3.3 */ + { + struct dict_avp_data data = { + 1501, /* Code */ + 10415, /* Vendor */ + "Non-3GPP-IP-Access", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Non-3GPP-IP-Access)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Non-3GPP-IP-Access-APN, Enumerated, code 1502, section 8.2.3.4 */ + { + struct dict_avp_data data = { + 1502, /* Code */ + 10415, /* Vendor */ + "Non-3GPP-IP-Access-APN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Non-3GPP-IP-Access-APN)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PPR-Flags, Unsigned32, code 1508, section 8.2.3.17 */ + { + struct dict_avp_data data = { + 1508, /* Code */ + 10415, /* Vendor */ + "PPR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAN-Default-APN-Context-Id, Unsigned32, code 1512, section 8.2.3.18 */ + { + struct dict_avp_data data = { + 1512, /* Code */ + 10415, /* Vendor */ + "TWAN-Default-APN-Context-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAN-Access-Info, Grouped, code 1510, section 8.2.3.19 */ + { + struct dict_avp_data data = { + 1510, /* Code */ + 10415, /* Vendor */ + "TWAN-Access-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Authorization-Flags, Unsigned32, code 1511, section 8.2.3.20 */ + { + struct dict_avp_data data = { + 1511, /* Code */ + 10415, /* Vendor */ + "Access-Authorization-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-AAA-Server-Name, DiameterIdentity, code 318, section 8.2.3.24 */ + { + struct dict_avp_data data = { + 318, /* Code */ + 10415, /* Vendor */ + "3GPP-AAA-Server-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* ERP-Authorization, Unsigned32, code 1541, section 8.2.3.27 */ + { + struct dict_avp_data data = { + 1541, /* Code */ + 10415, /* Vendor */ + "ERP-Authorization", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 9.2.3.1.1/1: Diameter S6b AVPs for DSMIPv6 */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* RAR-Flags, Unsigned32, code 1522, section 9.2.3.1.5 */ + { + struct dict_avp_data data = { + 1522, /* Code */ + 10415, /* Vendor */ + "RAR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Trust-Relationship-Update (1515) Enumerated removed in 3GPP TS 29.273 V11.4.0 (2012-12). */ + + /* DER-S6b-Flags, Unsigned32, code 1523, section 9.2.3.7 */ + { + struct dict_avp_data data = { + 1523, /* Code */ + 10415, /* Vendor */ + "DER-S6b-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 9.2.3.2.1/1: Diameter S6b AVPs for PMIPv6 or GTPv2 */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* Origination-Time-Stamp, Unsigned64, code 1536, section 9.2.3.2.6 */ + { + struct dict_avp_data data = { + 1536, /* Code */ + 10415, /* Vendor */ + "Origination-Time-Stamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-Wait-Time, Unsigned32, code 1537, section 9.2.3.2.7 */ + { + struct dict_avp_data data = { + 1537, /* Code */ + 10415, /* Vendor */ + "Maximum-Wait-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + + /*==================================================================*/ + /* 3GPP TS 29.273 Table 9.2.3.6.1/1: Diameter S6b AVPs for MIPv4 FACoA */ + /* */ + /* Note: No AVPs are first defined in this table. */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.283 V15.1.0 (2019-09) */ + /* Diameter Data Management Applications */ + /* */ + /* From 3GPP 29283-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.283 Table 7.3.1-1: MCPTT-2, MCVideo-2, MCData-2 and CSC-13 specific Diameter AVPs */ + /*==================================================================*/ + + /* MCPTT-ID, UTF8String, code 4500, section 7.3.2 */ + { + struct dict_avp_data data = { + 4500, /* Code */ + 10415, /* Vendor */ + "MCPTT-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Data-Identification, Grouped, code 4501, section 7.3.3 */ + { + struct dict_avp_data data = { + 4501, /* Code */ + 10415, /* Vendor */ + "Data-Identification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Data-Identification-Prefix, Unsigned32, code 4502, section 7.3.11 */ + { + struct dict_avp_data data = { + 4502, /* Code */ + 10415, /* Vendor */ + "Data-Identification-Prefix", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Data-Identification-Flags, Unsigned64, code 4503, section 7.3.12 */ + { + struct dict_avp_data data = { + 4503, /* Code */ + 10415, /* Vendor */ + "Data-Identification-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DPR-Flags, Unsigned32, code 4504, section 7.3.13 */ + { + struct dict_avp_data data = { + 4504, /* Code */ + 10415, /* Vendor */ + "DPR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DPA-Flags, Unsigned32, code 4505, section 7.3.14 */ + { + struct dict_avp_data data = { + 4505, /* Code */ + 10415, /* Vendor */ + "DPA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DUR-Flags, Unsigned32, code 4506, section 7.3.15 */ + { + struct dict_avp_data data = { + 4506, /* Code */ + 10415, /* Vendor */ + "DUR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DUA-Flags, Unsigned32, code 4507, section 7.3.16 */ + { + struct dict_avp_data data = { + 4507, /* Code */ + 10415, /* Vendor */ + "DUA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NDR-Flags, Unsigned32, code 4508, section 7.3.17 */ + { + struct dict_avp_data data = { + 4508, /* Code */ + 10415, /* Vendor */ + "NDR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NDA-Flags, Unsigned32, code 4509, section 7.3.18 */ + { + struct dict_avp_data data = { + 4509, /* Code */ + 10415, /* Vendor */ + "NDA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* User-Data-Id, Unsigned32, code 4510, section 7.3.19 */ + { + struct dict_avp_data data = { + 4510, /* Code */ + 10415, /* Vendor */ + "User-Data-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MC-Service-User-Profile-Data, Grouped, code 4511, section 7.3.20 */ + { + struct dict_avp_data data = { + 4511, /* Code */ + 10415, /* Vendor */ + "MC-Service-User-Profile-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.140 Sequence-Number (1107). */ + /* and 3GPP TS 29.329 Sequence-Number (716). */ + /* 3GPP TS 29.140 V6.1.0 (2005-06) allocated Sequence-Number (1107). */ + /* 3GPP TS 29.329 V10.0.0 (2010-09) CR 0163 added Sequence-Number (716). */ + /* 3GPP TS 29.283 V13.1.0 (2016-06) allocated Sequence-Number (4512). */ + /* */ + /* Fix: Sequence-Number (4512) renamed to Sequence-Number-29.283 (4512). */ + /* Sequence-Number-29.283, Unsigned32, code 4512, section 7.3.21 */ + { + struct dict_avp_data data = { + 4512, /* Code */ + 10415, /* Vendor */ + "Sequence-Number-29.283", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Data, Grouped, code 4513, section 7.3.22 */ + { + struct dict_avp_data data = { + 4513, /* Code */ + 10415, /* Vendor */ + "Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MCVideo-ID, UTF8String, code 4514, section 7.3.24 */ + { + struct dict_avp_data data = { + 4514, /* Code */ + 10415, /* Vendor */ + "MCVideo-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* MCData-ID, UTF8String, code 4515, section 7.3.25 */ + { + struct dict_avp_data data = { + 4515, /* Code */ + 10415, /* Vendor */ + "MCData-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.329 V15.2.0 (2019-09) */ + /* Sh Interface based on the Diameter protocol; */ + /* Protocol details */ + /* */ + /* From 3GPP 29329-f20.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.329 Table 6.3.1: Table 6.3.1: Diameter Multimedia Application AVPs */ + /* */ + /* Note: AVPs referenced from other sources are not added here. */ + /*==================================================================*/ + + /* User-Identity, Grouped, code 700, section 6.3.1 */ + { + struct dict_avp_data data = { + 700, /* Code */ + 10415, /* Vendor */ + "User-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MSISDN, OctetString, code 701, section 6.3.2 */ + { + struct dict_avp_data data = { + 701, /* Code */ + 10415, /* Vendor */ + "MSISDN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.229 User-Data (606). */ + /* 3GPP TS 29.229 V6.2.0 (2004-09) allocated User-Data (606). */ + /* 3GPP TS 29.329 V6.2.0 (2004-09) allocated User-Data (702). */ + /* */ + /* Fix: User-Data (702) renamed to User-Data-29.329 (702). */ + /* User-Data-29.329, OctetString, code 702, section 6.3.3 */ + { + struct dict_avp_data data = { + 702, /* Code */ + 10415, /* Vendor */ + "User-Data-29.329", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Data-Reference, Enumerated, code 703, section 6.3.4 */ + { + struct dict_avp_data data = { + 703, /* Code */ + 10415, /* Vendor */ + "Data-Reference", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Data-Reference)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Service-Indication, OctetString, code 704, section 6.3.5 */ + { + struct dict_avp_data data = { + 704, /* Code */ + 10415, /* Vendor */ + "Service-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Subs-Req-Type, Enumerated, code 705, section 6.3.6 */ + { + struct dict_avp_data data = { + 705, /* Code */ + 10415, /* Vendor */ + "Subs-Req-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subs-Req-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Requested-Domain, Enumerated, code 706, section 6.3.7 */ + { + struct dict_avp_data data = { + 706, /* Code */ + 10415, /* Vendor */ + "Requested-Domain", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Requested-Domain)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Current-Location, Enumerated, code 707, section 6.3.8 */ + { + struct dict_avp_data data = { + 707, /* Code */ + 10415, /* Vendor */ + "Current-Location", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Current-Location)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Identity-Set, Enumerated, code 708, section 6.3.10 */ + { + struct dict_avp_data data = { + 708, /* Code */ + 10415, /* Vendor */ + "Identity-Set", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Identity-Set)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Expiry-Time, Time, code 709, section 6.3.16 */ + { + struct dict_avp_data data = { + 709, /* Code */ + 10415, /* Vendor */ + "Expiry-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Send-Data-Indication, Enumerated, code 710, section 6.3.17 */ + { + struct dict_avp_data data = { + 710, /* Code */ + 10415, /* Vendor */ + "Send-Data-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Send-Data-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* DSAI-Tag, OctetString, code 711, section 6.3.18 */ + { + struct dict_avp_data data = { + 711, /* Code */ + 10415, /* Vendor */ + "DSAI-Tag", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* One-Time-Notification, Enumerated, code 712, section 6.3.22 */ + { + struct dict_avp_data data = { + 712, /* Code */ + 10415, /* Vendor */ + "One-Time-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/One-Time-Notification)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Requested-Nodes, Unsigned32, code 713, section 6.3.7A */ + { + struct dict_avp_data data = { + 713, /* Code */ + 10415, /* Vendor */ + "Requested-Nodes", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Serving-Node-Indication, Enumerated, code 714, section 6.3.23 */ + { + struct dict_avp_data data = { + 714, /* Code */ + 10415, /* Vendor */ + "Serving-Node-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Serving-Node-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Repository-Data-ID, Grouped, code 715, section 6.3.24 */ + { + struct dict_avp_data data = { + 715, /* Code */ + 10415, /* Vendor */ + "Repository-Data-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.140 Sequence-Number (1107) */ + /* and 3GPP TS 29.283 Sequence-Number (4512). */ + /* 3GPP TS 29.140 V6.1.0 (2005-06) allocated Sequence-Number (1107). */ + /* 3GPP TS 29.329 V10.0.0 (2010-09) CR 0163 added Sequence-Number (716). */ + /* 3GPP TS 29.283 V13.1.0 (2016-06) allocated Sequence-Number (4512). */ + /* Sequence-Number, Unsigned32, code 716, section 6.3.25 */ + { + struct dict_avp_data data = { + 716, /* Code */ + 10415, /* Vendor */ + "Sequence-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Pre-paging-Supported, Enumerated, code 717, section 6.3.26 */ + { + struct dict_avp_data data = { + 717, /* Code */ + 10415, /* Vendor */ + "Pre-paging-Supported", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Pre-paging-Supported)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Local-Time-Zone-Indication, Enumerated, code 718, section 6.3.27 */ + { + struct dict_avp_data data = { + 718, /* Code */ + 10415, /* Vendor */ + "Local-Time-Zone-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Local-Time-Zone-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* UDR-Flags, Unsigned32, code 719, section 6.3.28 */ + { + struct dict_avp_data data = { + 719, /* Code */ + 10415, /* Vendor */ + "UDR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Call-Reference-Info, Grouped, code 720, section 6.3.29 */ + { + struct dict_avp_data data = { + 720, /* Code */ + 10415, /* Vendor */ + "Call-Reference-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Call-Reference-Number, OctetString, code 721, section 6.3.30 */ + { + struct dict_avp_data data = { + 721, /* Code */ + 10415, /* Vendor */ + "Call-Reference-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AS-Number, OctetString, code 722, section 6.3.31 */ + { + struct dict_avp_data data = { + 722, /* Code */ + 10415, /* Vendor */ + "AS-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.336 V15.7.0 (2019-09) */ + /* Home Subscriber Server (HSS) diameter interfaces for */ + /* interworking with packet data networks and applications */ + /* */ + /* From 3GPP 29336-f70.docx */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.336 Table 6.4.1/1: S6m/S6n specific Diameter AVPs */ + /*==================================================================*/ + + /* IP-SM-GW-Number, OctetString, code 3100, section 6.4.14 */ + { + struct dict_avp_data data = { + 3100, /* Code */ + 10415, /* Vendor */ + "IP-SM-GW-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IP-SM-GW-Name, DiameterIdentity, code 3101, section 6.4.15 */ + { + struct dict_avp_data data = { + 3101, /* Code */ + 10415, /* Vendor */ + "IP-SM-GW-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* User-Identifier, Grouped, code 3102, section 6.4.2 */ + { + struct dict_avp_data data = { + 3102, /* Code */ + 10415, /* Vendor */ + "User-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-ID, Enumerated, code 3103, section 6.4.3 */ + { + struct dict_avp_data data = { + 3103, /* Code */ + 10415, /* Vendor */ + "Service-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Service-ID)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SCS-Identity, OctetString, code 3104, section 6.4.4 */ + { + struct dict_avp_data data = { + 3104, /* Code */ + 10415, /* Vendor */ + "SCS-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Parameters, Grouped, code 3105, section 6.4.5 */ + { + struct dict_avp_data data = { + 3105, /* Code */ + 10415, /* Vendor */ + "Service-Parameters", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* T4-Parameters, Grouped, code 3106, section 6.4.6 */ + { + struct dict_avp_data data = { + 3106, /* Code */ + 10415, /* Vendor */ + "T4-Parameters", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Data, Grouped, code 3107, section 6.4.7 */ + { + struct dict_avp_data data = { + 3107, /* Code */ + 10415, /* Vendor */ + "Service-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* T4-Data, Grouped, code 3108, section 6.4.8 */ + { + struct dict_avp_data data = { + 3108, /* Code */ + 10415, /* Vendor */ + "T4-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* HSS-Cause, Unsigned32, code 3109, section 6.4.9 */ + { + struct dict_avp_data data = { + 3109, /* Code */ + 10415, /* Vendor */ + "HSS-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIR-Flags, Unsigned32, code 3110, section 6.4.10 */ + { + struct dict_avp_data data = { + 3110, /* Code */ + 10415, /* Vendor */ + "SIR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.061 External-Identifier (28) OctetString replaced by */ + /* 3GPP TS 29.336 External-Identifier (3111) UTF8String. */ + /* */ + /* Change-1.4.0: External-Identifier (28) OctetString replaced by External-Identifier (3111) UTF8String. */ + /* External-Identifier, UTF8String, code 3111, section 6.4.11 */ + { + struct dict_avp_data data = { + 3111, /* Code */ + 10415, /* Vendor */ + "External-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* IP-SM-GW-Realm, DiameterIdentity, code 3112, section 6.4.18 */ + { + struct dict_avp_data data = { + 3112, /* Code */ + 10415, /* Vendor */ + "IP-SM-GW-Realm", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.336 Table 8.4.1-1: S6t specific Diameter AVPs */ + /*==================================================================*/ + + /* AESE-Communication-Pattern, Grouped, code 3113, section 8.4.25 */ + { + struct dict_avp_data data = { + 3113, /* Code */ + 10415, /* Vendor */ + "AESE-Communication-Pattern", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Communication-Pattern-Set, Grouped, code 3114, section 8.4.26 */ + { + struct dict_avp_data data = { + 3114, /* Code */ + 10415, /* Vendor */ + "Communication-Pattern-Set", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Periodic-Communication-Indicator, Unsigned32, code 3115, section 8.4.27 */ + { + struct dict_avp_data data = { + 3115, /* Code */ + 10415, /* Vendor */ + "Periodic-Communication-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Communication-Duration-Time, Unsigned32, code 3116, section 8.4.28 */ + { + struct dict_avp_data data = { + 3116, /* Code */ + 10415, /* Vendor */ + "Communication-Duration-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.336 Table 8.4.1-1 row Periodic-time (3117) has */ + /* incorrect name and should be "Periodic-Time" per majority use. */ + /* */ + /* Fix: Periodic-time (3117) renamed to Periodic-Time (931). */ + /* Periodic-Time, Unsigned32, code 3117, section 8.4.29 */ + { + struct dict_avp_data data = { + 3117, /* Code */ + 10415, /* Vendor */ + "Periodic-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Scheduled-Communication-Time, Grouped, code 3118, section 8.4.30 */ + { + struct dict_avp_data data = { + 3118, /* Code */ + 10415, /* Vendor */ + "Scheduled-Communication-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Stationary-Indication, Unsigned32, code 3119, section 8.4.31 */ + { + struct dict_avp_data data = { + 3119, /* Code */ + 10415, /* Vendor */ + "Stationary-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AESE-Communication-Pattern-Config-Status, Grouped, code 3120, section 8.4.32 */ + { + struct dict_avp_data data = { + 3120, /* Code */ + 10415, /* Vendor */ + "AESE-Communication-Pattern-Config-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AESE-Error-Report, Grouped, code 3121, section 8.4.33 */ + { + struct dict_avp_data data = { + 3121, /* Code */ + 10415, /* Vendor */ + "AESE-Error-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Configuration, Grouped, code 3122, section 8.4.2 */ + { + struct dict_avp_data data = { + 3122, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Report, Grouped, code 3123, section 8.4.3 */ + { + struct dict_avp_data data = { + 3123, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SCEF-Reference-ID, Unsigned32, code 3124, section 8.4.4 */ + { + struct dict_avp_data data = { + 3124, /* Code */ + 10415, /* Vendor */ + "SCEF-Reference-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SCEF-ID, DiameterIdentity, code 3125, section 8.4.5 */ + { + struct dict_avp_data data = { + 3125, /* Code */ + 10415, /* Vendor */ + "SCEF-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* SCEF-Reference-ID-for-Deletion, Unsigned32, code 3126, section 8.4.6 */ + { + struct dict_avp_data data = { + 3126, /* Code */ + 10415, /* Vendor */ + "SCEF-Reference-ID-for-Deletion", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Type, Unsigned32, code 3127, section 8.4.7 */ + { + struct dict_avp_data data = { + 3127, /* Code */ + 10415, /* Vendor */ + "Monitoring-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-Number-of-Reports, Unsigned32, code 3128, section 8.4.8 */ + { + struct dict_avp_data data = { + 3128, /* Code */ + 10415, /* Vendor */ + "Maximum-Number-of-Reports", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UE-Reachability-Configuration, Grouped, code 3129, section 8.4.9 */ + { + struct dict_avp_data data = { + 3129, /* Code */ + 10415, /* Vendor */ + "UE-Reachability-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Duration, Time, code 3130, section 8.4.10 */ + { + struct dict_avp_data data = { + 3130, /* Code */ + 10415, /* Vendor */ + "Monitoring-Duration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Maximum-Detection-Time, Unsigned32, code 3131, section 8.4.11 */ + { + struct dict_avp_data data = { + 3131, /* Code */ + 10415, /* Vendor */ + "Maximum-Detection-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reachability-Type, Unsigned32, code 3132, section 8.4.12 */ + { + struct dict_avp_data data = { + 3132, /* Code */ + 10415, /* Vendor */ + "Reachability-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-Latency, Unsigned32, code 3133, section 8.4.13 */ + { + struct dict_avp_data data = { + 3133, /* Code */ + 10415, /* Vendor */ + "Maximum-Latency", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-Response-Time, Unsigned32, code 3134, section 8.4.14 */ + { + struct dict_avp_data data = { + 3134, /* Code */ + 10415, /* Vendor */ + "Maximum-Response-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Information-Configuration, Grouped, code 3135, section 8.4.15 */ + { + struct dict_avp_data data = { + 3135, /* Code */ + 10415, /* Vendor */ + "Location-Information-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MONTE-Location-Type, Unsigned32, code 3136, section 8.4.16 */ + { + struct dict_avp_data data = { + 3136, /* Code */ + 10415, /* Vendor */ + "MONTE-Location-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Accuracy, Unsigned32, code 3137, section 8.4.17 */ + { + struct dict_avp_data data = { + 3137, /* Code */ + 10415, /* Vendor */ + "Accuracy", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Association-Type, Unsigned32, code 3138, section 8.4.18 */ + { + struct dict_avp_data data = { + 3138, /* Code */ + 10415, /* Vendor */ + "Association-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Roaming-Information, Unsigned32, code 3139, section 8.4.19 */ + { + struct dict_avp_data data = { + 3139, /* Code */ + 10415, /* Vendor */ + "Roaming-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reachability-Information, Unsigned32, code 3140, section 8.4.20 */ + { + struct dict_avp_data data = { + 3140, /* Code */ + 10415, /* Vendor */ + "Reachability-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IMEI-Change, Unsigned32, code 3141, section 8.4.22 */ + { + struct dict_avp_data data = { + 3141, /* Code */ + 10415, /* Vendor */ + "IMEI-Change", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Config-Status, Grouped, code 3142, section 8.4.24 */ + { + struct dict_avp_data data = { + 3142, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Config-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Supported-Services, Grouped, code 3143, section 8.4.40 */ + { + struct dict_avp_data data = { + 3143, /* Code */ + 10415, /* Vendor */ + "Supported-Services", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Supported-Monitoring-Events, Unsigned64, code 3144, section 8.4.41 */ + { + struct dict_avp_data data = { + 3144, /* Code */ + 10415, /* Vendor */ + "Supported-Monitoring-Events", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CIR-Flags, Unsigned32, code 3145, section 8.4.39 */ + { + struct dict_avp_data data = { + 3145, /* Code */ + 10415, /* Vendor */ + "CIR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Result, Grouped, code 3146, section 8.4.37 */ + { + struct dict_avp_data data = { + 3146, /* Code */ + 10415, /* Vendor */ + "Service-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Result-Code, Unsigned32, code 3147, section 8.4.38 */ + { + struct dict_avp_data data = { + 3147, /* Code */ + 10415, /* Vendor */ + "Service-Result-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reference-ID-Validity-Time, Time, code 3148, section 8.4.42 */ + { + struct dict_avp_data data = { + 3148, /* Code */ + 10415, /* Vendor */ + "Reference-ID-Validity-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Event-Handling, Unsigned32, code 3149, section 8.4.43 */ + { + struct dict_avp_data data = { + 3149, /* Code */ + 10415, /* Vendor */ + "Event-Handling", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NIDD-Authorization-Request, Grouped, code 3150, section 8.4.44 */ + { + struct dict_avp_data data = { + 3150, /* Code */ + 10415, /* Vendor */ + "NIDD-Authorization-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NIDD-Authorization-Response, Grouped, code 3151, section 8.4.45 */ + { + struct dict_avp_data data = { + 3151, /* Code */ + 10415, /* Vendor */ + "NIDD-Authorization-Response", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Report, Grouped, code 3152, section 8.4.47 */ + { + struct dict_avp_data data = { + 3152, /* Code */ + 10415, /* Vendor */ + "Service-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Node-Type, Unsigned32, code 3153, section 8.4.48 */ + { + struct dict_avp_data data = { + 3153, /* Code */ + 10415, /* Vendor */ + "Node-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* S6t-HSS-Cause, Unsigned32, code 3154, section 8.4.50 */ + { + struct dict_avp_data data = { + 3154, /* Code */ + 10415, /* Vendor */ + "S6t-HSS-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Enhanced-Coverage-Restriction, Grouped, code 3155, section 8.4.51 */ + { + struct dict_avp_data data = { + 3155, /* Code */ + 10415, /* Vendor */ + "Enhanced-Coverage-Restriction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Enhanced-Coverage-Restriction-Data, Grouped, code 3156, section 8.4.52 */ + { + struct dict_avp_data data = { + 3156, /* Code */ + 10415, /* Vendor */ + "Enhanced-Coverage-Restriction-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Restricted-PLMN-List, Grouped, code 3157, section 8.4.53 */ + { + struct dict_avp_data data = { + 3157, /* Code */ + 10415, /* Vendor */ + "Restricted-PLMN-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Allowed-PLMN-List, Grouped, code 3158, section 8.4.54 */ + { + struct dict_avp_data data = { + 3158, /* Code */ + 10415, /* Vendor */ + "Allowed-PLMN-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Requested-Validity-Time, Time, code 3159, section 8.4.55 */ + { + struct dict_avp_data data = { + 3159, /* Code */ + 10415, /* Vendor */ + "Requested-Validity-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Granted-Validity-Time, Time, code 3160, section 8.4.56 */ + { + struct dict_avp_data data = { + 3160, /* Code */ + 10415, /* Vendor */ + "Granted-Validity-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* NIDD-Authorization-Update, Grouped, code 3161, section 8.4.57 */ + { + struct dict_avp_data data = { + 3161, /* Code */ + 10415, /* Vendor */ + "NIDD-Authorization-Update", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Loss-Of-Connectivity-Reason, Unsigned32, code 3162, section 8.4.58 */ + { + struct dict_avp_data data = { + 3162, /* Code */ + 10415, /* Vendor */ + "Loss-Of-Connectivity-Reason", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Group-Reporting-Guard-Timer, Unsigned32, code 3163, section 8.4.59 */ + { + struct dict_avp_data data = { + 3163, /* Code */ + 10415, /* Vendor */ + "Group-Reporting-Guard-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CIA-Flags, Unsigned32, code 3164, section 8.4.60 */ + { + struct dict_avp_data data = { + 3164, /* Code */ + 10415, /* Vendor */ + "CIA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Group-Monitoring-Event-Report, Grouped, code 3165, section 8.4.61 */ + { + struct dict_avp_data data = { + 3165, /* Code */ + 10415, /* Vendor */ + "Group-Monitoring-Event-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Group-Monitoring-Event-Report-Item, Grouped, code 3166, section 8.4.62 */ + { + struct dict_avp_data data = { + 3166, /* Code */ + 10415, /* Vendor */ + "Group-Monitoring-Event-Report-Item", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RIR-Flags, Unsigned32, code 3167, section 8.4.63 */ + { + struct dict_avp_data data = { + 3167, /* Code */ + 10415, /* Vendor */ + "RIR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Type-Of-External-Identifier, Unsigned32, code 3168, section 8.4.64 */ + { + struct dict_avp_data data = { + 3168, /* Code */ + 10415, /* Vendor */ + "Type-Of-External-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-Validity-Time, Grouped, code 3169, section 8.4.65 */ + { + struct dict_avp_data data = { + 3169, /* Code */ + 10415, /* Vendor */ + "APN-Validity-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Suggested-Network-Configuration, Grouped, code 3170, section 8.4.66 */ + { + struct dict_avp_data data = { + 3170, /* Code */ + 10415, /* Vendor */ + "Suggested-Network-Configuration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Report-Status, Grouped, code 3171, section 8.4.67 */ + { + struct dict_avp_data data = { + 3171, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Report-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PLMN-ID-Requested, Enumerated, code 3172, section 8.4.68 */ + { + struct dict_avp_data data = { + 3172, /* Code */ + 10415, /* Vendor */ + "PLMN-ID-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PLMN-ID-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AdditionalIdentifiers, Grouped, code 3173, section 8.4.69 */ + { + struct dict_avp_data data = { + 3173, /* Code */ + 10415, /* Vendor */ + "AdditionalIdentifiers", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NIR-Flags, Unsigned32, code 3174, section 8.4.70 */ + { + struct dict_avp_data data = { + 3174, /* Code */ + 10415, /* Vendor */ + "NIR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reporting-Time-Stamp, Time, code 3175, section 8.4.71 */ + { + struct dict_avp_data data = { + 3175, /* Code */ + 10415, /* Vendor */ + "Reporting-Time-Stamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* NIA-Flags, Unsigned32, code 3176, section 8.4.72 */ + { + struct dict_avp_data data = { + 3176, /* Code */ + 10415, /* Vendor */ + "NIA-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Group-User-Identifier, Grouped, code 3177, section 8.4.73 */ + { + struct dict_avp_data data = { + 3177, /* Code */ + 10415, /* Vendor */ + "Group-User-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MTC-Provider-Info, Grouped, code 3178, section 8.4.74 */ + { + struct dict_avp_data data = { + 3178, /* Code */ + 10415, /* Vendor */ + "MTC-Provider-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MTC-Provider-ID, UTF8String, code 3179, section 8.4.75 */ + { + struct dict_avp_data data = { + 3179, /* Code */ + 10415, /* Vendor */ + "MTC-Provider-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.337 V15.0.0 (2018-06) */ + /* Diameter-based T4 interface for communications with packet */ + /* data networks and applications */ + /* */ + /* From 3GPP 29337-f00.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.337 Table 6.3.1/1: T4 specific Diameter AVPs */ + /*==================================================================*/ + + /* SM-Delivery-Outcome-T4, Enumerated, code 3200, section 6.3.1 */ + { + struct dict_avp_data data = { + 3200, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Outcome-T4", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Delivery-Outcome-T4)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Absent-Subscriber-Diagnostic-T4, Enumerated, code 3201, section 6.3.2 */ + { + struct dict_avp_data data = { + 3201, /* Code */ + 10415, /* Vendor */ + "Absent-Subscriber-Diagnostic-T4", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Absent-Subscriber-Diagnostic-T4)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Trigger-Action, Unsigned32, code 3202, section 6.3.6 */ + { + struct dict_avp_data data = { + 3202, /* Code */ + 10415, /* Vendor */ + "Trigger-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MTC-Error-Diagnostic, Unsigned32, code 3203, section 6.3.7 */ + { + struct dict_avp_data data = { + 3203, /* Code */ + 10415, /* Vendor */ + "MTC-Error-Diagnostic", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.338 V15.1.0 (2018-12) */ + /* Diameter based protocols to support */ + /* Short Message Service (SMS) capable */ + /* Mobile Management Entities (MMEs) */ + /* */ + /* From 3GPP 29338-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.338 Table 5.3.3.1/1: S6c specific Diameter AVPs */ + /*==================================================================*/ + + /* SM-RP-MTI, Enumerated, code 3308, section 5.3.3.2 */ + { + struct dict_avp_data data = { + 3308, /* Code */ + 10415, /* Vendor */ + "SM-RP-MTI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-RP-MTI)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SM-RP-SMEA, OctetString, code 3309, section 5.3.3.3 */ + { + struct dict_avp_data data = { + 3309, /* Code */ + 10415, /* Vendor */ + "SM-RP-SMEA", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SRR-Flags, Unsigned32, code 3310, section 5.3.3.4 */ + { + struct dict_avp_data data = { + 3310, /* Code */ + 10415, /* Vendor */ + "SRR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Delivery-Not-Intended, Enumerated, code 3311, section 5.3.3.5 */ + { + struct dict_avp_data data = { + 3311, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Not-Intended", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Delivery-Not-Intended)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MWD-Status, Unsigned32, code 3312, section 5.3.3.8 */ + { + struct dict_avp_data data = { + 3312, /* Code */ + 10415, /* Vendor */ + "MWD-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MME-Absent-User-Diagnostic-SM, Unsigned32, code 3313, section 5.3.3.9 */ + { + struct dict_avp_data data = { + 3313, /* Code */ + 10415, /* Vendor */ + "MME-Absent-User-Diagnostic-SM", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MSC-Absent-User-Diagnostic-SM, Unsigned32, code 3314, section 5.3.3.10 */ + { + struct dict_avp_data data = { + 3314, /* Code */ + 10415, /* Vendor */ + "MSC-Absent-User-Diagnostic-SM", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SGSN-Absent-User-Diagnostic-SM, Unsigned32, code 3315, section 5.3.3.11 */ + { + struct dict_avp_data data = { + 3315, /* Code */ + 10415, /* Vendor */ + "SGSN-Absent-User-Diagnostic-SM", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Delivery-Outcome, Grouped, code 3316, section 5.3.3.14 */ + { + struct dict_avp_data data = { + 3316, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Outcome", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MME-SM-Delivery-Outcome, Grouped, code 3317, section 5.3.3.15 */ + { + struct dict_avp_data data = { + 3317, /* Code */ + 10415, /* Vendor */ + "MME-SM-Delivery-Outcome", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MSC-SM-Delivery-Outcome, Grouped, code 3318, section 5.3.3.16 */ + { + struct dict_avp_data data = { + 3318, /* Code */ + 10415, /* Vendor */ + "MSC-SM-Delivery-Outcome", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SGSN-SM-Delivery-Outcome, Grouped, code 3319, section 5.3.3.17 */ + { + struct dict_avp_data data = { + 3319, /* Code */ + 10415, /* Vendor */ + "SGSN-SM-Delivery-Outcome", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IP-SM-GW-SM-Delivery-Outcome, Grouped, code 3320, section 5.3.3.18 */ + { + struct dict_avp_data data = { + 3320, /* Code */ + 10415, /* Vendor */ + "IP-SM-GW-SM-Delivery-Outcome", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Delivery-Cause, Enumerated, code 3321, section 5.3.3.19 */ + { + struct dict_avp_data data = { + 3321, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Delivery-Cause)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Absent-User-Diagnostic-SM, Unsigned32, code 3322, section 5.3.3.20 */ + { + struct dict_avp_data data = { + 3322, /* Code */ + 10415, /* Vendor */ + "Absent-User-Diagnostic-SM", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RDR-Flags, Unsigned32, code 3323, section 5.3.3.21 */ + { + struct dict_avp_data data = { + 3323, /* Code */ + 10415, /* Vendor */ + "RDR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-UE-Availability-Time, Time, code 3329, section 5.3.3.22 */ + { + struct dict_avp_data data = { + 3329, /* Code */ + 10415, /* Vendor */ + "Maximum-UE-Availability-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SMS-GMSC-Alert-Event, Unsigned32, code 3333, section 5.3.3.23 */ + { + struct dict_avp_data data = { + 3333, /* Code */ + 10415, /* Vendor */ + "SMS-GMSC-Alert-Event", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.338 Table 6.3.3.1/1: SGd/Gdd specific Diameter AVPs */ + /*==================================================================*/ + + /* SC-Address, OctetString, code 3300, section 6.3.3.2 */ + { + struct dict_avp_data data = { + 3300, /* Code */ + 10415, /* Vendor */ + "SC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-RP-UI, OctetString, code 3301, section 6.3.3.3 */ + { + struct dict_avp_data data = { + 3301, /* Code */ + 10415, /* Vendor */ + "SM-RP-UI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TFR-Flags, Unsigned32, code 3302, section 6.3.3.4 */ + { + struct dict_avp_data data = { + 3302, /* Code */ + 10415, /* Vendor */ + "TFR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Delivery-Failure-Cause, Grouped, code 3303, section 6.3.3.5 */ + { + struct dict_avp_data data = { + 3303, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Failure-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Enumerated-Delivery-Failure-Cause, Enumerated, code 3304, section 6.3.3.6 */ + { + struct dict_avp_data data = { + 3304, /* Code */ + 10415, /* Vendor */ + "SM-Enumerated-Delivery-Failure-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Enumerated-Delivery-Failure-Cause)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SM-Diagnostic-Info, OctetString, code 3305, section 6.3.3.7 */ + { + struct dict_avp_data data = { + 3305, /* Code */ + 10415, /* Vendor */ + "SM-Diagnostic-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Delivery-Timer, Unsigned32, code 3306, section 6.3.3.10 */ + { + struct dict_avp_data data = { + 3306, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Delivery-Start-Time, Time, code 3307, section 6.3.3.11 */ + { + struct dict_avp_data data = { + 3307, /* Code */ + 10415, /* Vendor */ + "SM-Delivery-Start-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SMSMI-Correlation-ID, Grouped, code 3324, section 6.3.3.13 */ + { + struct dict_avp_data data = { + 3324, /* Code */ + 10415, /* Vendor */ + "SMSMI-Correlation-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.338 Table 6.3.3.1/1 row HSS-ID (3325) */ + /* incorrectly lists type as OctetString instead of UTF8String. */ + /* 3GPP TS 29.338 clause 6.3.3.14 uses UTF8String. */ + /* */ + /* Fix: HSS-ID (3325) type changed from OctetString to UTF8String. */ + /* HSS-ID, UTF8String, code 3325, section 6.3.3.14 */ + { + struct dict_avp_data data = { + 3325, /* Code */ + 10415, /* Vendor */ + "HSS-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Originating-SIP-URI, UTF8String, code 3326, section 6.3.3.15 */ + { + struct dict_avp_data data = { + 3326, /* Code */ + 10415, /* Vendor */ + "Originating-SIP-URI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Destination-SIP-URI, UTF8String, code 3327, section 6.3.3.16 */ + { + struct dict_avp_data data = { + 3327, /* Code */ + 10415, /* Vendor */ + "Destination-SIP-URI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* OFR-Flags, Unsigned32, code 3328, section 6.3.3.12 */ + { + struct dict_avp_data data = { + 3328, /* Code */ + 10415, /* Vendor */ + "OFR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Maximum-Retransmission-Time, Time, code 3330, section 6.3.3.17 */ + { + struct dict_avp_data data = { + 3330, /* Code */ + 10415, /* Vendor */ + "Maximum-Retransmission-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Requested-Retransmission-Time, Time, code 3331, section 6.3.3.18 */ + { + struct dict_avp_data data = { + 3331, /* Code */ + 10415, /* Vendor */ + "Requested-Retransmission-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SMS-GMSC-Address, OctetString, code 3332, section 6.3.3.19 */ + { + struct dict_avp_data data = { + 3332, /* Code */ + 10415, /* Vendor */ + "SMS-GMSC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.343 V15.1.0 (2019-09) */ + /* Proximity-services (ProSe) function to */ + /* ProSe application server aspects (PC2); */ + /* Stage 3 */ + /* */ + /* From 3GPP 29343-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.343 Table 6.4.1-1: PC2 specific Diameter AVPs */ + /*==================================================================*/ + + /* Origin-App-Layer-User-Id, UTF8String, code 3600, section 6.4.2 */ + { + struct dict_avp_data data = { + 3600, /* Code */ + 10415, /* Vendor */ + "Origin-App-Layer-User-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Target-App-Layer-User-Id, UTF8String, code 3601, section 6.4.3 */ + { + struct dict_avp_data data = { + 3601, /* Code */ + 10415, /* Vendor */ + "Target-App-Layer-User-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* ProSe-Function-ID, OctetString, code 3602, section 6.4.4 */ + { + struct dict_avp_data data = { + 3602, /* Code */ + 10415, /* Vendor */ + "ProSe-Function-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Request-Type, Unsigned32, code 3603, section 6.4.5 */ + { + struct dict_avp_data data = { + 3603, /* Code */ + 10415, /* Vendor */ + "ProSe-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDUID, OctetString, code 3604, section 6.4.6 */ + { + struct dict_avp_data data = { + 3604, /* Code */ + 10415, /* Vendor */ + "PDUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Application-Data, UTF8String, code 3605, section 6.4.7 */ + { + struct dict_avp_data data = { + 3605, /* Code */ + 10415, /* Vendor */ + "Application-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Allowed-Suffixes-Number, Unsigned32, code 3606, section 6.4.8 */ + { + struct dict_avp_data data = { + 3606, /* Code */ + 10415, /* Vendor */ + "Allowed-Suffixes-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitor-Target, Grouped, code 3607, section 6.4.9 */ + { + struct dict_avp_data data = { + 3607, /* Code */ + 10415, /* Vendor */ + "Monitor-Target", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Code-Suffix-Mask, Grouped, code 3608, section 6.4.10 */ + { + struct dict_avp_data data = { + 3608, /* Code */ + 10415, /* Vendor */ + "ProSe-Code-Suffix-Mask", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Suffix-Code, OctetString, code 3609, section 6.4.11 */ + { + struct dict_avp_data data = { + 3609, /* Code */ + 10415, /* Vendor */ + "Suffix-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Suffix-Mask, OctetString, code 3610, section 6.4.12 */ + { + struct dict_avp_data data = { + 3610, /* Code */ + 10415, /* Vendor */ + "Suffix-Mask", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Banned-User-Target, Grouped, code 3611, section 6.4.17 */ + { + struct dict_avp_data data = { + 3611, /* Code */ + 10415, /* Vendor */ + "Banned-User-Target", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Metadata-Indicator, Unsigned32, code 3612, section 6.4.18 */ + { + struct dict_avp_data data = { + 3612, /* Code */ + 10415, /* Vendor */ + "Metadata-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.344 V15.1.0 (2019-09) */ + /* Proximity-services (ProSe) Function to Home Subscriber */ + /* Server (HSS) aspects; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29344-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.344 Table 6.3.1-1: PC4a specific Diameter AVPs */ + /*==================================================================*/ + + /* ProSe-Subscription-Data, Grouped, code 3701, section 6.3.2 */ + { + struct dict_avp_data data = { + 3701, /* Code */ + 10415, /* Vendor */ + "ProSe-Subscription-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Permission, Unsigned32, code 3702, section 6.3.3 */ + { + struct dict_avp_data data = { + 3702, /* Code */ + 10415, /* Vendor */ + "ProSe-Permission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Allowed-PLMN, Grouped, code 3703, section 6.3.4 */ + { + struct dict_avp_data data = { + 3703, /* Code */ + 10415, /* Vendor */ + "ProSe-Allowed-PLMN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Direct-Allowed, Unsigned32, code 3704, section 6.3.5 */ + { + struct dict_avp_data data = { + 3704, /* Code */ + 10415, /* Vendor */ + "ProSe-Direct-Allowed", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UPR-Flags, Unsigned32, code 3705, section 6.3.6 */ + { + struct dict_avp_data data = { + 3705, /* Code */ + 10415, /* Vendor */ + "UPR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PNR-Flags, Unsigned32, code 3706, section 6.3.7 */ + { + struct dict_avp_data data = { + 3706, /* Code */ + 10415, /* Vendor */ + "PNR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Initial-Location-Information, Grouped, code 3707, section 6.3.9 */ + { + struct dict_avp_data data = { + 3707, /* Code */ + 10415, /* Vendor */ + "ProSe-Initial-Location-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.344 Table 6.3.1-1 missing Authorized-Discovery-Range. */ + /* Present in 3GPP TS 29.344 clause 6.3.13 and 3GPP TS 29.230 Table 7.1. */ + /* */ + /* Fix: Add Authorized-Discovery-Range (3708) Unsigned32. */ + /* Authorized-Discovery-Range, Unsigned32, code 3708, section 6.3.13 */ + { + struct dict_avp_data data = { + 3708, /* Code */ + 10415, /* Vendor */ + "Authorized-Discovery-Range", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.345 V15.1.0 (2019-09) */ + /* Inter-Proximity-services (ProSe) Function signalling aspects; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29345-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.345 Table 6.3.1-1: PC6/PC7 specific Diameter AVPs */ + /*==================================================================*/ + + /* App-Layer-User-Id, UTF8String, code 3801, section 6.3.2 */ + { + struct dict_avp_data data = { + 3801, /* Code */ + 10415, /* Vendor */ + "App-Layer-User-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Note: 3GPP TS 29.345 Table 6.3.1-1 row Assistance-info (3802) has */ + /* incorrect name and should be "Assistance-Info" per clause 6.3.3. */ + /* */ + /* Fix: Assistance-info (3802) renamed to Assistance-Info (3802). */ + /* Assistance-Info, Grouped, code 3802, section 6.3.3 */ + { + struct dict_avp_data data = { + 3802, /* Code */ + 10415, /* Vendor */ + "Assistance-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Assistance-Info-Validity-Timer, Unsigned32, code 3803, section 6.3.4 */ + { + struct dict_avp_data data = { + 3803, /* Code */ + 10415, /* Vendor */ + "Assistance-Info-Validity-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Discovery-Type, Unsigned32, code 3804, section 6.3.5 */ + { + struct dict_avp_data data = { + 3804, /* Code */ + 10415, /* Vendor */ + "Discovery-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Filter-Id, OctetString, code 3805, section 6.3.9 */ + { + struct dict_avp_data data = { + 3805, /* Code */ + 10415, /* Vendor */ + "Filter-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MAC-Address, UTF8String, code 3806, section 6.3.11 */ + { + struct dict_avp_data data = { + 3806, /* Code */ + 10415, /* Vendor */ + "MAC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Match-Report, Grouped, code 3807, section 6.3.12 */ + { + struct dict_avp_data data = { + 3807, /* Code */ + 10415, /* Vendor */ + "Match-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Operating-Channel, Unsigned32, code 3808, section 6.3.14 */ + { + struct dict_avp_data data = { + 3808, /* Code */ + 10415, /* Vendor */ + "Operating-Channel", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* P2P-Features, Unsigned32, code 3809, section 6.3.15 */ + { + struct dict_avp_data data = { + 3809, /* Code */ + 10415, /* Vendor */ + "P2P-Features", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-App-Code, OctetString, code 3810, section 6.3.16 */ + { + struct dict_avp_data data = { + 3810, /* Code */ + 10415, /* Vendor */ + "ProSe-App-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-App-Id, UTF8String, code 3811, section 6.3.17 */ + { + struct dict_avp_data data = { + 3811, /* Code */ + 10415, /* Vendor */ + "ProSe-App-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* ProSe-App-Mask, OctetString, code 3812, section 6.3.18 */ + { + struct dict_avp_data data = { + 3812, /* Code */ + 10415, /* Vendor */ + "ProSe-App-Mask", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Discovery-Filter, Grouped, code 3813, section 6.3.20 */ + { + struct dict_avp_data data = { + 3813, /* Code */ + 10415, /* Vendor */ + "ProSe-Discovery-Filter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PRR-Flags, Unsigned32, code 3814, section 6.3.21 */ + { + struct dict_avp_data data = { + 3814, /* Code */ + 10415, /* Vendor */ + "PRR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Validity-Timer, Unsigned32, code 3815, section 6.3.22 */ + { + struct dict_avp_data data = { + 3815, /* Code */ + 10415, /* Vendor */ + "ProSe-Validity-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Requesting-EPUID, UTF8String, code 3816, section 6.3.23 */ + { + struct dict_avp_data data = { + 3816, /* Code */ + 10415, /* Vendor */ + "Requesting-EPUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Targeted-EPUID, UTF8String, code 3817, section 6.3.26 */ + { + struct dict_avp_data data = { + 3817, /* Code */ + 10415, /* Vendor */ + "Targeted-EPUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.154 Time-Window (4204). */ + /* Time-Window (3818) in 3GPP TS 29.345 V12.1.0 (2014-12) predates */ + /* Time-Window (4204) in 3GPP TS 29.154 V13.1.0 (2016-03). */ + /* Time-Window, Unsigned32, code 3818, section 6.3.27 */ + { + struct dict_avp_data data = { + 3818, /* Code */ + 10415, /* Vendor */ + "Time-Window", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WiFi-P2P-Assistance-Info, Grouped, code 3819, section 6.3.30 */ + { + struct dict_avp_data data = { + 3819, /* Code */ + 10415, /* Vendor */ + "WiFi-P2P-Assistance-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-Assistance-Info, Grouped, code 3820, section 6.3.31 */ + { + struct dict_avp_data data = { + 3820, /* Code */ + 10415, /* Vendor */ + "WLAN-Assistance-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-Link-Layer-Id, OctetString, code 3821, section 6.3.32 */ + { + struct dict_avp_data data = { + 3821, /* Code */ + 10415, /* Vendor */ + "WLAN-Link-Layer-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-Link-Layer-Id-List, Grouped, code 3822, section 6.3.33 */ + { + struct dict_avp_data data = { + 3822, /* Code */ + 10415, /* Vendor */ + "WLAN-Link-Layer-Id-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Update-Trigger, Grouped, code 3823, section 6.3.42 */ + { + struct dict_avp_data data = { + 3823, /* Code */ + 10415, /* Vendor */ + "Location-Update-Trigger", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Update-Event-Type, Unsigned32, code 3824, section 6.3.43 */ + { + struct dict_avp_data data = { + 3824, /* Code */ + 10415, /* Vendor */ + "Location-Update-Event-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-Of-Area-Type, Grouped, code 3825, section 6.3.44 */ + { + struct dict_avp_data data = { + 3825, /* Code */ + 10415, /* Vendor */ + "Change-Of-Area-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Update-Event-Trigger, Unsigned32, code 3826, section 6.3.45 */ + { + struct dict_avp_data data = { + 3826, /* Code */ + 10415, /* Vendor */ + "Location-Update-Event-Trigger", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Report-Cardinality, Enumerated, code 3827, section 6.3.46 */ + { + struct dict_avp_data data = { + 3827, /* Code */ + 10415, /* Vendor */ + "Report-Cardinality", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Report-Cardinality)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Minimum-Interval-Time, Unsigned32, code 3828, section 6.3.47 */ + { + struct dict_avp_data data = { + 3828, /* Code */ + 10415, /* Vendor */ + "Minimum-Interval-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Periodic-Location-Type, Grouped, code 3829, section 6.3.48 */ + { + struct dict_avp_data data = { + 3829, /* Code */ + 10415, /* Vendor */ + "Periodic-Location-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Report-Interval-Time, Unsigned32, code 3830, section 6.3.49 */ + { + struct dict_avp_data data = { + 3830, /* Code */ + 10415, /* Vendor */ + "Location-Report-Interval-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Total-Number-Of-Reports, Unsigned32, code 3831, section 6.3.50 */ + { + struct dict_avp_data data = { + 3831, /* Code */ + 10415, /* Vendor */ + "Total-Number-Of-Reports", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Validity-Time-Announce, Unsigned32, code 3832, section 6.3.36 */ + { + struct dict_avp_data data = { + 3832, /* Code */ + 10415, /* Vendor */ + "Validity-Time-Announce", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Validity-Time-Monitor, Unsigned32, code 3833, section 6.3.37 */ + { + struct dict_avp_data data = { + 3833, /* Code */ + 10415, /* Vendor */ + "Validity-Time-Monitor", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Validity-Time-Communication, Unsigned32, code 3834, section 6.3.38 */ + { + struct dict_avp_data data = { + 3834, /* Code */ + 10415, /* Vendor */ + "Validity-Time-Communication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-App-Code-Info, Grouped, code 3835, section 6.3.39 */ + { + struct dict_avp_data data = { + 3835, /* Code */ + 10415, /* Vendor */ + "ProSe-App-Code-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MIC, OctetString, code 3836, section 6.3.40 */ + { + struct dict_avp_data data = { + 3836, /* Code */ + 10415, /* Vendor */ + "MIC", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* UTC-based-Counter, Unsigned32, code 3837, section 6.3.41 */ + { + struct dict_avp_data data = { + 3837, /* Code */ + 10415, /* Vendor */ + "UTC-based-Counter", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Match-Refresh-Timer, Unsigned32, code 3838, section 6.3.52 */ + { + struct dict_avp_data data = { + 3838, /* Code */ + 10415, /* Vendor */ + "ProSe-Match-Refresh-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Metadata-Index-Mask, OctetString, code 3839, section 6.3.60 */ + { + struct dict_avp_data data = { + 3839, /* Code */ + 10415, /* Vendor */ + "ProSe-Metadata-Index-Mask", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* App-Identifier, Grouped, code 3840, section 6.3.61 */ + { + struct dict_avp_data data = { + 3840, /* Code */ + 10415, /* Vendor */ + "App-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* OS-ID, OctetString, code 3841, section 6.3.62 */ + { + struct dict_avp_data data = { + 3841, /* Code */ + 10415, /* Vendor */ + "OS-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* OS-App-ID, UTF8String, code 3842, section 6.3.63 */ + { + struct dict_avp_data data = { + 3842, /* Code */ + 10415, /* Vendor */ + "OS-App-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Requesting-RPAUID, UTF8String, code 3843, section 6.3.64 */ + { + struct dict_avp_data data = { + 3843, /* Code */ + 10415, /* Vendor */ + "Requesting-RPAUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Target-RPAUID, UTF8String, code 3844, section 6.3.65 */ + { + struct dict_avp_data data = { + 3844, /* Code */ + 10415, /* Vendor */ + "Target-RPAUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Target-PDUID, OctetString, code 3845, section 6.3.66 */ + { + struct dict_avp_data data = { + 3845, /* Code */ + 10415, /* Vendor */ + "Target-PDUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Restricted-Code, OctetString, code 3846, section 6.3.67 */ + { + struct dict_avp_data data = { + 3846, /* Code */ + 10415, /* Vendor */ + "ProSe-Restricted-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Restricted-Code-Suffix-Range, OctetString, code 3847, section 6.3.68 */ + { + struct dict_avp_data data = { + 3847, /* Code */ + 10415, /* Vendor */ + "ProSe-Restricted-Code-Suffix-Range", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Beginning-Suffix, OctetString, code 3848, section 6.3.69 */ + { + struct dict_avp_data data = { + 3848, /* Code */ + 10415, /* Vendor */ + "Beginning-Suffix", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Ending-Suffix, OctetString, code 3849, section 6.3.70 */ + { + struct dict_avp_data data = { + 3849, /* Code */ + 10415, /* Vendor */ + "Ending-Suffix", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Discovery-Entry-ID, Unsigned32, code 3850, section 6.3.59 */ + { + struct dict_avp_data data = { + 3850, /* Code */ + 10415, /* Vendor */ + "Discovery-Entry-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Match-Timestamp, Time, code 3851, section 6.3.71 */ + { + struct dict_avp_data data = { + 3851, /* Code */ + 10415, /* Vendor */ + "Match-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* PMR-Flags, Unsigned32, code 3852, section 6.3.57 */ + { + struct dict_avp_data data = { + 3852, /* Code */ + 10415, /* Vendor */ + "PMR-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Application-Metadata, UTF8String, code 3853, section 6.3.58 */ + { + struct dict_avp_data data = { + 3853, /* Code */ + 10415, /* Vendor */ + "ProSe-Application-Metadata", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Discovery-Auth-Request, Grouped, code 3854, section 6.3.53 */ + { + struct dict_avp_data data = { + 3854, /* Code */ + 10415, /* Vendor */ + "Discovery-Auth-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Discovery-Auth-Response, Grouped, code 3855, section 6.3.54 */ + { + struct dict_avp_data data = { + 3855, /* Code */ + 10415, /* Vendor */ + "Discovery-Auth-Response", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Match-Request, Grouped, code 3856, section 6.3.55 */ + { + struct dict_avp_data data = { + 3856, /* Code */ + 10415, /* Vendor */ + "Match-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Match-Report-Info, Grouped, code 3857, section 6.3.56 */ + { + struct dict_avp_data data = { + 3857, /* Code */ + 10415, /* Vendor */ + "Match-Report-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Banned-RPAUID, UTF8String, code 3858, section 6.3.73 */ + { + struct dict_avp_data data = { + 3858, /* Code */ + 10415, /* Vendor */ + "Banned-RPAUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Banned-PDUID, OctetString, code 3859, section 6.3.74 */ + { + struct dict_avp_data data = { + 3859, /* Code */ + 10415, /* Vendor */ + "Banned-PDUID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Code-Receiving-Security-Material, Grouped, code 3860, section 6.3.75 */ + { + struct dict_avp_data data = { + 3860, /* Code */ + 10415, /* Vendor */ + "Code-Receiving-Security-Material", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Code-Sending-Security-Material, Grouped, code 3861, section 6.3.76 */ + { + struct dict_avp_data data = { + 3861, /* Code */ + 10415, /* Vendor */ + "Code-Sending-Security-Material", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DUSK, OctetString, code 3862, section 6.3.77 */ + { + struct dict_avp_data data = { + 3862, /* Code */ + 10415, /* Vendor */ + "DUSK", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DUIK, OctetString, code 3863, section 6.3.78 */ + { + struct dict_avp_data data = { + 3863, /* Code */ + 10415, /* Vendor */ + "DUIK", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* DUCK, OctetString, code 3864, section 6.3.79 */ + { + struct dict_avp_data data = { + 3864, /* Code */ + 10415, /* Vendor */ + "DUCK", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 29.345 Table 6.3.1-1 row MIC-Check-indicator (3865) has */ + /* incorrect name and should be "MIC-Check-Indicator" per clause 6.3.80. */ + /* */ + /* Fix: MIC-Check-indicator (3865) renamed to MIC-Check-Indicator (3865). */ + /* MIC-Check-Indicator, Unsigned32, code 3865, section 6.3.80 */ + { + struct dict_avp_data data = { + 3865, /* Code */ + 10415, /* Vendor */ + "MIC-Check-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Encrypted-Bitmask, OctetString, code 3866, section 6.3.81 */ + { + struct dict_avp_data data = { + 3866, /* Code */ + 10415, /* Vendor */ + "Encrypted-Bitmask", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-App-Code-Suffix-Range, OctetString, code 3867, section 6.3.82 */ + { + struct dict_avp_data data = { + 3867, /* Code */ + 10415, /* Vendor */ + "ProSe-App-Code-Suffix-Range", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PC5-tech, OctetString, code 3868, section 6.3.84 */ + { + struct dict_avp_data data = { + 3868, /* Code */ + 10415, /* Vendor */ + "PC5-tech", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.368 V15.1.0 (2019-09) */ + /* Tsp interface protocol between the MTC Interworking Function */ + /* (MTC-IWF) and Service Capability Server (SCS) */ + /* */ + /* From 3GPP 29368-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.368 Table 6.4.1.1: Tsp specific Diameter AVPs */ + /*==================================================================*/ + + /* Device-Action, Grouped, code 3001, section 6. 4.2 */ + { + struct dict_avp_data data = { + 3001, /* Code */ + 10415, /* Vendor */ + "Device-Action", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Device-Notification, Grouped, code 3002, section 6.4.3 */ + { + struct dict_avp_data data = { + 3002, /* Code */ + 10415, /* Vendor */ + "Device-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trigger-Data, Grouped, code 3003, section 6.4.4 */ + { + struct dict_avp_data data = { + 3003, /* Code */ + 10415, /* Vendor */ + "Trigger-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Payload, OctetString, code 3004, section 6.4.5 */ + { + struct dict_avp_data data = { + 3004, /* Code */ + 10415, /* Vendor */ + "Payload", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Action-Type, Enumerated, code 3005, section 6.4.6 */ + { + struct dict_avp_data data = { + 3005, /* Code */ + 10415, /* Vendor */ + "Action-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Action-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Priority-Indication, Enumerated, code 3006, section 6.4.7 */ + { + struct dict_avp_data data = { + 3006, /* Code */ + 10415, /* Vendor */ + "Priority-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Priority-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Reference-Number, Unsigned32, code 3007, section 6.4.8 */ + { + struct dict_avp_data data = { + 3007, /* Code */ + 10415, /* Vendor */ + "Reference-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Request-Status, Enumerated, code 3008, section 6.4.9 */ + { + struct dict_avp_data data = { + 3008, /* Code */ + 10415, /* Vendor */ + "Request-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Request-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Delivery-Outcome, Enumerated, code 3009, section 6.4.10 */ + { + struct dict_avp_data data = { + 3009, /* Code */ + 10415, /* Vendor */ + "Delivery-Outcome", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Delivery-Outcome)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Application-Port-Identifier, Unsigned32, code 3010, section 6.4.11 */ + { + struct dict_avp_data data = { + 3010, /* Code */ + 10415, /* Vendor */ + "Application-Port-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Old-Reference-Number, Unsigned32, code 3011, section 6.4.12 */ + { + struct dict_avp_data data = { + 3011, /* Code */ + 10415, /* Vendor */ + "Old-Reference-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Feature-Supported-In-Final-Target, Unsigned32, code 3012, section 6.4.13 */ + { + struct dict_avp_data data = { + 3012, /* Code */ + 10415, /* Vendor */ + "Feature-Supported-In-Final-Target", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.388 V15.1.0 (2019-09) */ + /* V2X Control Function to Home Subscriber Server (HSS) */ + /* aspects (V4); */ + /* Stage 3 */ + /* */ + /* From 3GPP 29388-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.388 Table 6.3.1-1: V4 specific Diameter AVPs */ + /*==================================================================*/ + + /* V2X-PC5-Allowed-PLMN, Grouped, code 4600, section 6.3.3 */ + { + struct dict_avp_data data = { + 4600, /* Code */ + 10415, /* Vendor */ + "V2X-PC5-Allowed-PLMN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* V2X-Update-Flags, Unsigned32, code 4601, section 6.3.4 */ + { + struct dict_avp_data data = { + 4601, /* Code */ + 10415, /* Vendor */ + "V2X-Update-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* V2X-Notify-Flags, Unsigned32, code 4602, section 6.3.5 */ + { + struct dict_avp_data data = { + 4602, /* Code */ + 10415, /* Vendor */ + "V2X-Notify-Flags", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.389 V15.1.0 (2019-09) */ + /* Inter-V2X Control Function Signalling aspects (V6); */ + /* Stage 3 */ + /* */ + /* From 3GPP 29389-f10.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.389 Table 6.3.1-1: V6 specific Diameter AVPs */ + /* */ + /* Fix: All AVPs were missing M and V; assume MUST for both. */ + /*==================================================================*/ + + /* V2X-Authorization-Data, Grouped, code 4700, section 6.3.2 */ + { + struct dict_avp_data data = { + 4700, /* Code */ + 10415, /* Vendor */ + "V2X-Authorization-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* V2X-Permission-in-VPLMN, Unsigned32, code 4701, section 6.3.3 */ + { + struct dict_avp_data data = { + 4701, /* Code */ + 10415, /* Vendor */ + "V2X-Permission-in-VPLMN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* V2X-Application-Server, Grouped, code 4702, section 6.3.4 */ + { + struct dict_avp_data data = { + 4702, /* Code */ + 10415, /* Vendor */ + "V2X-Application-Server", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.468 V15.8.0 (2019-12) */ + /* Group Communication System Enablers for LTE (GCSE_LTE); */ + /* MB2 Reference Point; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29468-f80.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 29.468 Table 6.4.1 1: MB2 C specific Diameter AVPs */ + /*==================================================================*/ + + /* BMSC-Address, Address, code 3500, section 6.4.2 */ + { + struct dict_avp_data data = { + 3500, /* Code */ + 10415, /* Vendor */ + "BMSC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* BMSC-Port, Unsigned32, code 3501, section 6.4.3 */ + { + struct dict_avp_data data = { + 3501, /* Code */ + 10415, /* Vendor */ + "BMSC-Port", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Common-Tunnel-Endpoint-Identifier, OctetString, code 3524, section 6.4.26 */ + { + struct dict_avp_data data = { + 3524, /* Code */ + 10415, /* Vendor */ + "Common-Tunnel-Endpoint-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* FEC-Request, OctetString, code 3525, section 6.4.27 */ + { + struct dict_avp_data data = { + 3525, /* Code */ + 10415, /* Vendor */ + "FEC-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* FEC-Result, Unsigned32, code 3531, section 6.4.33 */ + { + struct dict_avp_data data = { + 3531, /* Code */ + 10415, /* Vendor */ + "FEC-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Local-M1-Information, Grouped, code 3518, section 6.4.20 */ + { + struct dict_avp_data data = { + 3518, /* Code */ + 10415, /* Vendor */ + "Local-M1-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Local-MB2-U-Information, Grouped, code 3519, section 6.4.21 */ + { + struct dict_avp_data data = { + 3519, /* Code */ + 10415, /* Vendor */ + "Local-MB2-U-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MB2U-Security, Unsigned32, code 3517, section 6.4.19 */ + { + struct dict_avp_data data = { + 3517, /* Code */ + 10415, /* Vendor */ + "MB2U-Security", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Bearer-Event, Unsigned32, code 3502, section 6.4.4 */ + { + struct dict_avp_data data = { + 3502, /* Code */ + 10415, /* Vendor */ + "MBMS-Bearer-Event", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Bearer-Event-Notification, Grouped, code 3503, section 6.4.5 */ + { + struct dict_avp_data data = { + 3503, /* Code */ + 10415, /* Vendor */ + "MBMS-Bearer-Event-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Bearer-Request, Grouped, code 3504, section 6.4.6 */ + { + struct dict_avp_data data = { + 3504, /* Code */ + 10415, /* Vendor */ + "MBMS-Bearer-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Bearer-Response, Grouped, code 3505, section 6.4.7 */ + { + struct dict_avp_data data = { + 3505, /* Code */ + 10415, /* Vendor */ + "MBMS-Bearer-Response", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-Bearer-Result, Unsigned32, code 3506, section 6.4.8 */ + { + struct dict_avp_data data = { + 3506, /* Code */ + 10415, /* Vendor */ + "MBMS-Bearer-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-eNB-IP-Multicast-Address, Address, code 3520, section 6.4.22 */ + { + struct dict_avp_data data = { + 3520, /* Code */ + 10415, /* Vendor */ + "MBMS-eNB-IP-Multicast-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* MBMS-eNB-IPv6-Multicast-Address, Address, code 3521, section 6.4.23 */ + { + struct dict_avp_data data = { + 3521, /* Code */ + 10415, /* Vendor */ + "MBMS-eNB-IPv6-Multicast-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IP-Address (924). */ + /* 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IP-Address (924). */ + /* 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IP-Address (3522). */ + /* */ + /* Fix: MBMS-GW-SSM-IP-Address (3522) renamed to MBMS-GW-SSM-IP-Address-29.468 (3522). */ + /* MBMS-GW-SSM-IP-Address-29.468, Address, code 3522, section 6.4.24 */ + { + struct dict_avp_data data = { + 3522, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-SSM-IP-Address-29.468", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IPv6-Address (925). */ + /* 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IPv6-Address (925). */ + /* 3GPP TS 29.061 V12.6.0 (2014-06) renamed */ + /* MBMS-GW-SSM-IPv6-Address (925) to MBMS-GW-SSM-Ipv6-Address. */ + /* 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IPv6-Address (3523). */ + /* */ + /* Fix: MBMS-GW-SSM-IPv6-Address (3523) renamed to MBMS-GW-SSM-IPv6-Address-29.468 (3523). */ + /* MBMS-GW-SSM-IPv6-Address-29.468, Address, code 3523, section 6.4.25 */ + { + struct dict_avp_data data = { + 3523, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-SSM-IPv6-Address-29.468", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* MBMS-Start-Time, Time, code 3507, section 6.4.9 */ + { + struct dict_avp_data data = { + 3507, /* Code */ + 10415, /* Vendor */ + "MBMS-Start-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 32.299 Radio-Frequency (3462). */ + /* 3GPP TS 29.468 V12.0.0 (2014-09) added Radio-Frequency (3508). */ + /* 3GPP TS 32.299 V13.1.0 (2015-06) CR 0638 added Radio-Frequency (3462). */ + /* */ + /* Fix: Radio-Frequency (3508) renamed to Radio-Frequency-29.468 (3508). */ + /* Radio-Frequency-29.468, Unsigned32, code 3508, section 6.4.10 */ + { + struct dict_avp_data data = { + 3508, /* Code */ + 10415, /* Vendor */ + "Radio-Frequency-29.468", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ROHC-Full-Header-Periodicity, Float32, code 3527, section 6.4.29 */ + { + struct dict_avp_data data = { + 3527, /* Code */ + 10415, /* Vendor */ + "ROHC-Full-Header-Periodicity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_FLOAT32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ROHC-Max-CID, Unsigned32, code 3532, section 6.4.34 */ + { + struct dict_avp_data data = { + 3532, /* Code */ + 10415, /* Vendor */ + "ROHC-Max-CID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ROHC-Profile, Unsigned32, code 3528, section 6.4.30 */ + { + struct dict_avp_data data = { + 3528, /* Code */ + 10415, /* Vendor */ + "ROHC-Profile", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ROHC-Request, Grouped, code 3526, section 6.4.28 */ + { + struct dict_avp_data data = { + 3526, /* Code */ + 10415, /* Vendor */ + "ROHC-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ROHC-Result, Unsigned32, code 3530, section 6.4.32 */ + { + struct dict_avp_data data = { + 3530, /* Code */ + 10415, /* Vendor */ + "ROHC-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Allocation-Request, Grouped, code 3509, section 6.4.11 */ + { + struct dict_avp_data data = { + 3509, /* Code */ + 10415, /* Vendor */ + "TMGI-Allocation-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Allocation-Response, Grouped, code 3510, section 6.4.12 */ + { + struct dict_avp_data data = { + 3510, /* Code */ + 10415, /* Vendor */ + "TMGI-Allocation-Response", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Allocation-Result, Unsigned32, code 3511, section 6.4.13 */ + { + struct dict_avp_data data = { + 3511, /* Code */ + 10415, /* Vendor */ + "TMGI-Allocation-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Deallocation-Request, Grouped, code 3512, section 6.4.14 */ + { + struct dict_avp_data data = { + 3512, /* Code */ + 10415, /* Vendor */ + "TMGI-Deallocation-Request", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Deallocation-Response, Grouped, code 3513, section 6.4.15 */ + { + struct dict_avp_data data = { + 3513, /* Code */ + 10415, /* Vendor */ + "TMGI-Deallocation-Response", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Deallocation-Result, Unsigned32, code 3514, section 6.4.16 */ + { + struct dict_avp_data data = { + 3514, /* Code */ + 10415, /* Vendor */ + "TMGI-Deallocation-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Expiry, Grouped, code 3515, section 6.4.17 */ + { + struct dict_avp_data data = { + 3515, /* Code */ + 10415, /* Vendor */ + "TMGI-Expiry", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TMGI-Number, Unsigned32, code 3516, section 6.4.18 */ + { + struct dict_avp_data data = { + 3516, /* Code */ + 10415, /* Vendor */ + "TMGI-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Userplane-Protocol-Result, Grouped, code 3529, section 6.4.31 */ + { + struct dict_avp_data data = { + 3529, /* Code */ + 10415, /* Vendor */ + "Userplane-Protocol-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 29.561 V16.3.0 (2020-03) */ + /* 5G System; Interworking between 5G Network and external */ + /* Data Networks; */ + /* Stage 3 */ + /* */ + /* From 3GPP 29561-g30.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* Table 12.4-1: N6 re-used Diameter AVPs */ + + /* Note: Only AVPs defined in 3GPP TS 29.561. */ + /*==================================================================*/ + + /* 3GPP-Notification, OctetString, code 110, section 11.3.1 */ + { + struct dict_avp_data data = { + 110, /* Code */ + 10415, /* Vendor */ + "3GPP-Notification", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-UE-MAC-Address, OctetString, code 111, section 11.3.1 */ + { + struct dict_avp_data data = { + 111, /* Code */ + 10415, /* Vendor */ + "3GPP-UE-MAC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Authorization-Reference, OctetString, code 112, section 11.3.1 */ + { + struct dict_avp_data data = { + 112, /* Code */ + 10415, /* Vendor */ + "3GPP-Authorization-Reference", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Policy-Reference, OctetString, code 113, section 11.3.1 */ + { + struct dict_avp_data data = { + 113, /* Code */ + 10415, /* Vendor */ + "3GPP-Policy-Reference", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Session-AMBR, OctetString, code 114, section 11.3.1 */ + { + struct dict_avp_data data = { + 114, /* Code */ + 10415, /* Vendor */ + "3GPP-Session-AMBR", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-NAI, OctetString, code 115, section 11.3.1 */ + { + struct dict_avp_data data = { + 115, /* Code */ + 10415, /* Vendor */ + "3GPP-NAI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-Session-AMBR-v2, OctetString, code 116, section 11.3.1 */ + { + struct dict_avp_data data = { + 116, /* Code */ + 10415, /* Vendor */ + "3GPP-Session-AMBR-v2", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-IP-Address-Pool-Id, OctetString, code 118, section 11.3.1 */ + { + struct dict_avp_data data = { + 118, /* Code */ + 10415, /* Vendor */ + "3GPP-IP-Address-Pool-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* Table 17.4-1: Additional information needed for network slice specific authentication */ + /*==================================================================*/ + + /* 3GPP-S-NSSAI, UTF8String, code 200, section 16.3.1 */ + { + struct dict_avp_data data = { + 200, /* Code */ + 10415, /* Vendor */ + "3GPP-S-NSSAI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /*==================================================================*/ + /* 3GPP TS 32.299 V15.7.0 (2019-06) */ + /* Charging management; */ + /* Diameter charging applications */ + /* */ + /* From 3GPP 32299-f70.doc */ + /*==================================================================*/ + + /*==================================================================*/ + /* 3GPP TS 32.299 Table 7.2.0.1: 3GPP specific AVPs */ + /*==================================================================*/ + + /* 3GPP-OC-Specific-Reduction, Grouped, code 1320 */ + { + struct dict_avp_data data = { + 1320, /* Code */ + 10415, /* Vendor */ + "3GPP-OC-Specific-Reduction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-OC-Rating-Group, Unsigned32, code 1321 */ + { + struct dict_avp_data data = { + 1321, /* Code */ + 10415, /* Vendor */ + "3GPP-OC-Rating-Group", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* 3GPP-OC-Request-Type, Enumerated, code 1322 */ + { + struct dict_avp_data data = { + 1322, /* Code */ + 10415, /* Vendor */ + "3GPP-OC-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/3GPP-OC-Request-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 29.212 3GPP-PS-Data-Off-Status (2847). */ + /* 3GPP TS 29.212 V14.3.0 (2017-03) CR 1559 added 3GPP-PS-Data-Off-Status (2847). */ + /* 3GPP TS 32.299 V14.3.0 (2017-03) CR 0760 added 3GPP-PS-Data-Off-Status (4406). */ + /* */ + /* Fix: 3GPP-PS-Data-Off-Status (4406) renamed to 3GPP-PS-Data-Off-Status-32.299 (4406). */ + /* 3GPP-PS-Data-Off-Status-32.299, Enumerated, code 4406 */ + { + struct dict_avp_data data = { + 4406, /* Code */ + 10415, /* Vendor */ + "3GPP-PS-Data-Off-Status-32.299", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/3GPP-PS-Data-Off-Status-32.299)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Access-Network-Info-Change, Grouped, code 4401 */ + { + struct dict_avp_data data = { + 4401, /* Code */ + 10415, /* Vendor */ + "Access-Network-Info-Change", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Network-Information, OctetString, code 1263 */ + { + struct dict_avp_data data = { + 1263, /* Code */ + 10415, /* Vendor */ + "Access-Network-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Transfer-Information, Grouped, code 2709 */ + { + struct dict_avp_data data = { + 2709, /* Code */ + 10415, /* Vendor */ + "Access-Transfer-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Access-Transfer-Type, Enumerated, code 2710 */ + { + struct dict_avp_data data = { + 2710, /* Code */ + 10415, /* Vendor */ + "Access-Transfer-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Access-Transfer-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Account-Expiration, Time, code 2309 */ + { + struct dict_avp_data data = { + 2309, /* Code */ + 10415, /* Vendor */ + "Account-Expiration", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Accumulated-Cost, Grouped, code 2052 */ + { + struct dict_avp_data data = { + 2052, /* Code */ + 10415, /* Vendor */ + "Accumulated-Cost", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Adaptations, Enumerated, code 1217 */ + { + struct dict_avp_data data = { + 1217, /* Code */ + 10415, /* Vendor */ + "Adaptations", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Adaptations)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Additional-Content-Information, Grouped, code 1207 */ + { + struct dict_avp_data data = { + 1207, /* Code */ + 10415, /* Vendor */ + "Additional-Content-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Additional-Exception-Reports, Enumerated, code 3936 */ + { + struct dict_avp_data data = { + 3936, /* Code */ + 10415, /* Vendor */ + "Additional-Exception-Reports", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Additional-Exception-Reports)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Additional-Type-Information, UTF8String, code 1205 */ + { + struct dict_avp_data data = { + 1205, /* Code */ + 10415, /* Vendor */ + "Additional-Type-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Address-Data, UTF8String, code 897 */ + { + struct dict_avp_data data = { + 897, /* Code */ + 10415, /* Vendor */ + "Address-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Address-Domain, Grouped, code 898 */ + { + struct dict_avp_data data = { + 898, /* Code */ + 10415, /* Vendor */ + "Address-Domain", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Addressee-Type, Enumerated, code 1208 */ + { + struct dict_avp_data data = { + 1208, /* Code */ + 10415, /* Vendor */ + "Addressee-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Addressee-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Address-Type, Enumerated, code 899 */ + { + struct dict_avp_data data = { + 899, /* Code */ + 10415, /* Vendor */ + "Address-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Address-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AF-Correlation-Information, Grouped, code 1276 */ + { + struct dict_avp_data data = { + 1276, /* Code */ + 10415, /* Vendor */ + "AF-Correlation-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Alternate-Charged-Party-Address, UTF8String, code 1280 */ + { + struct dict_avp_data data = { + 1280, /* Code */ + 10415, /* Vendor */ + "Alternate-Charged-Party-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Announcement-Identifier, Unsigned32, code 3905 */ + { + struct dict_avp_data data = { + 3905, /* Code */ + 10415, /* Vendor */ + "Announcement-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Announcement-Information, Grouped, code 3904 */ + { + struct dict_avp_data data = { + 3904, /* Code */ + 10415, /* Vendor */ + "Announcement-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Announcement-Order, Unsigned32, code 3906 */ + { + struct dict_avp_data data = { + 3906, /* Code */ + 10415, /* Vendor */ + "Announcement-Order", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Announcing-PLMN-ID, UTF8String, code 4408 */ + { + struct dict_avp_data data = { + 4408, /* Code */ + 10415, /* Vendor */ + "Announcing-PLMN-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Announcing-UE-HPLMN-Identifier, UTF8String, code 3426 */ + { + struct dict_avp_data data = { + 3426, /* Code */ + 10415, /* Vendor */ + "Announcing-UE-HPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Announcing-UE-VPLMN-Identifier, UTF8String, code 3427 */ + { + struct dict_avp_data data = { + 3427, /* Code */ + 10415, /* Vendor */ + "Announcing-UE-VPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* AoC-Cost-Information, Grouped, code 2053 */ + { + struct dict_avp_data data = { + 2053, /* Code */ + 10415, /* Vendor */ + "AoC-Cost-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AoC-Format, Enumerated, code 2310 */ + { + struct dict_avp_data data = { + 2310, /* Code */ + 10415, /* Vendor */ + "AoC-Format", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Format)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AoC-Information, Grouped, code 2054 */ + { + struct dict_avp_data data = { + 2054, /* Code */ + 10415, /* Vendor */ + "AoC-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AoC-Request-Type, Enumerated, code 2055 */ + { + struct dict_avp_data data = { + 2055, /* Code */ + 10415, /* Vendor */ + "AoC-Request-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Request-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AoC-Service, Grouped, code 2311 */ + { + struct dict_avp_data data = { + 2311, /* Code */ + 10415, /* Vendor */ + "AoC-Service", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* AoC-Service-Obligatory-Type, Enumerated, code 2312 */ + { + struct dict_avp_data data = { + 2312, /* Code */ + 10415, /* Vendor */ + "AoC-Service-Obligatory-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Service-Obligatory-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AoC-Service-Type, Enumerated, code 2313 */ + { + struct dict_avp_data data = { + 2313, /* Code */ + 10415, /* Vendor */ + "AoC-Service-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Service-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* AoC-Subscription-Information, Grouped, code 2314 */ + { + struct dict_avp_data data = { + 2314, /* Code */ + 10415, /* Vendor */ + "AoC-Subscription-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* API-Content, UTF8String, code 1309 */ + { + struct dict_avp_data data = { + 1309, /* Code */ + 10415, /* Vendor */ + "API-Content", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* API-Direction, Enumerated, code 1310 */ + { + struct dict_avp_data data = { + 1310, /* Code */ + 10415, /* Vendor */ + "API-Direction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/API-Direction)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* API-Identifier, OctetString, code 1311 */ + { + struct dict_avp_data data = { + 1311, /* Code */ + 10415, /* Vendor */ + "API-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* API-Invocation-Timestamp, Time, code 1312 */ + { + struct dict_avp_data data = { + 1312, /* Code */ + 10415, /* Vendor */ + "API-Invocation-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* API-Network-Service-Node, Enumerated, code 1315 */ + { + struct dict_avp_data data = { + 1315, /* Code */ + 10415, /* Vendor */ + "API-Network-Service-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/API-Network-Service-Node)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* API-Result-Code, Unsigned32, code 1313 */ + { + struct dict_avp_data data = { + 1313, /* Code */ + 10415, /* Vendor */ + "API-Result-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* API-Size, Unsigned64, code 1314 */ + { + struct dict_avp_data data = { + 1314, /* Code */ + 10415, /* Vendor */ + "API-Size", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-Rate-Control, Grouped, code 3933 */ + { + struct dict_avp_data data = { + 3933, /* Code */ + 10415, /* Vendor */ + "APN-Rate-Control", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-Rate-Control-Downlink, Grouped, code 3934 */ + { + struct dict_avp_data data = { + 3934, /* Code */ + 10415, /* Vendor */ + "APN-Rate-Control-Downlink", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* APN-Rate-Control-Uplink, Grouped, code 3935 */ + { + struct dict_avp_data data = { + 3935, /* Code */ + 10415, /* Vendor */ + "APN-Rate-Control-Uplink", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Applic-ID, UTF8String, code 1218 */ + { + struct dict_avp_data data = { + 1218, /* Code */ + 10415, /* Vendor */ + "Applic-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Application-Provided-Called-Party-Address, UTF8String, code 837 */ + { + struct dict_avp_data data = { + 837, /* Code */ + 10415, /* Vendor */ + "Application-Provided-Called-Party-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Application-Server, UTF8String, code 836 */ + { + struct dict_avp_data data = { + 836, /* Code */ + 10415, /* Vendor */ + "Application-Server", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Application-Server-Information, Grouped, code 850 */ + { + struct dict_avp_data data = { + 850, /* Code */ + 10415, /* Vendor */ + "Application-Server-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Application-Specific-Data, OctetString, code 3458 */ + { + struct dict_avp_data data = { + 3458, /* Code */ + 10415, /* Vendor */ + "Application-Specific-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Associated-Party-Address, UTF8String, code 2035 */ + { + struct dict_avp_data data = { + 2035, /* Code */ + 10415, /* Vendor */ + "Associated-Party-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Associated-URI, UTF8String, code 856 */ + { + struct dict_avp_data data = { + 856, /* Code */ + 10415, /* Vendor */ + "Associated-URI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Authorised-QoS, UTF8String, code 849 */ + { + struct dict_avp_data data = { + 849, /* Code */ + 10415, /* Vendor */ + "Authorised-QoS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Aux-Applic-Info, UTF8String, code 1219 */ + { + struct dict_avp_data data = { + 1219, /* Code */ + 10415, /* Vendor */ + "Aux-Applic-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Base-Time-Interval, Unsigned32, code 1265 */ + { + struct dict_avp_data data = { + 1265, /* Code */ + 10415, /* Vendor */ + "Base-Time-Interval", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Basic-Service-Code, Grouped, code 3411 */ + { + struct dict_avp_data data = { + 3411, /* Code */ + 10415, /* Vendor */ + "Basic-Service-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Bearer-Capability, OctetString, code 3412 */ + { + struct dict_avp_data data = { + 3412, /* Code */ + 10415, /* Vendor */ + "Bearer-Capability", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Bearer-Service, OctetString, code 854 */ + { + struct dict_avp_data data = { + 854, /* Code */ + 10415, /* Vendor */ + "Bearer-Service", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* BSSID, UTF8String, code 2716 */ + { + struct dict_avp_data data = { + 2716, /* Code */ + 10415, /* Vendor */ + "BSSID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Called-Asserted-Identity, UTF8String, code 1250 */ + { + struct dict_avp_data data = { + 1250, /* Code */ + 10415, /* Vendor */ + "Called-Asserted-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Called-Identity, UTF8String, code 3916 */ + { + struct dict_avp_data data = { + 3916, /* Code */ + 10415, /* Vendor */ + "Called-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Called-Identity-Change, Grouped, code 3917 */ + { + struct dict_avp_data data = { + 3917, /* Code */ + 10415, /* Vendor */ + "Called-Identity-Change", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Called-Party-Address, UTF8String, code 832 */ + { + struct dict_avp_data data = { + 832, /* Code */ + 10415, /* Vendor */ + "Called-Party-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Calling-Party-Address, UTF8String, code 831 */ + { + struct dict_avp_data data = { + 831, /* Code */ + 10415, /* Vendor */ + "Calling-Party-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Carrier-Select-Routing-Information, UTF8String, code 2023 */ + { + struct dict_avp_data data = { + 2023, /* Code */ + 10415, /* Vendor */ + "Carrier-Select-Routing-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Cause-Code, Integer32, code 861 */ + { + struct dict_avp_data data = { + 861, /* Code */ + 10415, /* Vendor */ + "Cause-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Cellular-Network-Information, OctetString, code 3924 */ + { + struct dict_avp_data data = { + 3924, /* Code */ + 10415, /* Vendor */ + "Cellular-Network-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CG-Address, Address, code 846 */ + { + struct dict_avp_data data = { + 846, /* Code */ + 10415, /* Vendor */ + "CG-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Change-Condition, Integer32, code 2037 */ + { + struct dict_avp_data data = { + 2037, /* Code */ + 10415, /* Vendor */ + "Change-Condition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-Time, Time, code 2038 */ + { + struct dict_avp_data data = { + 2038, /* Code */ + 10415, /* Vendor */ + "Change-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Charge-Reason-Code, Enumerated, code 2118 */ + { + struct dict_avp_data data = { + 2118, /* Code */ + 10415, /* Vendor */ + "Charge-Reason-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charge-Reason-Code)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Charged-Party, UTF8String, code 857 */ + { + struct dict_avp_data data = { + 857, /* Code */ + 10415, /* Vendor */ + "Charged-Party", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Charging-Characteristics-Selection-Mode, Enumerated, code 2066 */ + { + struct dict_avp_data data = { + 2066, /* Code */ + 10415, /* Vendor */ + "Charging-Characteristics-Selection-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charging-Characteristics-Selection-Mode)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Charging-Per-IP-CAN-Session-Indicator, Enumerated, code 4400 */ + { + struct dict_avp_data data = { + 4400, /* Code */ + 10415, /* Vendor */ + "Charging-Per-IP-CAN-Session-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charging-Per-IP-CAN-Session-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Civic-Address-Information, UTF8String, code 1305 */ + { + struct dict_avp_data data = { + 1305, /* Code */ + 10415, /* Vendor */ + "Civic-Address-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Class-Identifier, Enumerated, code 1214 */ + { + struct dict_avp_data data = { + 1214, /* Code */ + 10415, /* Vendor */ + "Class-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Class-Identifier)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Client-Address, Address, code 2018 */ + { + struct dict_avp_data data = { + 2018, /* Code */ + 10415, /* Vendor */ + "Client-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* CN-Operator-Selection-Entity, Enumerated, code 3421 */ + { + struct dict_avp_data data = { + 3421, /* Code */ + 10415, /* Vendor */ + "CN-Operator-Selection-Entity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CN-Operator-Selection-Entity)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Content-Class, Enumerated, code 1220 */ + { + struct dict_avp_data data = { + 1220, /* Code */ + 10415, /* Vendor */ + "Content-Class", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Content-Class)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Content-Disposition, UTF8String, code 828 */ + { + struct dict_avp_data data = { + 828, /* Code */ + 10415, /* Vendor */ + "Content-Disposition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Content-Length, Unsigned32, code 827 */ + { + struct dict_avp_data data = { + 827, /* Code */ + 10415, /* Vendor */ + "Content-Length", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Content-Size, Unsigned32, code 1206 */ + { + struct dict_avp_data data = { + 1206, /* Code */ + 10415, /* Vendor */ + "Content-Size", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Content-Type, UTF8String, code 826 */ + { + struct dict_avp_data data = { + 826, /* Code */ + 10415, /* Vendor */ + "Content-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Coverage-Info, Grouped, code 3459 */ + { + struct dict_avp_data data = { + 3459, /* Code */ + 10415, /* Vendor */ + "Coverage-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Coverage-Status, Enumerated, code 3428 */ + { + struct dict_avp_data data = { + 3428, /* Code */ + 10415, /* Vendor */ + "Coverage-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Coverage-Status)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* CP-CIoT-EPS-Optimisation-Indicator, Enumerated, code 3930 */ + { + struct dict_avp_data data = { + 3930, /* Code */ + 10415, /* Vendor */ + "CP-CIoT-EPS-Optimisation-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CP-CIoT-EPS-Optimisation-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* CPDT-Information, Grouped, code 3927 */ + { + struct dict_avp_data data = { + 3927, /* Code */ + 10415, /* Vendor */ + "CPDT-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* CSG-Access-Mode, Enumerated, code 2317 */ + { + struct dict_avp_data data = { + 2317, /* Code */ + 10415, /* Vendor */ + "CSG-Access-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CSG-Access-Mode)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* CSG-Membership-Indication, Enumerated, code 2318 */ + { + struct dict_avp_data data = { + 2318, /* Code */ + 10415, /* Vendor */ + "CSG-Membership-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CSG-Membership-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* CUG-Information, OctetString, code 2304 */ + { + struct dict_avp_data data = { + 2304, /* Code */ + 10415, /* Vendor */ + "CUG-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Current-Tariff, Grouped, code 2056 */ + { + struct dict_avp_data data = { + 2056, /* Code */ + 10415, /* Vendor */ + "Current-Tariff", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Data-Coding-Scheme, Integer32, code 2001 */ + { + struct dict_avp_data data = { + 2001, /* Code */ + 10415, /* Vendor */ + "Data-Coding-Scheme", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Deferred-Location-Event-Type, UTF8String, code 1230 */ + { + struct dict_avp_data data = { + 1230, /* Code */ + 10415, /* Vendor */ + "Deferred-Location-Event-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Delivery-Report-Requested, Enumerated, code 1216 */ + { + struct dict_avp_data data = { + 1216, /* Code */ + 10415, /* Vendor */ + "Delivery-Report-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Delivery-Report-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Destination-Interface, Grouped, code 2002 */ + { + struct dict_avp_data data = { + 2002, /* Code */ + 10415, /* Vendor */ + "Destination-Interface", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Diagnostics, Integer32, code 2039 */ + { + struct dict_avp_data data = { + 2039, /* Code */ + 10415, /* Vendor */ + "Diagnostics", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Discoveree-UE-HPLMN-Identifier, UTF8String, code 4402 */ + { + struct dict_avp_data data = { + 4402, /* Code */ + 10415, /* Vendor */ + "Discoveree-UE-HPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Discoveree-UE-VPLMN-Identifier, UTF8String, code 4403 */ + { + struct dict_avp_data data = { + 4403, /* Code */ + 10415, /* Vendor */ + "Discoveree-UE-VPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Discoverer-UE-HPLMN-Identifier, UTF8String, code 4404 */ + { + struct dict_avp_data data = { + 4404, /* Code */ + 10415, /* Vendor */ + "Discoverer-UE-HPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Discoverer-UE-VPLMN-Identifier, UTF8String, code 4405 */ + { + struct dict_avp_data data = { + 4405, /* Code */ + 10415, /* Vendor */ + "Discoverer-UE-VPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Domain-Name, UTF8String, code 1200 */ + { + struct dict_avp_data data = { + 1200, /* Code */ + 10415, /* Vendor */ + "Domain-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* DRM-Content, Enumerated, code 1221 */ + { + struct dict_avp_data data = { + 1221, /* Code */ + 10415, /* Vendor */ + "DRM-Content", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/DRM-Content)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Dynamic-Address-Flag, Enumerated, code 2051 */ + { + struct dict_avp_data data = { + 2051, /* Code */ + 10415, /* Vendor */ + "Dynamic-Address-Flag", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Dynamic-Address-Flag)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Dynamic-Address-Flag-Extension, Enumerated, code 2068 */ + { + struct dict_avp_data data = { + 2068, /* Code */ + 10415, /* Vendor */ + "Dynamic-Address-Flag-Extension", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Dynamic-Address-Flag-Extension)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Early-Media-Description, Grouped, code 1272 */ + { + struct dict_avp_data data = { + 1272, /* Code */ + 10415, /* Vendor */ + "Early-Media-Description", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Enhanced-Diagnostics, Grouped, code 3901 */ + { + struct dict_avp_data data = { + 3901, /* Code */ + 10415, /* Vendor */ + "Enhanced-Diagnostics", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Envelope, Grouped, code 1266 */ + { + struct dict_avp_data data = { + 1266, /* Code */ + 10415, /* Vendor */ + "Envelope", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Envelope-End-Time, Time, code 1267 */ + { + struct dict_avp_data data = { + 1267, /* Code */ + 10415, /* Vendor */ + "Envelope-End-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Envelope-Reporting, Enumerated, code 1268 */ + { + struct dict_avp_data data = { + 1268, /* Code */ + 10415, /* Vendor */ + "Envelope-Reporting", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Envelope-Reporting)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Envelope-Start-Time, Time, code 1269 */ + { + struct dict_avp_data data = { + 1269, /* Code */ + 10415, /* Vendor */ + "Envelope-Start-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* EPDG-Address, Address, code 3425 */ + { + struct dict_avp_data data = { + 3425, /* Code */ + 10415, /* Vendor */ + "EPDG-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Event, UTF8String, code 825 */ + { + struct dict_avp_data data = { + 825, /* Code */ + 10415, /* Vendor */ + "Event", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Event-Charging-TimeStamp, Time, code 1258 */ + { + struct dict_avp_data data = { + 1258, /* Code */ + 10415, /* Vendor */ + "Event-Charging-TimeStamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Event-Type, Grouped, code 823 */ + { + struct dict_avp_data data = { + 823, /* Code */ + 10415, /* Vendor */ + "Event-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Expires, Unsigned32, code 888 */ + { + struct dict_avp_data data = { + 888, /* Code */ + 10415, /* Vendor */ + "Expires", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Exposure-Function-API-Information, Grouped, code 1316 */ + { + struct dict_avp_data data = { + 1316, /* Code */ + 10415, /* Vendor */ + "Exposure-Function-API-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* FE-Identifier-List, UTF8String, code 4413 */ + { + struct dict_avp_data data = { + 4413, /* Code */ + 10415, /* Vendor */ + "FE-Identifier-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* File-Repair-Supported, Enumerated, code 1224 */ + { + struct dict_avp_data data = { + 1224, /* Code */ + 10415, /* Vendor */ + "File-Repair-Supported", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/File-Repair-Supported)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Forwarding-Pending, Enumerated, code 3415 */ + { + struct dict_avp_data data = { + 3415, /* Code */ + 10415, /* Vendor */ + "Forwarding-Pending", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Forwarding-Pending)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* From-Address, UTF8String, code 2708 */ + { + struct dict_avp_data data = { + 2708, /* Code */ + 10415, /* Vendor */ + "From-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* GGSN-Address, Address, code 847 */ + { + struct dict_avp_data data = { + 847, /* Code */ + 10415, /* Vendor */ + "GGSN-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* IMS-Application-Reference-Identifier, UTF8String, code 2601 */ + { + struct dict_avp_data data = { + 2601, /* Code */ + 10415, /* Vendor */ + "IMS-Application-Reference-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* IMS-Charging-Identifier, UTF8String, code 841 */ + { + struct dict_avp_data data = { + 841, /* Code */ + 10415, /* Vendor */ + "IMS-Charging-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* IMS-Communication-Service-Identifier, UTF8String, code 1281 */ + { + struct dict_avp_data data = { + 1281, /* Code */ + 10415, /* Vendor */ + "IMS-Communication-Service-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* IMS-Emergency-Indicator, Enumerated, code 2322 */ + { + struct dict_avp_data data = { + 2322, /* Code */ + 10415, /* Vendor */ + "IMS-Emergency-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMS-Emergency-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* IMS-Information, Grouped, code 876 */ + { + struct dict_avp_data data = { + 876, /* Code */ + 10415, /* Vendor */ + "IMS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* IMS-Visited-Network-Identifier, UTF8String, code 2713 */ + { + struct dict_avp_data data = { + 2713, /* Code */ + 10415, /* Vendor */ + "IMS-Visited-Network-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* IMSI-Unauthenticated-Flag, Enumerated, code 2308 */ + { + struct dict_avp_data data = { + 2308, /* Code */ + 10415, /* Vendor */ + "IMSI-Unauthenticated-Flag", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMSI-Unauthenticated-Flag)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Incoming-Trunk-Group-Id, UTF8String, code 852 */ + { + struct dict_avp_data data = { + 852, /* Code */ + 10415, /* Vendor */ + "Incoming-Trunk-Group-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Incremental-Cost, Grouped, code 2062 */ + { + struct dict_avp_data data = { + 2062, /* Code */ + 10415, /* Vendor */ + "Incremental-Cost", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Initial-IMS-Charging-Identifier, UTF8String, code 2321 */ + { + struct dict_avp_data data = { + 2321, /* Code */ + 10415, /* Vendor */ + "Initial-IMS-Charging-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Instance-Id, UTF8String, code 3402 */ + { + struct dict_avp_data data = { + 3402, /* Code */ + 10415, /* Vendor */ + "Instance-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Interface-Id, UTF8String, code 2003 */ + { + struct dict_avp_data data = { + 2003, /* Code */ + 10415, /* Vendor */ + "Interface-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Interface-Port, UTF8String, code 2004 */ + { + struct dict_avp_data data = { + 2004, /* Code */ + 10415, /* Vendor */ + "Interface-Port", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Interface-Text, UTF8String, code 2005 */ + { + struct dict_avp_data data = { + 2005, /* Code */ + 10415, /* Vendor */ + "Interface-Text", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Interface-Type, Enumerated, code 2006 */ + { + struct dict_avp_data data = { + 2006, /* Code */ + 10415, /* Vendor */ + "Interface-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Interface-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Inter-Operator-Identifier, Grouped, code 838 */ + { + struct dict_avp_data data = { + 838, /* Code */ + 10415, /* Vendor */ + "Inter-Operator-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Inter-UE-Transfer, Enumerated, code 3902 */ + { + struct dict_avp_data data = { + 3902, /* Code */ + 10415, /* Vendor */ + "Inter-UE-Transfer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Inter-UE-Transfer)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* IP-Realm-Default-Indication, Enumerated, code 2603 */ + { + struct dict_avp_data data = { + 2603, /* Code */ + 10415, /* Vendor */ + "IP-Realm-Default-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IP-Realm-Default-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ISUP-Cause, Grouped, code 3416 */ + { + struct dict_avp_data data = { + 3416, /* Code */ + 10415, /* Vendor */ + "ISUP-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ISUP-Cause-Diagnostics, OctetString, code 3422 */ + { + struct dict_avp_data data = { + 3422, /* Code */ + 10415, /* Vendor */ + "ISUP-Cause-Diagnostics", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ISUP-Cause-Location, Unsigned32, code 3423 */ + { + struct dict_avp_data data = { + 3423, /* Code */ + 10415, /* Vendor */ + "ISUP-Cause-Location", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ISUP-Cause-Value, Unsigned32, code 3424 */ + { + struct dict_avp_data data = { + 3424, /* Code */ + 10415, /* Vendor */ + "ISUP-Cause-Value", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ISUP-Location-Number, OctetString, code 3414 */ + { + struct dict_avp_data data = { + 3414, /* Code */ + 10415, /* Vendor */ + "ISUP-Location-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Language, UTF8String, code 3914 */ + { + struct dict_avp_data data = { + 3914, /* Code */ + 10415, /* Vendor */ + "Language", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Layer-2-Group-ID, OctetString, code 3429 */ + { + struct dict_avp_data data = { + 3429, /* Code */ + 10415, /* Vendor */ + "Layer-2-Group-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-APN, UTF8String, code 1231 */ + { + struct dict_avp_data data = { + 1231, /* Code */ + 10415, /* Vendor */ + "LCS-APN", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* LCS-Client-Dialed-By-MS, UTF8String, code 1233 */ + { + struct dict_avp_data data = { + 1233, /* Code */ + 10415, /* Vendor */ + "LCS-Client-Dialed-By-MS", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* LCS-Client-External-ID, UTF8String, code 1234 */ + { + struct dict_avp_data data = { + 1234, /* Code */ + 10415, /* Vendor */ + "LCS-Client-External-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* LCS-Client-Id, Grouped, code 1232 */ + { + struct dict_avp_data data = { + 1232, /* Code */ + 10415, /* Vendor */ + "LCS-Client-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Client-Name, Grouped, code 1235 */ + { + struct dict_avp_data data = { + 1235, /* Code */ + 10415, /* Vendor */ + "LCS-Client-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Client-Type, Enumerated, code 1241 */ + { + struct dict_avp_data data = { + 1241, /* Code */ + 10415, /* Vendor */ + "LCS-Client-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LCS-Client-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* LCS-Data-Coding-Scheme, UTF8String, code 1236 */ + { + struct dict_avp_data data = { + 1236, /* Code */ + 10415, /* Vendor */ + "LCS-Data-Coding-Scheme", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* LCS-Format-Indicator, Enumerated, code 1237 */ + { + struct dict_avp_data data = { + 1237, /* Code */ + 10415, /* Vendor */ + "LCS-Format-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LCS-Format-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* LCS-Information, Grouped, code 878 */ + { + struct dict_avp_data data = { + 878, /* Code */ + 10415, /* Vendor */ + "LCS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* LCS-Name-String, UTF8String, code 1238 */ + { + struct dict_avp_data data = { + 1238, /* Code */ + 10415, /* Vendor */ + "LCS-Name-String", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Note: 3GPP TS 32.299 V11.8.0 (2013-07) renamed */ + /* LCS-Requestor-Id (1239) to LCS-Requestor-ID (1239). */ + /* */ + /* Change-1.4.0: LCS-Requestor-Id (1239) renamed to LCS-Requestor-ID (1239). */ + /* LCS-Requestor-ID, Grouped, code 1239 */ + { + struct dict_avp_data data = { + 1239, /* Code */ + 10415, /* Vendor */ + "LCS-Requestor-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: 3GPP TS 32.299 V11.8.0 (2013-07) renamed */ + /* LCS-Requestor-Id-String (1240) to LCS-Requestor-ID-String (1240). */ + /* */ + /* Change-1.4.0: LCS-Requestor-Id-String (1240) renamed to LCS-Requestor-ID-String (1240). */ + /* LCS-Requestor-ID-String, UTF8String, code 1240 */ + { + struct dict_avp_data data = { + 1240, /* Code */ + 10415, /* Vendor */ + "LCS-Requestor-ID-String", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Local-GW-Inserted-Indication, Enumerated, code 2604 */ + { + struct dict_avp_data data = { + 2604, /* Code */ + 10415, /* Vendor */ + "Local-GW-Inserted-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Local-GW-Inserted-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Local-Sequence-Number, Unsigned32, code 2063 */ + { + struct dict_avp_data data = { + 2063, /* Code */ + 10415, /* Vendor */ + "Local-Sequence-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Estimate, OctetString, code 1242 */ + { + struct dict_avp_data data = { + 1242, /* Code */ + 10415, /* Vendor */ + "Location-Estimate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Estimate-Type, Enumerated, code 1243 */ + { + struct dict_avp_data data = { + 1243, /* Code */ + 10415, /* Vendor */ + "Location-Estimate-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Location-Estimate-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Location-Info, Grouped, code 3460 */ + { + struct dict_avp_data data = { + 3460, /* Code */ + 10415, /* Vendor */ + "Location-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Location-Type, Grouped, code 1244 */ + { + struct dict_avp_data data = { + 1244, /* Code */ + 10415, /* Vendor */ + "Location-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Low-Balance-Indication, Enumerated, code 2020 */ + { + struct dict_avp_data data = { + 2020, /* Code */ + 10415, /* Vendor */ + "Low-Balance-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Low-Balance-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Low-Priority-Indicator, Enumerated, code 2602 */ + { + struct dict_avp_data data = { + 2602, /* Code */ + 10415, /* Vendor */ + "Low-Priority-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Low-Priority-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MBMS-Charged-Party, Enumerated, code 2323 */ + { + struct dict_avp_data data = { + 2323, /* Code */ + 10415, /* Vendor */ + "MBMS-Charged-Party", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-Charged-Party)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: 3GPP TS 32.299 V11.8.0 (2013-07) Table 7.2 changed */ + /* row MBMS-GW-Address (2307) to have a hyphen instead of space. */ + /* */ + /* Change-1.4.0: MBMSGW-Address (2307) renamed to MBMS-GW-Address (2307). */ + /* MBMS-GW-Address, Address, code 2307 */ + { + struct dict_avp_data data = { + 2307, /* Code */ + 10415, /* Vendor */ + "MBMS-GW-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* MBMS-Information, Grouped, code 880 */ + { + struct dict_avp_data data = { + 880, /* Code */ + 10415, /* Vendor */ + "MBMS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MBMS-User-Service-Type, Enumerated, code 1225 */ + { + struct dict_avp_data data = { + 1225, /* Code */ + 10415, /* Vendor */ + "MBMS-User-Service-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-User-Service-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Media-Initiator-Flag, Enumerated, code 882 */ + { + struct dict_avp_data data = { + 882, /* Code */ + 10415, /* Vendor */ + "Media-Initiator-Flag", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Media-Initiator-Flag)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Media-Initiator-Party, UTF8String, code 1288 */ + { + struct dict_avp_data data = { + 1288, /* Code */ + 10415, /* Vendor */ + "Media-Initiator-Party", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Message-Body, Grouped, code 889 */ + { + struct dict_avp_data data = { + 889, /* Code */ + 10415, /* Vendor */ + "Message-Body", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Message-Class, Grouped, code 1213 */ + { + struct dict_avp_data data = { + 1213, /* Code */ + 10415, /* Vendor */ + "Message-Class", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Message-ID, UTF8String, code 1210 */ + { + struct dict_avp_data data = { + 1210, /* Code */ + 10415, /* Vendor */ + "Message-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Message-Size, Unsigned32, code 1212 */ + { + struct dict_avp_data data = { + 1212, /* Code */ + 10415, /* Vendor */ + "Message-Size", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Message-Type, Enumerated, code 1211 */ + { + struct dict_avp_data data = { + 1211, /* Code */ + 10415, /* Vendor */ + "Message-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Message-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MMBox-Storage-Requested, Enumerated, code 1248 */ + { + struct dict_avp_data data = { + 1248, /* Code */ + 10415, /* Vendor */ + "MMBox-Storage-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MMBox-Storage-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* MM-Content-Type, Grouped, code 1203 */ + { + struct dict_avp_data data = { + 1203, /* Code */ + 10415, /* Vendor */ + "MM-Content-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MMS-Information, Grouped, code 877 */ + { + struct dict_avp_data data = { + 877, /* Code */ + 10415, /* Vendor */ + "MMS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MMTel-Information, Grouped, code 2030 */ + { + struct dict_avp_data data = { + 2030, /* Code */ + 10415, /* Vendor */ + "MMTel-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MMTel-SService-Type, Unsigned32, code 2031 */ + { + struct dict_avp_data data = { + 2031, /* Code */ + 10415, /* Vendor */ + "MMTel-SService-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitored-PLMN-Identifier, UTF8String, code 3430 */ + { + struct dict_avp_data data = { + 3430, /* Code */ + 10415, /* Vendor */ + "Monitored-PLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Monitoring-Event-Configuration-Activity, Integer32, code 3919 */ + { + struct dict_avp_data data = { + 3919, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Configuration-Activity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Functionality, Integer32, code 3922 */ + { + struct dict_avp_data data = { + 3922, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Functionality", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Information, Grouped, code 3921 */ + { + struct dict_avp_data data = { + 3921, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Report-Data, Grouped, code 3920 */ + { + struct dict_avp_data data = { + 3920, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Report-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-Event-Report-Number, Unsigned32, code 3923 */ + { + struct dict_avp_data data = { + 3923, /* Code */ + 10415, /* Vendor */ + "Monitoring-Event-Report-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Monitoring-UE-HPLMN-Identifier, UTF8String, code 3431 */ + { + struct dict_avp_data data = { + 3431, /* Code */ + 10415, /* Vendor */ + "Monitoring-UE-HPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Monitoring-UE-Identifier, UTF8String, code 3432 */ + { + struct dict_avp_data data = { + 3432, /* Code */ + 10415, /* Vendor */ + "Monitoring-UE-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Monitoring-UE-VPLMN-Identifier, UTF8String, code 3433 */ + { + struct dict_avp_data data = { + 3433, /* Code */ + 10415, /* Vendor */ + "Monitoring-UE-VPLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* MSC-Address, OctetString, code 3417 */ + { + struct dict_avp_data data = { + 3417, /* Code */ + 10415, /* Vendor */ + "MSC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* MTC-IWF-Address, Address, code 3406 */ + { + struct dict_avp_data data = { + 3406, /* Code */ + 10415, /* Vendor */ + "MTC-IWF-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Neighbour-Node-Address, Address, code 2705 */ + { + struct dict_avp_data data = { + 2705, /* Code */ + 10415, /* Vendor */ + "Neighbour-Node-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Network-Call-Reference-Number, OctetString, code 3418 */ + { + struct dict_avp_data data = { + 3418, /* Code */ + 10415, /* Vendor */ + "Network-Call-Reference-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Next-Tariff, Grouped, code 2057 */ + { + struct dict_avp_data data = { + 2057, /* Code */ + 10415, /* Vendor */ + "Next-Tariff", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NIDD-Submission, Grouped, code 3928 */ + { + struct dict_avp_data data = { + 3928, /* Code */ + 10415, /* Vendor */ + "NIDD-Submission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NNI-Information, Grouped, code 2703 */ + { + struct dict_avp_data data = { + 2703, /* Code */ + 10415, /* Vendor */ + "NNI-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* NNI-Type, Enumerated, code 2704 */ + { + struct dict_avp_data data = { + 2704, /* Code */ + 10415, /* Vendor */ + "NNI-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/NNI-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Node-Functionality, Enumerated, code 862 */ + { + struct dict_avp_data data = { + 862, /* Code */ + 10415, /* Vendor */ + "Node-Functionality", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Node-Functionality)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Node-Id, UTF8String, code 2064 */ + { + struct dict_avp_data data = { + 2064, /* Code */ + 10415, /* Vendor */ + "Node-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Number-Of-Diversions, Unsigned32, code 2034 */ + { + struct dict_avp_data data = { + 2034, /* Code */ + 10415, /* Vendor */ + "Number-Of-Diversions", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Messages-Sent, Unsigned32, code 2019 */ + { + struct dict_avp_data data = { + 2019, /* Code */ + 10415, /* Vendor */ + "Number-Of-Messages-Sent", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Participants, Unsigned32, code 885 */ + { + struct dict_avp_data data = { + 885, /* Code */ + 10415, /* Vendor */ + "Number-Of-Participants", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Received-Talk-Bursts, Unsigned32, code 1282 */ + { + struct dict_avp_data data = { + 1282, /* Code */ + 10415, /* Vendor */ + "Number-Of-Received-Talk-Bursts", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Talk-Bursts, Unsigned32, code 1283 */ + { + struct dict_avp_data data = { + 1283, /* Code */ + 10415, /* Vendor */ + "Number-Of-Talk-Bursts", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Portability-Routing-Information, UTF8String, code 2024 */ + { + struct dict_avp_data data = { + 2024, /* Code */ + 10415, /* Vendor */ + "Number-Portability-Routing-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Offline-Charging, Grouped, code 1278 */ + { + struct dict_avp_data data = { + 1278, /* Code */ + 10415, /* Vendor */ + "Offline-Charging", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Online-Charging-Flag, Enumerated, code 2303 */ + { + struct dict_avp_data data = { + 2303, /* Code */ + 10415, /* Vendor */ + "Online-Charging-Flag", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Online-Charging-Flag)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Originating-IOI, UTF8String, code 839 */ + { + struct dict_avp_data data = { + 839, /* Code */ + 10415, /* Vendor */ + "Originating-IOI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Originator, Enumerated, code 864 */ + { + struct dict_avp_data data = { + 864, /* Code */ + 10415, /* Vendor */ + "Originator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Originator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Originator-Address, Grouped, code 886 */ + { + struct dict_avp_data data = { + 886, /* Code */ + 10415, /* Vendor */ + "Originator-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Originator-Interface, Grouped, code 2009 */ + { + struct dict_avp_data data = { + 2009, /* Code */ + 10415, /* Vendor */ + "Originator-Interface", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Originator-Received-Address, Grouped, code 2027 */ + { + struct dict_avp_data data = { + 2027, /* Code */ + 10415, /* Vendor */ + "Originator-Received-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Originator-SCCP-Address, Address, code 2008 */ + { + struct dict_avp_data data = { + 2008, /* Code */ + 10415, /* Vendor */ + "Originator-SCCP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Outgoing-Session-Id, UTF8String, code 2320 */ + { + struct dict_avp_data data = { + 2320, /* Code */ + 10415, /* Vendor */ + "Outgoing-Session-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Outgoing-Trunk-Group-Id, UTF8String, code 853 */ + { + struct dict_avp_data data = { + 853, /* Code */ + 10415, /* Vendor */ + "Outgoing-Trunk-Group-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Participant-Access-Priority, Enumerated, code 1259 */ + { + struct dict_avp_data data = { + 1259, /* Code */ + 10415, /* Vendor */ + "Participant-Access-Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Participant-Access-Priority)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Participant-Action-Type, Enumerated, code 2049 */ + { + struct dict_avp_data data = { + 2049, /* Code */ + 10415, /* Vendor */ + "Participant-Action-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Participant-Action-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Participant-Group, Grouped, code 1260 */ + { + struct dict_avp_data data = { + 1260, /* Code */ + 10415, /* Vendor */ + "Participant-Group", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Participants-Involved, UTF8String, code 887 */ + { + struct dict_avp_data data = { + 887, /* Code */ + 10415, /* Vendor */ + "Participants-Involved", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* PC3-Control-Protocol-Cause, Integer32, code 3434 */ + { + struct dict_avp_data data = { + 3434, /* Code */ + 10415, /* Vendor */ + "PC3-Control-Protocol-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PC3-EPC-Control-Protocol-Cause, Integer32, code 3435 */ + { + struct dict_avp_data data = { + 3435, /* Code */ + 10415, /* Vendor */ + "PC3-EPC-Control-Protocol-Cause", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PC5-Radio-Technology, Enumerated, code 1300 */ + { + struct dict_avp_data data = { + 1300, /* Code */ + 10415, /* Vendor */ + "PC5-Radio-Technology", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PC5-Radio-Technology)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PDN-Connection-Charging-ID, Unsigned32, code 2050 */ + { + struct dict_avp_data data = { + 2050, /* Code */ + 10415, /* Vendor */ + "PDN-Connection-Charging-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDP-Address, Address, code 1227 */ + { + struct dict_avp_data data = { + 1227, /* Code */ + 10415, /* Vendor */ + "PDP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* PDP-Address-Prefix-Length, Unsigned32, code 2606 */ + { + struct dict_avp_data data = { + 2606, /* Code */ + 10415, /* Vendor */ + "PDP-Address-Prefix-Length", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PDP-Context-Type, Enumerated, code 1247 */ + { + struct dict_avp_data data = { + 1247, /* Code */ + 10415, /* Vendor */ + "PDP-Context-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDP-Context-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Change-1.4.0: PDG-Address (895) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Change-1.4.0: PDG-Charging-Id (896) Unsigned32 removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Play-Alternative, Enumerated, code 3913 */ + { + struct dict_avp_data data = { + 3913, /* Code */ + 10415, /* Vendor */ + "Play-Alternative", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Play-Alternative)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PoC-Change-Condition, Enumerated, code 1261 */ + { + struct dict_avp_data data = { + 1261, /* Code */ + 10415, /* Vendor */ + "PoC-Change-Condition", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Change-Condition)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PoC-Change-Time, Time, code 1262 */ + { + struct dict_avp_data data = { + 1262, /* Code */ + 10415, /* Vendor */ + "PoC-Change-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* PoC-Controlling-Address, UTF8String, code 858 */ + { + struct dict_avp_data data = { + 858, /* Code */ + 10415, /* Vendor */ + "PoC-Controlling-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* PoC-Event-Type, Enumerated, code 2025 */ + { + struct dict_avp_data data = { + 2025, /* Code */ + 10415, /* Vendor */ + "PoC-Event-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Event-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PoC-Group-Name, UTF8String, code 859 */ + { + struct dict_avp_data data = { + 859, /* Code */ + 10415, /* Vendor */ + "PoC-Group-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* PoC-Information, Grouped, code 879 */ + { + struct dict_avp_data data = { + 879, /* Code */ + 10415, /* Vendor */ + "PoC-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PoC-Server-Role, Enumerated, code 883 */ + { + struct dict_avp_data data = { + 883, /* Code */ + 10415, /* Vendor */ + "PoC-Server-Role", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Server-Role)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PoC-Session-Id, UTF8String, code 1229 */ + { + struct dict_avp_data data = { + 1229, /* Code */ + 10415, /* Vendor */ + "PoC-Session-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* PoC-Session-Initiation-type, Enumerated, code 1277 */ + { + struct dict_avp_data data = { + 1277, /* Code */ + 10415, /* Vendor */ + "PoC-Session-Initiation-type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Session-Initiation-type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PoC-Session-Type, Enumerated, code 884 */ + { + struct dict_avp_data data = { + 884, /* Code */ + 10415, /* Vendor */ + "PoC-Session-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Session-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PoC-User-Role, Grouped, code 1252 */ + { + struct dict_avp_data data = { + 1252, /* Code */ + 10415, /* Vendor */ + "PoC-User-Role", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PoC-User-Role-IDs, UTF8String, code 1253 */ + { + struct dict_avp_data data = { + 1253, /* Code */ + 10415, /* Vendor */ + "PoC-User-Role-IDs", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Note: 3GPP TS 32.299 V13.1.0 (2015-06) renamed */ + /* PoC-User-Role-info-Units (1254) to PoC-User-Role-Info-Units (1254). */ + /* */ + /* Change-1.4.0: PoC-User-Role-info-Units (1254) renamed to PoC-User-Role-Info-Units (1254). */ + /* PoC-User-Role-Info-Units, Enumerated, code 1254 */ + { + struct dict_avp_data data = { + 1254, /* Code */ + 10415, /* Vendor */ + "PoC-User-Role-Info-Units", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-User-Role-Info-Units)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Positioning-Data, UTF8String, code 1245 */ + { + struct dict_avp_data data = { + 1245, /* Code */ + 10415, /* Vendor */ + "Positioning-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Preferred-AoC-Currency, Unsigned32, code 2315 */ + { + struct dict_avp_data data = { + 2315, /* Code */ + 10415, /* Vendor */ + "Preferred-AoC-Currency", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Priority, Enumerated, code 1209 */ + { + struct dict_avp_data data = { + 1209, /* Code */ + 10415, /* Vendor */ + "Priority", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Priority)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Privacy-Indicator, Enumerated, code 3915 */ + { + struct dict_avp_data data = { + 3915, /* Code */ + 10415, /* Vendor */ + "Privacy-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Privacy-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-3rd-Party-Application-ID, UTF8String, code 3440 */ + { + struct dict_avp_data data = { + 3440, /* Code */ + 10415, /* Vendor */ + "ProSe-3rd-Party-Application-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* ProSe-Direct-Communication-Reception-Data-Container, Grouped, code 3461 */ + { + struct dict_avp_data data = { + 3461, /* Code */ + 10415, /* Vendor */ + "ProSe-Direct-Communication-Reception-Data-Container", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Direct-Communication-Transmission-Data-Container, Grouped, code 3441 */ + { + struct dict_avp_data data = { + 3441, /* Code */ + 10415, /* Vendor */ + "ProSe-Direct-Communication-Transmission-Data-Container", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Direct-Discovery-Model, Enumerated, code 3442 */ + { + struct dict_avp_data data = { + 3442, /* Code */ + 10415, /* Vendor */ + "ProSe-Direct-Discovery-Model", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ProSe-Direct-Discovery-Model)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-Event-Type, Enumerated, code 3443 */ + { + struct dict_avp_data data = { + 3443, /* Code */ + 10415, /* Vendor */ + "ProSe-Event-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ProSe-Event-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-Function-IP-Address, Address, code 3444 */ + { + struct dict_avp_data data = { + 3444, /* Code */ + 10415, /* Vendor */ + "ProSe-Function-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* ProSe-Function-PLMN-Identifier, UTF8String, code 3457 */ + { + struct dict_avp_data data = { + 3457, /* Code */ + 10415, /* Vendor */ + "ProSe-Function-PLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* ProSe-Functionality, Enumerated, code 3445 */ + { + struct dict_avp_data data = { + 3445, /* Code */ + 10415, /* Vendor */ + "ProSe-Functionality", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ProSe-Functionality)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-Group-IP-Multicast-Address, Address, code 3446 */ + { + struct dict_avp_data data = { + 3446, /* Code */ + 10415, /* Vendor */ + "ProSe-Group-IP-Multicast-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* ProSe-Information, Grouped, code 3447 */ + { + struct dict_avp_data data = { + 3447, /* Code */ + 10415, /* Vendor */ + "ProSe-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-Range-Class, Enumerated, code 3448 */ + { + struct dict_avp_data data = { + 3448, /* Code */ + 10415, /* Vendor */ + "ProSe-Range-Class", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ProSe-Range-Class)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-Reason-For-Cancellation, Enumerated, code 3449 */ + { + struct dict_avp_data data = { + 3449, /* Code */ + 10415, /* Vendor */ + "ProSe-Reason-For-Cancellation", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ProSe-Reason-For-Cancellation)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-Request-Timestamp, Time, code 3450 */ + { + struct dict_avp_data data = { + 3450, /* Code */ + 10415, /* Vendor */ + "ProSe-Request-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* ProSe-Role-Of-UE, Enumerated, code 3451 */ + { + struct dict_avp_data data = { + 3451, /* Code */ + 10415, /* Vendor */ + "ProSe-Role-Of-UE", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ProSe-Role-Of-UE)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* ProSe-Source-IP-Address, Address, code 3452 */ + { + struct dict_avp_data data = { + 3452, /* Code */ + 10415, /* Vendor */ + "ProSe-Source-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* ProSe-Target-Layer-2-ID, OctetString, code 4410 */ + { + struct dict_avp_data data = { + 4410, /* Code */ + 10415, /* Vendor */ + "ProSe-Target-Layer-2-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-UE-ID, OctetString, code 3453 */ + { + struct dict_avp_data data = { + 3453, /* Code */ + 10415, /* Vendor */ + "ProSe-UE-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* ProSe-UE-to-Network-Relay-UE-ID, OctetString, code 4409 */ + { + struct dict_avp_data data = { + 4409, /* Code */ + 10415, /* Vendor */ + "ProSe-UE-to-Network-Relay-UE-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Proximity-Alert-Indication, Enumerated, code 3454 */ + { + struct dict_avp_data data = { + 3454, /* Code */ + 10415, /* Vendor */ + "Proximity-Alert-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Proximity-Alert-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Proximity-Alert-Timestamp, Time, code 3455 */ + { + struct dict_avp_data data = { + 3455, /* Code */ + 10415, /* Vendor */ + "Proximity-Alert-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Proximity-Cancellation-Timestamp, Time, code 3456 */ + { + struct dict_avp_data data = { + 3456, /* Code */ + 10415, /* Vendor */ + "Proximity-Cancellation-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* PS-Append-Free-Format-Data, Enumerated, code 867 */ + { + struct dict_avp_data data = { + 867, /* Code */ + 10415, /* Vendor */ + "PS-Append-Free-Format-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PS-Append-Free-Format-Data)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* PS-Free-Format-Data, OctetString, code 866 */ + { + struct dict_avp_data data = { + 866, /* Code */ + 10415, /* Vendor */ + "PS-Free-Format-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PS-Furnish-Charging-Information, Grouped, code 865 */ + { + struct dict_avp_data data = { + 865, /* Code */ + 10415, /* Vendor */ + "PS-Furnish-Charging-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* PS-Information, Grouped, code 874 */ + { + struct dict_avp_data data = { + 874, /* Code */ + 10415, /* Vendor */ + "PS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Quota-Consumption-Time, Unsigned32, code 881 */ + { + struct dict_avp_data data = { + 881, /* Code */ + 10415, /* Vendor */ + "Quota-Consumption-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Quota-Holding-Time, Unsigned32, code 871 */ + { + struct dict_avp_data data = { + 871, /* Code */ + 10415, /* Vendor */ + "Quota-Holding-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Quota-Indicator, Enumerated, code 3912 */ + { + struct dict_avp_data data = { + 3912, /* Code */ + 10415, /* Vendor */ + "Quota-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Quota-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Note: Name conflict with 3GPP TS 32.299 Radio-Frequency (3508) */ + /* 3GPP TS 29.468 V12.0.0 (2014-09) added Radio-Frequency (3508). */ + /* 3GPP TS 32.299 V13.1.0 (2015-06) CR 0638 added Radio-Frequency (3462). */ + /* Radio-Frequency, OctetString, code 3462 */ + { + struct dict_avp_data data = { + 3462, /* Code */ + 10415, /* Vendor */ + "Radio-Frequency", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Radio-Parameter-Set-Info, Grouped, code 3463 */ + { + struct dict_avp_data data = { + 3463, /* Code */ + 10415, /* Vendor */ + "Radio-Parameter-Set-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Radio-Parameter-Set-Values, OctetString, code 3464 */ + { + struct dict_avp_data data = { + 3464, /* Code */ + 10415, /* Vendor */ + "Radio-Parameter-Set-Values", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Radio-Resources-Indicator, Integer32, code 3465 */ + { + struct dict_avp_data data = { + 3465, /* Code */ + 10415, /* Vendor */ + "Radio-Resources-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RAN-End-Time, Time, code 1301 */ + { + struct dict_avp_data data = { + 1301, /* Code */ + 10415, /* Vendor */ + "RAN-End-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* RAN-Secondary-RAT-Usage-Report, Grouped, code 1302 */ + { + struct dict_avp_data data = { + 1302, /* Code */ + 10415, /* Vendor */ + "RAN-Secondary-RAT-Usage-Report", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* RAN-Start-Time, Time, code 1303 */ + { + struct dict_avp_data data = { + 1303, /* Code */ + 10415, /* Vendor */ + "RAN-Start-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Rate-Control-Max-Message-Size, Unsigned32, code 3937 */ + { + struct dict_avp_data data = { + 3937, /* Code */ + 10415, /* Vendor */ + "Rate-Control-Max-Message-Size", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Rate-Control-Max-Rate, Unsigned32, code 3938 */ + { + struct dict_avp_data data = { + 3938, /* Code */ + 10415, /* Vendor */ + "Rate-Control-Max-Rate", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Rate-Control-Time-Unit, Unsigned32, code 3939 */ + { + struct dict_avp_data data = { + 3939, /* Code */ + 10415, /* Vendor */ + "Rate-Control-Time-Unit", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Rate-Element, Grouped, code 2058 */ + { + struct dict_avp_data data = { + 2058, /* Code */ + 10415, /* Vendor */ + "Rate-Element", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Read-Reply-Report-Requested, Enumerated, code 1222 */ + { + struct dict_avp_data data = { + 1222, /* Code */ + 10415, /* Vendor */ + "Read-Reply-Report-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Read-Reply-Report-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Real-Time-Tariff-Information, Grouped, code 2305 */ + { + struct dict_avp_data data = { + 2305, /* Code */ + 10415, /* Vendor */ + "Real-Time-Tariff-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reason-Header, UTF8String, code 3401 */ + { + struct dict_avp_data data = { + 3401, /* Code */ + 10415, /* Vendor */ + "Reason-Header", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Received-Talk-Burst-Time, Unsigned32, code 1284 */ + { + struct dict_avp_data data = { + 1284, /* Code */ + 10415, /* Vendor */ + "Received-Talk-Burst-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Received-Talk-Burst-Volume, Unsigned32, code 1285 */ + { + struct dict_avp_data data = { + 1285, /* Code */ + 10415, /* Vendor */ + "Received-Talk-Burst-Volume", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Note: Name conflict with 3GPP TS 32.299 Recipient-Address (1201); */ + /* 3GPP TS 29.140 V6.1.0 (2005-06) allocated Recipient-Address (1108). */ + /* 3GPP TS 32.299 V6.4.0 (2005-09) CR 0028 added Recipient-Address (1201). */ + /* Recipient-Address, Grouped, code 1201 */ + { + struct dict_avp_data data = { + 1201, /* Code */ + 10415, /* Vendor */ + "Recipient-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Recipient-Info, Grouped, code 2026 */ + { + struct dict_avp_data data = { + 2026, /* Code */ + 10415, /* Vendor */ + "Recipient-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Recipient-Received-Address, Grouped, code 2028 */ + { + struct dict_avp_data data = { + 2028, /* Code */ + 10415, /* Vendor */ + "Recipient-Received-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Recipient-SCCP-Address, Address, code 2010 */ + { + struct dict_avp_data data = { + 2010, /* Code */ + 10415, /* Vendor */ + "Recipient-SCCP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Refund-Information, OctetString, code 2022 */ + { + struct dict_avp_data data = { + 2022, /* Code */ + 10415, /* Vendor */ + "Refund-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Related-Change-Condition-Information, Grouped, code 3925 */ + { + struct dict_avp_data data = { + 3925, /* Code */ + 10415, /* Vendor */ + "Related-Change-Condition-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Related-Trigger, Grouped, code 3926 */ + { + struct dict_avp_data data = { + 3926, /* Code */ + 10415, /* Vendor */ + "Related-Trigger", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Related-IMS-Charging-Identifier, UTF8String, code 2711 */ + { + struct dict_avp_data data = { + 2711, /* Code */ + 10415, /* Vendor */ + "Related-IMS-Charging-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Related-IMS-Charging-Identifier-Node, Address, code 2712 */ + { + struct dict_avp_data data = { + 2712, /* Code */ + 10415, /* Vendor */ + "Related-IMS-Charging-Identifier-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Relationship-Mode, Enumerated, code 2706 */ + { + struct dict_avp_data data = { + 2706, /* Code */ + 10415, /* Vendor */ + "Relationship-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Relationship-Mode)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Relay-IP-address, Address, code 4411 */ + { + struct dict_avp_data data = { + 4411, /* Code */ + 10415, /* Vendor */ + "Relay-IP-address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Remaining-Balance, Grouped, code 2021 */ + { + struct dict_avp_data data = { + 2021, /* Code */ + 10415, /* Vendor */ + "Remaining-Balance", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Reply-Applic-ID, UTF8String, code 1223 */ + { + struct dict_avp_data data = { + 1223, /* Code */ + 10415, /* Vendor */ + "Reply-Applic-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Reply-Path-Requested, Enumerated, code 2011 */ + { + struct dict_avp_data data = { + 2011, /* Code */ + 10415, /* Vendor */ + "Reply-Path-Requested", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reply-Path-Requested)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Reporting-Reason, Enumerated, code 872 */ + { + struct dict_avp_data data = { + 872, /* Code */ + 10415, /* Vendor */ + "Reporting-Reason", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reporting-Reason)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Requested-Party-Address, UTF8String, code 1251 */ + { + struct dict_avp_data data = { + 1251, /* Code */ + 10415, /* Vendor */ + "Requested-Party-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Requested-PLMN-Identifier, UTF8String, code 3436 */ + { + struct dict_avp_data data = { + 3436, /* Code */ + 10415, /* Vendor */ + "Requested-PLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Requestor-PLMN-Identifier, UTF8String, code 3437 */ + { + struct dict_avp_data data = { + 3437, /* Code */ + 10415, /* Vendor */ + "Requestor-PLMN-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Role-Of-Node, Enumerated, code 829 */ + { + struct dict_avp_data data = { + 829, /* Code */ + 10415, /* Vendor */ + "Role-Of-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Role-Of-Node)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Role-Of-ProSe-Function, Enumerated, code 3438 */ + { + struct dict_avp_data data = { + 3438, /* Code */ + 10415, /* Vendor */ + "Role-Of-ProSe-Function", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Role-Of-ProSe-Function)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Route-Header-Received, UTF8String, code 3403 */ + { + struct dict_avp_data data = { + 3403, /* Code */ + 10415, /* Vendor */ + "Route-Header-Received", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Route-Header-Transmitted, UTF8String, code 3404 */ + { + struct dict_avp_data data = { + 3404, /* Code */ + 10415, /* Vendor */ + "Route-Header-Transmitted", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Scale-Factor, Grouped, code 2059 */ + { + struct dict_avp_data data = { + 2059, /* Code */ + 10415, /* Vendor */ + "Scale-Factor", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SCEF-Address, Address, code 1317 */ + { + struct dict_avp_data data = { + 1317, /* Code */ + 10415, /* Vendor */ + "SCEF-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* SCS-Address, Address, code 3941 */ + { + struct dict_avp_data data = { + 3941, /* Code */ + 10415, /* Vendor */ + "SCS-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* SCS-AS-Address, Grouped, code 3940 */ + { + struct dict_avp_data data = { + 3940, /* Code */ + 10415, /* Vendor */ + "SCS-AS-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SCS-Realm, DiameterIdentity, code 3942 */ + { + struct dict_avp_data data = { + 3942, /* Code */ + 10415, /* Vendor */ + "SCS-Realm", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* SDP-Answer-Timestamp, Time, code 1275 */ + { + struct dict_avp_data data = { + 1275, /* Code */ + 10415, /* Vendor */ + "SDP-Answer-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SDP-Media-Component, Grouped, code 843 */ + { + struct dict_avp_data data = { + 843, /* Code */ + 10415, /* Vendor */ + "SDP-Media-Component", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SDP-Media-Description, UTF8String, code 845 */ + { + struct dict_avp_data data = { + 845, /* Code */ + 10415, /* Vendor */ + "SDP-Media-Description", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SDP-Media-Name, UTF8String, code 844 */ + { + struct dict_avp_data data = { + 844, /* Code */ + 10415, /* Vendor */ + "SDP-Media-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SDP-Offer-Timestamp, Time, code 1274 */ + { + struct dict_avp_data data = { + 1274, /* Code */ + 10415, /* Vendor */ + "SDP-Offer-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SDP-Session-Description, UTF8String, code 842 */ + { + struct dict_avp_data data = { + 842, /* Code */ + 10415, /* Vendor */ + "SDP-Session-Description", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SDP-TimeStamps, Grouped, code 1273 */ + { + struct dict_avp_data data = { + 1273, /* Code */ + 10415, /* Vendor */ + "SDP-TimeStamps", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SDP-Type, Enumerated, code 2036 */ + { + struct dict_avp_data data = { + 2036, /* Code */ + 10415, /* Vendor */ + "SDP-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SDP-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Secondary-RAT-Type, OctetString, code 1304 */ + { + struct dict_avp_data data = { + 1304, /* Code */ + 10415, /* Vendor */ + "Secondary-RAT-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Serving-Node-Identity, DiameterIdentity, code 3929 */ + { + struct dict_avp_data data = { + 3929, /* Code */ + 10415, /* Vendor */ + "Serving-Node-Identity", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); + }; + + /* Served-Party-IP-Address, Address, code 848 */ + { + struct dict_avp_data data = { + 848, /* Code */ + 10415, /* Vendor */ + "Served-Party-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Service-Data-Container, Grouped, code 2040 */ + { + struct dict_avp_data data = { + 2040, /* Code */ + 10415, /* Vendor */ + "Service-Data-Container", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Id, UTF8String, code 855 */ + { + struct dict_avp_data data = { + 855, /* Code */ + 10415, /* Vendor */ + "Service-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Service-Information, Grouped, code 873 */ + { + struct dict_avp_data data = { + 873, /* Code */ + 10415, /* Vendor */ + "Service-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Mode, Unsigned32, code 2032 */ + { + struct dict_avp_data data = { + 2032, /* Code */ + 10415, /* Vendor */ + "Service-Mode", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Specific-Data, UTF8String, code 863 */ + { + struct dict_avp_data data = { + 863, /* Code */ + 10415, /* Vendor */ + "Service-Specific-Data", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Service-Specific-Info, Grouped, code 1249 */ + { + struct dict_avp_data data = { + 1249, /* Code */ + 10415, /* Vendor */ + "Service-Specific-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Specific-Type, Unsigned32, code 1257 */ + { + struct dict_avp_data data = { + 1257, /* Code */ + 10415, /* Vendor */ + "Service-Specific-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Serving-Node-Type, Enumerated, code 2047 */ + { + struct dict_avp_data data = { + 2047, /* Code */ + 10415, /* Vendor */ + "Serving-Node-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Serving-Node-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Session-Direction, Enumerated, code 2707 */ + { + struct dict_avp_data data = { + 2707, /* Code */ + 10415, /* Vendor */ + "Session-Direction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Direction)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SGi-PtP-Tunnelling-Method, Enumerated, code 3931 */ + { + struct dict_avp_data data = { + 3931, /* Code */ + 10415, /* Vendor */ + "SGi-PtP-Tunnelling-Method", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SGi-PtP-Tunnelling-Method)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SGSN-Address, Address, code 1228 */ + { + struct dict_avp_data data = { + 1228, /* Code */ + 10415, /* Vendor */ + "SGSN-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* SGW-Address, Address, code 2067 */ + { + struct dict_avp_data data = { + 2067, /* Code */ + 10415, /* Vendor */ + "SGW-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* SGW-Change, Enumerated, code 2065 */ + { + struct dict_avp_data data = { + 2065, /* Code */ + 10415, /* Vendor */ + "SGW-Change", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SGW-Change)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SIP-Method, UTF8String, code 824 */ + { + struct dict_avp_data data = { + 824, /* Code */ + 10415, /* Vendor */ + "SIP-Method", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SIP-Request-Timestamp, Time, code 834 */ + { + struct dict_avp_data data = { + 834, /* Code */ + 10415, /* Vendor */ + "SIP-Request-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SIP-Request-Timestamp-Fraction, Unsigned32, code 2301 */ + { + struct dict_avp_data data = { + 2301, /* Code */ + 10415, /* Vendor */ + "SIP-Request-Timestamp-Fraction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SIP-Response-Timestamp, Time, code 835 */ + { + struct dict_avp_data data = { + 835, /* Code */ + 10415, /* Vendor */ + "SIP-Response-Timestamp", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SIP-Response-Timestamp-Fraction, Unsigned32, code 2302 */ + { + struct dict_avp_data data = { + 2302, /* Code */ + 10415, /* Vendor */ + "SIP-Response-Timestamp-Fraction", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Device-Trigger-Indicator, Enumerated, code 3407 */ + { + struct dict_avp_data data = { + 3407, /* Code */ + 10415, /* Vendor */ + "SM-Device-Trigger-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Device-Trigger-Indicator)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SM-Device-Trigger-Information, Grouped, code 3405 */ + { + struct dict_avp_data data = { + 3405, /* Code */ + 10415, /* Vendor */ + "SM-Device-Trigger-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Discharge-Time, Time, code 2012 */ + { + struct dict_avp_data data = { + 2012, /* Code */ + 10415, /* Vendor */ + "SM-Discharge-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SM-Message-Type, Enumerated, code 2007 */ + { + struct dict_avp_data data = { + 2007, /* Code */ + 10415, /* Vendor */ + "SM-Message-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Message-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SM-Protocol-ID, OctetString, code 2013 */ + { + struct dict_avp_data data = { + 2013, /* Code */ + 10415, /* Vendor */ + "SM-Protocol-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Sequence-Number, Unsigned32, code 3408 */ + { + struct dict_avp_data data = { + 3408, /* Code */ + 10415, /* Vendor */ + "SM-Sequence-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-Service-Type, Enumerated, code 2029 */ + { + struct dict_avp_data data = { + 2029, /* Code */ + 10415, /* Vendor */ + "SM-Service-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Service-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SM-Status, OctetString, code 2014 */ + { + struct dict_avp_data data = { + 2014, /* Code */ + 10415, /* Vendor */ + "SM-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SM-User-Data-Header, OctetString, code 2015 */ + { + struct dict_avp_data data = { + 2015, /* Code */ + 10415, /* Vendor */ + "SM-User-Data-Header", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SMS-Information, Grouped, code 2000 */ + { + struct dict_avp_data data = { + 2000, /* Code */ + 10415, /* Vendor */ + "SMS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SMS-Node, Enumerated, code 2016 */ + { + struct dict_avp_data data = { + 2016, /* Code */ + 10415, /* Vendor */ + "SMS-Node", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SMS-Node)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SMS-Result, Unsigned32, code 3409 */ + { + struct dict_avp_data data = { + 3409, /* Code */ + 10415, /* Vendor */ + "SMS-Result", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SMSC-Address, Address, code 2017 */ + { + struct dict_avp_data data = { + 2017, /* Code */ + 10415, /* Vendor */ + "SMSC-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Start-of-Charging, Time, code 3419 */ + { + struct dict_avp_data data = { + 3419, /* Code */ + 10415, /* Vendor */ + "Start-of-Charging", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Start-Time, Time, code 2041 */ + { + struct dict_avp_data data = { + 2041, /* Code */ + 10415, /* Vendor */ + "Start-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Note: 3GPP TS 32.299 V11.10.0 (2013-12) CR 0566 renamed */ + /* Status (2702) to Status-Code (2702). */ + /* 3GPP TS 32.299 V11.14.0 (2014-12) CR 0617 renamed */ + /* Status-Code (2702) to Status-AS-Code (2702). */ + /* */ + /* Change-1.4.0: Status (2702) renamed to Status-AS-Code (2702). */ + /* Status-AS-Code, Enumerated, code 2702 */ + { + struct dict_avp_data data = { + 2702, /* Code */ + 10415, /* Vendor */ + "Status-AS-Code", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Status-AS-Code)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Stop-Time, Time, code 2042 */ + { + struct dict_avp_data data = { + 2042, /* Code */ + 10415, /* Vendor */ + "Stop-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Submission-Time, Time, code 1202 */ + { + struct dict_avp_data data = { + 1202, /* Code */ + 10415, /* Vendor */ + "Submission-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Subscriber-Role, Enumerated, code 2033 */ + { + struct dict_avp_data data = { + 2033, /* Code */ + 10415, /* Vendor */ + "Subscriber-Role", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subscriber-Role)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Supplementary-Service, Grouped, code 2048 */ + { + struct dict_avp_data data = { + 2048, /* Code */ + 10415, /* Vendor */ + "Supplementary-Service", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TAD-Identifier, Enumerated, code 2717 */ + { + struct dict_avp_data data = { + 2717, /* Code */ + 10415, /* Vendor */ + "TAD-Identifier", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/TAD-Identifier)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Talk-Burst-Exchange, Grouped, code 1255 */ + { + struct dict_avp_data data = { + 1255, /* Code */ + 10415, /* Vendor */ + "Talk-Burst-Exchange", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Talk-Burst-Time, Unsigned32, code 1286 */ + { + struct dict_avp_data data = { + 1286, /* Code */ + 10415, /* Vendor */ + "Talk-Burst-Time", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Talk-Burst-Volume, Unsigned32, code 1287 */ + { + struct dict_avp_data data = { + 1287, /* Code */ + 10415, /* Vendor */ + "Talk-Burst-Volume", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Target-IP-Address, Address, code 4412 */ + { + struct dict_avp_data data = { + 4412, /* Code */ + 10415, /* Vendor */ + "Target-IP-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* Tariff-Information, Grouped, code 2060 */ + { + struct dict_avp_data data = { + 2060, /* Code */ + 10415, /* Vendor */ + "Tariff-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Tariff-XML, UTF8String, code 2306 */ + { + struct dict_avp_data data = { + 2306, /* Code */ + 10415, /* Vendor */ + "Tariff-XML", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Teleservice, OctetString, code 3413 */ + { + struct dict_avp_data data = { + 3413, /* Code */ + 10415, /* Vendor */ + "Teleservice", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Terminating-IOI, UTF8String, code 840 */ + { + struct dict_avp_data data = { + 840, /* Code */ + 10415, /* Vendor */ + "Terminating-IOI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Time-First-Reception, Time, code 3466 */ + { + struct dict_avp_data data = { + 3466, /* Code */ + 10415, /* Vendor */ + "Time-First-Reception", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Time-First-Transmission, Time, code 3467 */ + { + struct dict_avp_data data = { + 3467, /* Code */ + 10415, /* Vendor */ + "Time-First-Transmission", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Time-First-Usage, Time, code 2043 */ + { + struct dict_avp_data data = { + 2043, /* Code */ + 10415, /* Vendor */ + "Time-First-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Time-Indicator, Unsigned32, code 3911 */ + { + struct dict_avp_data data = { + 3911, /* Code */ + 10415, /* Vendor */ + "Time-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Time-Last-Usage, Time, code 2044 */ + { + struct dict_avp_data data = { + 2044, /* Code */ + 10415, /* Vendor */ + "Time-Last-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* Time-Quota-Mechanism, Grouped, code 1270 */ + { + struct dict_avp_data data = { + 1270, /* Code */ + 10415, /* Vendor */ + "Time-Quota-Mechanism", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Time-Quota-Threshold, Unsigned32, code 868 */ + { + struct dict_avp_data data = { + 868, /* Code */ + 10415, /* Vendor */ + "Time-Quota-Threshold", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Time-Quota-Type, Enumerated, code 1271 */ + { + struct dict_avp_data data = { + 1271, /* Code */ + 10415, /* Vendor */ + "Time-Quota-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Time-Quota-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Time-Stamps, Grouped, code 833 */ + { + struct dict_avp_data data = { + 833, /* Code */ + 10415, /* Vendor */ + "Time-Stamps", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Time-Usage, Unsigned32, code 2045 */ + { + struct dict_avp_data data = { + 2045, /* Code */ + 10415, /* Vendor */ + "Time-Usage", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TLTRI, Unsigned32, code 1318 */ + { + struct dict_avp_data data = { + 1318, /* Code */ + 10415, /* Vendor */ + "TLTRI", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Token-Text, UTF8String, code 1215 */ + { + struct dict_avp_data data = { + 1215, /* Code */ + 10415, /* Vendor */ + "Token-Text", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Traffic-Data-Volumes, Grouped, code 2046 */ + { + struct dict_avp_data data = { + 2046, /* Code */ + 10415, /* Vendor */ + "Traffic-Data-Volumes", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Transcoder-Inserted-Indication, Enumerated, code 2605 */ + { + struct dict_avp_data data = { + 2605, /* Code */ + 10415, /* Vendor */ + "Transcoder-Inserted-Indication", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Transcoder-Inserted-Indication)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Transit-IOI-List, UTF8String, code 2701 */ + { + struct dict_avp_data data = { + 2701, /* Code */ + 10415, /* Vendor */ + "Transit-IOI-List", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Transmitter-Info, Grouped, code 3468 */ + { + struct dict_avp_data data = { + 3468, /* Code */ + 10415, /* Vendor */ + "Transmitter-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trigger, Grouped, code 1264 */ + { + struct dict_avp_data data = { + 1264, /* Code */ + 10415, /* Vendor */ + "Trigger", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Trigger-Type, Enumerated, code 870 */ + { + struct dict_avp_data data = { + 870, /* Code */ + 10415, /* Vendor */ + "Trigger-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Trigger-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Trunk-Group-Id, Grouped, code 851 */ + { + struct dict_avp_data data = { + 851, /* Code */ + 10415, /* Vendor */ + "Trunk-Group-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* TWAG-Address, Address, code 3903 */ + { + struct dict_avp_data data = { + 3903, /* Code */ + 10415, /* Vendor */ + "TWAG-Address", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); + }; + + /* TWAN-User-Location-Info, Grouped, code 2714 */ + { + struct dict_avp_data data = { + 2714, /* Code */ + 10415, /* Vendor */ + "TWAN-User-Location-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Type-Number, Enumerated, code 1204 */ + { + struct dict_avp_data data = { + 1204, /* Code */ + 10415, /* Vendor */ + "Type-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Type-Number)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* UNI-PDU-CP-Only-Flag, Enumerated, code 3932 */ + { + struct dict_avp_data data = { + 3932, /* Code */ + 10415, /* Vendor */ + "UNI-PDU-CP-Only-Flag", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/UNI-PDU-CP-Only-Flag)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Unit-Cost, Grouped, code 2061 */ + { + struct dict_avp_data data = { + 2061, /* Code */ + 10415, /* Vendor */ + "Unit-Cost", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Unit-Quota-Threshold, Unsigned32, code 1226 */ + { + struct dict_avp_data data = { + 1226, /* Code */ + 10415, /* Vendor */ + "Unit-Quota-Threshold", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Unused-Quota-Timer, Unsigned32, code 4407 */ + { + struct dict_avp_data data = { + 4407, /* Code */ + 10415, /* Vendor */ + "Unused-Quota-Timer", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Usage-Information-Report-Sequence-Number, Integer32, code 3439 */ + { + struct dict_avp_data data = { + 3439, /* Code */ + 10415, /* Vendor */ + "Usage-Information-Report-Sequence-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* User-CSG-Information, Grouped, code 2319 */ + { + struct dict_avp_data data = { + 2319, /* Code */ + 10415, /* Vendor */ + "User-CSG-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* User-Participating-Type, Enumerated, code 1279 */ + { + struct dict_avp_data data = { + 1279, /* Code */ + 10415, /* Vendor */ + "User-Participating-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-Participating-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* User-Session-Id, UTF8String, code 830 */ + { + struct dict_avp_data data = { + 830, /* Code */ + 10415, /* Vendor */ + "User-Session-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* UWAN-User-Location-Info, Grouped, code 3918 */ + { + struct dict_avp_data data = { + 3918, /* Code */ + 10415, /* Vendor */ + "UWAN-User-Location-Info", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Variable-Part, Grouped, code 3907 */ + { + struct dict_avp_data data = { + 3907, /* Code */ + 10415, /* Vendor */ + "Variable-Part", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Variable-Part-Order, Unsigned32, code 3908 */ + { + struct dict_avp_data data = { + 3908, /* Code */ + 10415, /* Vendor */ + "Variable-Part-Order", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Variable-Part-Type, Unsigned32, code 3909 */ + { + struct dict_avp_data data = { + 3909, /* Code */ + 10415, /* Vendor */ + "Variable-Part-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Variable-Part-Value, UTF8String, code 3910 */ + { + struct dict_avp_data data = { + 3910, /* Code */ + 10415, /* Vendor */ + "Variable-Part-Value", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* VCS-Information, Grouped, code 3410 */ + { + struct dict_avp_data data = { + 3410, /* Code */ + 10415, /* Vendor */ + "VCS-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* VLR-Number, OctetString, code 3420 */ + { + struct dict_avp_data data = { + 3420, /* Code */ + 10415, /* Vendor */ + "VLR-Number", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Volume-Quota-Threshold, Unsigned32, code 869 */ + { + struct dict_avp_data data = { + 869, /* Code */ + 10415, /* Vendor */ + "Volume-Quota-Threshold", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Change-1.4.0: WAG-Address (890) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Change-1.4.0: WAG-PLMN-Id (891) OctetString removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Change-1.4.0: WLAN-Information (875) Grouped removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* WLAN-Operator-Id, Grouped, code 1306 */ + { + struct dict_avp_data data = { + 1306, /* Code */ + 10415, /* Vendor */ + "WLAN-Operator-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* WLAN-Operator-Name, UTF8String, code 1307 */ + { + struct dict_avp_data data = { + 1307, /* Code */ + 10415, /* Vendor */ + "WLAN-Operator-Name", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* WLAN-PLMN-Id, UTF8String, code 1308 */ + { + struct dict_avp_data data = { + 1308, /* Code */ + 10415, /* Vendor */ + "WLAN-PLMN-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Change-1.4.0: WLAN-Radio-Container (892) Grouped removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Change-1.4.0: WLAN-Session-Id (1246) UTF8String removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Change-1.4.0: WLAN-Technology (893) Unsigned32 removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /* Change-1.4.0: WLAN-UE-Local-IPAddress (894) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09). */ + + /*==================================================================*/ + /* OMA DDS Charging_Data V1.0 20110201-A */ + /* Charging Data */ + /* */ + /* From OMA OMA-DDS-Charging_Data-V1_0-20110201-A.pdf */ + /*==================================================================*/ + + /* Application-Server-Id, UTF8String, code 2101, section 8.4 */ + { + struct dict_avp_data data = { + 2101, /* Code */ + 10415, /* Vendor */ + "Application-Server-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Change-1.4.0: Application-Service-Type (2102) type changed from UTF8String to Enumerated. */ + /* Application-Service-Type, Enumerated, code 2102, section 8.4 */ + { + struct dict_avp_data data = { + 2102, /* Code */ + 10415, /* Vendor */ + "Application-Service-Type", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Application-Service-Type)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* Change-1.4.0: Application-Session-Id (2103) type changed from UTF8String to Unsigned32. */ + /* Application-Session-Id, Unsigned32, code 2103, section 8.4 */ + { + struct dict_avp_data data = { + 2103, /* Code */ + 10415, /* Vendor */ + "Application-Session-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Content-ID, UTF8String, code 2116, section 8.4 */ + { + struct dict_avp_data data = { + 2116, /* Code */ + 10415, /* Vendor */ + "Content-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* Content-provider-ID, UTF8String, code 2117, section 8.4 */ + { + struct dict_avp_data data = { + 2117, /* Code */ + 10415, /* Vendor */ + "Content-provider-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* DCD-Information, Grouped, code 2115, section 8.5.5 */ + { + struct dict_avp_data data = { + 2115, /* Code */ + 10415, /* Vendor */ + "DCD-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Delivery-Status, UTF8String, code 2104, section 8.4 */ + { + struct dict_avp_data data = { + 2104, /* Code */ + 10415, /* Vendor */ + "Delivery-Status", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* IM-Information, Grouped, code 2110, section 8.5.6 */ + { + struct dict_avp_data data = { + 2110, /* Code */ + 10415, /* Vendor */ + "IM-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Messages-Successfully-Exploded, Unsigned32, code 2111, section 8.4 */ + { + struct dict_avp_data data = { + 2111, /* Code */ + 10415, /* Vendor */ + "Number-Of-Messages-Successfully-Exploded", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Number-Of-Messages-Successfully-Sent, Unsigned32, code 2112, section 8.4 */ + { + struct dict_avp_data data = { + 2112, /* Code */ + 10415, /* Vendor */ + "Number-Of-Messages-Successfully-Sent", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Service-Generic-Information, Grouped, code 1256, section 8.5.10 */ + { + struct dict_avp_data data = { + 1256, /* Code */ + 10415, /* Vendor */ + "Service-Generic-Information", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Total-Number-Of-Messages-Exploded, Unsigned32, code 2113, section 8.4 */ + { + struct dict_avp_data data = { + 2113, /* Code */ + 10415, /* Vendor */ + "Total-Number-Of-Messages-Exploded", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* Total-Number-Of-Messages-Sent, Unsigned32, code 2114, section 8.4 */ + { + struct dict_avp_data data = { + 2114, /* Code */ + 10415, /* Vendor */ + "Total-Number-Of-Messages-Sent", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /*==================================================================*/ + /* 3GPP2 X.S0057-0 v2.0 */ + /* E-UTRAN - eHRPD Connectivity and Interworking: */ + /* Core Network Aspects */ + /* */ + /* From 3GPP2 X.S0057-0_v2.0_091215.pdf */ + /*==================================================================*/ + + /* */ + /* Change-1.4.0: 3GPP2-BSID (9010) type changed from OctetString to UTF8String. */ + /* Change-1.4.0: 3GPP2-BSID (9010) flag M MUST. */ + /* 3GPP2-BSID, UTF8String, code 9010, section 5.6.2.1.1 */ + { + struct dict_avp_data data = { + 9010, /* Code */ + 5535, /* Vendor */ + "3GPP2-BSID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + return 0; +} /* add_avps() */ diff --git a/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c b/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c index 55d5ce4..3d58cf6 100644 --- a/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c +++ b/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c @@ -72,10 +72,9 @@ * 1. It would be good if 29.061 was reviewed to check for each AVP if * it is Mandatory or not. The data currently in the document does not * match what was in the previous version of the freeDiameter - * extension (the one that existedbefore I rewrote it) or what I saw + * extension (the one that existed before I rewrote it) or what I saw * so far. IIRC, even the table and the document contradict each - * other. The AVP table is also missing an entry for - * "External-Identifier", 28. + * other. * * 2. 29.140 has conflicting AVP names with other documents: * - Sequence-Number is also in 32.329 @@ -98,7 +97,8 @@ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); struct local_rules_definition { - struct dict_avp_request avp_vendor_plus_name; + vendor_id_t vendor; + char * name; enum rule_position position; int min; int max; @@ -110,6 +110,10 @@ struct local_rules_definition { #define PARSE_loc_rules( _rulearray, _parent) { \ int __ar; \ for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \ + struct dict_avp_request __avp = { \ + .avp_vendor = (_rulearray)[__ar].vendor, \ + .avp_name = (_rulearray)[__ar].name, \ + }; \ struct dict_rule_data __data = { NULL, \ (_rulearray)[__ar].position, \ 0, \ @@ -120,16 +124,15 @@ struct local_rules_definition { fd_g_config->cnf_dict, \ DICT_AVP, \ AVP_BY_NAME_AND_VENDOR, \ - &(_rulearray)[__ar].avp_vendor_plus_name, \ + &__avp, \ &__data.rule_avp, 0 ) ); \ if ( !__data.rule_avp ) { \ - TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_vendor_plus_name.avp_name); \ + LOG_E( "AVP Not found: '%s'", __avp.avp_name); \ return ENOENT; \ } \ CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \ { \ - TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \ - (_rulearray)[__ar].avp_vendor_plus_name.avp_name); \ + LOG_E( "Error on rule with AVP '%s'", __avp.avp_name); \ return EINVAL; \ } ); \ } \ @@ -144,7 +147,10 @@ struct local_rules_definition { static int dict_dcca_3gpp_entry(char * conffile) { - /* Applications section */ + /*==================================================================*/ + /* Applications section */ + /*==================================================================*/ + { /* Create the vendors */ { @@ -158,10115 +164,198 @@ static int dict_dcca_3gpp_entry(char * conffile) } + /*==================================================================*/ + /* AVPs section */ + /*==================================================================*/ + + + /* 3GPP Experimental-Result-Code ENUMVAL Unsigned32 */ + /* 3GPP TS 29.230 V15.7.0 (2019-12) section 8.1 */ + { + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(3GPP/Experimental-Result-Code)", NULL, NULL}; + struct dict_enumval_data tvals[] = { + enumval_def_u32(2001, "DIAMETER_FIRST_REGISTRATION"), + enumval_def_u32(2002, "DIAMETER_SUBSEQUENT_REGISTRATION"), + enumval_def_u32(2003, "DIAMETER_UNREGISTERED_SERVICE"), + /* + * 3GPP TS 29.229 V5.3.0 (2003-03) renamed 2004 from DIAMETER_SUCCESS_NOT SUPPORTED_USER_DATA. + */ + enumval_def_u32(2004, "DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED"), + /* + * 3GPP TS 29.229 V5.3.0 (2003-03) renamed 2005 from DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED. + * 3GPP TS 29.229 V7.2.0 (2006-06) deprecated 2005 DIAMETER_SERVER_SELECTION. + */ + enumval_def_u32(2005, "DIAMETER_SERVER_SELECTION"), + enumval_def_u32(2021, "DIAMETER_PDP_CONTEXT_DELETION_INDICATION"), + enumval_def_u32(2421, "DIAMETER_QOS_FLOW_DELETION_INDICATION"), + enumval_def_u32(4100, "DIAMETER_USER_DATA_NOT_AVAILABLE"), + enumval_def_u32(4101, "DIAMETER_PRIOR_UPDATE_IN_PROGRESS"), + enumval_def_u32(4121, "DIAMETER_ERROR_OUT_OF_RESOURCES"), + enumval_def_u32(4141, "DIAMETER_PCC_BEARER_EVENT"), + enumval_def_u32(4142, "DIAMETER_BEARER_EVENT"), + enumval_def_u32(4143, "DIAMETER_AN_GW_FAILED"), + enumval_def_u32(4144, "DIAMETER_PENDING_TRANSACTION"), + enumval_def_u32(4145, "DIAMETER_UE_STATUS_SUSPEND"), + enumval_def_u32(4181, "DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE"), + enumval_def_u32(4182, "DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT"), + /* + * DIAMETER_ERROR_ABSENT_USER name conflict between: + * - 3GPP TS 29.173 § 6.3.4.1 DIAMETER_ERROR_ABSENT_USER (4201). (For SLh). + * - 3GPP TS 29.338 § 7.3.3 DIAMETER_ERROR_ABSENT_USER (5550). (For S6c, SGd). + * Rename 4201 from 3GPP TS 29.173 to DIAMETER_ERROR_ABSENT_USER-29.173. + */ + enumval_def_u32(4201, "DIAMETER_ERROR_ABSENT_USER-29.173"), + enumval_def_u32(4221, "DIAMETER_ERROR_UNREACHABLE_USER"), + enumval_def_u32(4222, "DIAMETER_ERROR_SUSPENDED_USER"), + enumval_def_u32(4223, "DIAMETER_ERROR_DETACHED_USER"), + enumval_def_u32(4224, "DIAMETER_ERROR_POSITIONING_DENIED"), + enumval_def_u32(4225, "DIAMETER_ERROR_POSITIONING_FAILED"), + enumval_def_u32(4226, "DIAMETER_ERROR_UNKNOWN_UNREACHABLE LCS_CLIENT"), + enumval_def_u32(4241, "DIAMETER_ERROR_NO_AVAILABLE_POLICY_COUNTERS"), + enumval_def_u32(4261, "REQUESTED_SERVICE_TEMPORARILY_NOT_AUTHORIZED"), + enumval_def_u32(5001, "DIAMETER_ERROR_USER_UNKNOWN"), + enumval_def_u32(5002, "DIAMETER_ERROR_IDENTITIES_DONT_MATCH"), + enumval_def_u32(5003, "DIAMETER_ERROR_IDENTITY_NOT_REGISTERED"), + enumval_def_u32(5004, "DIAMETER_ERROR_ROAMING_NOT_ALLOWED"), + enumval_def_u32(5005, "DIAMETER_ERROR_IDENTITY_ALREADY_REGISTERED"), + enumval_def_u32(5006, "DIAMETER_ERROR_AUTH_SCHEME_NOT_SUPPORTED"), + enumval_def_u32(5007, "DIAMETER_ERROR_IN_ASSIGNMENT_TYPE"), + enumval_def_u32(5008, "DIAMETER_ERROR_TOO_MUCH_DATA"), + enumval_def_u32(5009, "DIAMETER_ERROR_NOT_SUPPORTED_USER_DATA"), + enumval_def_u32(5011, "DIAMETER_ERROR_FEATURE_UNSUPPORTED"), + enumval_def_u32(5012, "DIAMETER_ERROR_SERVING_NODE_FEATURE_UNSUPPORTED"), + enumval_def_u32(5041, "DIAMETER_ERROR_USER_NO_WLAN_SUBSCRIPTION"), + enumval_def_u32(5042, "DIAMETER_ERROR_W-APN_UNUSED_BY_USER"), + enumval_def_u32(5043, "DIAMETER_ERROR_NO_ACCESS_INDEPENDENT_SUBSCRIPTION"), + enumval_def_u32(5044, "DIAMETER_ERROR_USER_NO_W-APN_SUBSCRIPTION"), + enumval_def_u32(5045, "DIAMETER_ERROR_UNSUITABLE_NETWORK"), + enumval_def_u32(5061, "INVALID_SERVICE_INFORMATION"), + enumval_def_u32(5062, "FILTER_RESTRICTIONS"), + enumval_def_u32(5063, "REQUESTED_SERVICE_NOT_AUTHORIZED"), + enumval_def_u32(5064, "DUPLICATED_AF_SESSION"), + enumval_def_u32(5065, "IP-CAN_SESSION_NOT_AVAILABLE"), + enumval_def_u32(5066, "UNAUTHORIZED_NON_EMERGENCY_SESSION"), + enumval_def_u32(5067, "UNAUTHORIZED_SPONSORED_DATA_CONNECTIVITY"), + enumval_def_u32(5068, "TEMPORARY_NETWORK_FAILURE"), + enumval_def_u32(5100, "DIAMETER_ERROR_USER_DATA_NOT_RECOGNIZED"), + enumval_def_u32(5101, "DIAMETER_ERROR_OPERATION_NOT_ALLOWED"), + enumval_def_u32(5102, "DIAMETER_ERROR_USER_DATA_CANNOT_BE_READ"), + enumval_def_u32(5103, "DIAMETER_ERROR_USER_DATA_CANNOT_BE_MODIFIED"), + enumval_def_u32(5104, "DIAMETER_ERROR_USER_DATA_CANNOT_BE_NOTIFIED"), + enumval_def_u32(5105, "DIAMETER_ERROR_TRANSPARENT_DATA OUT_OF_SYNC"), + enumval_def_u32(5106, "DIAMETER_ERROR_SUBS_DATA_ABSENT"), + enumval_def_u32(5107, "DIAMETER_ERROR_NO_SUBSCRIPTION_TO_DATA"), + enumval_def_u32(5108, "DIAMETER_ERROR_DSAI_NOT_AVAILABLE"), + enumval_def_u32(5120, "DIAMETER_ERROR_START_INDICATION"), + enumval_def_u32(5121, "DIAMETER_ERROR_STOP_INDICATION"), + enumval_def_u32(5122, "DIAMETER_ERROR_UNKNOWN_MBMS_BEARER_SERVICE"), + enumval_def_u32(5123, "DIAMETER_ERROR_SERVICE_AREA"), + enumval_def_u32(5140, "DIAMETER_ERROR_INITIAL_PARAMETERS"), + enumval_def_u32(5141, "DIAMETER_ERROR_TRIGGER_EVENT"), + enumval_def_u32(5142, "DIAMETER_PCC_RULE_EVENT"), + enumval_def_u32(5143, "DIAMETER_ERROR_BEARER_NOT_AUTHORIZED"), + enumval_def_u32(5144, "DIAMETER_ERROR_TRAFFIC_MAPPING_INFO_REJECTED"), + enumval_def_u32(5145, "DIAMETER_QOS_RULE_EVENT"), + enumval_def_u32(5147, "DIAMETER_ERROR_CONFLICTING_REQUEST"), + enumval_def_u32(5148, "DIAMETER_ADC_RULE_EVENT"), + enumval_def_u32(5149, "DIAMETER_ERROR_NBIFOM_NOT_AUTHORIZED"), + enumval_def_u32(5401, "DIAMETER_ERROR_IMPI_UNKNOWN"), + enumval_def_u32(5402, "DIAMETER_ERROR_NOT_AUTHORIZED"), + enumval_def_u32(5403, "DIAMETER_ERROR_TRANSACTION_IDENTIFIER_INVALID"), + enumval_def_u32(5420, "DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION"), + enumval_def_u32(5421, "DIAMETER_ERROR_RAT_NOT_ALLOWED"), + enumval_def_u32(5422, "DIAMETER_ERROR_EQUIPMENT_UNKNOWN"), + enumval_def_u32(5423, "DIAMETER_ERROR_UNKNOWN_SERVING_NODE"), + enumval_def_u32(5450, "DIAMETER_ERROR_USER_NO_NON_3GPP_SUBSCRIPTION"), + enumval_def_u32(5451, "DIAMETER_ERROR_USER_NO_APN_SUBSCRIPTION"), + enumval_def_u32(5452, "DIAMETER_ERROR_RAT_TYPE_NOT_ALLOWED"), + enumval_def_u32(5453, "DIAMETER_ERROR_LATE_OVERLAPPING_REQUEST"), + enumval_def_u32(5454, "DIAMETER_ERROR_TIMED_OUT_REQUEST"), + enumval_def_u32(5470, "DIAMETER_ERROR_SUBSESSION"), + enumval_def_u32(5471, "DIAMETER_ERROR_ONGOING_SESSION_ESTABLISHMENT"), + enumval_def_u32(5490, "DIAMETER_ERROR_UNAUTHORIZED_REQUESTING_NETWORK"), + enumval_def_u32(5510, "DIAMETER_ERROR_UNAUTHORIZED_REQUESTING_ENTITY"), + enumval_def_u32(5511, "DIAMETER_ERROR_UNAUTHORIZED_SERVICE"), + enumval_def_u32(5512, "DIAMETER_ERROR_REQUESTED_RANGE_IS_NOT ALLOWED"), + enumval_def_u32(5513, "DIAMETER_ERROR_CONFIGURATION_EVENT_STORAGE_NOT_SUCCESSFUL"), + enumval_def_u32(5514, "DIAMETER_ERROR_CONFIGURATION_EVENT_NON_EXISTANT"), + enumval_def_u32(5515, "DIAMETER_ERROR_SCEF_REFERENCE_ID_UNKNOWN"), + enumval_def_u32(5530, "DIAMETER_ERROR_INVALID_SME_ADDRESS"), + enumval_def_u32(5531, "DIAMETER_ERROR_SC_CONGESTION"), + enumval_def_u32(5532, "DIAMETER_ERROR_SM_PROTOCOL"), + enumval_def_u32(5533, "DIAMETER_ERROR_TRIGGER_REPLACE_FAILURE"), + enumval_def_u32(5534, "DIAMETER_ERROR_TRIGGER_RECALL_FAILURE"), + enumval_def_u32(5535, "DIAMETER_ERROR_ORIGINAL_MESSAGE_NOT_PENDING"), + enumval_def_u32(5550, "DIAMETER_ERROR_ABSENT_USER"), + enumval_def_u32(5551, "DIAMETER_ERROR_USER_BUSY_FOR_MT_SMS"), + enumval_def_u32(5552, "DIAMETER_ERROR_FACILITY_NOT_SUPPORTED"), + enumval_def_u32(5553, "DIAMETER_ERROR_ILLEGAL_USER"), + enumval_def_u32(5554, "DIAMETER_ERROR_ILLEGAL_EQUIPMENT"), + enumval_def_u32(5555, "DIAMETER_ERROR_SM_DELIVERY_FAILURE"), + enumval_def_u32(5556, "DIAMETER_ERROR_SERVICE_NOT_SUBSCRIBED"), + enumval_def_u32(5557, "DIAMETER_ERROR_SERVICE_BARRED"), + enumval_def_u32(5558, "DIAMETER_ERROR_MWD_LIST_FULL"), + enumval_def_u32(5570, "DIAMETER_ERROR_UNKNOWN_POLICY_COUNTERS"), + enumval_def_u32(5590, "DIAMETER_ERROR_ORIGIN_ALUID_UNKNOWN"), + enumval_def_u32(5591, "DIAMETER_ERROR_TARGET_ALUID_UNKNOWN"), + enumval_def_u32(5592, "DIAMETER_ERROR_PFID_UNKNOWN"), + enumval_def_u32(5593, "DIAMETER_ERROR_APP_REGISTER_REJECT"), + enumval_def_u32(5594, "DIAMETER_ERROR_PROSE_MAP_REQUEST_DISALLOWED"), + enumval_def_u32(5595, "DIAMETER_ERROR_MAP_REQUEST_REJECT"), + enumval_def_u32(5596, "DIAMETER_ERROR_REQUESTING_RPAUID_UNKNOWN"), + enumval_def_u32(5597, "DIAMETER_ERROR_UNKNOWN_OR_INVALID_TARGET_SET"), + enumval_def_u32(5598, "DIAMETER_ERROR_MISSING_APPLICATION_DATA"), + enumval_def_u32(5599, "DIAMETER_ERROR_AUTHORIZATION_REJECT"), + enumval_def_u32(5600, "DIAMETER_ERROR_DISCOVERY_NOT_PERMITTED"), + enumval_def_u32(5601, "DIAMETER_ERROR_TARGET_RPAUID_UNKNOWN"), + enumval_def_u32(5602, "DIAMETER_ERROR_INVALID_APPLICATION_DATA"), + enumval_def_u32(5610, "DIAMETER_ERROR_UNKNOWN_PROSE_SUBSCRIPTION"), + enumval_def_u32(5611, "DIAMETER_ERROR_PROSE_NOT_ALLOWED"), + enumval_def_u32(5612, "DIAMETER_ERROR_UE_LOCATION_UNKNOWN"), + enumval_def_u32(5630, "DIAMETER_ERROR_NO_ASSOCIATED_DISCOVERY_FILTER"), + enumval_def_u32(5631, "DIAMETER_ERROR_ANNOUNCING_UNAUTHORIZED_IN_PLMN"), + enumval_def_u32(5632, "DIAMETER_ERROR_INVALID_APPLICATION_CODE"), + enumval_def_u32(5633, "DIAMETER_ERROR_PROXIMITY_UNAUTHORIZED"), + enumval_def_u32(5634, "DIAMETER_ERROR_PROXIMITY_REJECTED"), + enumval_def_u32(5635, "DIAMETER_ERROR_NO_PROXIMITY_REQUEST"), + enumval_def_u32(5636, "DIAMETER_ERROR_UNAUTHORIZED_SERVICE_IN_THIS_PLMN"), + enumval_def_u32(5637, "DIAMETER_ERROR_PROXIMITY_CANCELLED"), + enumval_def_u32(5638, "DIAMETER_ERROR_INVALID_TARGET_PDUID"), + enumval_def_u32(5639, "DIAMETER_ERROR_INVALID_TARGET_RPAUID"), + enumval_def_u32(5640, "DIAMETER_ERROR_NO_ASSOCIATED_RESTRICTED_CODE"), + enumval_def_u32(5641, "DIAMETER_ERROR_INVALID_DISCOVERY_TYPE"), + enumval_def_u32(5650, "DIAMETER_ERROR_REQUESTED_LOCATION_NOT_SERVED"), + enumval_def_u32(5651, "DIAMETER_ERROR_INVALID_EPS_BEARER"), + enumval_def_u32(5652, "DIAMETER_ERROR_NIDD_CONFIGURATION_NOT_AVAILABLE"), + enumval_def_u32(5653, "DIAMETER_ERROR_USER_TEMPORARILY_UNREACHABLE"), + enumval_def_u32(5670, "DIAMETER_ERROR_UNKNKOWN_DATA"), + enumval_def_u32(5671, "DIAMETER_ERROR_REQUIRED_KEY_NOT_PROVIDED"), + enumval_def_u32(5690, "DIAMETER_ERROR_UNKNOWN_V2X_SUBSCRIPTION"), + enumval_def_u32(5691, "DIAMETER_ERROR_V2X_NOT_ALLOWED"), + }; + int i; + /* Create the Enumerated type and enumerated values */ + CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type); + for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) { + CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL); + } + } - struct dict_object * Address_type; - struct dict_object * DiameterIdentity_type; - struct dict_object * DiameterURI_type; - struct dict_object * IPFilterRule_type; - struct dict_object * Time_type; - struct dict_object * UTF8String_type; - - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "DiameterIdentity", &DiameterIdentity_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "DiameterURI", &DiameterURI_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "IPFilterRule", &IPFilterRule_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); - - - /* The following is created automatically. Do not modify. */ - /* Changes will be lost during the next update. Modify the source org file instead. */ - - /* 3GPP 29.061-c00 (12.0.0 2012.12.20) */ - /* 3GPP 29.061 is not very clear and self-inconsistent about M */ - /* for this reason, other sources are assumed more trustworthy */ - /* M inconsistently specified */ - /* 3GPP-IMSI */ - { - struct dict_avp_data data = { - 1, /* Code */ - 10415, /* Vendor */ - "3GPP-IMSI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* 29.061 says OctetString; dumps say UInt32; manually changed */ - /* 29.061 says MUST NOT M; dumps say MUST */ - /* 3GPP-Charging-Id */ - { - struct dict_avp_data data = { - 2, /* Code */ - 10415, /* Vendor */ - "3GPP-Charging-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; dumps say MUST */ - /* 3GPP-PDP-Type */ - { - struct dict_avp_data data = { - 3, /* Code */ - 10415, /* Vendor */ - "3GPP-PDP-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/3GPP-PDP-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* 3GPP-CG-Address */ - { - struct dict_avp_data data = { - 4, /* Code */ - 10415, /* Vendor */ - "3GPP-CG-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-GPRS-Negotiated-QoS-Profile */ - { - struct dict_avp_data data = { - 5, /* Code */ - 10415, /* Vendor */ - "3GPP-GPRS-Negotiated-QoS-Profile", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* M inconsistently specified; old contrib/3gg says MUST NOT */ - /* 3GPP-SGSN-Address */ - { - struct dict_avp_data data = { - 6, /* Code */ - 10415, /* Vendor */ - "3GPP-SGSN-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP-GGSN-Address */ - { - struct dict_avp_data data = { - 7, /* Code */ - 10415, /* Vendor */ - "3GPP-GGSN-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; dumps say MUST */ - /* 3GPP-IMSI-MCC-MNC */ - { - struct dict_avp_data data = { - 8, /* Code */ - 10415, /* Vendor */ - "3GPP-IMSI-MCC-MNC", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-GGSN-MCC-MNC */ - { - struct dict_avp_data data = { - 9, /* Code */ - 10415, /* Vendor */ - "3GPP-GGSN-MCC-MNC", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-NSAPI */ - { - struct dict_avp_data data = { - 10, /* Code */ - 10415, /* Vendor */ - "3GPP-NSAPI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* added manually, missing in AVP table */ - /* 3GPP-Session-Stop-Indicator */ - { - struct dict_avp_data data = { - 11, /* Code */ - 10415, /* Vendor */ - "3GPP-Session-Stop-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-Selection-Mode */ - { - struct dict_avp_data data = { - 12, /* Code */ - 10415, /* Vendor */ - "3GPP-Selection-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-Charging-Characteristics */ - { - struct dict_avp_data data = { - 13, /* Code */ - 10415, /* Vendor */ - "3GPP-Charging-Characteristics", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-CG-IPv6-Address */ - { - struct dict_avp_data data = { - 14, /* Code */ - 10415, /* Vendor */ - "3GPP-CG-IPv6-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* M inconsistently specified */ - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-SGSN-IPv6-Address */ - { - struct dict_avp_data data = { - 15, /* Code */ - 10415, /* Vendor */ - "3GPP-SGSN-IPv6-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-GGSN-IPv6-Address */ - { - struct dict_avp_data data = { - 16, /* Code */ - 10415, /* Vendor */ - "3GPP-GGSN-IPv6-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-IPv6-DNS-Servers */ - { - struct dict_avp_data data = { - 17, /* Code */ - 10415, /* Vendor */ - "3GPP-IPv6-DNS-Servers", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 29.061 says MUST NOT M; old contrib/3gpp says MUST */ - /* 3GPP-SGSN-MCC-MNC */ - { - struct dict_avp_data data = { - 18, /* Code */ - 10415, /* Vendor */ - "3GPP-SGSN-MCC-MNC", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* M inconsistently specified */ - /* 3GPP-IMEISV */ - { - struct dict_avp_data data = { - 20, /* Code */ - 10415, /* Vendor */ - "3GPP-IMEISV", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* M inconsistently specified */ - /* 3GPP-RAT-Type */ - { - struct dict_avp_data data = { - 21, /* Code */ - 10415, /* Vendor */ - "3GPP-RAT-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* M inconsistently specified */ - /* 3GPP-User-Location-Info */ - { - struct dict_avp_data data = { - 22, /* Code */ - 10415, /* Vendor */ - "3GPP-User-Location-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* M inconsistently specified */ - /* 3GPP-MS-TimeZone */ - { - struct dict_avp_data data = { - 23, /* Code */ - 10415, /* Vendor */ - "3GPP-MS-TimeZone", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP-CAMEL-Charging-Info */ - { - struct dict_avp_data data = { - 24, /* Code */ - 10415, /* Vendor */ - "3GPP-CAMEL-Charging-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP-Packet-Filter */ - { - struct dict_avp_data data = { - 25, /* Code */ - 10415, /* Vendor */ - "3GPP-Packet-Filter", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP-Negotiated-DSCP */ - { - struct dict_avp_data data = { - 26, /* Code */ - 10415, /* Vendor */ - "3GPP-Negotiated-DSCP", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP-Allocate-IP-Type */ - { - struct dict_avp_data data = { - 27, /* Code */ - 10415, /* Vendor */ - "3GPP-Allocate-IP-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* added manually, missing in AVP table */ - /* External-Identifier */ - { - struct dict_avp_data data = { - 28, /* Code */ - 10415, /* Vendor */ - "External-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* TMGI */ - { - struct dict_avp_data data = { - 900, /* Code */ - 10415, /* Vendor */ - "TMGI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Required-MBMS-Bearer-Capabilities */ - { - struct dict_avp_data data = { - 901, /* Code */ - 10415, /* Vendor */ - "Required-MBMS-Bearer-Capabilities", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* MBMS-StartStop-Indication */ - { - struct dict_avp_data data = { - 902, /* Code */ - 10415, /* Vendor */ - "MBMS-StartStop-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-StartStop-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMS-Service-Area */ - { - struct dict_avp_data data = { - 903, /* Code */ - 10415, /* Vendor */ - "MBMS-Service-Area", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-Session-Duration */ - { - struct dict_avp_data data = { - 904, /* Code */ - 10415, /* Vendor */ - "MBMS-Session-Duration", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Alternative-APN */ - { - struct dict_avp_data data = { - 905, /* Code */ - 10415, /* Vendor */ - "Alternative-APN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* MBMS-Service-Type */ - { - struct dict_avp_data data = { - 906, /* Code */ - 10415, /* Vendor */ - "MBMS-Service-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-Service-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMS-2G-3G-Indicator */ - { - struct dict_avp_data data = { - 907, /* Code */ - 10415, /* Vendor */ - "MBMS-2G-3G-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-2G-3G-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMS-Session-Identity */ - { - struct dict_avp_data data = { - 908, /* Code */ - 10415, /* Vendor */ - "MBMS-Session-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* RAI */ - { - struct dict_avp_data data = { - 909, /* Code */ - 10415, /* Vendor */ - "RAI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Additional-MBMS-Trace-Info */ - { - struct dict_avp_data data = { - 910, /* Code */ - 10415, /* Vendor */ - "Additional-MBMS-Trace-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-Time-To-Data-Transfer */ - { - struct dict_avp_data data = { - 911, /* Code */ - 10415, /* Vendor */ - "MBMS-Time-To-Data-Transfer", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-Session-Repetition-Number */ - { - struct dict_avp_data data = { - 912, /* Code */ - 10415, /* Vendor */ - "MBMS-Session-Repetition-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-Required-QoS */ - { - struct dict_avp_data data = { - 913, /* Code */ - 10415, /* Vendor */ - "MBMS-Required-QoS", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* MBMS-Counting-Information */ - { - struct dict_avp_data data = { - 914, /* Code */ - 10415, /* Vendor */ - "MBMS-Counting-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-Counting-Information)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMS-User-Data-Mode-Indication */ - { - struct dict_avp_data data = { - 915, /* Code */ - 10415, /* Vendor */ - "MBMS-User-Data-Mode-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-User-Data-Mode-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMS-GGSN-Address */ - { - struct dict_avp_data data = { - 916, /* Code */ - 10415, /* Vendor */ - "MBMS-GGSN-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-GGSN-IPv6-Address */ - { - struct dict_avp_data data = { - 917, /* Code */ - 10415, /* Vendor */ - "MBMS-GGSN-IPv6-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-BMSC-SSM-IP-Address */ - { - struct dict_avp_data data = { - 918, /* Code */ - 10415, /* Vendor */ - "MBMS-BMSC-SSM-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-BMSC-SSM-IPv6-Address */ - { - struct dict_avp_data data = { - 919, /* Code */ - 10415, /* Vendor */ - "MBMS-BMSC-SSM-IPv6-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-Flow-Identifier */ - { - struct dict_avp_data data = { - 920, /* Code */ - 10415, /* Vendor */ - "MBMS-Flow-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CN-IP-Multicast-Distribution */ - { - struct dict_avp_data data = { - 921, /* Code */ - 10415, /* Vendor */ - "CN-IP-Multicast-Distribution", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CN-IP-Multicast-Distribution)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMS-HC-Indicator */ - { - struct dict_avp_data data = { - 922, /* Code */ - 10415, /* Vendor */ - "MBMS-HC-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-HC-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* 3GPP 29.140-700 (7.0.0 2007.07.05) */ - /* Served-User-Identity */ - { - struct dict_avp_data data = { - 1100, /* Code */ - 10415, /* Vendor */ - "Served-User-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* reuses: MSISDN */ - /* VASP-ID */ - { - struct dict_avp_data data = { - 1101, /* Code */ - 10415, /* Vendor */ - "VASP-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* VAS-ID */ - { - struct dict_avp_data data = { - 1102, /* Code */ - 10415, /* Vendor */ - "VAS-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Trigger-Event */ - { - struct dict_avp_data data = { - 1103, /* Code */ - 10415, /* Vendor */ - "Trigger-Event", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Trigger-Event)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* reuses: 3GPP-IMSI */ - /* Sender-Address */ - { - struct dict_avp_data data = { - 1104, /* Code */ - 10415, /* Vendor */ - "Sender-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Initial-Recipient-Address */ - { - struct dict_avp_data data = { - 1105, /* Code */ - 10415, /* Vendor */ - "Initial-Recipient-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Result-Recipient-Address */ - { - struct dict_avp_data data = { - 1106, /* Code */ - 10415, /* Vendor */ - "Result-Recipient-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* conflicts with one in (more common) 32.329 */ - /* Sequence-Number-29.140 */ - { - struct dict_avp_data data = { - 1107, /* Code */ - 10415, /* Vendor */ - "Sequence-Number-29.140", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* conflicts with one in (more common) 32.299 */ - /* Recipient-Address-29.140 */ - { - struct dict_avp_data data = { - 1108, /* Code */ - 10415, /* Vendor */ - "Recipient-Address-29.140", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Routeing-Address */ - { - struct dict_avp_data data = { - 1109, /* Code */ - 10415, /* Vendor */ - "Routeing-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Originating-Interface */ - { - struct dict_avp_data data = { - 1110, /* Code */ - 10415, /* Vendor */ - "Originating-Interface", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Originating-Interface)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Delivery-Report */ - { - struct dict_avp_data data = { - 1111, /* Code */ - 10415, /* Vendor */ - "Delivery-Report", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Delivery-Report)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Read-Reply */ - { - struct dict_avp_data data = { - 1112, /* Code */ - 10415, /* Vendor */ - "Read-Reply", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Read-Reply)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Sender-Visibility */ - { - struct dict_avp_data data = { - 1113, /* Code */ - 10415, /* Vendor */ - "Sender-Visibility", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Sender-Visibility)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Service-Key */ - { - struct dict_avp_data data = { - 1114, /* Code */ - 10415, /* Vendor */ - "Service-Key", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Billing-Information */ - { - struct dict_avp_data data = { - 1115, /* Code */ - 10415, /* Vendor */ - "Billing-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* conflicts with one in (more common) 32.299 */ - /* Status-29.140 */ - { - struct dict_avp_data data = { - 1116, /* Code */ - 10415, /* Vendor */ - "Status-29.140", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Status-Code */ - { - struct dict_avp_data data = { - 1117, /* Code */ - 10415, /* Vendor */ - "Status-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Status-Text */ - { - struct dict_avp_data data = { - 1118, /* Code */ - 10415, /* Vendor */ - "Status-Text", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Routeing-Address-Resolution */ - { - struct dict_avp_data data = { - 1119, /* Code */ - 10415, /* Vendor */ - "Routeing-Address-Resolution", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Routeing-Address-Resolution)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* 3GPP 29.173-c00 (12.0.0 2013.03.13) */ - /* LMSI */ - { - struct dict_avp_data data = { - 2400, /* Code */ - 10415, /* Vendor */ - "LMSI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Serving-Node */ - { - struct dict_avp_data data = { - 2401, /* Code */ - 10415, /* Vendor */ - "Serving-Node", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MME-Name */ - { - struct dict_avp_data data = { - 2402, /* Code */ - 10415, /* Vendor */ - "MME-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); - }; - - /* MSC-Number */ - { - struct dict_avp_data data = { - 2403, /* Code */ - 10415, /* Vendor */ - "MSC-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-Capabilities-Sets */ - { - struct dict_avp_data data = { - 2404, /* Code */ - 10415, /* Vendor */ - "LCS-Capabilities-Sets", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* GMLC-Address */ - { - struct dict_avp_data data = { - 2405, /* Code */ - 10415, /* Vendor */ - "GMLC-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Additional-Serving-Node */ - { - struct dict_avp_data data = { - 2406, /* Code */ - 10415, /* Vendor */ - "Additional-Serving-Node", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PPR-Address */ - { - struct dict_avp_data data = { - 2407, /* Code */ - 10415, /* Vendor */ - "PPR-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* MME-Realm */ - { - struct dict_avp_data data = { - 2408, /* Code */ - 10415, /* Vendor */ - "MME-Realm", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); - }; - - /* SGSN-Name */ - { - struct dict_avp_data data = { - 2409, /* Code */ - 10415, /* Vendor */ - "SGSN-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); - }; - - /* SGSN-Realm */ - { - struct dict_avp_data data = { - 2410, /* Code */ - 10415, /* Vendor */ - "SGSN-Realm", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); - }; - - /* 3GPP 29.210-670 (6.7.0 2006-12-18) */ - /* PDP-Session-Operation */ - { - struct dict_avp_data data = { - 1015, /* Code */ - 10415, /* Vendor */ - "PDP-Session-Operation", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDP-Session-Operation)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* 3GPP 29.212-c00 (12.0.0 2013.03.15) */ - /* Gx-specific */ - /* ADC-Revalidation-Time */ - { - struct dict_avp_data data = { - 2801, /* Code */ - 10415, /* Vendor */ - "ADC-Revalidation-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* ADC-Rule-Install */ - { - struct dict_avp_data data = { - 1092, /* Code */ - 10415, /* Vendor */ - "ADC-Rule-Install", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ADC-Rule-Remove */ - { - struct dict_avp_data data = { - 1093, /* Code */ - 10415, /* Vendor */ - "ADC-Rule-Remove", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ADC-Rule-Definition */ - { - struct dict_avp_data data = { - 1094, /* Code */ - 10415, /* Vendor */ - "ADC-Rule-Definition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ADC-Rule-Base-Name */ - { - struct dict_avp_data data = { - 1095, /* Code */ - 10415, /* Vendor */ - "ADC-Rule-Base-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* ADC-Rule-Name */ - { - struct dict_avp_data data = { - 1096, /* Code */ - 10415, /* Vendor */ - "ADC-Rule-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ADC-Rule-Report */ - { - struct dict_avp_data data = { - 1097, /* Code */ - 10415, /* Vendor */ - "ADC-Rule-Report", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Application-Detection-Information */ - { - struct dict_avp_data data = { - 1098, /* Code */ - 10415, /* Vendor */ - "Application-Detection-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Access-Network-Charging-Identifier-Gx */ - { - struct dict_avp_data data = { - 1022, /* Code */ - 10415, /* Vendor */ - "Access-Network-Charging-Identifier-Gx", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Allocation-Retention-Priority */ - { - struct dict_avp_data data = { - 1034, /* Code */ - 10415, /* Vendor */ - "Allocation-Retention-Priority", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AN-GW-Address */ - { - struct dict_avp_data data = { - 1050, /* Code */ - 10415, /* Vendor */ - "AN-GW-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* APN-Aggregate-Max-Bitrate-DL */ - { - struct dict_avp_data data = { - 1040, /* Code */ - 10415, /* Vendor */ - "APN-Aggregate-Max-Bitrate-DL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* APN-Aggregate-Max-Bitrate-UL */ - { - struct dict_avp_data data = { - 1041, /* Code */ - 10415, /* Vendor */ - "APN-Aggregate-Max-Bitrate-UL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Bearer-Control-Mode */ - { - struct dict_avp_data data = { - 1023, /* Code */ - 10415, /* Vendor */ - "Bearer-Control-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Bearer-Control-Mode)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Bearer-Identifier */ - { - struct dict_avp_data data = { - 1020, /* Code */ - 10415, /* Vendor */ - "Bearer-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Bearer-Operation */ - { - struct dict_avp_data data = { - 1021, /* Code */ - 10415, /* Vendor */ - "Bearer-Operation", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Bearer-Operation)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Bearer-Usage */ - { - struct dict_avp_data data = { - 1000, /* Code */ - 10415, /* Vendor */ - "Bearer-Usage", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Bearer-Usage)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Charging-Rule-Install */ - { - struct dict_avp_data data = { - 1001, /* Code */ - 10415, /* Vendor */ - "Charging-Rule-Install", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Charging-Rule-Remove */ - { - struct dict_avp_data data = { - 1002, /* Code */ - 10415, /* Vendor */ - "Charging-Rule-Remove", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Charging-Rule-Definition */ - { - struct dict_avp_data data = { - 1003, /* Code */ - 10415, /* Vendor */ - "Charging-Rule-Definition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Charging-Rule-Base-Name */ - { - struct dict_avp_data data = { - 1004, /* Code */ - 10415, /* Vendor */ - "Charging-Rule-Base-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Charging-Rule-Name */ - { - struct dict_avp_data data = { - 1005, /* Code */ - 10415, /* Vendor */ - "Charging-Rule-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Charging-Rule-Report */ - { - struct dict_avp_data data = { - 1018, /* Code */ - 10415, /* Vendor */ - "Charging-Rule-Report", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Charging-Correlation-Indicator */ - { - struct dict_avp_data data = { - 1073, /* Code */ - 10415, /* Vendor */ - "Charging-Correlation-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charging-Correlation-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* CoA-IP-Address */ - { - struct dict_avp_data data = { - 1035, /* Code */ - 10415, /* Vendor */ - "CoA-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* CoA-Information */ - { - struct dict_avp_data data = { - 1039, /* Code */ - 10415, /* Vendor */ - "CoA-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CSG-Information-Reporting */ - { - struct dict_avp_data data = { - 1071, /* Code */ - 10415, /* Vendor */ - "CSG-Information-Reporting", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CSG-Information-Reporting)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Default-EPS-Bearer-QoS */ - { - struct dict_avp_data data = { - 1049, /* Code */ - 10415, /* Vendor */ - "Default-EPS-Bearer-QoS", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Event-Report-Indication */ - { - struct dict_avp_data data = { - 1033, /* Code */ - 10415, /* Vendor */ - "Event-Report-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Event-Trigger */ - { - struct dict_avp_data data = { - 1006, /* Code */ - 10415, /* Vendor */ - "Event-Trigger", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Event-Trigger)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Flow-Direction */ - { - struct dict_avp_data data = { - 1080, /* Code */ - 10415, /* Vendor */ - "Flow-Direction", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Flow-Direction)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Flow-Information */ - { - struct dict_avp_data data = { - 1058, /* Code */ - 10415, /* Vendor */ - "Flow-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Flow-Label */ - { - struct dict_avp_data data = { - 1057, /* Code */ - 10415, /* Vendor */ - "Flow-Label", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* IP-CAN-Type */ - { - struct dict_avp_data data = { - 1027, /* Code */ - 10415, /* Vendor */ - "IP-CAN-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IP-CAN-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Guaranteed-Bitrate-DL */ - { - struct dict_avp_data data = { - 1025, /* Code */ - 10415, /* Vendor */ - "Guaranteed-Bitrate-DL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Guaranteed-Bitrate-UL */ - { - struct dict_avp_data data = { - 1026, /* Code */ - 10415, /* Vendor */ - "Guaranteed-Bitrate-UL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* HeNB-Local-IP-Address */ - { - struct dict_avp_data data = { - 2804, /* Code */ - 10415, /* Vendor */ - "HeNB-Local-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Metering-Method */ - { - struct dict_avp_data data = { - 1007, /* Code */ - 10415, /* Vendor */ - "Metering-Method", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Metering-Method)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Monitoring-Key */ - { - struct dict_avp_data data = { - 1066, /* Code */ - 10415, /* Vendor */ - "Monitoring-Key", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Mute-Notification */ - { - struct dict_avp_data data = { - 2809, /* Code */ - 10415, /* Vendor */ - "Mute-Notification", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Mute-Notification)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Monitoring-Time */ - { - struct dict_avp_data data = { - 2810, /* Code */ - 10415, /* Vendor */ - "Monitoring-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Network-Request-Support */ - { - struct dict_avp_data data = { - 1024, /* Code */ - 10415, /* Vendor */ - "Network-Request-Support", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Network-Request-Support)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Offline */ - { - struct dict_avp_data data = { - 1008, /* Code */ - 10415, /* Vendor */ - "Offline", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Offline)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Online */ - { - struct dict_avp_data data = { - 1009, /* Code */ - 10415, /* Vendor */ - "Online", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Online)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Packet-Filter-Content */ - { - struct dict_avp_data data = { - 1059, /* Code */ - 10415, /* Vendor */ - "Packet-Filter-Content", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); - }; - - /* Packet-Filter-Identifier */ - { - struct dict_avp_data data = { - 1060, /* Code */ - 10415, /* Vendor */ - "Packet-Filter-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Packet-Filter-Information */ - { - struct dict_avp_data data = { - 1061, /* Code */ - 10415, /* Vendor */ - "Packet-Filter-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Packet-Filter-Operation */ - { - struct dict_avp_data data = { - 1062, /* Code */ - 10415, /* Vendor */ - "Packet-Filter-Operation", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Packet-Filter-Operation)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Packet-Filter-Usage */ - { - struct dict_avp_data data = { - 1072, /* Code */ - 10415, /* Vendor */ - "Packet-Filter-Usage", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Packet-Filter-Usage)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PDN-Connection-ID */ - { - struct dict_avp_data data = { - 1065, /* Code */ - 10415, /* Vendor */ - "PDN-Connection-ID", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Precedence */ - { - struct dict_avp_data data = { - 1010, /* Code */ - 10415, /* Vendor */ - "Precedence", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Pre-emption-Capability */ - { - struct dict_avp_data data = { - 1047, /* Code */ - 10415, /* Vendor */ - "Pre-emption-Capability", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Pre-emption-Capability)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Pre-emption-Vulnerability */ - { - struct dict_avp_data data = { - 1048, /* Code */ - 10415, /* Vendor */ - "Pre-emption-Vulnerability", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Pre-emption-Vulnerability)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Priority-Level */ - { - struct dict_avp_data data = { - 1046, /* Code */ - 10415, /* Vendor */ - "Priority-Level", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Redirect-Information */ - { - struct dict_avp_data data = { - 1085, /* Code */ - 10415, /* Vendor */ - "Redirect-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Redirect-Support */ - { - struct dict_avp_data data = { - 1086, /* Code */ - 10415, /* Vendor */ - "Redirect-Support", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Redirect-Support)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Reporting-Level */ - { - struct dict_avp_data data = { - 1011, /* Code */ - 10415, /* Vendor */ - "Reporting-Level", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reporting-Level)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Routing-Filter */ - { - struct dict_avp_data data = { - 1078, /* Code */ - 10415, /* Vendor */ - "Routing-Filter", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Routing-IP-Address */ - { - struct dict_avp_data data = { - 1079, /* Code */ - 10415, /* Vendor */ - "Routing-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Routing-Rule-Definition */ - { - struct dict_avp_data data = { - 1076, /* Code */ - 10415, /* Vendor */ - "Routing-Rule-Definition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Routing-Rule-Identifier */ - { - struct dict_avp_data data = { - 1077, /* Code */ - 10415, /* Vendor */ - "Routing-Rule-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Routing-Rule-Install */ - { - struct dict_avp_data data = { - 1081, /* Code */ - 10415, /* Vendor */ - "Routing-Rule-Install", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Routing-Rule-Remove */ - { - struct dict_avp_data data = { - 1075, /* Code */ - 10415, /* Vendor */ - "Routing-Rule-Remove", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PCC-Rule-Status */ - { - struct dict_avp_data data = { - 1019, /* Code */ - 10415, /* Vendor */ - "PCC-Rule-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PCC-Rule-Status)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Session-Release-Cause */ - { - struct dict_avp_data data = { - 1045, /* Code */ - 10415, /* Vendor */ - "Session-Release-Cause", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Release-Cause)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* TDF-Information */ - { - struct dict_avp_data data = { - 1087, /* Code */ - 10415, /* Vendor */ - "TDF-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* TDF-Application-Identifier */ - { - struct dict_avp_data data = { - 1088, /* Code */ - 10415, /* Vendor */ - "TDF-Application-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* TDF-Application-Instance-Identifier */ - { - struct dict_avp_data data = { - 2802, /* Code */ - 10415, /* Vendor */ - "TDF-Application-Instance-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* TDF-Destination-Host */ - { - struct dict_avp_data data = { - 1089, /* Code */ - 10415, /* Vendor */ - "TDF-Destination-Host", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); - }; - - /* TDF-Destination-Realm */ - { - struct dict_avp_data data = { - 1090, /* Code */ - 10415, /* Vendor */ - "TDF-Destination-Realm", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterIdentity_type, NULL); - }; - - /* TDF-IP-Address */ - { - struct dict_avp_data data = { - 1091, /* Code */ - 10415, /* Vendor */ - "TDF-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* QoS-Class-Identifier */ - { - struct dict_avp_data data = { - 1028, /* Code */ - 10415, /* Vendor */ - "QoS-Class-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/QoS-Class-Identifier)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* QoS-Information */ - { - struct dict_avp_data data = { - 1016, /* Code */ - 10415, /* Vendor */ - "QoS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* QoS-Negotiation */ - { - struct dict_avp_data data = { - 1029, /* Code */ - 10415, /* Vendor */ - "QoS-Negotiation", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/QoS-Negotiation)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* QoS-Upgrade */ - { - struct dict_avp_data data = { - 1030, /* Code */ - 10415, /* Vendor */ - "QoS-Upgrade", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/QoS-Upgrade)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PS-to-CS-Session-Continuity */ - { - struct dict_avp_data data = { - 1099, /* Code */ - 10415, /* Vendor */ - "PS-to-CS-Session-Continuity", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PS-to-CS-Session-Continuity)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Resource-Allocation-Notification */ - { - struct dict_avp_data data = { - 1063, /* Code */ - 10415, /* Vendor */ - "Resource-Allocation-Notification", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Resource-Allocation-Notification)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Rule-Failure-Code */ - { - struct dict_avp_data data = { - 1031, /* Code */ - 10415, /* Vendor */ - "Rule-Failure-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Rule-Failure-Code)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Security-Parameter-Index */ - { - struct dict_avp_data data = { - 1056, /* Code */ - 10415, /* Vendor */ - "Security-Parameter-Index", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* TFT-Filter */ - { - struct dict_avp_data data = { - 1012, /* Code */ - 10415, /* Vendor */ - "TFT-Filter", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); - }; - - /* TFT-Packet-Filter-Information */ - { - struct dict_avp_data data = { - 1013, /* Code */ - 10415, /* Vendor */ - "TFT-Packet-Filter-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ToS-Traffic-Class */ - { - struct dict_avp_data data = { - 1014, /* Code */ - 10415, /* Vendor */ - "ToS-Traffic-Class", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Tunnel-Header-Filter */ - { - struct dict_avp_data data = { - 1036, /* Code */ - 10415, /* Vendor */ - "Tunnel-Header-Filter", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); - }; - - /* Tunnel-Header-Length */ - { - struct dict_avp_data data = { - 1037, /* Code */ - 10415, /* Vendor */ - "Tunnel-Header-Length", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Tunnel-Information */ - { - struct dict_avp_data data = { - 1038, /* Code */ - 10415, /* Vendor */ - "Tunnel-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* RAT-Type */ - { - struct dict_avp_data data = { - 1032, /* Code */ - 10415, /* Vendor */ - "RAT-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/RAT-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Revalidation-Time */ - { - struct dict_avp_data data = { - 1042, /* Code */ - 10415, /* Vendor */ - "Revalidation-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Rule-Activation-Time */ - { - struct dict_avp_data data = { - 1043, /* Code */ - 10415, /* Vendor */ - "Rule-Activation-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* UDP-Source-Port */ - { - struct dict_avp_data data = { - 2806, /* Code */ - 10415, /* Vendor */ - "UDP-Source-Port", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* UE-Local-IP-Address */ - { - struct dict_avp_data data = { - 2805, /* Code */ - 10415, /* Vendor */ - "UE-Local-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Usage-Monitoring-Information */ - { - struct dict_avp_data data = { - 1067, /* Code */ - 10415, /* Vendor */ - "Usage-Monitoring-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Rule-Deactivation-Time */ - { - struct dict_avp_data data = { - 1044, /* Code */ - 10415, /* Vendor */ - "Rule-Deactivation-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Usage-Monitoring-Level */ - { - struct dict_avp_data data = { - 1068, /* Code */ - 10415, /* Vendor */ - "Usage-Monitoring-Level", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Usage-Monitoring-Level)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Usage-Monitoring-Report */ - { - struct dict_avp_data data = { - 1069, /* Code */ - 10415, /* Vendor */ - "Usage-Monitoring-Report", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Usage-Monitoring-Report)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Usage-Monitoring-Support */ - { - struct dict_avp_data data = { - 1070, /* Code */ - 10415, /* Vendor */ - "Usage-Monitoring-Support", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Usage-Monitoring-Support)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Gxx-specific */ - /* QoS-Rule-Install */ - { - struct dict_avp_data data = { - 1051, /* Code */ - 10415, /* Vendor */ - "QoS-Rule-Install", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* QoS-Rule-Remove */ - { - struct dict_avp_data data = { - 1052, /* Code */ - 10415, /* Vendor */ - "QoS-Rule-Remove", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* QoS-Rule-Definition */ - { - struct dict_avp_data data = { - 1053, /* Code */ - 10415, /* Vendor */ - "QoS-Rule-Definition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* QoS-Rule-Name */ - { - struct dict_avp_data data = { - 1054, /* Code */ - 10415, /* Vendor */ - "QoS-Rule-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* QoS-Rule-Base-Name */ - { - struct dict_avp_data data = { - 1074, /* Code */ - 10415, /* Vendor */ - "QoS-Rule-Base-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* QoS-Rule-Report */ - { - struct dict_avp_data data = { - 1055, /* Code */ - 10415, /* Vendor */ - "QoS-Rule-Report", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Session-Linking-Indicator */ - { - struct dict_avp_data data = { - 1064, /* Code */ - 10415, /* Vendor */ - "Session-Linking-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Linking-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* S15-specific */ - /* CS-Service-Qos-Request-Identifier */ - { - struct dict_avp_data data = { - 2807, /* Code */ - 10415, /* Vendor */ - "CS-Service-Qos-Request-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CS-Service-QoS-Request-Operation */ - { - struct dict_avp_data data = { - 2808, /* Code */ - 10415, /* Vendor */ - "CS-Service-QoS-Request-Operation", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CS-Service-QoS-Request-Operation)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* 3GPP 29.214-b80 (11.8.0 2013.03.15) */ - /* Abort-Cause */ - { - struct dict_avp_data data = { - 500, /* Code */ - 10415, /* Vendor */ - "Abort-Cause", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Abort-Cause)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Access-Network-Charging-Address */ - { - struct dict_avp_data data = { - 501, /* Code */ - 10415, /* Vendor */ - "Access-Network-Charging-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Access-Network-Charging-Identifier */ - { - struct dict_avp_data data = { - 502, /* Code */ - 10415, /* Vendor */ - "Access-Network-Charging-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Access-Network-Charging-Identifier-Value */ - { - struct dict_avp_data data = { - 503, /* Code */ - 10415, /* Vendor */ - "Access-Network-Charging-Identifier-Value", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Acceptable-Service-Info */ - { - struct dict_avp_data data = { - 526, /* Code */ - 10415, /* Vendor */ - "Acceptable-Service-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AF-Application-Identifier */ - { - struct dict_avp_data data = { - 504, /* Code */ - 10415, /* Vendor */ - "AF-Application-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AF-Charging-Identifier */ - { - struct dict_avp_data data = { - 505, /* Code */ - 10415, /* Vendor */ - "AF-Charging-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Application-Service-Provider-Identity */ - { - struct dict_avp_data data = { - 532, /* Code */ - 10415, /* Vendor */ - "Application-Service-Provider-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Codec-Data */ - { - struct dict_avp_data data = { - 524, /* Code */ - 10415, /* Vendor */ - "Codec-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Flow-Description */ - { - struct dict_avp_data data = { - 507, /* Code */ - 10415, /* Vendor */ - "Flow-Description", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, IPFilterRule_type, NULL); - }; - - /* Flow-Number */ - { - struct dict_avp_data data = { - 509, /* Code */ - 10415, /* Vendor */ - "Flow-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Flows */ - { - struct dict_avp_data data = { - 510, /* Code */ - 10415, /* Vendor */ - "Flows", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Flow-Status */ - { - struct dict_avp_data data = { - 511, /* Code */ - 10415, /* Vendor */ - "Flow-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Flow-Status)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Flow-Usage */ - { - struct dict_avp_data data = { - 512, /* Code */ - 10415, /* Vendor */ - "Flow-Usage", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Flow-Usage)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Service-URN */ - { - struct dict_avp_data data = { - 525, /* Code */ - 10415, /* Vendor */ - "Service-URN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Specific-Action */ - { - struct dict_avp_data data = { - 513, /* Code */ - 10415, /* Vendor */ - "Specific-Action", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Specific-Action)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Max-Requested-Bandwidth-DL */ - { - struct dict_avp_data data = { - 515, /* Code */ - 10415, /* Vendor */ - "Max-Requested-Bandwidth-DL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Max-Requested-Bandwidth-UL */ - { - struct dict_avp_data data = { - 516, /* Code */ - 10415, /* Vendor */ - "Max-Requested-Bandwidth-UL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Media-Component-Description */ - { - struct dict_avp_data data = { - 517, /* Code */ - 10415, /* Vendor */ - "Media-Component-Description", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Media-Component-Number */ - { - struct dict_avp_data data = { - 518, /* Code */ - 10415, /* Vendor */ - "Media-Component-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Media-Sub-Component */ - { - struct dict_avp_data data = { - 519, /* Code */ - 10415, /* Vendor */ - "Media-Sub-Component", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Media-Type */ - { - struct dict_avp_data data = { - 520, /* Code */ - 10415, /* Vendor */ - "Media-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Media-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MPS-Identifier */ - { - struct dict_avp_data data = { - 528, /* Code */ - 10415, /* Vendor */ - "MPS-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Min-Requested-Bandwidth-DL */ - { - struct dict_avp_data data = { - 534, /* Code */ - 10415, /* Vendor */ - "Min-Requested-Bandwidth-DL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Min-Requested-Bandwidth-UL */ - { - struct dict_avp_data data = { - 535, /* Code */ - 10415, /* Vendor */ - "Min-Requested-Bandwidth-UL", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* RR-Bandwidth */ - { - struct dict_avp_data data = { - 521, /* Code */ - 10415, /* Vendor */ - "RR-Bandwidth", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* RS-Bandwidth */ - { - struct dict_avp_data data = { - 522, /* Code */ - 10415, /* Vendor */ - "RS-Bandwidth", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Info-Status */ - { - struct dict_avp_data data = { - 527, /* Code */ - 10415, /* Vendor */ - "Service-Info-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Service-Info-Status)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SIP-Forking-Indication */ - { - struct dict_avp_data data = { - 523, /* Code */ - 10415, /* Vendor */ - "SIP-Forking-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SIP-Forking-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Sponsor-Identity */ - { - struct dict_avp_data data = { - 531, /* Code */ - 10415, /* Vendor */ - "Sponsor-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Sponsored-Connectivity-Data */ - { - struct dict_avp_data data = { - 530, /* Code */ - 10415, /* Vendor */ - "Sponsored-Connectivity-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AF-Signalling-Protocol */ - { - struct dict_avp_data data = { - 529, /* Code */ - 10415, /* Vendor */ - "AF-Signalling-Protocol", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AF-Signalling-Protocol)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Required-Access-Info */ - { - struct dict_avp_data data = { - 536, /* Code */ - 10415, /* Vendor */ - "Required-Access-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Required-Access-Info)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Rx-Request-Type */ - { - struct dict_avp_data data = { - 533, /* Code */ - 10415, /* Vendor */ - "Rx-Request-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Rx-Request-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* IP-Domain-Id */ - { - struct dict_avp_data data = { - 537, /* Code */ - 10415, /* Vendor */ - "IP-Domain-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP 29.229-b20 (11.2.0 2012.12.21) */ - /* Associated-Identities */ - { - struct dict_avp_data data = { - 632, /* Code */ - 10415, /* Vendor */ - "Associated-Identities", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Associated-Registered-Identities */ - { - struct dict_avp_data data = { - 647, /* Code */ - 10415, /* Vendor */ - "Associated-Registered-Identities", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Call-ID-SIP-Header */ - { - struct dict_avp_data data = { - 643, /* Code */ - 10415, /* Vendor */ - "Call-ID-SIP-Header", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Charging-Information */ - { - struct dict_avp_data data = { - 618, /* Code */ - 10415, /* Vendor */ - "Charging-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Confidentiality-Key */ - { - struct dict_avp_data data = { - 625, /* Code */ - 10415, /* Vendor */ - "Confidentiality-Key", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Contact */ - { - struct dict_avp_data data = { - 641, /* Code */ - 10415, /* Vendor */ - "Contact", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Deregistration-Reason */ - { - struct dict_avp_data data = { - 615, /* Code */ - 10415, /* Vendor */ - "Deregistration-Reason", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Feature-List */ - { - struct dict_avp_data data = { - 630, /* Code */ - 10415, /* Vendor */ - "Feature-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Feature-List-ID */ - { - struct dict_avp_data data = { - 629, /* Code */ - 10415, /* Vendor */ - "Feature-List-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* From-SIP-Header */ - { - struct dict_avp_data data = { - 644, /* Code */ - 10415, /* Vendor */ - "From-SIP-Header", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Identity-with-Emergency-Registration */ - { - struct dict_avp_data data = { - 651, /* Code */ - 10415, /* Vendor */ - "Identity-with-Emergency-Registration", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Integrity-Key */ - { - struct dict_avp_data data = { - 626, /* Code */ - 10415, /* Vendor */ - "Integrity-Key", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LIA-Flags */ - { - struct dict_avp_data data = { - 653, /* Code */ - 10415, /* Vendor */ - "LIA-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Loose-Route-Indication */ - { - struct dict_avp_data data = { - 638, /* Code */ - 10415, /* Vendor */ - "Loose-Route-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Loose-Route-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Mandatory-Capability */ - { - struct dict_avp_data data = { - 604, /* Code */ - 10415, /* Vendor */ - "Mandatory-Capability", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Multiple-Registration-Indication */ - { - struct dict_avp_data data = { - 648, /* Code */ - 10415, /* Vendor */ - "Multiple-Registration-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Multiple-Registration-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Optional-Capability */ - { - struct dict_avp_data data = { - 605, /* Code */ - 10415, /* Vendor */ - "Optional-Capability", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Originating-Request */ - { - struct dict_avp_data data = { - 633, /* Code */ - 10415, /* Vendor */ - "Originating-Request", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Originating-Request)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Path */ - { - struct dict_avp_data data = { - 640, /* Code */ - 10415, /* Vendor */ - "Path", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Primary-Charging-Collection-Function-Name */ - { - struct dict_avp_data data = { - 621, /* Code */ - 10415, /* Vendor */ - "Primary-Charging-Collection-Function-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); - }; - - /* Primary-Event-Charging-Function-Name */ - { - struct dict_avp_data data = { - 619, /* Code */ - 10415, /* Vendor */ - "Primary-Event-Charging-Function-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); - }; - - /* Priviledged-Sender-Indication */ - { - struct dict_avp_data data = { - 652, /* Code */ - 10415, /* Vendor */ - "Priviledged-Sender-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Priviledged-Sender-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Public-Identity */ - { - struct dict_avp_data data = { - 601, /* Code */ - 10415, /* Vendor */ - "Public-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Reason-Code */ - { - struct dict_avp_data data = { - 616, /* Code */ - 10415, /* Vendor */ - "Reason-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reason-Code)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Reason-Info */ - { - struct dict_avp_data data = { - 617, /* Code */ - 10415, /* Vendor */ - "Reason-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Record-Route */ - { - struct dict_avp_data data = { - 646, /* Code */ - 10415, /* Vendor */ - "Record-Route", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Restoration-Info */ - { - struct dict_avp_data data = { - 649, /* Code */ - 10415, /* Vendor */ - "Restoration-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SCSCF-Restoration-Info */ - { - struct dict_avp_data data = { - 639, /* Code */ - 10415, /* Vendor */ - "SCSCF-Restoration-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Auth-Data-Item */ - { - struct dict_avp_data data = { - 612, /* Code */ - 10415, /* Vendor */ - "SIP-Auth-Data-Item", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Authenticate */ - { - struct dict_avp_data data = { - 609, /* Code */ - 10415, /* Vendor */ - "SIP-Authenticate", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Authentication-Context */ - { - struct dict_avp_data data = { - 611, /* Code */ - 10415, /* Vendor */ - "SIP-Authentication-Context", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Authentication-Scheme */ - { - struct dict_avp_data data = { - 608, /* Code */ - 10415, /* Vendor */ - "SIP-Authentication-Scheme", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SIP-Authorization */ - { - struct dict_avp_data data = { - 610, /* Code */ - 10415, /* Vendor */ - "SIP-Authorization", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Digest-Authenticate */ - { - struct dict_avp_data data = { - 635, /* Code */ - 10415, /* Vendor */ - "SIP-Digest-Authenticate", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Item-Number */ - { - struct dict_avp_data data = { - 613, /* Code */ - 10415, /* Vendor */ - "SIP-Item-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Number-Auth-Items */ - { - struct dict_avp_data data = { - 607, /* Code */ - 10415, /* Vendor */ - "SIP-Number-Auth-Items", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Secondary-Charging-Collection-Function-Name */ - { - struct dict_avp_data data = { - 622, /* Code */ - 10415, /* Vendor */ - "Secondary-Charging-Collection-Function-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); - }; - - /* Secondary-Event-Charging-Function-Name */ - { - struct dict_avp_data data = { - 620, /* Code */ - 10415, /* Vendor */ - "Secondary-Event-Charging-Function-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, DiameterURI_type, NULL); - }; - - /* Server-Assignment-Type */ - { - struct dict_avp_data data = { - 614, /* Code */ - 10415, /* Vendor */ - "Server-Assignment-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Server-Assignment-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Server-Capabilities */ - { - struct dict_avp_data data = { - 603, /* Code */ - 10415, /* Vendor */ - "Server-Capabilities", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Server-Name */ - { - struct dict_avp_data data = { - 602, /* Code */ - 10415, /* Vendor */ - "Server-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Session-Priority */ - { - struct dict_avp_data data = { - 650, /* Code */ - 10415, /* Vendor */ - "Session-Priority", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Priority)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Subscription-Info */ - { - struct dict_avp_data data = { - 642, /* Code */ - 10415, /* Vendor */ - "Subscription-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Supported-Applications */ - { - struct dict_avp_data data = { - 631, /* Code */ - 10415, /* Vendor */ - "Supported-Applications", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Supported-Features */ - { - struct dict_avp_data data = { - 628, /* Code */ - 10415, /* Vendor */ - "Supported-Features", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* To-SIP-Header */ - { - struct dict_avp_data data = { - 645, /* Code */ - 10415, /* Vendor */ - "To-SIP-Header", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* UAR-Flags */ - { - struct dict_avp_data data = { - 637, /* Code */ - 10415, /* Vendor */ - "UAR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* User-Authorization-Type */ - { - struct dict_avp_data data = { - 623, /* Code */ - 10415, /* Vendor */ - "User-Authorization-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-Authorization-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* User-Data */ - { - struct dict_avp_data data = { - 606, /* Code */ - 10415, /* Vendor */ - "User-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* User-Data-Already-Available */ - { - struct dict_avp_data data = { - 624, /* Code */ - 10415, /* Vendor */ - "User-Data-Already-Available", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-Data-Already-Available)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Visited-Network-Identifier */ - { - struct dict_avp_data data = { - 600, /* Code */ - 10415, /* Vendor */ - "Visited-Network-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Wildcarded-Public-Identity */ - { - struct dict_avp_data data = { - 634, /* Code */ - 10415, /* Vendor */ - "Wildcarded-Public-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* 3GPP 32.299-b60 (11.6.0 2012.12.21) */ - /* AF-Correlation-Information */ - { - struct dict_avp_data data = { - 1276, /* Code */ - 10415, /* Vendor */ - "AF-Correlation-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Access-Network-Information */ - { - struct dict_avp_data data = { - 1263, /* Code */ - 10415, /* Vendor */ - "Access-Network-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Access-Transfer-Information */ - { - struct dict_avp_data data = { - 2709, /* Code */ - 10415, /* Vendor */ - "Access-Transfer-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Access-Transfer-Type */ - { - struct dict_avp_data data = { - 2710, /* Code */ - 10415, /* Vendor */ - "Access-Transfer-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Access-Transfer-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Account-Expiration */ - { - struct dict_avp_data data = { - 2309, /* Code */ - 10415, /* Vendor */ - "Account-Expiration", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Accumulated-Cost */ - { - struct dict_avp_data data = { - 2052, /* Code */ - 10415, /* Vendor */ - "Accumulated-Cost", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Adaptations */ - { - struct dict_avp_data data = { - 1217, /* Code */ - 10415, /* Vendor */ - "Adaptations", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Adaptations)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Additional-Content-Information */ - { - struct dict_avp_data data = { - 1207, /* Code */ - 10415, /* Vendor */ - "Additional-Content-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Additional-Type-Information */ - { - struct dict_avp_data data = { - 1205, /* Code */ - 10415, /* Vendor */ - "Additional-Type-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Address-Data */ - { - struct dict_avp_data data = { - 897, /* Code */ - 10415, /* Vendor */ - "Address-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Address-Domain */ - { - struct dict_avp_data data = { - 898, /* Code */ - 10415, /* Vendor */ - "Address-Domain", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Address-Type */ - { - struct dict_avp_data data = { - 899, /* Code */ - 10415, /* Vendor */ - "Address-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Address-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Addressee-Type */ - { - struct dict_avp_data data = { - 1208, /* Code */ - 10415, /* Vendor */ - "Addressee-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Addressee-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Alternate-Charged-Party-Address */ - { - struct dict_avp_data data = { - 1280, /* Code */ - 10415, /* Vendor */ - "Alternate-Charged-Party-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* AoC-Cost-Information */ - { - struct dict_avp_data data = { - 2053, /* Code */ - 10415, /* Vendor */ - "AoC-Cost-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AoC-Format */ - { - struct dict_avp_data data = { - 2310, /* Code */ - 10415, /* Vendor */ - "AoC-Format", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Format)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* AoC-Information */ - { - struct dict_avp_data data = { - 2054, /* Code */ - 10415, /* Vendor */ - "AoC-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AoC-Request-Type */ - { - struct dict_avp_data data = { - 2055, /* Code */ - 10415, /* Vendor */ - "AoC-Request-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Request-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* AoC-Service */ - { - struct dict_avp_data data = { - 2311, /* Code */ - 10415, /* Vendor */ - "AoC-Service", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AoC-Service-Obligatory-Type */ - { - struct dict_avp_data data = { - 2312, /* Code */ - 10415, /* Vendor */ - "AoC-Service-Obligatory-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Service-Obligatory-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* AoC-Service-Type */ - { - struct dict_avp_data data = { - 2313, /* Code */ - 10415, /* Vendor */ - "AoC-Service-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/AoC-Service-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* AoC-Subscription-Information */ - { - struct dict_avp_data data = { - 2314, /* Code */ - 10415, /* Vendor */ - "AoC-Subscription-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Applic-ID */ - { - struct dict_avp_data data = { - 1218, /* Code */ - 10415, /* Vendor */ - "Applic-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Application-Server */ - { - struct dict_avp_data data = { - 836, /* Code */ - 10415, /* Vendor */ - "Application-Server", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Application-Server-Information */ - { - struct dict_avp_data data = { - 850, /* Code */ - 10415, /* Vendor */ - "Application-Server-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Application-Provided-Called-Party-Address */ - { - struct dict_avp_data data = { - 837, /* Code */ - 10415, /* Vendor */ - "Application-Provided-Called-Party-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Associated-Party-Address */ - { - struct dict_avp_data data = { - 2035, /* Code */ - 10415, /* Vendor */ - "Associated-Party-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Associated-URI */ - { - struct dict_avp_data data = { - 856, /* Code */ - 10415, /* Vendor */ - "Associated-URI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Aux-Applic-Info */ - { - struct dict_avp_data data = { - 1219, /* Code */ - 10415, /* Vendor */ - "Aux-Applic-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Base-Time-Interval */ - { - struct dict_avp_data data = { - 1265, /* Code */ - 10415, /* Vendor */ - "Base-Time-Interval", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Bearer-Service */ - { - struct dict_avp_data data = { - 854, /* Code */ - 10415, /* Vendor */ - "Bearer-Service", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CG-Address */ - { - struct dict_avp_data data = { - 846, /* Code */ - 10415, /* Vendor */ - "CG-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* CSG-Access-Mode */ - { - struct dict_avp_data data = { - 2317, /* Code */ - 10415, /* Vendor */ - "CSG-Access-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CSG-Access-Mode)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* CSG-Membership-Indication */ - { - struct dict_avp_data data = { - 2318, /* Code */ - 10415, /* Vendor */ - "CSG-Membership-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/CSG-Membership-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* CUG-Information */ - { - struct dict_avp_data data = { - 2304, /* Code */ - 10415, /* Vendor */ - "CUG-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Called-Asserted-Identity */ - { - struct dict_avp_data data = { - 1250, /* Code */ - 10415, /* Vendor */ - "Called-Asserted-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Called-Party-Address */ - { - struct dict_avp_data data = { - 832, /* Code */ - 10415, /* Vendor */ - "Called-Party-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Calling-Party-Address */ - { - struct dict_avp_data data = { - 831, /* Code */ - 10415, /* Vendor */ - "Calling-Party-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Carrier-Select-Routing-Information */ - { - struct dict_avp_data data = { - 2023, /* Code */ - 10415, /* Vendor */ - "Carrier-Select-Routing-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Cause-Code */ - { - struct dict_avp_data data = { - 861, /* Code */ - 10415, /* Vendor */ - "Cause-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Change-Condition */ - { - struct dict_avp_data data = { - 2037, /* Code */ - 10415, /* Vendor */ - "Change-Condition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Change-Time */ - { - struct dict_avp_data data = { - 2038, /* Code */ - 10415, /* Vendor */ - "Change-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Charge-Reason-Code */ - { - struct dict_avp_data data = { - 2118, /* Code */ - 10415, /* Vendor */ - "Charge-Reason-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charge-Reason-Code)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Charged-Party */ - { - struct dict_avp_data data = { - 857, /* Code */ - 10415, /* Vendor */ - "Charged-Party", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Charging-Characteristics-Selection-Mode */ - { - struct dict_avp_data data = { - 2066, /* Code */ - 10415, /* Vendor */ - "Charging-Characteristics-Selection-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Charging-Characteristics-Selection-Mode)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Class-Identifier */ - { - struct dict_avp_data data = { - 1214, /* Code */ - 10415, /* Vendor */ - "Class-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Class-Identifier)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Client-Address */ - { - struct dict_avp_data data = { - 2018, /* Code */ - 10415, /* Vendor */ - "Client-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Content-Class */ - { - struct dict_avp_data data = { - 1220, /* Code */ - 10415, /* Vendor */ - "Content-Class", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Content-Class)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Content-Disposition */ - { - struct dict_avp_data data = { - 828, /* Code */ - 10415, /* Vendor */ - "Content-Disposition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Content-Length */ - { - struct dict_avp_data data = { - 827, /* Code */ - 10415, /* Vendor */ - "Content-Length", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Content-Size */ - { - struct dict_avp_data data = { - 1206, /* Code */ - 10415, /* Vendor */ - "Content-Size", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Content-Type */ - { - struct dict_avp_data data = { - 826, /* Code */ - 10415, /* Vendor */ - "Content-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Current-Tariff */ - { - struct dict_avp_data data = { - 2056, /* Code */ - 10415, /* Vendor */ - "Current-Tariff", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* DRM-Content */ - { - struct dict_avp_data data = { - 1221, /* Code */ - 10415, /* Vendor */ - "DRM-Content", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/DRM-Content)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Data-Coding-Scheme */ - { - struct dict_avp_data data = { - 2001, /* Code */ - 10415, /* Vendor */ - "Data-Coding-Scheme", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Deferred-Location-Event-Type */ - { - struct dict_avp_data data = { - 1230, /* Code */ - 10415, /* Vendor */ - "Deferred-Location-Event-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Delivery-Report-Requested */ - { - struct dict_avp_data data = { - 1216, /* Code */ - 10415, /* Vendor */ - "Delivery-Report-Requested", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Delivery-Report-Requested)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Destination-Interface */ - { - struct dict_avp_data data = { - 2002, /* Code */ - 10415, /* Vendor */ - "Destination-Interface", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Diagnostics */ - { - struct dict_avp_data data = { - 2039, /* Code */ - 10415, /* Vendor */ - "Diagnostics", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Domain-Name */ - { - struct dict_avp_data data = { - 1200, /* Code */ - 10415, /* Vendor */ - "Domain-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Dynamic-Address-Flag */ - { - struct dict_avp_data data = { - 2051, /* Code */ - 10415, /* Vendor */ - "Dynamic-Address-Flag", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Dynamic-Address-Flag)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Dynamic-Address-Flag-Extension */ - { - struct dict_avp_data data = { - 2068, /* Code */ - 10415, /* Vendor */ - "Dynamic-Address-Flag-Extension", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Dynamic-Address-Flag-Extension)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Early-Media-Description */ - { - struct dict_avp_data data = { - 1272, /* Code */ - 10415, /* Vendor */ - "Early-Media-Description", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Envelope */ - { - struct dict_avp_data data = { - 1266, /* Code */ - 10415, /* Vendor */ - "Envelope", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Envelope-End-Time */ - { - struct dict_avp_data data = { - 1267, /* Code */ - 10415, /* Vendor */ - "Envelope-End-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Envelope-Reporting */ - { - struct dict_avp_data data = { - 1268, /* Code */ - 10415, /* Vendor */ - "Envelope-Reporting", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Envelope-Reporting)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Envelope-Start-Time */ - { - struct dict_avp_data data = { - 1269, /* Code */ - 10415, /* Vendor */ - "Envelope-Start-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Event */ - { - struct dict_avp_data data = { - 825, /* Code */ - 10415, /* Vendor */ - "Event", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Event-Charging-TimeStamp */ - { - struct dict_avp_data data = { - 1258, /* Code */ - 10415, /* Vendor */ - "Event-Charging-TimeStamp", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Event-Type */ - { - struct dict_avp_data data = { - 823, /* Code */ - 10415, /* Vendor */ - "Event-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Expires */ - { - struct dict_avp_data data = { - 888, /* Code */ - 10415, /* Vendor */ - "Expires", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* File-Repair-Supported */ - { - struct dict_avp_data data = { - 1224, /* Code */ - 10415, /* Vendor */ - "File-Repair-Supported", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/File-Repair-Supported)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* From-Address */ - { - struct dict_avp_data data = { - 2708, /* Code */ - 10415, /* Vendor */ - "From-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* GGSN-Address */ - { - struct dict_avp_data data = { - 847, /* Code */ - 10415, /* Vendor */ - "GGSN-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* IMS-Application-Reference-Identifier */ - { - struct dict_avp_data data = { - 2601, /* Code */ - 10415, /* Vendor */ - "IMS-Application-Reference-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* IMS-Charging-Identifier */ - { - struct dict_avp_data data = { - 841, /* Code */ - 10415, /* Vendor */ - "IMS-Charging-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* IMS-Communication-Service-Identifier */ - { - struct dict_avp_data data = { - 1281, /* Code */ - 10415, /* Vendor */ - "IMS-Communication-Service-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* IMS-Emergency-Indicator */ - { - struct dict_avp_data data = { - 2322, /* Code */ - 10415, /* Vendor */ - "IMS-Emergency-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMS-Emergency-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* IMS-Information */ - { - struct dict_avp_data data = { - 876, /* Code */ - 10415, /* Vendor */ - "IMS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* IMSI-Unauthenticated-Flag */ - { - struct dict_avp_data data = { - 2308, /* Code */ - 10415, /* Vendor */ - "IMSI-Unauthenticated-Flag", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMSI-Unauthenticated-Flag)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* IP-Realm-Default-Indication */ - { - struct dict_avp_data data = { - 2603, /* Code */ - 10415, /* Vendor */ - "IP-Realm-Default-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IP-Realm-Default-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Incoming-Trunk-Group-Id */ - { - struct dict_avp_data data = { - 852, /* Code */ - 10415, /* Vendor */ - "Incoming-Trunk-Group-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Incremental-Cost */ - { - struct dict_avp_data data = { - 2062, /* Code */ - 10415, /* Vendor */ - "Incremental-Cost", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Initial-IMS-Charging-Identifier */ - { - struct dict_avp_data data = { - 2321, /* Code */ - 10415, /* Vendor */ - "Initial-IMS-Charging-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Inter-Operator-Identifier */ - { - struct dict_avp_data data = { - 838, /* Code */ - 10415, /* Vendor */ - "Inter-Operator-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Interface-Id */ - { - struct dict_avp_data data = { - 2003, /* Code */ - 10415, /* Vendor */ - "Interface-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Interface-Port */ - { - struct dict_avp_data data = { - 2004, /* Code */ - 10415, /* Vendor */ - "Interface-Port", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Interface-Text */ - { - struct dict_avp_data data = { - 2005, /* Code */ - 10415, /* Vendor */ - "Interface-Text", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Interface-Type */ - { - struct dict_avp_data data = { - 2006, /* Code */ - 10415, /* Vendor */ - "Interface-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Interface-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* LCS-APN */ - { - struct dict_avp_data data = { - 1231, /* Code */ - 10415, /* Vendor */ - "LCS-APN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* LCS-Client-Dialed-By-MS */ - { - struct dict_avp_data data = { - 1233, /* Code */ - 10415, /* Vendor */ - "LCS-Client-Dialed-By-MS", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* LCS-Client-External-ID */ - { - struct dict_avp_data data = { - 1234, /* Code */ - 10415, /* Vendor */ - "LCS-Client-External-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* LCS-Client-Id */ - { - struct dict_avp_data data = { - 1232, /* Code */ - 10415, /* Vendor */ - "LCS-Client-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-Client-Name */ - { - struct dict_avp_data data = { - 1235, /* Code */ - 10415, /* Vendor */ - "LCS-Client-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-Client-Type */ - { - struct dict_avp_data data = { - 1241, /* Code */ - 10415, /* Vendor */ - "LCS-Client-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LCS-Client-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* LCS-Data-Coding-Scheme */ - { - struct dict_avp_data data = { - 1236, /* Code */ - 10415, /* Vendor */ - "LCS-Data-Coding-Scheme", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* LCS-Format-Indicator */ - { - struct dict_avp_data data = { - 1237, /* Code */ - 10415, /* Vendor */ - "LCS-Format-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LCS-Format-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* LCS-Information */ - { - struct dict_avp_data data = { - 878, /* Code */ - 10415, /* Vendor */ - "LCS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-Name-String */ - { - struct dict_avp_data data = { - 1238, /* Code */ - 10415, /* Vendor */ - "LCS-Name-String", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* LCS-Requestor-Id */ - { - struct dict_avp_data data = { - 1239, /* Code */ - 10415, /* Vendor */ - "LCS-Requestor-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-Requestor-Id-String */ - { - struct dict_avp_data data = { - 1240, /* Code */ - 10415, /* Vendor */ - "LCS-Requestor-Id-String", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Local-GW-Inserted-Indication */ - { - struct dict_avp_data data = { - 2604, /* Code */ - 10415, /* Vendor */ - "Local-GW-Inserted-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Local-GW-Inserted-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Local-Sequence-Number */ - { - struct dict_avp_data data = { - 2063, /* Code */ - 10415, /* Vendor */ - "Local-Sequence-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Location-Estimate */ - { - struct dict_avp_data data = { - 1242, /* Code */ - 10415, /* Vendor */ - "Location-Estimate", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Location-Estimate-Type */ - { - struct dict_avp_data data = { - 1243, /* Code */ - 10415, /* Vendor */ - "Location-Estimate-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Location-Estimate-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Location-Type */ - { - struct dict_avp_data data = { - 1244, /* Code */ - 10415, /* Vendor */ - "Location-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Low-Balance-Indication */ - { - struct dict_avp_data data = { - 2020, /* Code */ - 10415, /* Vendor */ - "Low-Balance-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Low-Balance-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Low-Priority-Indicator */ - { - struct dict_avp_data data = { - 2602, /* Code */ - 10415, /* Vendor */ - "Low-Priority-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Low-Priority-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MBMSGW-Address */ - { - struct dict_avp_data data = { - 2307, /* Code */ - 10415, /* Vendor */ - "MBMSGW-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* MBMS-Information */ - { - struct dict_avp_data data = { - 880, /* Code */ - 10415, /* Vendor */ - "MBMS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MBMS-User-Service-Type */ - { - struct dict_avp_data data = { - 1225, /* Code */ - 10415, /* Vendor */ - "MBMS-User-Service-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MBMS-User-Service-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MM-Content-Type */ - { - struct dict_avp_data data = { - 1203, /* Code */ - 10415, /* Vendor */ - "MM-Content-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MMBox-Storage-Requested */ - { - struct dict_avp_data data = { - 1248, /* Code */ - 10415, /* Vendor */ - "MMBox-Storage-Requested", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MMBox-Storage-Requested)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MMS-Information */ - { - struct dict_avp_data data = { - 877, /* Code */ - 10415, /* Vendor */ - "MMS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MMTel-Information */ - { - struct dict_avp_data data = { - 2030, /* Code */ - 10415, /* Vendor */ - "MMTel-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MMTel-SService-Type */ - { - struct dict_avp_data data = { - 2031, /* Code */ - 10415, /* Vendor */ - "MMTel-SService-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Media-Initiator-Flag */ - { - struct dict_avp_data data = { - 882, /* Code */ - 10415, /* Vendor */ - "Media-Initiator-Flag", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Media-Initiator-Flag)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Media-Initiator-Party */ - { - struct dict_avp_data data = { - 1288, /* Code */ - 10415, /* Vendor */ - "Media-Initiator-Party", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Message-Body */ - { - struct dict_avp_data data = { - 889, /* Code */ - 10415, /* Vendor */ - "Message-Body", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Message-Class */ - { - struct dict_avp_data data = { - 1213, /* Code */ - 10415, /* Vendor */ - "Message-Class", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Message-ID */ - { - struct dict_avp_data data = { - 1210, /* Code */ - 10415, /* Vendor */ - "Message-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Message-Size */ - { - struct dict_avp_data data = { - 1212, /* Code */ - 10415, /* Vendor */ - "Message-Size", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Message-Type */ - { - struct dict_avp_data data = { - 1211, /* Code */ - 10415, /* Vendor */ - "Message-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Message-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* NNI-Information */ - { - struct dict_avp_data data = { - 2703, /* Code */ - 10415, /* Vendor */ - "NNI-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* NNI-Type */ - { - struct dict_avp_data data = { - 2704, /* Code */ - 10415, /* Vendor */ - "NNI-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/NNI-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Neighbour-Node-Address */ - { - struct dict_avp_data data = { - 2705, /* Code */ - 10415, /* Vendor */ - "Neighbour-Node-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Next-Tariff */ - { - struct dict_avp_data data = { - 2057, /* Code */ - 10415, /* Vendor */ - "Next-Tariff", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Node-Functionality */ - { - struct dict_avp_data data = { - 862, /* Code */ - 10415, /* Vendor */ - "Node-Functionality", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Node-Functionality)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Node-Id */ - { - struct dict_avp_data data = { - 2064, /* Code */ - 10415, /* Vendor */ - "Node-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Number-Of-Diversions */ - { - struct dict_avp_data data = { - 2034, /* Code */ - 10415, /* Vendor */ - "Number-Of-Diversions", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Messages-Sent */ - { - struct dict_avp_data data = { - 2019, /* Code */ - 10415, /* Vendor */ - "Number-Of-Messages-Sent", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Participants */ - { - struct dict_avp_data data = { - 885, /* Code */ - 10415, /* Vendor */ - "Number-Of-Participants", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Received-Talk-Bursts */ - { - struct dict_avp_data data = { - 1282, /* Code */ - 10415, /* Vendor */ - "Number-Of-Received-Talk-Bursts", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Talk-Bursts */ - { - struct dict_avp_data data = { - 1283, /* Code */ - 10415, /* Vendor */ - "Number-Of-Talk-Bursts", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Portability-Routing-Information */ - { - struct dict_avp_data data = { - 2024, /* Code */ - 10415, /* Vendor */ - "Number-Portability-Routing-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Offline-Charging */ - { - struct dict_avp_data data = { - 1278, /* Code */ - 10415, /* Vendor */ - "Offline-Charging", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Online-Charging-Flag */ - { - struct dict_avp_data data = { - 2303, /* Code */ - 10415, /* Vendor */ - "Online-Charging-Flag", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Online-Charging-Flag)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Originating-IOI */ - { - struct dict_avp_data data = { - 839, /* Code */ - 10415, /* Vendor */ - "Originating-IOI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Originator */ - { - struct dict_avp_data data = { - 864, /* Code */ - 10415, /* Vendor */ - "Originator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Originator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Originator-Address */ - { - struct dict_avp_data data = { - 886, /* Code */ - 10415, /* Vendor */ - "Originator-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Originator-Interface */ - { - struct dict_avp_data data = { - 2009, /* Code */ - 10415, /* Vendor */ - "Originator-Interface", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Originator-Received-Address */ - { - struct dict_avp_data data = { - 2027, /* Code */ - 10415, /* Vendor */ - "Originator-Received-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Originator-SCCP-Address */ - { - struct dict_avp_data data = { - 2008, /* Code */ - 10415, /* Vendor */ - "Originator-SCCP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Outgoing-Session-Id */ - { - struct dict_avp_data data = { - 2320, /* Code */ - 10415, /* Vendor */ - "Outgoing-Session-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Outgoing-Trunk-Group-Id */ - { - struct dict_avp_data data = { - 853, /* Code */ - 10415, /* Vendor */ - "Outgoing-Trunk-Group-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* PDG-Address */ - { - struct dict_avp_data data = { - 895, /* Code */ - 10415, /* Vendor */ - "PDG-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* PDG-Charging-Id */ - { - struct dict_avp_data data = { - 896, /* Code */ - 10415, /* Vendor */ - "PDG-Charging-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PDN-Connection-Charging-ID */ - { - struct dict_avp_data data = { - 2050, /* Code */ - 10415, /* Vendor */ - "PDN-Connection-Charging-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PDP-Address */ - { - struct dict_avp_data data = { - 1227, /* Code */ - 10415, /* Vendor */ - "PDP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* PDP-Address-Prefix-Length */ - { - struct dict_avp_data data = { - 2606, /* Code */ - 10415, /* Vendor */ - "PDP-Address-Prefix-Length", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PDP-Context-Type */ - { - struct dict_avp_data data = { - 1247, /* Code */ - 10415, /* Vendor */ - "PDP-Context-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDP-Context-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PS-Append-Free-Format-Data */ - { - struct dict_avp_data data = { - 867, /* Code */ - 10415, /* Vendor */ - "PS-Append-Free-Format-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PS-Append-Free-Format-Data)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PS-Free-Format-Data */ - { - struct dict_avp_data data = { - 866, /* Code */ - 10415, /* Vendor */ - "PS-Free-Format-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PS-Furnish-Charging-Information */ - { - struct dict_avp_data data = { - 865, /* Code */ - 10415, /* Vendor */ - "PS-Furnish-Charging-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PS-Information */ - { - struct dict_avp_data data = { - 874, /* Code */ - 10415, /* Vendor */ - "PS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Participant-Access-Priority */ - { - struct dict_avp_data data = { - 1259, /* Code */ - 10415, /* Vendor */ - "Participant-Access-Priority", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Participant-Access-Priority)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Participant-Action-Type */ - { - struct dict_avp_data data = { - 2049, /* Code */ - 10415, /* Vendor */ - "Participant-Action-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Participant-Action-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Participant-Group */ - { - struct dict_avp_data data = { - 1260, /* Code */ - 10415, /* Vendor */ - "Participant-Group", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Participants-Involved */ - { - struct dict_avp_data data = { - 887, /* Code */ - 10415, /* Vendor */ - "Participants-Involved", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* PoC-Change-Condition */ - { - struct dict_avp_data data = { - 1261, /* Code */ - 10415, /* Vendor */ - "PoC-Change-Condition", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Change-Condition)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PoC-Change-Time */ - { - struct dict_avp_data data = { - 1262, /* Code */ - 10415, /* Vendor */ - "PoC-Change-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* PoC-Controlling-Address */ - { - struct dict_avp_data data = { - 858, /* Code */ - 10415, /* Vendor */ - "PoC-Controlling-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* PoC-Event-Type */ - { - struct dict_avp_data data = { - 2025, /* Code */ - 10415, /* Vendor */ - "PoC-Event-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Event-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PoC-Group-Name */ - { - struct dict_avp_data data = { - 859, /* Code */ - 10415, /* Vendor */ - "PoC-Group-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* PoC-Information */ - { - struct dict_avp_data data = { - 879, /* Code */ - 10415, /* Vendor */ - "PoC-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PoC-Server-Role */ - { - struct dict_avp_data data = { - 883, /* Code */ - 10415, /* Vendor */ - "PoC-Server-Role", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Server-Role)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PoC-Session-Id */ - { - struct dict_avp_data data = { - 1229, /* Code */ - 10415, /* Vendor */ - "PoC-Session-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* PoC-Session-Initiation-type */ - { - struct dict_avp_data data = { - 1277, /* Code */ - 10415, /* Vendor */ - "PoC-Session-Initiation-type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Session-Initiation-type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PoC-Session-Type */ - { - struct dict_avp_data data = { - 884, /* Code */ - 10415, /* Vendor */ - "PoC-Session-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-Session-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PoC-User-Role */ - { - struct dict_avp_data data = { - 1252, /* Code */ - 10415, /* Vendor */ - "PoC-User-Role", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PoC-User-Role-IDs */ - { - struct dict_avp_data data = { - 1253, /* Code */ - 10415, /* Vendor */ - "PoC-User-Role-IDs", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* PoC-User-Role-info-Units */ - { - struct dict_avp_data data = { - 1254, /* Code */ - 10415, /* Vendor */ - "PoC-User-Role-info-Units", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PoC-User-Role-info-Units)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Positioning-Data */ - { - struct dict_avp_data data = { - 1245, /* Code */ - 10415, /* Vendor */ - "Positioning-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Preferred-AoC-Currency */ - { - struct dict_avp_data data = { - 2315, /* Code */ - 10415, /* Vendor */ - "Preferred-AoC-Currency", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Priority */ - { - struct dict_avp_data data = { - 1209, /* Code */ - 10415, /* Vendor */ - "Priority", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Priority)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Quota-Consumption-Time */ - { - struct dict_avp_data data = { - 881, /* Code */ - 10415, /* Vendor */ - "Quota-Consumption-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Quota-Holding-Time */ - { - struct dict_avp_data data = { - 871, /* Code */ - 10415, /* Vendor */ - "Quota-Holding-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Rate-Element */ - { - struct dict_avp_data data = { - 2058, /* Code */ - 10415, /* Vendor */ - "Rate-Element", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Read-Reply-Report-Requested */ - { - struct dict_avp_data data = { - 1222, /* Code */ - 10415, /* Vendor */ - "Read-Reply-Report-Requested", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Read-Reply-Report-Requested)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Real-Time-Tariff-Information */ - { - struct dict_avp_data data = { - 2305, /* Code */ - 10415, /* Vendor */ - "Real-Time-Tariff-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Received-Talk-Burst-Time */ - { - struct dict_avp_data data = { - 1284, /* Code */ - 10415, /* Vendor */ - "Received-Talk-Burst-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Received-Talk-Burst-Volume */ - { - struct dict_avp_data data = { - 1285, /* Code */ - 10415, /* Vendor */ - "Received-Talk-Burst-Volume", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Recipient-Address */ - { - struct dict_avp_data data = { - 1201, /* Code */ - 10415, /* Vendor */ - "Recipient-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Recipient-Info */ - { - struct dict_avp_data data = { - 2026, /* Code */ - 10415, /* Vendor */ - "Recipient-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Recipient-Received-Address */ - { - struct dict_avp_data data = { - 2028, /* Code */ - 10415, /* Vendor */ - "Recipient-Received-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Recipient-SCCP-Address */ - { - struct dict_avp_data data = { - 2010, /* Code */ - 10415, /* Vendor */ - "Recipient-SCCP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Refund-Information */ - { - struct dict_avp_data data = { - 2022, /* Code */ - 10415, /* Vendor */ - "Refund-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Relationship-Mode */ - { - struct dict_avp_data data = { - 2706, /* Code */ - 10415, /* Vendor */ - "Relationship-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Relationship-Mode)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Remaining-Balance */ - { - struct dict_avp_data data = { - 2021, /* Code */ - 10415, /* Vendor */ - "Remaining-Balance", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Reply-Applic-ID */ - { - struct dict_avp_data data = { - 1223, /* Code */ - 10415, /* Vendor */ - "Reply-Applic-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Reply-Path-Requested */ - { - struct dict_avp_data data = { - 2011, /* Code */ - 10415, /* Vendor */ - "Reply-Path-Requested", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reply-Path-Requested)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Reporting-Reason */ - { - struct dict_avp_data data = { - 872, /* Code */ - 10415, /* Vendor */ - "Reporting-Reason", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Reporting-Reason)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Requested-Party-Address */ - { - struct dict_avp_data data = { - 1251, /* Code */ - 10415, /* Vendor */ - "Requested-Party-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Role-Of-Node */ - { - struct dict_avp_data data = { - 829, /* Code */ - 10415, /* Vendor */ - "Role-Of-Node", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Role-Of-Node)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SDP-Answer-Timestamp */ - { - struct dict_avp_data data = { - 1275, /* Code */ - 10415, /* Vendor */ - "SDP-Answer-Timestamp", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SDP-Media-Component */ - { - struct dict_avp_data data = { - 843, /* Code */ - 10415, /* Vendor */ - "SDP-Media-Component", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SDP-Media-Description */ - { - struct dict_avp_data data = { - 845, /* Code */ - 10415, /* Vendor */ - "SDP-Media-Description", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SDP-Media-Name */ - { - struct dict_avp_data data = { - 844, /* Code */ - 10415, /* Vendor */ - "SDP-Media-Name", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SDP-Offer-Timestamp */ - { - struct dict_avp_data data = { - 1274, /* Code */ - 10415, /* Vendor */ - "SDP-Offer-Timestamp", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SDP-Session-Description */ - { - struct dict_avp_data data = { - 842, /* Code */ - 10415, /* Vendor */ - "SDP-Session-Description", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SDP-TimeStamps */ - { - struct dict_avp_data data = { - 1273, /* Code */ - 10415, /* Vendor */ - "SDP-TimeStamps", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SDP-Type */ - { - struct dict_avp_data data = { - 2036, /* Code */ - 10415, /* Vendor */ - "SDP-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SDP-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SGSN-Address */ - { - struct dict_avp_data data = { - 1228, /* Code */ - 10415, /* Vendor */ - "SGSN-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* SGW-Address */ - { - struct dict_avp_data data = { - 2067, /* Code */ - 10415, /* Vendor */ - "SGW-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* SGW-Change */ - { - struct dict_avp_data data = { - 2065, /* Code */ - 10415, /* Vendor */ - "SGW-Change", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SGW-Change)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SIP-Method */ - { - struct dict_avp_data data = { - 824, /* Code */ - 10415, /* Vendor */ - "SIP-Method", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SIP-Request-Timestamp */ - { - struct dict_avp_data data = { - 834, /* Code */ - 10415, /* Vendor */ - "SIP-Request-Timestamp", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SIP-Request-Timestamp-Fraction */ - { - struct dict_avp_data data = { - 2301, /* Code */ - 10415, /* Vendor */ - "SIP-Request-Timestamp-Fraction", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIP-Response-Timestamp */ - { - struct dict_avp_data data = { - 835, /* Code */ - 10415, /* Vendor */ - "SIP-Response-Timestamp", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SIP-Response-Timestamp-Fraction */ - { - struct dict_avp_data data = { - 2302, /* Code */ - 10415, /* Vendor */ - "SIP-Response-Timestamp-Fraction", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SM-Discharge-Time */ - { - struct dict_avp_data data = { - 2012, /* Code */ - 10415, /* Vendor */ - "SM-Discharge-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SM-Message-Type */ - { - struct dict_avp_data data = { - 2007, /* Code */ - 10415, /* Vendor */ - "SM-Message-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Message-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SM-Protocol-ID */ - { - struct dict_avp_data data = { - 2013, /* Code */ - 10415, /* Vendor */ - "SM-Protocol-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SM-Service-Type */ - { - struct dict_avp_data data = { - 2029, /* Code */ - 10415, /* Vendor */ - "SM-Service-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SM-Service-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SM-Status */ - { - struct dict_avp_data data = { - 2014, /* Code */ - 10415, /* Vendor */ - "SM-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SM-User-Data-Header */ - { - struct dict_avp_data data = { - 2015, /* Code */ - 10415, /* Vendor */ - "SM-User-Data-Header", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SMS-Information */ - { - struct dict_avp_data data = { - 2000, /* Code */ - 10415, /* Vendor */ - "SMS-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SMS-Node */ - { - struct dict_avp_data data = { - 2016, /* Code */ - 10415, /* Vendor */ - "SMS-Node", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SMS-Node)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SMSC-Address */ - { - struct dict_avp_data data = { - 2017, /* Code */ - 10415, /* Vendor */ - "SMSC-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Scale-Factor */ - { - struct dict_avp_data data = { - 2059, /* Code */ - 10415, /* Vendor */ - "Scale-Factor", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Served-Party-IP-Address */ - { - struct dict_avp_data data = { - 848, /* Code */ - 10415, /* Vendor */ - "Served-Party-IP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Service-Data-Container */ - { - struct dict_avp_data data = { - 2040, /* Code */ - 10415, /* Vendor */ - "Service-Data-Container", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Id */ - { - struct dict_avp_data data = { - 855, /* Code */ - 10415, /* Vendor */ - "Service-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Service-Information */ - { - struct dict_avp_data data = { - 873, /* Code */ - 10415, /* Vendor */ - "Service-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Mode */ - { - struct dict_avp_data data = { - 2032, /* Code */ - 10415, /* Vendor */ - "Service-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Specific-Data */ - { - struct dict_avp_data data = { - 863, /* Code */ - 10415, /* Vendor */ - "Service-Specific-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Service-Specific-Info */ - { - struct dict_avp_data data = { - 1249, /* Code */ - 10415, /* Vendor */ - "Service-Specific-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Specific-Type */ - { - struct dict_avp_data data = { - 1257, /* Code */ - 10415, /* Vendor */ - "Service-Specific-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Serving-Node-Type */ - { - struct dict_avp_data data = { - 2047, /* Code */ - 10415, /* Vendor */ - "Serving-Node-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Serving-Node-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Session-Direction */ - { - struct dict_avp_data data = { - 2707, /* Code */ - 10415, /* Vendor */ - "Session-Direction", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Session-Direction)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Start-Time */ - { - struct dict_avp_data data = { - 2041, /* Code */ - 10415, /* Vendor */ - "Start-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Status */ - { - struct dict_avp_data data = { - 2702, /* Code */ - 10415, /* Vendor */ - "Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Status)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Stop-Time */ - { - struct dict_avp_data data = { - 2042, /* Code */ - 10415, /* Vendor */ - "Stop-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Submission-Time */ - { - struct dict_avp_data data = { - 1202, /* Code */ - 10415, /* Vendor */ - "Submission-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Subscriber-Role */ - { - struct dict_avp_data data = { - 2033, /* Code */ - 10415, /* Vendor */ - "Subscriber-Role", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subscriber-Role)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Supplementary-Service */ - { - struct dict_avp_data data = { - 2048, /* Code */ - 10415, /* Vendor */ - "Supplementary-Service", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Talk-Burst-Exchange */ - { - struct dict_avp_data data = { - 1255, /* Code */ - 10415, /* Vendor */ - "Talk-Burst-Exchange", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Talk-Burst-Time */ - { - struct dict_avp_data data = { - 1286, /* Code */ - 10415, /* Vendor */ - "Talk-Burst-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Talk-Burst-Volume */ - { - struct dict_avp_data data = { - 1287, /* Code */ - 10415, /* Vendor */ - "Talk-Burst-Volume", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Tariff-Information */ - { - struct dict_avp_data data = { - 2060, /* Code */ - 10415, /* Vendor */ - "Tariff-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Tariff-XML */ - { - struct dict_avp_data data = { - 2306, /* Code */ - 10415, /* Vendor */ - "Tariff-XML", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Terminating-IOI */ - { - struct dict_avp_data data = { - 840, /* Code */ - 10415, /* Vendor */ - "Terminating-IOI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Time-First-Usage */ - { - struct dict_avp_data data = { - 2043, /* Code */ - 10415, /* Vendor */ - "Time-First-Usage", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Time-Last-Usage */ - { - struct dict_avp_data data = { - 2044, /* Code */ - 10415, /* Vendor */ - "Time-Last-Usage", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Time-Quota-Mechanism */ - { - struct dict_avp_data data = { - 1270, /* Code */ - 10415, /* Vendor */ - "Time-Quota-Mechanism", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Time-Quota-Threshold */ - { - struct dict_avp_data data = { - 868, /* Code */ - 10415, /* Vendor */ - "Time-Quota-Threshold", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Time-Quota-Type */ - { - struct dict_avp_data data = { - 1271, /* Code */ - 10415, /* Vendor */ - "Time-Quota-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Time-Quota-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Time-Stamps */ - { - struct dict_avp_data data = { - 833, /* Code */ - 10415, /* Vendor */ - "Time-Stamps", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Time-Usage */ - { - struct dict_avp_data data = { - 2045, /* Code */ - 10415, /* Vendor */ - "Time-Usage", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Token-Text */ - { - struct dict_avp_data data = { - 1215, /* Code */ - 10415, /* Vendor */ - "Token-Text", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Traffic-Data-Volumes */ - { - struct dict_avp_data data = { - 2046, /* Code */ - 10415, /* Vendor */ - "Traffic-Data-Volumes", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Transcoder-Inserted-Indication */ - { - struct dict_avp_data data = { - 2605, /* Code */ - 10415, /* Vendor */ - "Transcoder-Inserted-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Transcoder-Inserted-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Transit-IOI-List */ - { - struct dict_avp_data data = { - 2701, /* Code */ - 10415, /* Vendor */ - "Transit-IOI-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Trigger */ - { - struct dict_avp_data data = { - 1264, /* Code */ - 10415, /* Vendor */ - "Trigger", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Trigger-Type */ - { - struct dict_avp_data data = { - 870, /* Code */ - 10415, /* Vendor */ - "Trigger-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Trigger-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Trunk-Group-Id */ - { - struct dict_avp_data data = { - 851, /* Code */ - 10415, /* Vendor */ - "Trunk-Group-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Type-Number */ - { - struct dict_avp_data data = { - 1204, /* Code */ - 10415, /* Vendor */ - "Type-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Type-Number)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Unit-Cost */ - { - struct dict_avp_data data = { - 2061, /* Code */ - 10415, /* Vendor */ - "Unit-Cost", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Unit-Quota-Threshold */ - { - struct dict_avp_data data = { - 1226, /* Code */ - 10415, /* Vendor */ - "Unit-Quota-Threshold", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* User-CSG-Information */ - { - struct dict_avp_data data = { - 2319, /* Code */ - 10415, /* Vendor */ - "User-CSG-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* User-Participating-Type */ - { - struct dict_avp_data data = { - 1279, /* Code */ - 10415, /* Vendor */ - "User-Participating-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-Participating-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* User-Session-Id */ - { - struct dict_avp_data data = { - 830, /* Code */ - 10415, /* Vendor */ - "User-Session-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Volume-Quota-Threshold */ - { - struct dict_avp_data data = { - 869, /* Code */ - 10415, /* Vendor */ - "Volume-Quota-Threshold", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* WAG-Address */ - { - struct dict_avp_data data = { - 890, /* Code */ - 10415, /* Vendor */ - "WAG-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* WAG-PLMN-Id */ - { - struct dict_avp_data data = { - 891, /* Code */ - 10415, /* Vendor */ - "WAG-PLMN-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* WLAN-Information */ - { - struct dict_avp_data data = { - 875, /* Code */ - 10415, /* Vendor */ - "WLAN-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* WLAN-Radio-Container */ - { - struct dict_avp_data data = { - 892, /* Code */ - 10415, /* Vendor */ - "WLAN-Radio-Container", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* WLAN-Session-Id */ - { - struct dict_avp_data data = { - 1246, /* Code */ - 10415, /* Vendor */ - "WLAN-Session-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* WLAN-Technology */ - { - struct dict_avp_data data = { - 893, /* Code */ - 10415, /* Vendor */ - "WLAN-Technology", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* WLAN-UE-Local-IPAddress */ - { - struct dict_avp_data data = { - 894, /* Code */ - 10415, /* Vendor */ - "WLAN-UE-Local-IPAddress", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* 3GPP 29.272-c00 (12.0.0 2013.03.13) */ - /* Subscription-Data */ - { - struct dict_avp_data data = { - 1400, /* Code */ - 10415, /* Vendor */ - "Subscription-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Terminal-Information */ - { - struct dict_avp_data data = { - 1401, /* Code */ - 10415, /* Vendor */ - "Terminal-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* IMEI */ - { - struct dict_avp_data data = { - 1402, /* Code */ - 10415, /* Vendor */ - "IMEI", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Software-Version */ - { - struct dict_avp_data data = { - 1403, /* Code */ - 10415, /* Vendor */ - "Software-Version", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* QoS-Subscribed */ - { - struct dict_avp_data data = { - 1404, /* Code */ - 10415, /* Vendor */ - "QoS-Subscribed", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ULR-Flags */ - { - struct dict_avp_data data = { - 1405, /* Code */ - 10415, /* Vendor */ - "ULR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ULA-Flags */ - { - struct dict_avp_data data = { - 1406, /* Code */ - 10415, /* Vendor */ - "ULA-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Visited-PLMN-Id */ - { - struct dict_avp_data data = { - 1407, /* Code */ - 10415, /* Vendor */ - "Visited-PLMN-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Requested-EUTRAN-Authentication-Info */ - { - struct dict_avp_data data = { - 1408, /* Code */ - 10415, /* Vendor */ - "Requested-EUTRAN-Authentication-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Requested-UTRAN-GERAN-Authentication-Info */ - { - struct dict_avp_data data = { - 1409, /* Code */ - 10415, /* Vendor */ - "Requested-UTRAN-GERAN-Authentication-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Requested-Vectors */ - { - struct dict_avp_data data = { - 1410, /* Code */ - 10415, /* Vendor */ - "Number-Of-Requested-Vectors", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Re-Synchronization-Info */ - { - struct dict_avp_data data = { - 1411, /* Code */ - 10415, /* Vendor */ - "Re-Synchronization-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Immediate-Response-Preferred */ - { - struct dict_avp_data data = { - 1412, /* Code */ - 10415, /* Vendor */ - "Immediate-Response-Preferred", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Authentication-Info */ - { - struct dict_avp_data data = { - 1413, /* Code */ - 10415, /* Vendor */ - "Authentication-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* E-UTRAN-Vector */ - { - struct dict_avp_data data = { - 1414, /* Code */ - 10415, /* Vendor */ - "E-UTRAN-Vector", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* UTRAN-Vector */ - { - struct dict_avp_data data = { - 1415, /* Code */ - 10415, /* Vendor */ - "UTRAN-Vector", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* GERAN-Vector */ - { - struct dict_avp_data data = { - 1416, /* Code */ - 10415, /* Vendor */ - "GERAN-Vector", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Network-Access-Mode */ - { - struct dict_avp_data data = { - 1417, /* Code */ - 10415, /* Vendor */ - "Network-Access-Mode", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Network-Access-Mode)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* HPLMN-ODB */ - { - struct dict_avp_data data = { - 1418, /* Code */ - 10415, /* Vendor */ - "HPLMN-ODB", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Item-Number */ - { - struct dict_avp_data data = { - 1419, /* Code */ - 10415, /* Vendor */ - "Item-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Cancellation-Type */ - { - struct dict_avp_data data = { - 1420, /* Code */ - 10415, /* Vendor */ - "Cancellation-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Cancellation-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* DSR-Flags */ - { - struct dict_avp_data data = { - 1421, /* Code */ - 10415, /* Vendor */ - "DSR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* DSA-Flags */ - { - struct dict_avp_data data = { - 1422, /* Code */ - 10415, /* Vendor */ - "DSA-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Context-Identifier */ - { - struct dict_avp_data data = { - 1423, /* Code */ - 10415, /* Vendor */ - "Context-Identifier", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Subscriber-Status */ - { - struct dict_avp_data data = { - 1424, /* Code */ - 10415, /* Vendor */ - "Subscriber-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subscriber-Status)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Operator-Determined-Barring */ - { - struct dict_avp_data data = { - 1425, /* Code */ - 10415, /* Vendor */ - "Operator-Determined-Barring", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Access-Restriction-Data */ - { - struct dict_avp_data data = { - 1426, /* Code */ - 10415, /* Vendor */ - "Access-Restriction-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* APN-OI-Replacement */ - { - struct dict_avp_data data = { - 1427, /* Code */ - 10415, /* Vendor */ - "APN-OI-Replacement", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* All-APN-Configurations-Included-Indicator */ - { - struct dict_avp_data data = { - 1428, /* Code */ - 10415, /* Vendor */ - "All-APN-Configurations-Included-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/All-APN-Configurations-Included-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* APN-Configuration-Profile */ - { - struct dict_avp_data data = { - 1429, /* Code */ - 10415, /* Vendor */ - "APN-Configuration-Profile", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* APN-Configuration */ - { - struct dict_avp_data data = { - 1430, /* Code */ - 10415, /* Vendor */ - "APN-Configuration", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* EPS-Subscribed-QoS-Profile */ - { - struct dict_avp_data data = { - 1431, /* Code */ - 10415, /* Vendor */ - "EPS-Subscribed-QoS-Profile", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* VPLMN-Dynamic-Address-Allowed */ - { - struct dict_avp_data data = { - 1432, /* Code */ - 10415, /* Vendor */ - "VPLMN-Dynamic-Address-Allowed", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/VPLMN-Dynamic-Address-Allowed)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* STN-SR */ - { - struct dict_avp_data data = { - 1433, /* Code */ - 10415, /* Vendor */ - "STN-SR", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Alert-Reason */ - { - struct dict_avp_data data = { - 1434, /* Code */ - 10415, /* Vendor */ - "Alert-Reason", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Alert-Reason)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* AMBR */ - { - struct dict_avp_data data = { - 1435, /* Code */ - 10415, /* Vendor */ - "AMBR", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CSG-Subscription-Data */ - { - struct dict_avp_data data = { - 1436, /* Code */ - 10415, /* Vendor */ - "CSG-Subscription-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CSG-Id */ - { - struct dict_avp_data data = { - 1437, /* Code */ - 10415, /* Vendor */ - "CSG-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PDN-GW-Allocation-Type */ - { - struct dict_avp_data data = { - 1438, /* Code */ - 10415, /* Vendor */ - "PDN-GW-Allocation-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDN-GW-Allocation-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Expiration-Date */ - { - struct dict_avp_data data = { - 1439, /* Code */ - 10415, /* Vendor */ - "Expiration-Date", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* RAT-Frequency-Selection-Priority-ID */ - { - struct dict_avp_data data = { - 1440, /* Code */ - 10415, /* Vendor */ - "RAT-Frequency-Selection-Priority-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* IDA-Flags */ - { - struct dict_avp_data data = { - 1441, /* Code */ - 10415, /* Vendor */ - "IDA-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PUA-Flags */ - { - struct dict_avp_data data = { - 1442, /* Code */ - 10415, /* Vendor */ - "PUA-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* NOR-Flags */ - { - struct dict_avp_data data = { - 1443, /* Code */ - 10415, /* Vendor */ - "NOR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* User-Id */ - { - struct dict_avp_data data = { - 1444, /* Code */ - 10415, /* Vendor */ - "User-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Equipment-Status */ - { - struct dict_avp_data data = { - 1445, /* Code */ - 10415, /* Vendor */ - "Equipment-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Equipment-Status)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Regional-Subscription-Zone-Code */ - { - struct dict_avp_data data = { - 1446, /* Code */ - 10415, /* Vendor */ - "Regional-Subscription-Zone-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* RAND */ - { - struct dict_avp_data data = { - 1447, /* Code */ - 10415, /* Vendor */ - "RAND", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* XRES */ - { - struct dict_avp_data data = { - 1448, /* Code */ - 10415, /* Vendor */ - "XRES", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* AUTN */ - { - struct dict_avp_data data = { - 1449, /* Code */ - 10415, /* Vendor */ - "AUTN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* KASME */ - { - struct dict_avp_data data = { - 1450, /* Code */ - 10415, /* Vendor */ - "KASME", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Trace-Collection-Entity */ - { - struct dict_avp_data data = { - 1452, /* Code */ - 10415, /* Vendor */ - "Trace-Collection-Entity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* Kc */ - { - struct dict_avp_data data = { - 1453, /* Code */ - 10415, /* Vendor */ - "Kc", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SRES */ - { - struct dict_avp_data data = { - 1454, /* Code */ - 10415, /* Vendor */ - "SRES", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PDN-Type */ - { - struct dict_avp_data data = { - 1456, /* Code */ - 10415, /* Vendor */ - "PDN-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PDN-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Roaming-Restricted-Due-To-Unsupported-Feature */ - { - struct dict_avp_data data = { - 1457, /* Code */ - 10415, /* Vendor */ - "Roaming-Restricted-Due-To-Unsupported-Feature", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Roaming-Restricted-Due-To-Unsupported-Feature)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Trace-Data */ - { - struct dict_avp_data data = { - 1458, /* Code */ - 10415, /* Vendor */ - "Trace-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Trace-Reference */ - { - struct dict_avp_data data = { - 1459, /* Code */ - 10415, /* Vendor */ - "Trace-Reference", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Trace-Depth */ - { - struct dict_avp_data data = { - 1462, /* Code */ - 10415, /* Vendor */ - "Trace-Depth", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Trace-Depth)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Trace-NE-Type-List */ - { - struct dict_avp_data data = { - 1463, /* Code */ - 10415, /* Vendor */ - "Trace-NE-Type-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Trace-Interface-List */ - { - struct dict_avp_data data = { - 1464, /* Code */ - 10415, /* Vendor */ - "Trace-Interface-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Trace-Event-List */ - { - struct dict_avp_data data = { - 1465, /* Code */ - 10415, /* Vendor */ - "Trace-Event-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* OMC-Id */ - { - struct dict_avp_data data = { - 1466, /* Code */ - 10415, /* Vendor */ - "OMC-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* GPRS-Subscription-Data */ - { - struct dict_avp_data data = { - 1467, /* Code */ - 10415, /* Vendor */ - "GPRS-Subscription-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Complete-Data-List-Included-Indicator */ - { - struct dict_avp_data data = { - 1468, /* Code */ - 10415, /* Vendor */ - "Complete-Data-List-Included-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Complete-Data-List-Included-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PDP-Context */ - { - struct dict_avp_data data = { - 1469, /* Code */ - 10415, /* Vendor */ - "PDP-Context", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* PDP-Type */ - { - struct dict_avp_data data = { - 1470, /* Code */ - 10415, /* Vendor */ - "PDP-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP2-MEID */ - { - struct dict_avp_data data = { - 1471, /* Code */ - 10415, /* Vendor */ - "3GPP2-MEID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Specific-APN-Info */ - { - struct dict_avp_data data = { - 1472, /* Code */ - 10415, /* Vendor */ - "Specific-APN-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-Info */ - { - struct dict_avp_data data = { - 1473, /* Code */ - 10415, /* Vendor */ - "LCS-Info", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* GMLC-Number */ - { - struct dict_avp_data data = { - 1474, /* Code */ - 10415, /* Vendor */ - "GMLC-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* LCS-PrivacyException */ - { - struct dict_avp_data data = { - 1475, /* Code */ - 10415, /* Vendor */ - "LCS-PrivacyException", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SS-Code */ - { - struct dict_avp_data data = { - 1476, /* Code */ - 10415, /* Vendor */ - "SS-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SS-Status */ - { - struct dict_avp_data data = { - 1477, /* Code */ - 10415, /* Vendor */ - "SS-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Notification-To-UE-User */ - { - struct dict_avp_data data = { - 1478, /* Code */ - 10415, /* Vendor */ - "Notification-To-UE-User", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Notification-To-UE-User)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* External-Client */ - { - struct dict_avp_data data = { - 1479, /* Code */ - 10415, /* Vendor */ - "External-Client", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Client-Identity */ - { - struct dict_avp_data data = { - 1480, /* Code */ - 10415, /* Vendor */ - "Client-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* GMLC-Restriction */ - { - struct dict_avp_data data = { - 1481, /* Code */ - 10415, /* Vendor */ - "GMLC-Restriction", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/GMLC-Restriction)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PLMN-Client */ - { - struct dict_avp_data data = { - 1482, /* Code */ - 10415, /* Vendor */ - "PLMN-Client", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/PLMN-Client)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Service-Type */ - { - struct dict_avp_data data = { - 1483, /* Code */ - 10415, /* Vendor */ - "Service-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ServiceTypeIdentity */ - { - struct dict_avp_data data = { - 1484, /* Code */ - 10415, /* Vendor */ - "ServiceTypeIdentity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MO-LR */ - { - struct dict_avp_data data = { - 1485, /* Code */ - 10415, /* Vendor */ - "MO-LR", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Teleservice-List */ - { - struct dict_avp_data data = { - 1486, /* Code */ - 10415, /* Vendor */ - "Teleservice-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* TS-Code */ - { - struct dict_avp_data data = { - 1487, /* Code */ - 10415, /* Vendor */ - "TS-Code", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Call-Barring-Infor-List */ - { - struct dict_avp_data data = { - 1488, /* Code */ - 10415, /* Vendor */ - "Call-Barring-Infor-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SGSN-Number */ - { - struct dict_avp_data data = { - 1489, /* Code */ - 10415, /* Vendor */ - "SGSN-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* IDR-Flags */ - { - struct dict_avp_data data = { - 1490, /* Code */ - 10415, /* Vendor */ - "IDR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* ICS-Indicator */ - { - struct dict_avp_data data = { - 1491, /* Code */ - 10415, /* Vendor */ - "ICS-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/ICS-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* IMS-Voice-Over-PS-Sessions-Supported */ - { - struct dict_avp_data data = { - 1492, /* Code */ - 10415, /* Vendor */ - "IMS-Voice-Over-PS-Sessions-Supported", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/IMS-Voice-Over-PS-Sessions-Supported)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions */ - { - struct dict_avp_data data = { - 1493, /* Code */ - 10415, /* Vendor */ - "Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Last-UE-Activity-Time */ - { - struct dict_avp_data data = { - 1494, /* Code */ - 10415, /* Vendor */ - "Last-UE-Activity-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* EPS-User-State */ - { - struct dict_avp_data data = { - 1495, /* Code */ - 10415, /* Vendor */ - "EPS-User-State", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* EPS-Location-Information */ - { - struct dict_avp_data data = { - 1496, /* Code */ - 10415, /* Vendor */ - "EPS-Location-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MME-User-State */ - { - struct dict_avp_data data = { - 1497, /* Code */ - 10415, /* Vendor */ - "MME-User-State", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SGSN-User-State */ - { - struct dict_avp_data data = { - 1498, /* Code */ - 10415, /* Vendor */ - "SGSN-User-State", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* User-State */ - { - struct dict_avp_data data = { - 1499, /* Code */ - 10415, /* Vendor */ - "User-State", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/User-State)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MME-LocationInformation */ - { - struct dict_avp_data data = { - 1600, /* Code */ - 10415, /* Vendor */ - "MME-LocationInformation", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SGSN-Location-Information */ - { - struct dict_avp_data data = { - 1601, /* Code */ - 10415, /* Vendor */ - "SGSN-Location-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* E-UTRAN-Cell-Global-Identity */ - { - struct dict_avp_data data = { - 1602, /* Code */ - 10415, /* Vendor */ - "E-UTRAN-Cell-Global-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Tracking-Area-Identity */ - { - struct dict_avp_data data = { - 1603, /* Code */ - 10415, /* Vendor */ - "Tracking-Area-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Cell-Global-Identity */ - { - struct dict_avp_data data = { - 1604, /* Code */ - 10415, /* Vendor */ - "Cell-Global-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Routing-Area-Identity */ - { - struct dict_avp_data data = { - 1605, /* Code */ - 10415, /* Vendor */ - "Routing-Area-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Location-Area-Identity */ - { - struct dict_avp_data data = { - 1606, /* Code */ - 10415, /* Vendor */ - "Location-Area-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Area-Identity */ - { - struct dict_avp_data data = { - 1607, /* Code */ - 10415, /* Vendor */ - "Service-Area-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Geographical-Information */ - { - struct dict_avp_data data = { - 1608, /* Code */ - 10415, /* Vendor */ - "Geographical-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Geodetic-Information */ - { - struct dict_avp_data data = { - 1609, /* Code */ - 10415, /* Vendor */ - "Geodetic-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Current-Location-Retrieved */ - { - struct dict_avp_data data = { - 1610, /* Code */ - 10415, /* Vendor */ - "Current-Location-Retrieved", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Current-Location-Retrieved)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Age-Of-Location-Information */ - { - struct dict_avp_data data = { - 1611, /* Code */ - 10415, /* Vendor */ - "Age-Of-Location-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Active-APN */ - { - struct dict_avp_data data = { - 1612, /* Code */ - 10415, /* Vendor */ - "Active-APN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Error-Diagnostic */ - { - struct dict_avp_data data = { - 1614, /* Code */ - 10415, /* Vendor */ - "Error-Diagnostic", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Error-Diagnostic)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Ext-PDP-Address */ - { - struct dict_avp_data data = { - 1621, /* Code */ - 10415, /* Vendor */ - "Ext-PDP-Address", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Address_type, NULL); - }; - - /* UE-SRVCC-Capability */ - { - struct dict_avp_data data = { - 1615, /* Code */ - 10415, /* Vendor */ - "UE-SRVCC-Capability", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/UE-SRVCC-Capability)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MPS-Priority */ - { - struct dict_avp_data data = { - 1616, /* Code */ - 10415, /* Vendor */ - "MPS-Priority", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* VPLMN-LIPA-Allowed */ - { - struct dict_avp_data data = { - 1617, /* Code */ - 10415, /* Vendor */ - "VPLMN-LIPA-Allowed", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/VPLMN-LIPA-Allowed)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* LIPA-Permission */ - { - struct dict_avp_data data = { - 1618, /* Code */ - 10415, /* Vendor */ - "LIPA-Permission", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/LIPA-Permission)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Subscribed-Periodic-RAU-TAU-Timer */ - { - struct dict_avp_data data = { - 1619, /* Code */ - 10415, /* Vendor */ - "Subscribed-Periodic-RAU-TAU-Timer", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Ext-PDP-Type */ - { - struct dict_avp_data data = { - 1620, /* Code */ - 10415, /* Vendor */ - "Ext-PDP-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SIPTO-Permission */ - { - struct dict_avp_data data = { - 1613, /* Code */ - 10415, /* Vendor */ - "SIPTO-Permission", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SIPTO-Permission)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MDT-Configuration */ - { - struct dict_avp_data data = { - 1622, /* Code */ - 10415, /* Vendor */ - "MDT-Configuration", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Job-Type */ - { - struct dict_avp_data data = { - 1623, /* Code */ - 10415, /* Vendor */ - "Job-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Job-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Area-Scope */ - { - struct dict_avp_data data = { - 1624, /* Code */ - 10415, /* Vendor */ - "Area-Scope", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* List-Of-Measurements */ - { - struct dict_avp_data data = { - 1625, /* Code */ - 10415, /* Vendor */ - "List-Of-Measurements", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Reporting-Trigger */ - { - struct dict_avp_data data = { - 1626, /* Code */ - 10415, /* Vendor */ - "Reporting-Trigger", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Report-Interval */ - { - struct dict_avp_data data = { - 1627, /* Code */ - 10415, /* Vendor */ - "Report-Interval", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Report-Interval)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Report-Amount */ - { - struct dict_avp_data data = { - 1628, /* Code */ - 10415, /* Vendor */ - "Report-Amount", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Report-Amount)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Event-Threshold-RSRP */ - { - struct dict_avp_data data = { - 1629, /* Code */ - 10415, /* Vendor */ - "Event-Threshold-RSRP", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Event-Threshold-RSRQ */ - { - struct dict_avp_data data = { - 1630, /* Code */ - 10415, /* Vendor */ - "Event-Threshold-RSRQ", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Logging-Interval */ - { - struct dict_avp_data data = { - 1631, /* Code */ - 10415, /* Vendor */ - "Logging-Interval", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Logging-Interval)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Logging-Duration */ - { - struct dict_avp_data data = { - 1632, /* Code */ - 10415, /* Vendor */ - "Logging-Duration", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Logging-Duration)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Relay-Node-Indicator */ - { - struct dict_avp_data data = { - 1633, /* Code */ - 10415, /* Vendor */ - "Relay-Node-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Relay-Node-Indicator)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* MDT-User-Consent */ - { - struct dict_avp_data data = { - 1634, /* Code */ - 10415, /* Vendor */ - "MDT-User-Consent", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/MDT-User-Consent)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* PUR-Flags */ - { - struct dict_avp_data data = { - 1635, /* Code */ - 10415, /* Vendor */ - "PUR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Subscribed-VSRVCC */ - { - struct dict_avp_data data = { - 1636, /* Code */ - 10415, /* Vendor */ - "Subscribed-VSRVCC", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subscribed-VSRVCC)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Equivalent-PLMN-List */ - { - struct dict_avp_data data = { - 1637, /* Code */ - 10415, /* Vendor */ - "Equivalent-PLMN-List", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* CLR-Flags */ - { - struct dict_avp_data data = { - 1638, /* Code */ - 10415, /* Vendor */ - "CLR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* UVR-Flags */ - { - struct dict_avp_data data = { - 1639, /* Code */ - 10415, /* Vendor */ - "UVR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* UVA-Flags */ - { - struct dict_avp_data data = { - 1640, /* Code */ - 10415, /* Vendor */ - "UVA-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* VPLMN-CSG-Subscription-Data */ - { - struct dict_avp_data data = { - 1641, /* Code */ - 10415, /* Vendor */ - "VPLMN-CSG-Subscription-Data", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Time-Zone */ - { - struct dict_avp_data data = { - 1642, /* Code */ - 10415, /* Vendor */ - "Time-Zone", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* A-MSISDN */ - { - struct dict_avp_data data = { - 1643, /* Code */ - 10415, /* Vendor */ - "A-MSISDN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MME-Number-for-MT-SMS */ - { - struct dict_avp_data data = { - 1645, /* Code */ - 10415, /* Vendor */ - "MME-Number-for-MT-SMS", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SMS-Register-Request */ - { - struct dict_avp_data data = { - 1648, /* Code */ - 10415, /* Vendor */ - "SMS-Register-Request", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/SMS-Register-Request)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Local-Time-Zone */ - { - struct dict_avp_data data = { - 1649, /* Code */ - 10415, /* Vendor */ - "Local-Time-Zone", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Daylight-Saving-Time */ - { - struct dict_avp_data data = { - 1650, /* Code */ - 10415, /* Vendor */ - "Daylight-Saving-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Daylight-Saving-Time)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Subscription-Data-Flags */ - { - struct dict_avp_data data = { - 1654, /* Code */ - 10415, /* Vendor */ - "Subscription-Data-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Measurement-Period-UMTS */ - { - struct dict_avp_data data = { - 1655, /* Code */ - 10415, /* Vendor */ - "Measurement-Period-UMTS", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Measurement-Period-UMTS)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Measurement-Period-LTE */ - { - struct dict_avp_data data = { - 1656, /* Code */ - 10415, /* Vendor */ - "Measurement-Period-LTE", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Measurement-Period-LTE)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Collection-Period-RRM-LTE */ - { - struct dict_avp_data data = { - 1657, /* Code */ - 10415, /* Vendor */ - "Collection-Period-RRM-LTE", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Collection-Period-RRM-LTE)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Collection-Period-RRM-UMTS */ - { - struct dict_avp_data data = { - 1658, /* Code */ - 10415, /* Vendor */ - "Collection-Period-RRM-UMTS", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Collection-Period-RRM-UMTS)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Positioning-Method */ - { - struct dict_avp_data data = { - 1659, /* Code */ - 10415, /* Vendor */ - "Positioning-Method", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Measurement-Quantity */ - { - struct dict_avp_data data = { - 1660, /* Code */ - 10415, /* Vendor */ - "Measurement-Quantity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Event-Threshold-Event-1F */ - { - struct dict_avp_data data = { - 1661, /* Code */ - 10415, /* Vendor */ - "Event-Threshold-Event-1F", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Event-Threshold-Event-1I */ - { - struct dict_avp_data data = { - 1662, /* Code */ - 10415, /* Vendor */ - "Event-Threshold-Event-1I", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* 3GPP 29.329-b50 (11.5.0 2012.12.21) */ - /* User-Identity */ - { - struct dict_avp_data data = { - 700, /* Code */ - 10415, /* Vendor */ - "User-Identity", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* MSISDN */ - { - struct dict_avp_data data = { - 701, /* Code */ - 10415, /* Vendor */ - "MSISDN", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Name conflict with 29.229 User-Data (606), renamed */ - /* User-Data-29.329 */ - { - struct dict_avp_data data = { - 702, /* Code */ - 10415, /* Vendor */ - "User-Data-29.329", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Data-Reference */ - { - struct dict_avp_data data = { - 703, /* Code */ - 10415, /* Vendor */ - "Data-Reference", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Data-Reference)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Service-Indication */ - { - struct dict_avp_data data = { - 704, /* Code */ - 10415, /* Vendor */ - "Service-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Subs-Req-Type */ - { - struct dict_avp_data data = { - 705, /* Code */ - 10415, /* Vendor */ - "Subs-Req-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Subs-Req-Type)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Requested-Domain */ - { - struct dict_avp_data data = { - 706, /* Code */ - 10415, /* Vendor */ - "Requested-Domain", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Requested-Domain)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Current-Location */ - { - struct dict_avp_data data = { - 707, /* Code */ - 10415, /* Vendor */ - "Current-Location", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Current-Location)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Identity-Set */ - { - struct dict_avp_data data = { - 708, /* Code */ - 10415, /* Vendor */ - "Identity-Set", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Identity-Set)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Expiry-Time */ - { - struct dict_avp_data data = { - 709, /* Code */ - 10415, /* Vendor */ - "Expiry-Time", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* Send-Data-Indication */ - { - struct dict_avp_data data = { - 710, /* Code */ - 10415, /* Vendor */ - "Send-Data-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Send-Data-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* in 29.229 */ - /* Server-Name */ - /* Supported-Features */ - /* Feature-List-ID */ - /* Feature-List */ - /* Supported-Applications */ - /* Public-Identity */ - /* DSAI-Tag */ - { - struct dict_avp_data data = { - 711, /* Code */ - 10415, /* Vendor */ - "DSAI-Tag", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* in 29.229 */ - /* Wildcarded-Public-Identity */ - /* Wildcarded-IMPU */ - { - struct dict_avp_data data = { - 636, /* Code */ - 10415, /* Vendor */ - "Wildcarded-IMPU", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* in 29.229 */ - /* Session-Priority */ - /* One-Time-Notification */ - { - struct dict_avp_data data = { - 712, /* Code */ - 10415, /* Vendor */ - "One-Time-Notification", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/One-Time-Notification)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Requested-Nodes */ - { - struct dict_avp_data data = { - 713, /* Code */ - 10415, /* Vendor */ - "Requested-Nodes", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Serving-Node-Indication */ - { - struct dict_avp_data data = { - 714, /* Code */ - 10415, /* Vendor */ - "Serving-Node-Indication", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(3GPP/Serving-Node-Indication)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* Repository-Data-ID */ - { - struct dict_avp_data data = { - 715, /* Code */ - 10415, /* Vendor */ - "Repository-Data-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Sequence-Number */ - { - struct dict_avp_data data = { - 716, /* Code */ - 10415, /* Vendor */ - "Sequence-Number", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* UDR-Flags */ - { - struct dict_avp_data data = { - 719, /* Code */ - 10415, /* Vendor */ - "UDR-Flags", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* OMA DDS Charging_Data V1.0 20110201-A */ - /* Application-Server-Id */ - { - struct dict_avp_data data = { - 2101, /* Code */ - 10415, /* Vendor */ - "Application-Server-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Application-Service-Type */ - { - struct dict_avp_data data = { - 2102, /* Code */ - 10415, /* Vendor */ - "Application-Service-Type", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Application-Session-Id */ - { - struct dict_avp_data data = { - 2103, /* Code */ - 10415, /* Vendor */ - "Application-Session-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Content-ID */ - { - struct dict_avp_data data = { - 2116, /* Code */ - 10415, /* Vendor */ - "Content-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* Content-provider-ID */ - { - struct dict_avp_data data = { - 2117, /* Code */ - 10415, /* Vendor */ - "Content-provider-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* DCD-Information */ - { - struct dict_avp_data data = { - 2115, /* Code */ - 10415, /* Vendor */ - "DCD-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Delivery-Status */ - { - struct dict_avp_data data = { - 2104, /* Code */ - 10415, /* Vendor */ - "Delivery-Status", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* IM-Information */ - { - struct dict_avp_data data = { - 2110, /* Code */ - 10415, /* Vendor */ - "IM-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Messages-Successfully-Exploded */ - { - struct dict_avp_data data = { - 2111, /* Code */ - 10415, /* Vendor */ - "Number-Of-Messages-Successfully-Exploded", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Number-Of-Messages-Successfully-Sent */ - { - struct dict_avp_data data = { - 2112, /* Code */ - 10415, /* Vendor */ - "Number-Of-Messages-Successfully-Sent", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Service-Generic-Information */ - { - struct dict_avp_data data = { - 1256, /* Code */ - 10415, /* Vendor */ - "Service-Generic-Information", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Total-Number-Of-Messages-Exploded */ - { - struct dict_avp_data data = { - 2113, /* Code */ - 10415, /* Vendor */ - "Total-Number-Of-Messages-Exploded", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* Total-Number-Of-Messages-Sent */ - { - struct dict_avp_data data = { - 2114, /* Code */ - 10415, /* Vendor */ - "Total-Number-Of-Messages-Sent", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - - - - - /*****************************************************/ - /* end of generated data, rules below added manually */ - /*****************************************************/ + /*==================================================================*/ + /* Create AVPs via generated add_avps() */ + /*==================================================================*/ + extern int add_avps(); + CHECK_FCT( add_avps() ); - - /* 3GPP2-BSID */ - { - struct dict_avp_data data = { - 9010, /* Code */ - 5535, /* Vendor */ - "3GPP2-BSID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ /* XXX: guessed */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; + /*==================================================================*/ + /* Rules section */ + /*==================================================================*/ - /* 29.212 */ + /*==================================================================*/ + /* 3GPP TS 29.212 V15.9.0 (2019-12) */ + /*==================================================================*/ { struct dict_object *rule_avp; @@ -10276,9 +365,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Priority-Level" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Pre-emption-Capability" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Pre-emption-Vulnerability" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Priority-Level", RULE_REQUIRED, -1, 1 }, + { 10415, "Pre-emption-Capability", RULE_OPTIONAL, -1, 1 }, + { 10415, "Pre-emption-Vulnerability", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10291,20 +380,29 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "QoS-Class-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Max-Requested-Bandwidth-UL" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Max-Requested-Bandwidth-DL" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Guaranteed-Bitrate-UL" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Guaranteed-Bitrate-DL" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Bearer-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Allocation-Retention-Priority" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "APN-Aggregate-Max-Bitrate-UL" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "APN-Aggregate-Max-Bitrate-DL" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "QoS-Class-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "Max-Requested-Bandwidth-UL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Max-Requested-Bandwidth-DL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Extended-Max-Requested-BW-UL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Extended-Max-Requested-BW-DL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Guaranteed-Bitrate-UL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Guaranteed-Bitrate-DL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Extended-GBR-UL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Extended-GBR-DL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Bearer-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "Allocation-Retention-Priority", RULE_OPTIONAL, -1, 1 }, + { 10415, "APN-Aggregate-Max-Bitrate-UL", RULE_OPTIONAL, -1, 1 }, + { 10415, "APN-Aggregate-Max-Bitrate-DL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Extended-APN-AMBR-UL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Extended-APN-AMBR-DL", RULE_OPTIONAL, -1, 1 }, + { 10415, "Conditional-APN-Aggregate-Max-Bitrate", RULE_OPTIONAL, -1, -1 }, }; PARSE_loc_rules(rules, rule_avp); } - /* 32.299 */ + /*==================================================================*/ + /* 3GPP TS 32.299 V15.7.0 (2019-06) */ + /*==================================================================*/ { /* additional allowed AVPs */ @@ -10312,8 +410,8 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &ccr); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "AoC-Request-Type"}, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Information"}, RULE_OPTIONAL, -1, 1 }, + { 10415, "AoC-Request-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Service-Information", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, ccr); } @@ -10324,9 +422,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Answer", &ccr); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Low-Balance-Indication"}, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Remaining-Balance"}, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Information"}, RULE_OPTIONAL, -1, 1 }, + { 10415, "Low-Balance-Indication", RULE_OPTIONAL, -1, 1 }, + { 10415, "Remaining-Balance", RULE_OPTIONAL, -1, 1 }, + { 10415, "Service-Information", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, ccr); } @@ -10339,8 +437,8 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Domain-Name" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-IMSI-MCC-MNC" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Domain-Name", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-IMSI-MCC-MNC", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10353,8 +451,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Application-Server" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Application-Provided-Called-Party-Address" }, RULE_OPTIONAL, -1, -1 }, + { 10415, "Application-Server", RULE_OPTIONAL, -1, 1 }, + { 10415, "Application-Provided-Called-Party-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "Status-AS-Code", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10367,10 +466,10 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Interface-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Interface-Text" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Interface-Port" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Interface-Type" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Text", RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Port", RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Type", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10383,12 +482,12 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Envelope-Start-Time" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Envelope-End-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 0, .avp_name = "CC-Total-Octets" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 0, .avp_name = "CC-Input-Octets" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 0, .avp_name = "CC-Output-Octets" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 0, .avp_name = "CC-Service-Specific-Units" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Envelope-Start-Time", RULE_REQUIRED, -1, 1 }, + { 10415, "Envelope-End-Time", RULE_OPTIONAL, -1, 1 }, + { 0, "CC-Total-Octets", RULE_REQUIRED, -1, 1 }, + { 0, "CC-Input-Octets", RULE_OPTIONAL, -1, 1 }, + { 0, "CC-Output-Octets", RULE_OPTIONAL, -1, 1 }, + { 0, "CC-Service-Specific-Units", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10401,9 +500,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "SIP-Method" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Event" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Expires" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "SIP-Method", RULE_OPTIONAL, -1, 1 }, + { 10415, "Event", RULE_OPTIONAL, -1, 1 }, + { 10415, "Expires", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10416,47 +515,58 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Event-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Role-Of-Node" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Node-Functionality" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "User-Session-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Outgoing-Session-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Session-Priority" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Calling-Party-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Called-Party-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Called-Asserted-Identity" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Number-Portability-Routing-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Carrier-Select-Routing-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Alternate-Charged-Party-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Requested-Party-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Associated-URI" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Time-Stamps" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Application-Server-Information" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Inter-Operator-Identifier" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Transit-IOI-List" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IMS-Charging-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SDP-Session-Description" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "SDP-Media-Component" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Served-Party-IP-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Server-Capabilities" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Trunk-Group-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Bearer-Service" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Specific-Info" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Message-Body" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Cause-Code" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Access-Network-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Early-Media-Description" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "IMS-Communication-Service-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IMS-Application-Reference-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Online-Charging-Flag" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Real-Time-Tariff-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Account-Expiration" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Initial-IMS-Charging-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "NNI-Information" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "From-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IMS-Emergency-Indicator" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Access-Transfer-Information" }, RULE_OPTIONAL, -1, -1 }, + { 10415, "Event-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Role-Of-Node", RULE_OPTIONAL, -1, 1 }, + { 10415, "Node-Functionality", RULE_REQUIRED, -1, 1 }, + { 10415, "User-Session-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Outgoing-Session-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Session-Priority", RULE_OPTIONAL, -1, 1 }, + { 10415, "Calling-Party-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "Called-Party-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Called-Asserted-Identity", RULE_OPTIONAL, -1, -1 }, + { 10415, "Number-Portability-Routing-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Carrier-Select-Routing-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Alternate-Charged-Party-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Requested-Party-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "Associated-URI", RULE_OPTIONAL, -1, -1 }, + { 10415, "Time-Stamps", RULE_OPTIONAL, -1, 1 }, + { 10415, "Application-Server-Information", RULE_OPTIONAL, -1, -1 }, + { 10415, "Inter-Operator-Identifier", RULE_OPTIONAL, -1, -1 }, + { 10415, "Transit-IOI-List", RULE_OPTIONAL, -1, 1 }, + { 10415, "IMS-Charging-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "SDP-Session-Description", RULE_OPTIONAL, -1, -1 }, + { 10415, "SDP-Media-Component", RULE_OPTIONAL, -1, -1 }, + { 10415, "Served-Party-IP-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Server-Capabilities", RULE_OPTIONAL, -1, 1 }, + { 10415, "Trunk-Group-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Bearer-Service", RULE_OPTIONAL, -1, 1 }, + { 10415, "Service-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Service-Specific-Info", RULE_OPTIONAL, -1, -1 }, + { 10415, "Message-Body", RULE_OPTIONAL, -1, -1 }, + { 10415, "Cause-Code", RULE_OPTIONAL, -1, 1 }, + { 10415, "Reason-Header", RULE_OPTIONAL, -1, -1 }, + { 10415, "Access-Network-Information", RULE_OPTIONAL, -1, -1 }, + { 10415, "Cellular-Network-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Early-Media-Description", RULE_OPTIONAL, -1, -1 }, + { 10415, "IMS-Communication-Service-Identifier",RULE_OPTIONAL, -1, 1 }, + { 10415, "IMS-Application-Reference-Identifier",RULE_OPTIONAL, -1, 1 }, + { 10415, "Online-Charging-Flag", RULE_OPTIONAL, -1, 1 }, + { 10415, "Real-Time-Tariff-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Account-Expiration", RULE_OPTIONAL, -1, 1 }, + { 10415, "Initial-IMS-Charging-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "NNI-Information", RULE_OPTIONAL, -1, -1 }, + { 10415, "From-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "IMS-Emergency-Indicator", RULE_OPTIONAL, -1, 1 }, + { 10415, "IMS-Visited-Network-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "Access-Network-Info-Change", RULE_OPTIONAL, -1, -1 }, + { 10415, "Access-Transfer-Information", RULE_OPTIONAL, -1, -1 }, + { 10415, "Related-IMS-Charging-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "Related-IMS-Charging-Identifier-Node",RULE_OPTIONAL, -1, 1 }, + { 10415, "Route-Header-Received", RULE_OPTIONAL, -1, 1 }, + { 10415, "Route-Header-Transmitted", RULE_OPTIONAL, -1, 1 }, + { 10415, "Instance-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "TAD-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "FE-Identifier-List", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10469,8 +579,8 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Class-Identifier" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Token-Text" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Class-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "Token-Text", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10483,26 +593,26 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Originator-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Recipient-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Submission-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MM-Content-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Priority" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Message-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Message-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Message-Size" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Message-Class" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Delivery-Report-Requested" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Read-Reply-Report-Requested" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MMBox-Storage-Requested" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Applic-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Reply-Applic-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Aux-Applic-Info" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Content-Class" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "DRM-Content" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Adaptations" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "VASP-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "VAS-ID" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Originator-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Recipient-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "Submission-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "MM-Content-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Priority", RULE_OPTIONAL, -1, 1 }, + { 10415, "Message-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "Message-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Message-Size", RULE_OPTIONAL, -1, 1 }, + { 10415, "Message-Class", RULE_OPTIONAL, -1, 1 }, + { 10415, "Delivery-Report-Requested", RULE_OPTIONAL, -1, 1 }, + { 10415, "Read-Reply-Report-Requested", RULE_OPTIONAL, -1, 1 }, + { 10415, "MMBox-Storage-Requested", RULE_OPTIONAL, -1, 1 }, + { 10415, "Applic-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "Reply-Applic-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "Aux-Applic-Info", RULE_OPTIONAL, -1, 1 }, + { 10415, "Content-Class", RULE_OPTIONAL, -1, 1 }, + { 10415, "DRM-Content", RULE_OPTIONAL, -1, 1 }, + { 10415, "Adaptations", RULE_OPTIONAL, -1, 1 }, + { 10415, "VASP-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "VAS-ID", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10517,21 +627,21 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Time-Quota-Threshold" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Volume-Quota-Threshold" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Unit-Quota-Threshold" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Quota-Holding-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Quota-Consumption-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Reporting-Reason" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Trigger" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PS-Furnish-Charging-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Refund-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "AF-Correlation-Information" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Envelope" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Envelope-Reporting" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Time-Quota-Mechanism" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Specific-Info" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "QoS-Information" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Time-Quota-Threshold", RULE_OPTIONAL, -1, 1 }, + { 10415, "Volume-Quota-Threshold", RULE_OPTIONAL, -1, 1 }, + { 10415, "Unit-Quota-Threshold", RULE_OPTIONAL, -1, 1 }, + { 10415, "Quota-Holding-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "Quota-Consumption-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "Reporting-Reason", RULE_OPTIONAL, -1, -1 }, + { 10415, "Trigger", RULE_OPTIONAL, -1, 1 }, + { 10415, "PS-Furnish-Charging-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Refund-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "AF-Correlation-Information", RULE_OPTIONAL, -1, -1 }, + { 10415, "Envelope", RULE_OPTIONAL, -1, -1 }, + { 10415, "Envelope-Reporting", RULE_OPTIONAL, -1, 1 }, + { 10415, "Time-Quota-Mechanism", RULE_OPTIONAL, -1, 1 }, + { 10415, "Service-Specific-Info", RULE_OPTIONAL, -1, -1 }, + { 10415, "QoS-Information", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10544,10 +654,10 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Quota-Consumption-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Time-Quota-Mechanism" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Envelope-Reporting" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 0, .avp_name = "Multiple-Services-Credit-Control" }, RULE_OPTIONAL, -1, -1 }, + { 10415, "Quota-Consumption-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "Time-Quota-Mechanism", RULE_OPTIONAL, -1, 1 }, + { 10415, "Envelope-Reporting", RULE_OPTIONAL, -1, 1 }, + { 0, "Multiple-Services-Credit-Control", RULE_OPTIONAL, -1, -1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10560,9 +670,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Address-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Data" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Domain" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Data", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Domain", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10575,10 +685,10 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Interface-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Interface-Text" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Interface-Port" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Interface-Type" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Text", RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Port", RULE_OPTIONAL, -1, 1 }, + { 10415, "Interface-Type", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10591,9 +701,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Address-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Data" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Domain" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Data", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Domain", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10606,9 +716,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "3GPP-Charging-Id" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PS-Free-Format-Data" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PS-Append-Free-Format-Data" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-Charging-Id", RULE_REQUIRED, -1, 1 }, + { 10415, "PS-Free-Format-Data", RULE_REQUIRED, -1, 1 }, + { 10415, "PS-Append-Free-Format-Data", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10621,52 +731,80 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "3GPP-Charging-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PDN-Connection-Charging-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Node-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-PDP-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PDP-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "PDP-Address-Prefix-Length" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Dynamic-Address-Flag" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Dynamic-Address-Flag-Extension" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "QoS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SGSN-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "GGSN-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "SGW-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "CG-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Serving-Node-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SGW-Change" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-IMSI-MCC-MNC" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IMSI-Unauthenticated-Flag" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-GGSN-MCC-MNC" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-NSAPI" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 0, .avp_name = "Called-Station-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-Session-Stop-Indicator" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-Selection-Mode" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-Charging-Characteristics" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Charging-Characteristics-Selection-Mode" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-SGSN-MCC-MNC" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-MS-TimeZone" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Charging-Rule-Base-Name" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-User-Location-Info" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "User-CSG-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 5535, .avp_name = "3GPP2-BSID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-RAT-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PS-Furnish-Charging-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PDP-Context-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Offline-Charging" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Traffic-Data-Volumes" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Data-Container" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 0, .avp_name = "User-Equipment-Info" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Terminal-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Start-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Stop-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Change-Condition" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Diagnostics" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Low-Priority-Indicator" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MME-Number-for-MT-SMS" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MME-Name" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MME-Realm" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Supported-Features", RULE_OPTIONAL, -1, -1 }, + { 10415, "3GPP-Charging-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "PDN-Connection-Charging-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "Node-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-PDP-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "PDP-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "PDP-Address-Prefix-Length", RULE_OPTIONAL, -1, 1 }, + { 10415, "Dynamic-Address-Flag", RULE_OPTIONAL, -1, 1 }, + { 10415, "Dynamic-Address-Flag-Extension", RULE_OPTIONAL, -1, 1 }, + { 10415, "QoS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "SGSN-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "GGSN-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "TDF-IP-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "SGW-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "EPDG-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "CG-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Serving-Node-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "SGW-Change", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-IMSI-MCC-MNC", RULE_OPTIONAL, -1, 1 }, + { 10415, "IMSI-Unauthenticated-Flag", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-GGSN-MCC-MNC", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-NSAPI", RULE_OPTIONAL, -1, 1 }, + { 0, "Called-Station-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-Session-Stop-Indicator", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-Selection-Mode", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-Charging-Characteristics", RULE_OPTIONAL, -1, 1 }, + { 10415, "Charging-Characteristics-Selection-Mode", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-SGSN-MCC-MNC", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-MS-TimeZone", RULE_OPTIONAL, -1, 1 }, + { 10415, "Charging-Rule-Base-Name", RULE_OPTIONAL, -1, 1 }, + { 10415, "ADC-Rule-Base-Name", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-User-Location-Info", RULE_OPTIONAL, -1, 1 }, + { 10415, "User-Location-Info-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "User-CSG-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Presence-Reporting-Area-Information", RULE_OPTIONAL, -1, -1 }, + { 5535, "3GPP2-BSID", RULE_OPTIONAL, -1, 1 }, + { 10415, "TWAN-User-Location-Info", RULE_OPTIONAL, -1, 1 }, + { 10415, "UWAN-User-Location-Info", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-RAT-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "PS-Furnish-Charging-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "PDP-Context-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Offline-Charging", RULE_OPTIONAL, -1, 1 }, + { 10415, "Traffic-Data-Volumes", RULE_OPTIONAL, -1, -1 }, + { 10415, "Service-Data-Container", RULE_OPTIONAL, -1, -1 }, + { 0, "User-Equipment-Info", RULE_OPTIONAL, -1, 1 }, + { 10415, "Terminal-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Start-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "Stop-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "Change-Condition", RULE_OPTIONAL, -1, 1 }, + { 10415, "Diagnostics", RULE_OPTIONAL, -1, 1 }, + { 10415, "Low-Priority-Indicator", RULE_OPTIONAL, -1, 1 }, + { 10415, "NBIFOM-Mode", RULE_OPTIONAL, -1, 1 }, + { 10415, "NBIFOM-Support", RULE_OPTIONAL, -1, 1 }, + { 10415, "MME-Number-for-MT-SMS", RULE_OPTIONAL, -1, 1 }, + { 10415, "MME-Name", RULE_OPTIONAL, -1, 1 }, + { 10415, "MME-Realm", RULE_OPTIONAL, -1, 1 }, +#if 0 /* TODO: ETSI ES 283 034 */ + { 13019, "Logical-Access-ID", RULE_OPTIONAL, -1, 1 }, + { 13019, "Physical-Access-ID", RULE_OPTIONAL, -1, 1 }, +#endif + { 10415, "Fixed-User-Location-Info", RULE_OPTIONAL, -1, 1 }, + { 10415, "CN-Operator-Selection-Entity", RULE_OPTIONAL, -1, 1 }, + { 10415, "Enhanced-Diagnostics", RULE_OPTIONAL, -1, 1 }, + { 10415, "SGi-PtP-Tunnelling-Method", RULE_OPTIONAL, -1, 1 }, + { 10415, "CP-CIoT-EPS-Optimisation-Indicator", RULE_OPTIONAL, -1, 1 }, + { 10415, "UNI-PDU-CP-Only-Flag", RULE_OPTIONAL, -1, 1 }, + { 10415, "Serving-PLMN-Rate-Control", RULE_OPTIONAL, -1, 1 }, + { 10415, "APN-Rate-Control", RULE_OPTIONAL, -1, 1 }, + { 10415, "Charging-Per-IP-CAN-Session-Indicator", RULE_OPTIONAL, -1, 1 }, + { 10415, "RRC-Cause-Counter", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-PS-Data-Off-Status", RULE_OPTIONAL, -1, 1 }, + { 10415, "SCS-AS-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Unused-Quota-Timer", RULE_OPTIONAL, -1, 1 }, + { 10415, "RAN-Secondary-RAT-Usage-Report", RULE_OPTIONAL, -1, -1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10679,10 +817,10 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Address-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Data" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Domain" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Addressee-Type" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Data", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Domain", RULE_OPTIONAL, -1, 1 }, + { 10415, "Addressee-Type", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10695,11 +833,11 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Destination-Interface" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Recipient-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Recipient-Received-Address" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Recipient-SCCP-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-Protocol-ID" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Destination-Interface", RULE_OPTIONAL, -1, 1 }, + { 10415, "Recipient-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "Recipient-Received-Address", RULE_OPTIONAL, -1, -1 }, + { 10415, "Recipient-SCCP-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Protocol-ID", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10712,9 +850,9 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Address-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Data" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Address-Domain" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Data", RULE_OPTIONAL, -1, 1 }, + { 10415, "Address-Domain", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10727,16 +865,16 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "SDP-Media-Name" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SDP-Media-Description" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Local-GW-Inserted-Indication" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IP-Realm-Default-Indication" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Transcoder-Inserted-Indication" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Media-Initiator-Flag" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Media-Initiator-Party" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "3GPP-Charging-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Access-Network-Charging-Identifier-Value" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SDP-Type" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "SDP-Media-Name", RULE_OPTIONAL, -1, 1 }, + { 10415, "SDP-Media-Description", RULE_OPTIONAL, -1, -1 }, + { 10415, "Local-GW-Inserted-Indication", RULE_OPTIONAL, -1, 1 }, + { 10415, "IP-Realm-Default-Indication", RULE_OPTIONAL, -1, 1 }, + { 10415, "Transcoder-Inserted-Indication", RULE_OPTIONAL, -1, 1 }, + { 10415, "Media-Initiator-Flag", RULE_OPTIONAL, -1, 1 }, + { 10415, "Media-Initiator-Party", RULE_OPTIONAL, -1, 1 }, + { 10415, "3GPP-Charging-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Access-Network-Charging-Identifier-Value", RULE_OPTIONAL, -1, 1 }, + { 10415, "SDP-Type", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10749,20 +887,25 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 0, .avp_name = "Subscription-Id" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "AoC-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "WLAN-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IMS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MMS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "LCS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "PoC-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MBMS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SMS-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "MMTel-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Service-Generic-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "IM-Information" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "DCD-Information" }, RULE_OPTIONAL, -1, 1 }, + { 0, "Subscription-Id", RULE_OPTIONAL, -1, -1 }, + { 10415, "AoC-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "PS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "IMS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "MMS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "LCS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "PoC-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "MBMS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "SMS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "VCS-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "MMTel-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "ProSe-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "Service-Generic-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "IM-Information", RULE_OPTIONAL, -1, 1 }, + { 10415, "DCD-Information", RULE_OPTIONAL, -1, 1 }, +#if 0 /* TODO: oneM2M TS-0004 */ + { 45687, "M2M-Information", RULE_OPTIONAL, -1, 1 }, +#endif + { 10415, "CPDT-Information", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10775,22 +918,27 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "SMS-Node" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Client-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Originator-SCCP-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SMSC-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Data-Coding-Scheme" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-Discharge-Time" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-Message-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Originator-Interface" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-Protocol-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Reply-Path-Requested" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-Status" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-User-Data-Header" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Number-Of-Messages-Sent" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Recipient-Info" }, RULE_OPTIONAL, -1, -1 }, - { { .avp_vendor = 10415, .avp_name = "Originator-Received-Address" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SM-Service-Type" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "SMS-Node", RULE_OPTIONAL, -1, 1 }, + { 10415, "Client-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Originator-SCCP-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "SMSC-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Data-Coding-Scheme", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Discharge-Time", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Message-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Originator-Interface", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Protocol-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "Reply-Path-Requested", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Status", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-User-Data-Header", RULE_OPTIONAL, -1, 1 }, + { 10415, "Number-Of-Messages-Sent", RULE_OPTIONAL, -1, 1 }, + { 10415, "Recipient-Info", RULE_OPTIONAL, -1, -1 }, + { 10415, "Originator-Received-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Service-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "SMS-Result", RULE_OPTIONAL, -1, 1 }, + { 10415, "SM-Device-Trigger-Indicator", RULE_OPTIONAL, -1, 1 }, + { 10415, "MTC-IWF-Address", RULE_OPTIONAL, -1, 1 }, + { 10415, "Application-Port-Identifier", RULE_OPTIONAL, -1, 1 }, + { 10415, "External-Identifier", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10803,8 +951,8 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Time-Quota-Type" }, RULE_REQUIRED, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Base-Time-Interval" }, RULE_REQUIRED, -1, 1 }, + { 10415, "Time-Quota-Type", RULE_REQUIRED, -1, 1 }, + { 10415, "Base-Time-Interval", RULE_REQUIRED, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10817,10 +965,10 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "SIP-Request-Timestamp" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SIP-Response-Timestamp" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SIP-Request-Timestamp-Fraction" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "SIP-Response-Timestamp-Fraction" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "SIP-Request-Timestamp", RULE_OPTIONAL, -1, 1 }, + { 10415, "SIP-Response-Timestamp", RULE_OPTIONAL, -1, 1 }, + { 10415, "SIP-Request-Timestamp-Fraction", RULE_OPTIONAL, -1, 1 }, + { 10415, "SIP-Response-Timestamp-Fraction", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10835,13 +983,16 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Reporting-Reason" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Event-Charging-TimeStamp" }, RULE_OPTIONAL, -1, -1 }, + { 10415, "Reporting-Reason", RULE_OPTIONAL, -1, 1 }, + { 10415, "Event-Charging-TimeStamp", RULE_OPTIONAL, -1, -1 }, }; PARSE_loc_rules(rules, rule_avp); } - /* OMA */ + /*==================================================================*/ + /* OMA DDS Charging_Data V1.0 20110201-A */ + /*==================================================================*/ + { struct dict_object *rule_avp; struct dict_avp_request vpa; @@ -10850,8 +1001,8 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Content-ID" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Content-provider-ID" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Content-ID", RULE_OPTIONAL, -1, 1 }, + { 10415, "Content-provider-ID", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10863,10 +1014,10 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Total-Number-Of-Messages-Sent" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Total-Number-Of-Messages-Exploded" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Number-Of-Messages-Successfully-Sent" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Number-Of-Messages-Successfully-Exploded" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Total-Number-Of-Messages-Sent", RULE_OPTIONAL, -1, 1 }, + { 10415, "Total-Number-Of-Messages-Exploded", RULE_OPTIONAL, -1, 1 }, + { 10415, "Number-Of-Messages-Successfully-Sent", RULE_OPTIONAL, -1, 1 }, + { 10415, "Number-Of-Messages-Successfully-Exploded", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } @@ -10878,14 +1029,14 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = { - { { .avp_vendor = 10415, .avp_name = "Application-Server-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Application-Service-Type" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Application-Session-Id" }, RULE_OPTIONAL, -1, 1 }, - { { .avp_vendor = 10415, .avp_name = "Delivery-Status" }, RULE_OPTIONAL, -1, 1 }, + { 10415, "Application-Server-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Application-Service-Type", RULE_OPTIONAL, -1, 1 }, + { 10415, "Application-Session-Id", RULE_OPTIONAL, -1, 1 }, + { 10415, "Delivery-Status", RULE_OPTIONAL, -1, 1 }, }; PARSE_loc_rules(rules, rule_avp); } - + LOG_D( "Extension 'Dictionary definitions for DCCA 3GPP' initialized"); return 0; } diff --git a/extensions/dict_dcca_3gpp/dict_dcca_3gpp.csv b/extensions/dict_dcca_3gpp/dict_dcca_3gpp.csv new file mode 100644 index 0000000..ff45102 --- /dev/null +++ b/extensions/dict_dcca_3gpp/dict_dcca_3gpp.csv @@ -0,0 +1,2421 @@ +Attribute Name,AVP Code,Section defined,Value Type,MUST,MAY,SHOULD NOT,MUST NOT
+@vendor,10415,,,,,,
+,,,,,,,
+@standard,3GPP TS 29.061,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.061 V15.5.0 (2018-12),,,,,,,
+# Interworking between the Public Land Mobile Network (PLMN),,,,,,,
+# supporting packet based services and,,,,,,,
+# Packet Data Networks (PDN),,,,,,,
+# ,,,,,,,
+# From 3GPP 29061-f50.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.061 Table 9a: Gi/Sgi specific AVPs,,,,,,,
+#,,,,,,,
+# Note: 3GPP TS 29.061 is unclear and inconsistent about M.,,,,,,,
+"# For this reason, other sources are assumed more trustworthy.",,,,,,,
+#=,,,,,,,
+#,,,,,,,
+# Fix: 3GPP-IMSI (1) changed to Must M.,,,,,,,
+3GPP-IMSI,1,16.4.7,UTF8String,"M,V",P,,
+"# Fix: 3GPP-Charging-Id (2) type changed from OctetString to Unsigned32,",,,,,,,
+# per 3GPP TS 29.061 clause 16.4.7.2/2 and packet dumps.,,,,,,,
+3GPP-Charging-Id,2,16.4.7,Unsigned32,"M,V",P,,
+# Fix: 3GPP-PDP-Type (3) changed to Must M.,,,,,,,
+3GPP-PDP-Type,3,16.4.7,Enumerated,"M,V",P,,
+3GPP-CG-Address,4,16.4.7,OctetString,V,P,,M
+# Fix: 3GPP-GPRS-Negotiated-QoS-Profile (5) changed to Must M per contrib/3gpp.,,,,,,,
+3GPP-GPRS-Negotiated-QoS-Profile,5,16.4.7,UTF8String,"M,V",P,,
+3GPP-SGSN-Address,6,16.4.7,OctetString,V,P,,M
+3GPP-GGSN-Address,7,16.4.7,OctetString,V,P,,M
+# Fix: 3GPP-IMSI-MCC-MNC (8) changed to Must M per packet dumps.,,,,,,,
+3GPP-IMSI-MCC-MNC,8,16.4.7,UTF8String,"M,V",P,,
+# Fix: 3GPP-GGSN-MCC-MNC (9) changed to Must M per contrib/3gpp.,,,,,,,
+3GPP-GGSN-MCC-MNC,9,16.4.7,UTF8String,"M,V",P,,
+# Fix: 3GPP-NSAPI (10) changed to Must M per contrib/3gpp.,,,,,,,
+3GPP-NSAPI,10,16.4.7,OctetString,"M,V",P,,
+# Note: 3GPP TS 29.061 Table 9a does not define,,,,,,,
+# 3GPP-Session-Stop-Indicator (11) even when it is referenced,,,,,,,
+# by other 3GPP Diameter AVPs including PS-Information (874).,,,,,,,
+# ,,,,,,,
+# Fix: Add 3GPP-Session-Stop-Indicator (11) OctetString.,,,,,,,
+3GPP-Session-Stop-Indicator,11,16.4.7,OctetString,V,P,,M
+# Fix: 3GPP-Selection-Mode (12) changed to Must M per contrib/3gpp.,,,,,,,
+3GPP-Selection-Mode,12,16.4.7,UTF8String,"M,V",P,,
+# Fix: 3GPP-Charging-Characteristics (13) changed to Must M per contrib/3gpp.,,,,,,,
+3GPP-Charging-Characteristics,13,16.4.7,UTF8String,"M,V",P,,
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# 3GPP-CG-IPv6-Address (14) to 3GPP-CG-Ipv6-Address.,,,,,,,
+# ,,,,,,,
+# Fix: 3GPP-CG-Ipv6-Address (14) changed to Must M per contrib/3gpp.,,,,,,,
+# Change-1.4.0: 3GPP-CG-IPv6-Address (14) renamed to 3GPP-CG-Ipv6-Address (14).,,,,,,,
+3GPP-CG-Ipv6-Address,14,16.4.7,OctetString,"M,V",P,,
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# 3GPP-SGSN-IPv6-Address (15) to 3GPP-SGSN-Ipv6-Address.,,,,,,,
+# ,,,,,,,
+# Fix: 3GPP-SGSN-Ipv6-Address (15) changed to Must M per contrib/3gpp.,,,,,,,
+# Change-1.4.0: 3GPP-SGSN-IPv6-Address (15) renamed to 3GPP-SGSN-Ipv6-Address (15).,,,,,,,
+3GPP-SGSN-Ipv6-Address,15,16.4.7,OctetString,"M,V",P,,
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# 3GPP-GGSN-IPv6-Address (16) to 3GPP-GGSN-Ipv6-Address.,,,,,,,
+# ,,,,,,,
+# Fix: 3GPP-GGSN-Ipv6-Address (16) changed to Must M per contrib/3gpp.,,,,,,,
+# Change-1.4.0: 3GPP-GGSN-IPv6-Address (16) renamed to 3GPP-GGSN-Ipv6-Address (16).,,,,,,,
+3GPP-GGSN-Ipv6-Address,16,16.4.7,OctetString,"M,V",P,,
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# 3GPP-IPv6-DNS-Servers (17) to 3GPP-Ipv6-DNS-Servers.,,,,,,,
+# ,,,,,,,
+# Fix: 3GPP-Ipv6-DNS-Servers (17) changed to Must M per contrib/3gpp.,,,,,,,
+# Change-1.4.0: 3GPP-IPv6-DNS-Servers (17) renamed to 3GPP-Ipv6-DNS-Servers (17).,,,,,,,
+3GPP-Ipv6-DNS-Servers,17,16.4.7,OctetString,"M,V",P,,
+# Fix: 3GPP-SGSN-MCC-MNC (18) changed to Must M per contrib/3gpp.,,,,,,,
+3GPP-SGSN-MCC-MNC,18,16.4.7,UTF8String,"M,V",P,,
+# Fix: 3GPP-IMEISV (20) changed to Must M.,,,,,,,
+3GPP-IMEISV,20,16.4.7,OctetString,"M,V",P,,
+# Fix: 3GPP-RAT-Type (21) changed to Must M.,,,,,,,
+3GPP-RAT-Type,21,16.4.7,OctetString,"M,V",P,,
+# Fix: 3GPP-User-Location-Info (22) changed to Must M.,,,,,,,
+3GPP-User-Location-Info,22,16.4.7,OctetString,"M,V",P,,
+# Fix: 3GPP-MS-TimeZone (23) changed to Must M.,,,,,,,
+3GPP-MS-TimeZone,23,16.4.7,OctetString,"M,V",P,,
+3GPP-CAMEL-Charging-Info,24,16.4.7,OctetString,V,P,,M
+3GPP-Packet-Filter,25,16.4.7,OctetString,V,P,,M
+3GPP-Negotiated-DSCP,26,16.4.7,OctetString,V,P,,M
+3GPP-Allocate-IP-Type,27,16.4.7,OctetString,V,P,,M
+# Note: 3GPP TS 29.061 Table 9a does not define,,,,,,,
+# External-Identifier (28) for Diameter; it is RADIUS only.,,,,,,,
+# 3GPP TS 29.061 Table 9b refers to 3GPP TS 29.336,,,,,,,
+# for External-Identifier (3111).,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: External-Identifier (28) OctetString replaced by External-Identifier (3111) UTF8String.,,,,,,,
+#,,,,,,,
+TWAN-Identifier,29,16.4.7,OctetString,V,P,,M
+3GPP-User-Location-Info-Time,30,16.4.7,OctetString,V,P,,M
+3GPP-Secondary-RAT-Usage,31,16.4.7,OctetString,V,P,,M
+#=,,,,,,,
+# 3GPP TS 29.061 Table 10: Gmb specific AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+TMGI,900,17.7.2,OctetString,"M,V",P,,
+Required-MBMS-Bearer-Capabilities,901,17.7.3,UTF8String,"M,V",P,,
+MBMS-StartStop-Indication,902,17.7.5,Enumerated,"M,V",P,,
+MBMS-Service-Area,903,17.7.6,OctetString,"M,V",P,,
+MBMS-Session-Duration,904,17.7.7,OctetString,"M,V",P,,
+Alternative-APN,905,17.7.8,UTF8String,"M,V",P,,
+MBMS-Service-Type,906,17.7.9,Enumerated,"M,V",P,,
+MBMS-2G-3G-Indicator,907,17.7.10,Enumerated,"M, V",P,,
+MBMS-Session-Identity,908,17.7.11,OctetString,"M,V",P,,
+RAI,909,17.7.12,UTF8String,"M, V",P,,
+Additional-MBMS-Trace-Info,910,17.7.13,OctetString,"M,V",P,,
+MBMS-Time-To-Data-Transfer,911,17.7.14,OctetString,"M,V",P,,
+MBMS-Session-Repetition-Number,912,17.7.15,OctetString,"M,V",P,,
+MBMS-Required-QoS,913,17.7.16,UTF8String,"M,V",P,,
+MBMS-Counting-Information,914,17.7.17,Enumerated,"M,V",P,,
+MBMS-User-Data-Mode-Indication,915,17.7.18,Enumerated,"M,V",P,,
+MBMS-GGSN-Address,916,17.7.19,OctetString,"M,V",P,,
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# MBMS-GGSN-IPv6-Address (917) to MBMS-GGSN-Ipv6-Address.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: MBMS-GGSN-IPv6-Address (917) renamed to MBMS-GGSN-Ipv6-Address (917).,,,,,,,
+MBMS-GGSN-Ipv6-Address,917,17.7.20,OctetString,"M,V",P,,
+MBMS-BMSC-SSM-IP-Address,918,17.7.21,OctetString,"M,V",P,,
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# MBMS-BMSC-SSM-IPv6-Address (919) to MBMS-BMSC-SSM-Ipv6-Address.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: MBMS-BMSC-SSM-IPv6-Address (919) renamed to MBMS-BMSC-SSM-Ipv6-Address (919).,,,,,,,
+MBMS-BMSC-SSM-Ipv6-Address,919,17.7.22,OctetString,"M,V",P,,
+MBMS-Flow-Identifier,920,17.7.23,OctetString,"M,V",P,,
+CN-IP-Multicast-Distribution,921,17.7.24,Enumerated,"M,V",P,,
+MBMS-HC-Indicator,922,17.7.25,Enumerated,"M,V",P,,
+#=,,,,,,,
+# 3GPP TS 29.061 Table 20.5a.1: SGmb specific AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+MBMS-Access-Indicator,923,20.5a.1,Enumerated,"M,V",P,,
+# Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IP-Address (3522).,,,,,,,
+# 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IP-Address (924).,,,,,,,
+# 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IP-Address (3522).,,,,,,,
+MBMS-GW-SSM-IP-Address,924,20.5a.2,OctetString,V,P,,M
+# Note: 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# MBMS-GW-SSM-IPv6-Address (925) to MBMS-GW-SSM-Ipv6-Address.,,,,,,,
+# Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IPv6-Address (3523).,,,,,,,
+# 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IPv6-Address (925).,,,,,,,
+# 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# MBMS-GW-SSM-IPv6-Address (925) to MBMS-GW-SSM-Ipv6-Address.,,,,,,,
+# 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IPv6-Address (3523).,,,,,,,
+MBMS-GW-SSM-IPv6-Address,925,20.5a.3,OctetString,V,P,,M
+MBMS-BMSC-SSM-UDP-Port,926,20.5a.4,OctetString,V,P,,M
+MBMS-GW-UDP-Port,927,20.5a.5,OctetString,V,P,,M
+MBMS-GW-UDP-Port-Indicator,928,20.5a.6,Enumerated,V,P,,M
+MBMS-Data-Transfer-Start,929,20.5a.7,Unsigned64,V,P,,M
+MBMS-Data-Transfer-Stop,930,20.5a.8,Unsigned64,V,P,,M
+# Note: 3GPP TS 29.061 Table 20.5a.1 row MBMS-Flag (931) has,,,,,,,
+"# incorrect name and should be ""MBMS-Flags"" per clause 20.5a.9.",,,,,,,
+# ,,,,,,,
+# Fix: MBMS-Flag (931) renamed to MBMS-Flags (931).,,,,,,,
+MBMS-Flags,931,20.5a.9,Unsigned32,V,P,,M
+Restart-Counter,932,20.5a.10,Unsigned32,V,P,,M
+Diagnostic-Info,933,20.5a.11,Unsigned32,V,P,,M
+MBMS-Cell-List,934,20.5a.12,OctetString,V,P,,M
+,,,,,,,
+@standard,3GPP TS 29.109,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.109 V15.0.0 (2017-06),,,,,,,
+# Generic Authentication Architecture (GAA);,,,,,,,
+# Zh and Zn Interfaces based on the Diameter protocol;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29109-f00.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.109 Table 6.1: New Diameter Multimedia Application AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+GBA-UserSecSettings,400,6.3.1.1,OctetString,"M, V",,,
+Transaction-Identifier,401,6.3.1.2,OctetString,"M, V",,,
+NAF-Id,402,6.3.1.3,OctetString,"M, V",,,
+GAA-Service-Identifier,403,6.3.1.4,OctetString,"M, V",,,
+Key-ExpiryTime,404,6.3.1.5,Time,"M, V",,,
+ME-Key-Material,405,6.3.1.6,OctetString,"M, V",,,
+UICC-Key-Material,406,6.3.1.7,OctetString,"M, V",,,
+# Note: 3GPP TS 29.109 Table 6.1 row GBA_U-Awareness-Indicator (407),,,,,,,
+# has an underscore in the name (contrary to RFC 6733 section 4.1).,,,,,,,
+# ,,,,,,,
+# Fix: GBA_U-Awareness-Indicator (407) renamed to GBA-U-Awareness-Indicator (407).,,,,,,,
+GBA-U-Awareness-Indicator,407,6.3.1.8,Enumerated,"M, V",,,
+BootstrapInfoCreationTime,408,6.3.1.9,Time,"M, V",,,
+GUSS-Timestamp,409,6.3.1.10,Time,V,,,M
+GBA-Type,410,6.3.1.11,Enumerated,"M, V",,,
+UE-Id,411,6.3.1.12,OctetString,"M, V",,,
+UE-Id-Type,412,6.3.1.13,Enumerated,"M, V",,,
+UICC-App-Label,413,6.3.1.14,OctetString,"M, V",,,
+UICC-ME,414,6.3.1.15,Enumerated,"M, V",,,
+Requested-Key-Lifetime,415,6.3.1.16,Time,"M, V",,,
+Private-Identity-Request,416,6.3.1.17,Enumerated,"M, V",,,
+GBA-Push-Info,417,6.3.1.18,OctetString,"M, V",,,
+NAF-SA-Identifier,418,6.3.1.19,OctetString,"M, V",,,
+Security-Feature-Request,419,6.3.1.20,OctetString,"M,V",,,
+Security-Feature-Response,420,6.3.1.21,OctetString,"M,V",,,
+,,,,,,,
+@standard,3GPP TS 29.128,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.128 V15.6.0 (2019-09),,,,,,,
+# Mobility Management Entity (MME) and Serving GPRS Support,,,,,,,
+# Node (SGSN) interfaces for interworking with packet data,,,,,,,
+# networks and applications,,,,,,,
+# ,,,,,,,
+# From 3GPP 29128-f60.docx,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.128 Table 6.4.1-1: T6a/T6b specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Communication-Failure-Information,4300,6.4.4,Grouped,"M,V",,,
+Cause-Type,4301,6.4.5,Unsigned32,"M,V",,,
+S1AP-Cause,4302,6.4.6,Unsigned32,"M,V",,,
+RANAP-Cause,4303,6.4.7,Unsigned32,"M,V",,,
+BSSGP-Cause,4309,6.4.8,Unsigned32,"M,V",,,
+GMM-Cause,4304,6.4.9,Unsigned32,"M,V",,,
+SM-Cause,4305,6.4.10,Unsigned32,"M,V",,,
+Number-Of-UE-Per-Location-Configuration,4306,6.4.11,Grouped,"M,V",,,
+Number-Of-UE-Per-Location-Report,4307,6.4.12,Grouped,"M,V",,,
+UE-Count,4308,6.4.13,Unsigned32,"M,V",,,
+Connection-Action,4314,6.4.18,Unsigned32,"M,V",,,
+Non-IP-Data,4315,6.4.19,OctetString,"M,V",,,
+Serving-PLMN-Rate-Control,4310,6.4.21,Grouped,"M,V",,,
+Uplink-Rate-Limit,4311,6.4.23,Unsigned32,"M,V",,,
+Downlink-Rate-Limit,4312,6.4.22,Unsigned32,"M,V",,,
+Extended-PCO,4313,6.4.26,OctetString,"M,V",,,
+SCEF-Wait-Time,4316,6.4.24,Time,"M,V",,,
+CMR-Flags,4317,6.4.25,Unsigned32,"M,V",,,
+RRC-Cause-Counter,4318,6.4.27,Grouped,"M,V",,,
+Counter-Value,4319,6.4.28,Unsigned32,"M,V",,,
+RRC-Counter-Timestamp,4320,6.4.29,Time,"M,V",,,
+TDA-Flags,4321,6.4.31,Unsigned32,V,,,M
+Idle-Status-Indication,4322,6.4.32,Grouped,V,,,M
+Idle-Status-Timestamp,4323,6.4.33,Time,V,,,M
+Active-Time,4324,6.4.34,Unsigned32,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.140,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.140 V7.0.0 (2007-06),,,,,,,
+# MM10 interface based on Diameter protocol;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29140-700.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.140 Table 6.3.1: Diameter MM10 Application AVPs,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Served-User-Identity,1100,6.3.1,Grouped,"M,V",,,
+VASP-ID,1101,6.3.3,UTF8String,"M,V",,,
+VAS-ID,1102,6.3.4,UTF8String,"M,V",,,
+Trigger-Event,1103,6.3.5,Enumerated,"M,V",,,
+Sender-Address,1104,6.3.7,UTF8String,"M,V",,,
+Initial-Recipient-Address,1105,6.3.8,Grouped,"M,V",,,
+Result-Recipient-Address,1106,6.3.9,Grouped,"M,V",,,
+# Note: Name conflict with 3GPP TS 29.329 Sequence-Number (716),,,,,,,
+# and 3GPP TS 29.283 Sequence-Number (4512).,,,,,,,
+# 3GPP TS 29.140 V6.1.0 (2005-06) allocated Sequence-Number (1107).,,,,,,,
+# 3GPP TS 29.329 V10.0.0 (2010-09) CR 0163 added Sequence-Number (716).,,,,,,,
+# 3GPP TS 29.283 V13.1.0 (2016-06) allocated Sequence-Number (4512).,,,,,,,
+# ,,,,,,,
+# Fix: Sequence-Number (1107) renamed to Sequence-Number-29.140 (1107).,,,,,,,
+Sequence-Number-29.140,1107,6.3.10,Unsigned32,"M,V",,,
+# Note: Name conflict with 3GPP TS 32.299 Recipient-Address (1201);,,,,,,,
+# 3GPP TS 29.140 V6.1.0 (2005-06) allocated Recipient-Address (1108).,,,,,,,
+# 3GPP TS 32.299 V6.4.0 (2005-09) CR 0028 added Recipient-Address (1201).,,,,,,,
+# ,,,,,,,
+# Fix: Recipient-Address (1108) renamed to Recipient-Address-29.140 (1108).,,,,,,,
+Recipient-Address-29.140,1108,6.3.11,UTF8String,"M,V",,,
+Routeing-Address,1109,6.3.12,UTF8String,"M,V",,,
+Originating-Interface,1110,6.3.13,Enumerated,"M,V",,,
+Delivery-Report,1111,6.3.14,Enumerated,"M,V",,,
+Read-Reply,1112,6.3.15,Enumerated,"M,V",,,
+Sender-Visibility,1113,6.3.16,Enumerated,"M,V",,,
+Service-Key,1114,6.3.17,UTF8String,"M,V",,,
+Billing-Information,1115,6.3.18,UTF8String,"M,V",,,
+# Note: Name conflict with 3GPP TS 32.299 V11.6.0 Status (2702).,,,,,,,
+# 3GPP TS 32.299 V11.10.0 (2013-12) CR 0566 renamed,,,,,,,
+# Status (2702) to Status-Code (2702).,,,,,,,
+# 3GPP TS 32.299 V11.14.0 (2014-12) CR 0617 renamed,,,,,,,
+# Status-Code (2702) to Status-AS-Code (2702).,,,,,,,
+# ,,,,,,,
+# TODO: rename back to Status ?,,,,,,,
+# Fix: Status (1116) renamed to Status-29.140 (1116).,,,,,,,
+Status-29.140,1116,6.3.19,Grouped,"M,V",,,
+Status-Code,1117,6.3.20,UTF8String,"M,V",,,
+Status-Text,1118,6.3.21,UTF8String,"M,V",,,
+Routeing-Address-Resolution,1119,6.3.22,Enumerated,"M,V",,,
+,,,,,,,
+@standard,3GPP TS 29.153,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.153 V15.1.0 (2019-09),,,,,,,
+# Service capability exposure functionality over Ns,,,,,,,
+# reference point,,,,,,,
+# ,,,,,,,
+# From 3GPP 29153-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.153 Table 5.3.1.1: Ns specific Diameter AVPs ,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Network-Congestion-Area-Report,4101,5.3.2,Grouped,"M,V",P,,
+Ns-Request-Type,4102,5.3.3,Unsigned32,"M,V",P,,
+,,,,,,,
+@standard,3GPP TS 29.154,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.154 V15.3.0 (2019-09),,,,,,,
+# Service capability exposure functionality over,,,,,,,
+# Nt reference point,,,,,,,
+# ,,,,,,,
+# From 3GPP 29154-f30.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.154 Table 5.3.1.1: Nt specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Network-Area-Info-List,4201,5.3.2,OctetString,"M,V",P,,
+Number-Of-UEs,4209,5.3.10,Unsigned32,"M,V",P,,
+Reference-Id,4202,5.3.3,OctetString,"M,V",P,,
+Transfer-Request-Type,4203,5.3.4,Unsigned32,"M,V",P,,
+# Note: Name conflict with 3GPP TS 29.345 Time-Window (3818).,,,,,,,
+# Time-Window (3818) in 3GPP TS 29.345 V12.1.0 (2014-12) predates,,,,,,,
+# Time-Window (4204) in 3GPP TS 29.154 V13.1.0 (2016-03).,,,,,,,
+# ,,,,,,,
+# Fix: Time-Window (4204) renamed to Time-Window-29.154 (4204).,,,,,,,
+Time-Window-29.154,4204,5.3.5,Grouped,"M,V",P,,
+Transfer-End-Time,4205,5.3.6,Time,"M,V",P,,
+Transfer-Policy,4207,5.3.8,Grouped,"M,V",P,,
+Transfer-Policy-Id,4208,5.3.9,Unsigned32,"M,V",P,,
+Transfer-Start-Time,4206,5.3.7,Time,"M,V",P,,
+#=,,,,,,,
+# 3GPP TS 29.154 Table A.6.3.1-1: Nta specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Access-Network-Reports,4210,A.6.3.2,Grouped,"M,V",P,,
+Event-Configuration,4211,A.6.3.3,Grouped,"M,V",P,,
+Event-Configuration-State,4212,A.6.3.4,Unsigned32,"M,V",P,,
+Event-Configuration-Status,4213,A.6.3.5,Grouped,"M,V",P,,
+Event-Reporting-Results,4214,A.6.3.6,Unsigned32,"M,V",P,,
+Event-Reports,4215,A.6.3.7,Grouped,"M,V",P,,
+Extended-SCEF-Reference-ID,4216,A.6.3.8,Unsigned64,"M,V",P,,
+,,,,,,,
+@standard,3GPP TS 29.172,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.172 V15.2.0 (2019-12),,,,,,,
+# Location Services (LCS);,,,,,,,
+# Evolved Packet Core (EPC) LCS Protocol (ELP) between the,,,,,,,
+# Gateway Mobile Location Centre (GMLC) and the,,,,,,,
+# Mobile Management Entity (MME);,,,,,,,
+# SLg interface,,,,,,,
+# ,,,,,,,
+# From 3GPP 29172-f20.docx,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.172 Table 7.4.1-1: Diameter ELP Application AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+SLg-Location-Type,2500,7.4.2,Enumerated,"M, V",,,
+LCS-EPS-Client-Name,2501,7.4.3,Grouped,"M, V",,,
+LCS-Requestor-Name,2502,7.4.4,Grouped,"M, V",,,
+LCS-Priority,2503,7.4.5,Unsigned32,"M, V",,,
+LCS-QoS,2504,7.4.6,Grouped,"M, V",,,
+Horizontal-Accuracy,2505,7.4.7,Unsigned32,"M, V",,,
+Vertical-Accuracy,2506,7.4.8,Unsigned32,"M, V",,,
+Vertical-Requested,2507,7.4.9,Enumerated,"M, V",,,
+Velocity-Requested,2508,7.4.10,Enumerated,"M, V",,,
+Response-Time,2509,7.4.11,Enumerated,"M, V",,,
+Supported-GAD-Shapes,2510,7.4.12,Unsigned32,"M, V",,,
+LCS-Codeword,2511,7.4.13,UTF8String,"M, V",,,
+LCS-Privacy-Check,2512,7.4.14,Enumerated,"M, V",,,
+Accuracy-Fulfilment-Indicator,2513,7.4.15,Enumerated,"M, V",,,
+Age-Of-Location-Estimate,2514,7.4.16,Unsigned32,"M, V",,,
+Velocity-Estimate,2515,7.4.17,OctetString,"M, V",,,
+EUTRAN-Positioning-Data,2516,7.4.18,OctetString,"M, V",,,
+ECGI,2517,7.4.19,OctetString,"M, V",,,
+Location-Event,2518,7.4.20,Enumerated,"M, V",,,
+Pseudonym-Indicator,2519,7.4.21,Enumerated,"M, V",,,
+LCS-Service-Type-ID,2520,7.4.22,Unsigned32,"M, V",,,
+LCS-Privacy-Check-Non-Session,2521,7.4.23,Grouped,"M, V",,,
+LCS-Privacy-Check-Session,2522,7.4.24,Grouped,"M, V",,,
+LCS-QoS-Class,2523,7.4.27,Enumerated,"M, V",,,
+GERAN-Positioning-Info,2524,7.4.29,Grouped,V,,,M
+GERAN-Positioning-Data,2525,7.4.30,OctetString,V,,,M
+GERAN-GANSS-Positioning-Data,2526,7.4.31,OctetString,V,,,M
+UTRAN-Positioning-Info,2527,7.4.32,Grouped,V,,,M
+UTRAN-Positioning-Data,2528,7.4.33,OctetString,V,,,M
+UTRAN-GANSS-Positioning-Data,2529,7.4.34,OctetString,V,,,M
+LRR-Flags,2530,7.4.35,Unsigned32,V,,,M
+LCS-Reference-Number,2531,7.4.37,OctetString,V,,,M
+Deferred-Location-Type,2532,7.4.36,Unsigned32,V,,,M
+Area-Event-Info,2533,7.4.38,Grouped,V,,,M
+Area-Definition,2534,7.4.39,Grouped,V,,,M
+Area,2535,7.4.40,Grouped,V,,,M
+Area-Type,2536,7.4.41,Unsigned32,V,,,M
+Area-Identification,2537,7.4.42,Grouped,V,,,M
+Occurrence-Info,2538,7.4.43,Enumerated,V,,,M
+Interval-Time,2539,7.4.44,Unsigned32,V,,,M
+Periodic-LDR-Information,2540,7.4.45,Grouped,V,,,M
+Reporting-Amount,2541,7.4.46,Unsigned32,V,,,M
+Reporting-Interval,2542,7.4.47,Unsigned32,V,,,M
+Reporting-PLMN-List,2543,7.4.48,Grouped,V,,,M
+PLMN-ID-List,2544,7.4.49,Grouped,V,,,M
+PLR-Flags,2545,7.4.52,Unsigned32,V,,,M
+PLA-Flags,2546,7.4.53,Unsigned32,V,,,M
+Deferred-MT-LR-Data,2547,7.4.54,Grouped,V,,,M
+Termination-Cause,2548,7.4.55,Unsigned32,V,,,M
+LRA-Flags,2549,7.4.56,Unsigned32,V,,,M
+Periodic-Location-Support-Indicator,2550,7.4.50,Enumerated,V,,,M
+Prioritized-List-Indicator,2551,7.4.51,Enumerated,V,,,M
+ESMLC-Cell-Info,2552,7.4.57,Grouped,V,,,M
+Cell-Portion-ID,2553,7.4.58,Unsigned32,V,,,M
+1xRTT-RCID,2554,7.4.59,OctetString,V,,,M
+Delayed-Location-Reporting-Data,2555,7.4.60,Grouped,V,,,M
+Civic-Address,2556,7.4.61,UTF8String,V,,,M
+Barometric-Pressure,2557,7.4.62,Unsigned32,V,,,M
+UTRAN-Additional-Positioning-Data,2558,7.4.63,OctetString,V,,,M
+Motion-Event-Info,2559,7.4.64,Grouped,V,,,M
+Linear-Distance,2560,7.4.65,Unsigned32,V,,,M
+Maximum-Interval,2561,7.4.66,Unsigned32,V,,,M
+Sampling-Interval,2562,7.4.67,Unsigned32,V,,,M
+Reporting-Duration,2563,7.4.68,Unsigned32,V,,,M
+Reporting-Location-Requirements,2564,7.4.69,Unsigned32,V,,,M
+Additional-Area,2565,7.4.70,Grouped,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.173,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.173 V15.0.0 (2018-06),,,,,,,
+# Location Services (LCS);,,,,,,,
+# Diameter-based SLh interface for Control Plane LCS,,,,,,,
+# ,,,,,,,
+# From 3GPP 29173-f00.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.173 Table 6.4.1/1: SLh specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+LMSI,2400,6.4.2,OctetString,"M,V",,,
+Serving-Node,2401,6.4.3,Grouped,"M,V",,,
+MME-Name,2402,6.4.4,DiameterIdentity,"M,V",,,
+MSC-Number,2403,6.4.5,OctetString,"M,V",,,
+LCS-Capabilities-Sets,2404,6.4.6,Unsigned32,"M,V",,,
+GMLC-Address,2405,6.4.7,Address,"M,V",,,
+Additional-Serving-Node,2406,6.4.8,Grouped,"M,V",,,
+PPR-Address,2407,6.4.9,Address,"M,V",,,
+MME-Realm,2408,6.4.12,DiameterIdentity,V,,,M
+SGSN-Name,2409,6.4.13,DiameterIdentity,V,,,M
+SGSN-Realm,2410,6.4.14,DiameterIdentity,V,,,M
+RIA-Flags,2411,6.4.15,Unsigned32,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.209,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.209 V6.8.0 (2011-09),,,,,,,
+# Policy control over Gq interface,,,,,,,
+# ,,,,,,,
+# From 3GPP 29209-680.doc,,,,,,,
+# ,,,,,,,
+# Replaced by 3GPP TS 29.214.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.209 Table 6.5.1: Gq specific Diameter AVPs,,,,,,,
+# Note: Only AVPs not provided by 3GPP TS 29.214.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Authorization-Token,506,6.5.7,OctetString,"M,V",P,,
+Flow-Grouping,508,6.5.9,Grouped,"M,V",P,,
+,,,,,,,
+@standard,3GPP TS 29.210,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.210 V6.7.0 (2006-12),,,,,,,
+# Charging rule provisioning over Gx interface,,,,,,,
+# ,,,,,,,
+# From 3GPP 29210-670.doc,,,,,,,
+# ,,,,,,,
+# Replaced by 3GPP TS 29.212.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.210 Table 5.2: Gx specific Diameter AVPs,,,,,,,
+# Note: Only AVPs not provided by 3GPP TS 29.212.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+PDP-Session-Operation,1015,5.2.21,Enumerated,"M,V",P,,
+,,,,,,,
+@standard,3GPP TS 29.212,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.212 V15.9.0 (2019-12),,,,,,,
+# Policy and Charging Control (PCC); Reference points,,,,,,,
+# ,,,,,,,
+# From 3GPP 29212-f90.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.212 Table 5.3.0.1: Gx specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+# Change-1.4.0: ADC-Revalidation-Time (2801) Time removed in 3GPP TS 29.212 V12.1.0 (2013-06).,,,,,,,
+#,,,,,,,
+# Note: Name conflict with 3GPP TS 32.299 3GPP-PS-Data-Off-Status (4406).,,,,,,,
+# 3GPP TS 29.212 V14.3.0 (2017-03) CR 1559 added 3GPP-PS-Data-Off-Status (2847).,,,,,,,
+# 3GPP TS 32.299 V14.3.0 (2017-03) CR 0760 added 3GPP-PS-Data-Off-Status (4406).,,,,,,,
+3GPP-PS-Data-Off-Status,2847,5.3.133,Enumerated,V,P,,M
+Access-Availability-Change-Reason,2833,5.3.121,Unsigned32,V,P,,M
+Access-Network-Charging-Identifier-Gx,1022,5.3.22,Grouped,"M,V",P,,
+Allocation-Retention-Priority,1034,5.3.32,Grouped,V,P,,M
+AN-GW-Address,1050,5.3.49,Address,V,P,,M
+AN-GW-Status,2811,5.3.100,Enumerated,V,P,,M
+APN-Aggregate-Max-Bitrate-DL,1040,5.3.39,Unsigned32,V,P,,M
+APN-Aggregate-Max-Bitrate-UL,1041,5.3.40,Unsigned32,V,P,,M
+Application-Detection-Information,1098,5.3.91,Grouped,V,P,,M
+Bearer-Control-Mode,1023,5.3.23,Enumerated,"M,V",P,,
+Bearer-Identifier,1020,5.3.20,OctetString,"M,V",P,,
+Bearer-Operation,1021,5.3.21,Enumerated,"M,V",P,,
+Bearer-Usage,1000,5.3.1,Enumerated,"M,V",P,,
+Charging-Correlation-Indicator,1073,5.3.67,Enumerated,V,P,,M
+Charging-Rule-Base-Name,1004,5.3.5,UTF8String,"M,V",P,,
+Charging-Rule-Definition,1003,5.3.4,Grouped,"M,V",P,,
+Charging-Rule-Install,1001,5.3.2,Grouped,"M,V",P,,
+Charging-Rule-Name,1005,5.3.6,OctetString,"M,V",P,,
+Charging-Rule-Remove,1002,5.3.3,Grouped,"M,V",P,,
+Charging-Rule-Report,1018,5.3.18,Grouped,"M,V",P,,
+CoA-Information,1039,5.3.37,Grouped,V,P,,M
+CoA-IP-Address,1035,5.3.33,Address,V,P,,M
+Conditional-APN-Aggregate-Max-Bitrate,2818,5.3.105,Grouped,V,P,,M
+Conditional-Policy-Information,2840,5.3.128,Grouped,V,P,,M
+Credit-Management-Status,1082,5.3.102,Unsigned32,V,P,,M
+CSG-Information-Reporting,1071,5.3.64,Enumerated,V,P,,M
+Default-Access,2829,5.3.120,Enumerated,V,P,,M
+Default-Bearer-Indication,2844,5.3.132,Enumerated,V,P,,M
+Default-EPS-Bearer-QoS,1049,5.3.48,Grouped,V,P,,M
+Default-QoS-Information,2816,5.3.103,Grouped,V,P,,M
+Default-QoS-Name,2817,5.3.104,UTF8String,V,P,,M
+Event-Report-Indication,1033,5.3.30,Grouped,V,P,,M
+Event-Trigger,1006,5.3.7,Enumerated,"M,V",P,,
+Execution-Time,2839,5.3.127,Time,V,P,,M
+Extended-APN-AMBR-DL,2848,5.3.134,Unsigned32,V,P,,M
+Extended-APN-AMBR-UL,2849,5.3.135,Unsigned32,V,P,,M
+Extended-GBR-DL,2850,5.3.136,Unsigned32,V,P,,M
+Extended-GBR-UL,2851,5.3.137,Unsigned32,V,P,,M
+Flow-Direction,1080,5.3.65,Enumerated,V,P,,M
+Flow-Information,1058,5.3.53,Grouped,V,P,,M
+Flow-Label,1057,5.3.52,OctetString,V,P,,M
+Fixed-User-Location-Info,2825,5.3.112,Grouped,V,P,,M
+Guaranteed-Bitrate-DL,1025,5.3.25,Unsigned32,"M,V",P,,
+Guaranteed-Bitrate-UL,1026,5.3.26,Unsigned32,"M,V",P,,
+# Note: HeNB-BBF-FQDN (2803) UTF8String removed in 3GPP TS 29.212 V11.8.0 (2013-03).,,,,,,,
+#,,,,,,,
+HeNB-Local-IP-Address,2804,5.3.95,Address,V,P,,M
+IP-CAN-Session-Charging-Scope,2827,5.3.114,Enumerated,V,P,,M
+IP-CAN-Type,1027,5.3.27,Enumerated,"M,V",P,,
+# Note: 3GPP TS 29.212 Table 5.3.0.1 row Max-PLR-DL (2852),,,,,,,
+# incorrectly lists type as Unsigned32 instead of Float32.,,,,,,,
+# 3GPP TS 29.212 clause 5.3.138 uses Float32.,,,,,,,
+# ,,,,,,,
+# Fix: Max-PLR-DL (2852) type changed from Float32 to Unsigned32.,,,,,,,
+Max-PLR-DL,2852,5.3.138,Unsigned32,V,P,,M
+# Note: 3GPP TS 29.212 Table 5.3.0.1 row Max-PLR-UL (2853),,,,,,,
+# incorrectly lists type as Unsigned32 instead of Float32.,,,,,,,
+# 3GPP TS 29.212 clause 5.3.139 uses Float32.,,,,,,,
+# ,,,,,,,
+# Fix: Max-PLR-UL (2853) type changed from Float32 to Unsigned32.,,,,,,,
+Max-PLR-UL,2853,5.3.139,Unsigned32,V,P,,M
+Metering-Method,1007,5.3.8,Enumerated,"M,V",P,,
+Monitoring-Flags,2828,5.3.115,Unsigned32,V,,,M
+Monitoring-Key,1066,5.3.59,OctetString,V,P,,M
+Mute-Notification,2809,5.3.98,Enumerated,V,P,,M
+Monitoring-Time,2810,5.3.99,Time,V,P,,M
+NBIFOM-Mode,2830,5.3.117,Enumerated,V,P,,M
+NBIFOM-Support,2831,5.3.116,Enumerated,V,P,,M
+NetLoc-Access-Support,2824,5.3.111,Unsigned32,V,P,,M
+Network-Request-Support,1024,5.3.24,Enumerated,"M,V",P,,
+Offline,1008,5.3.9,Enumerated,"M,V",P,,
+Online,1009,5.3.10,Enumerated,"M,V",P,,
+Packet-Filter-Content,1059,5.3.54,IPFilterRule,V,P,,M
+Packet-Filter-Identifier,1060,5.3.55,OctetString,V,P,,M
+Packet-Filter-Information,1061,5.3.56,Grouped,V,P,,M
+Packet-Filter-Operation,1062,5.3.57,Enumerated,V,P,,M
+Packet-Filter-Usage,1072,5.3.66,Enumerated,V,P,,M
+PCC-Rule-Status,1019,5.3.19,Enumerated,"M,V",P,,
+# Note: 3GPP TS 29.212 Table 5.3.0.1 row PDN-Connection-ID (1065),,,,,,,
+"# missing M, assume MUST NOT.",,,,,,,
+# ,,,,,,,
+# Change-1.4.0: PDN-Connection-ID (1065) flag M MUST NOT.,,,,,,,
+PDN-Connection-ID,1065,5.3.58,OctetString,V,P,,M
+PRA-Install,2845,5.3.130,Grouped,V,P,,M
+PRA-Remove,2846,5.3.131,Grouped,V,P,,M
+Precedence,1010,5.3.11,Unsigned32,"M,V",P,,
+Pre-emption-Capability,1047,5.3.46,Enumerated,V,P,,M
+Pre-emption-Vulnerability,1048,5.3.47,Enumerated,V,P,,M
+Presence-Reporting-Area-Elements-List,2820,5.3.107,OctetString,V,P,,M
+Presence-Reporting-Area-Identifier,2821,5.3.108,OctetString,V,P,,M
+Presence-Reporting-Area-Information,2822,5.3.109,Grouped,V,P,,M
+Presence-Reporting-Area-Node,2855,5.3.141,Unsigned32,V,P,,M
+Presence-Reporting-Area-Status,2823,5.3.110,Unsigned32,V,P,,M
+Priority-Level,1046,5.3.45,Unsigned32,V,P,,M
+# Note: 3GPP TS 29.212 Table 5.3.0.1 row PS-to-CS-Session-Continuity (1099),,,,,,,
+"# missing M, assume MUST NOT.",,,,,,,
+# ,,,,,,,
+# Change-1.4.0: PS-to-CS-Session-Continuity (1099) flag M MUST NOT.,,,,,,,
+PS-to-CS-Session-Continuity,1099,5.3.84,Enumerated,V,P,,M
+QoS-Class-Identifier,1028,5.3.17,Enumerated,"M,V",P,,
+QoS-Information,1016,5.3.16,Grouped,"M,V",P,,
+QoS-Negotiation,1029,5.3.28,Enumerated,"M,V",P,,
+QoS-Upgrade,1030,5.3.29,Enumerated,"M,V",P,,
+RAN-NAS-Release-Cause,2819,5.3.106,OctetString,V,P,,M
+RAN-Rule-Support,2832,5.3.122,Unsigned32,V,P,,M
+RAT-Type,1032,5.3.31,Enumerated,V,P,,M
+Redirect-Information,1085,5.3.82,Grouped,V,P,,M
+Redirect-Support,1086,5.3.83,Enumerated,V,P,,M
+Removal-Of-Access,2842,5.3.126,Enumerated,V,P,,M
+Reporting-Level,1011,5.3.12,Enumerated,"M,V",P,,
+Resource-Allocation-Notification,1063,5.3.50,Enumerated,V,P,,M
+Resource-Release-Notification,2841,5.3.125,Enumerated,V,P,,M
+Revalidation-Time,1042,5.3.41,Time,"M,V",P,,
+Routing-Filter,1078,5.3.72,Grouped,V,P,,M
+Routing-IP-Address,1079,5.3.73,Address,V,P,,M
+Routing-Rule-Definition,1076,5.3.70,Grouped,V,P,,M
+Routing-Rule-Identifier,1077,5.3.71,OctetString,V,P,,M
+Routing-Rule-Install,1081,5.3.68,Grouped,V,P,,M
+Routing-Rule-Remove,1075,5.3.69,Grouped,V,P,,M
+Routing-Rule-Failure-Code,2834,5.3.119,Unsigned32,V,P,,M
+Routing-Rule-Report,2835,5.3.118,Grouped,V,P,,M
+Rule-Activation-Time,1043,5.3.42,Time,"M,V",P,,
+Rule-Deactivation-Time,1044,5.3.43,Time,"M,V",P,,
+Rule-Failure-Code,1031,5.3.38,Enumerated,"M,V",P,,
+Security-Parameter-Index,1056,5.3.51,OctetString,V,P,,M
+Session-Release-Cause,1045,5.3.44,Enumerated,"M,V",P,,
+TCP-Source-Port,2843,5.3.129,Unsigned32,V,P,,M
+TDF-Information,1087,5.3.78,Grouped,V,P,,M
+TDF-Application-Identifier,1088,5.3.77,OctetString,V,P,,M
+TDF-Application-Instance-Identifier,2802,5.3.92,OctetString,V,P,,M
+TDF-Destination-Host,1089,5.3.80,DiameterIdentity,V,P,,M
+TDF-Destination-Realm,1090,5.3.79,DiameterIdentity,V,P,,M
+TDF-IP-Address,1091,5.3.81,Address,V,P,,M
+TFT-Filter,1012,5.3.13,IPFilterRule,"M,V",P,,
+TFT-Packet-Filter-Information,1013,5.3.14,Grouped,"M,V",P,,
+Traffic-Steering-Policy-Identifier-DL,2836,5.3.123,OctetString,V,P,,M
+Traffic-Steering-Policy-Identifier-UL,2837,5.3.124,OctetString,V,P,,M
+ToS-Traffic-Class,1014,5.3.15,OctetString,"M,V",P,,
+Tunnel-Header-Filter,1036,5.3.34,IPFilterRule,V,P,,M
+Tunnel-Header-Length,1037,5.3.35,Unsigned32,V,P,,M
+Tunnel-Information,1038,5.3.36,Grouped,V,P,,M
+UDP-Source-Port,2806,5.3.97,Unsigned32,V,P,,M
+UE-Local-IP-Address,2805,5.3.96,Address,V,P,,M
+UE-Status,2854,5.3.140,Unsigned32,V,P,,M
+Usage-Monitoring-Information,1067,5.3.60,Grouped,V,P,,M
+Usage-Monitoring-Level,1068,5.3.61,Enumerated,V,P,,M
+Usage-Monitoring-Report,1069,5.3.62,Enumerated,V,P,,M
+Usage-Monitoring-Support,1070,5.3.63,Enumerated,V,P,,M
+User-Location-Info-Time,2812,5.3.101,Time,V,P,,M
+PCSCF-Restoration-Indication,2826,5.3.113,Unsigned32,V,P,,M
+#=,,,,,,,
+# 3GPP TS 29.212 Table 5a.3.0.1: Gxx specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+QoS-Rule-Install,1051,5a.3.1,Grouped,"M,V",P,,
+QoS-Rule-Remove,1052,5a.3.2,Grouped,"M,V",P,,
+QoS-Rule-Definition,1053,5a.3.3,Grouped,"M,V",P,,
+QoS-Rule-Name,1054,5a.3.4,OctetString,"M,V",P,,
+QoS-Rule-Base-Name,1074,5a.3.7,UTF8String,V,P,,M
+QoS-Rule-Report,1055,5a.3.5,Grouped,"M,V",P,,
+Session-Linking-Indicator,1064,5a.3.6,Enumerated,"M,V",P,,
+#=,,,,,,,
+# 3GPP TS 29.212 Table 5b.3.0.1: Sd specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+# Change-1.4.0: ADC-Rule-Base-Name (1095) flag M MUST.,,,,,,,
+ADC-Rule-Base-Name,1095,5b.3.4,UTF8String,"M,V",P,,
+# Change-1.4.0: ADC-Rule-Definition (1094) flag M MUST.,,,,,,,
+ADC-Rule-Definition,1094,5b.3.3,Grouped,"M,V",P,,
+# Change-1.4.0: ADC-Rule-Install (1092) flag M MUST.,,,,,,,
+ADC-Rule-Install,1092,5b.3.1,Grouped,"M,V",P,,
+# Change-1.4.0: ADC-Rule-Name (1096) flag M MUST.,,,,,,,
+ADC-Rule-Name,1096,5b.3.5,OctetString,"M,V",P,,
+# Change-1.4.0: ADC-Rule-Remove (1093) flag M MUST.,,,,,,,
+ADC-Rule-Remove,1093,5b.3.2,Grouped,"M,V",P,,
+# Change-1.4.0: ADC-Rule-Report (1097) flag M MUST.,,,,,,,
+ADC-Rule-Report,1097,5b.3.6,Grouped,"M,V",P,,
+#=,,,,,,,
+# 3GPP TS 29.212 Table 5c.3.1.1: St specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Request-Type,2838,5c.3.2,Unsigned32,"M,V",P,,
+#=,,,,,,,
+# 3GPP TS 29.212 Table E.6.3.1.1: S15 specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+CS-Service-Qos-Request-Identifier,2807,E.6.3.2,OctetString,"M, V",P,,
+CS-Service-QoS-Request-Operation,2808,E.6.3.3,Enumerated,"M, V",P,,
+CS-Service-Resource-Report,2813,E.6.3.6,Grouped,"M, V",P,,
+CS-Service-Resource-Failure-Cause,2814,E.6.3.5,Enumerated,"M, V",P,,
+CS-Service-Resource-Result-Operation,2815,E.6.3.4,Enumerated,"M, V",P,,
+,,,,,,,
+@standard,3GPP TS 29.214,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.214 V15.7.0 (2019-09),,,,,,,
+# Policy and Charging Control over Rx reference point,,,,,,,
+# ,,,,,,,
+# From 3GPP 29214-f70.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.214 Table 5.3.0.1: Rx specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Abort-Cause,500,5.3.1,Enumerated,"M,V",P,,
+Access-Network-Charging-Address,501,5.3.2,Address,"M,V",P,,
+Access-Network-Charging-Identifier,502,5.3.3,Grouped,"M,V",P,,
+Access-Network-Charging-Identifier-Value,503,5.3.4,OctetString,"M,V",P,,
+Acceptable-Service-Info,526,5.3.24,Grouped,"M,V",P,,
+AF-Application-Identifier,504,5.3.5,OctetString,"M,V",P,,
+AF-Charging-Identifier,505,5.3.6,OctetString,"M,V",P,,
+AF-Requested-Data,551,5.3.50,Unsigned32,V,P,,M
+AF-Signalling-Protocol,529,5.3.26,Enumerated,V,P,,M
+Application-Service-Provider-Identity,532,5.3.29,UTF8String,V,P,,M
+Codec-Data,524,5.3.7,OctetString,"M,V",P,,
+Content-Version,552,5.3.49,Unsigned64,V,P,,M
+Extended-Max-Requested-BW-DL,554,5.3.52,Unsigned32,V,P,,M
+Extended-Max-Requested-BW-UL,555,5.3.53,Unsigned32,V,P,,M
+Extended-Max-Supported-BW-DL,556,5.3.54,Unsigned32,V,P,,M
+Extended-Max-Supported-BW-UL,557,5.3.55,Unsigned32,V,P,,M
+Extended-Min-Desired-BW-DL,558,5.3.56,Unsigned32,V,P,,M
+Extended-Min-Desired-BW-UL,559,5.3.57,Unsigned32,V,P,,M
+Extended-Min-Requested-BW-DL,560,5.3.58,Unsigned32,V,P,,M
+Extended-Min-Requested-BW-UL,561,5.3.59,Unsigned32,V,P,,M
+Flow-Description,507,5.3.8,IPFilterRule,"M,V",P,,
+Flow-Number,509,5.3.9,Unsigned32,"M,V",P,,
+Flows,510,5.3.10,Grouped,"M,V",P,,
+Flow-Status,511,5.3.11,Enumerated,"M,V",P,,
+Flow-Usage,512,5.3.12,Enumerated,"M,V",P,,
+GCS-Identifier,538,5.3.36,OctetString,V,P,,M
+# Note: 3GPP TS 29.214 Table 5.3.0.1 row IMS-Content-Identifier (563),,,,,,,
+"# missing M, assume MUST NOT.",,,,,,,
+# ,,,,,,,
+# Fix: IMS-Content-Identifier (563) flag M MUST NOT.,,,,,,,
+IMS-Content-Identifier,563,5.3.60,OctetString,V,P,,M
+# Note: 3GPP TS 29.214 Table 5.3.0.1 row IMS-Content (564),,,,,,,
+"# missing M, assume MUST NOT.",,,,,,,
+# ,,,,,,,
+# Fix: IMS-Content (564) flag M MUST NOT.,,,,,,,
+IMS-Content-Type,564,5.3.61,Enumerated,V,P,,M
+IP-Domain-Id,537,5.3.35,OctetString,V,P,,M
+Max-Requested-Bandwidth-DL,515,5.3.14,Unsigned32,"M,V",P,,
+Max-Requested-Bandwidth-UL,516,5.3.15,Unsigned32,"M,V",P,,
+Max-Supported-Bandwidth-DL,543,5.3.41,Unsigned32,V,P,,M
+Max-Supported-Bandwidth-UL,544,5.3.42,Unsigned32,V,P,,M
+MCPTT-Identifier,547,5.3.45,OctetString,V,P,,M
+MCVideo-Identifier,562,5.3.45a,OctetString,V,P,,M
+Media-Component-Description,517,5.3.16,Grouped,"M,V",P,,
+Media-Component-Number,518,5.3.17,Unsigned32,"M,V",P,,
+Media-Component-Status,549,5.3.48,Unsigned32,V,P,,M
+Media-Sub-Component,519,5.3.18,Grouped,"M,V",P,,
+Media-Type,520,5.3.19,Enumerated,"M,V",P,,
+MPS-Identifier,528,5.3.30,OctetString,V,P,,M
+Min-Desired-Bandwidth-DL,545,5.3.43,Unsigned32,V,P,,M
+Min-Desired-Bandwidth-UL,546,5.3.44,Unsigned32,V,P,,M
+Min-Requested-Bandwidth-DL,534,5.3.32,Unsigned32,V,P,,M
+Min-Requested-Bandwidth-UL,535,5.3.33,Unsigned32,V,P,,M
+Priority-Sharing-Indicator,550,5.3.47,Enumerated,V,P,,M
+Pre-emption-Control-Info,553,5.3.51,Unsigned32,V,P,,M
+Required-Access-Info,536,5.3.34,Enumerated,V,P,,M
+Retry-Interval,541,5.3.39,Unsigned32,V,P,,M
+Rx-Request-Type,533,5.3.31,Enumerated,V,P,,M
+RR-Bandwidth,521,5.3.20,Unsigned32,"M,V",P,,
+RS-Bandwidth,522,5.3.21,Unsigned32,"M,V",P,,
+Service-Authorization-Info,548,5.3.46,Unsigned32,V,P,,M
+Service-URN,525,5.3.23,OctetString,"M,V",P,,
+Service-Info-Status,527,5.3.25,Enumerated,"M,V",P,,
+Sharing-Key-DL,539,5.3.37,Unsigned32,V,P,,M
+Sharing-Key-UL,540,5.3.38,Unsigned32,V,P,,M
+Specific-Action,513,5.3.13,Enumerated,"M,V",P,,
+SIP-Forking-Indication,523,5.3.22,Enumerated,"M,V",P,,
+Sponsor-Identity,531,5.3.28,UTF8String,V,P,,M
+Sponsored-Connectivity-Data,530,5.3.27,Grouped,V,P,,M
+Sponsoring-Action,542,5.3.40,Enumerated,V,P,,M
+,,,,,,,
+@standard,3GPP TS 29.215,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.215 V15.2.0 (2019-09),,,,,,,
+# Policy and Charging Control (PCC) over S9 reference point;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29215-f20.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.215 Table 5.3.0.1: S9 specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+DRA-Deployment,2206,5.3.7,Enumerated,V,P,,M
+Multiple-BBERF-Action,2204,5.3.6,Enumerated,"M,V",P,,
+Subsession-Decision-Info,2200,5.3.1,Grouped,"M,V",P,,
+Subsession-Enforcement-Info,2201,5.3.2,Grouped,"M,V",P,,
+Subsession-Id,2202,5.3.3,Unsigned32,"M,V",P,,
+Subsession-Operation,2203,5.3.4,Enumerated,"M,V",P,,
+DRA-Binding,2208,5.3.x,Enumerated,V,P,,M
+#=,,,,,,,
+# 3GPP TS 29.215 Table A.7.3.1.1: S9a specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+PCRF-Address,2207,A.7.3.1.1,DiameterIdentity,"V,M",P,,
+#=,,,,,,,
+# 3GPP TS 29.215 Table A.8.3.1.1: S9a* specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+UE-Local-IPv6-Prefix,2205,A.8.3.1,OctetString,"V,M",P,,
+,,,,,,,
+@standard,3GPP TS 29.217,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.217 V15.1.0 (2019-09),,,,,,,
+# Policy and Charging Control (PCC);,,,,,,,
+# Congestion reporting over Np reference point,,,,,,,
+# ,,,,,,,
+# From 3GPP 29217-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.217 Table 5.3.1.1: Np specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Aggregated-Congestion-Info,4000,5.3.2,Grouped,"V, M",P,,
+Aggregated-RUCI-Report,4001,5.3.3,Grouped,"V, M",P,,
+Congestion-Level-Definition,4002,5.3.4,Grouped,V,P,,M
+Congestion-Level-Range,4003,5.3.5,Unsigned32,V,P,,M
+Congestion-Level-Set-Id,4004,5.3.6,Unsigned32,V,P,,M
+Congestion-Level-Value,4005,5.3.7,Unsigned32,"V, M",P,,
+Congestion-Location-Id,4006,5.3.8,Grouped,V,P,,M
+Conditional-Restriction,4007,5.3.9,Unsigned32,V,P,,M
+eNodeB-Id,4008,5.3.10,OctetString,"V, M",P,,
+IMSI-List,4009,5.3.11,OctetString,"V, M",P,,
+RCAF-Id,4010,5.3.12,DiameterIdentity,"V, M",P,,
+Reporting-Restriction,4011,5.3.13,Unsigned32,V,P,,M
+RUCI-Action,4012,5.3.14,Unsigned32,V,P,,M
+Extended-eNodeB-Id,4013,5.3.15,OctetString,"V, ",P,,M
+,,,,,,,
+@standard,3GPP TS 29.219,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.219 V15.3.0 (2019-09),,,,,,,
+# Policy and Charging Control: Spending Limit Reporting over,,,,,,,
+# Sy reference point,,,,,,,
+# ,,,,,,,
+# From 3GPP 29219-f30.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.219 Table 5.3.0.1: Sy specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Pending-Policy-Counter-Information,2905,5.3.5,Grouped,"M,V",P,,
+Pending-Policy-Counter-Change-Time,2906,5.3.6,Time,"M,V",P,,
+Policy-Counter-Identifier,2901,5.3.1,UTF8String,"M,V",P,,
+Policy-Counter-Status,2902,5.3.2,UTF8String,"M,V",P,,
+Policy-Counter-Status-Report,2903,5.3.3,Grouped,"M,V",P,,
+SL-Request-Type,2904,5.3.4,Enumerated,"M,V",P,,
+SN-Request-Type,2907,5.3.7,Unsigned32,V,P,,M
+,,,,,,,
+@standard,3GPP TS 29.229,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.229 V15.2.0 (2019-09),,,,,,,
+# Cx and Dx interfaces based on the Diameter protocol;,,,,,,,
+# Protocol details,,,,,,,
+# ,,,,,,,
+# From 3GPP 29229-f20.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.229 Table 6.3.1: Diameter Multimedia Application AVPs,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Visited-Network-Identifier,600,6.3.1,OctetString,"M, V",,,
+Public-Identity,601,6.3.2,UTF8String,"M, V",,,
+Server-Name,602,6.3.3,UTF8String,"M, V",,,
+Server-Capabilities,603,6.3.4,Grouped,"M, V",,,
+Mandatory-Capability,604,6.3.5,Unsigned32,"M, V",,,
+Optional-Capability,605,6.3.6,Unsigned32,"M, V",,,
+# Note: Name conflict with 3GPP TS 29.329 User-Data (702).,,,,,,,
+# 3GPP TS 29.229 V6.2.0 (2004-09) allocated User-Data (606).,,,,,,,
+# 3GPP TS 29.329 V6.2.0 (2004-09) allocated User-Data (702).,,,,,,,
+User-Data,606,6.3.7,OctetString,"M, V",,,
+SIP-Number-Auth-Items,607,6.3.8,Unsigned32,"M, V",,,
+SIP-Authentication-Scheme,608,6.3.9,UTF8String,"M, V",,,
+SIP-Authenticate,609,6.3.10,OctetString,"M, V",,,
+SIP-Authorization,610,6.3.11,OctetString,"M, V",,,
+SIP-Authentication-Context,611,6.3.12,OctetString,"M, V",,,
+SIP-Auth-Data-Item,612,6.3.13,Grouped,"M, V",,,
+SIP-Item-Number,613,6.3.14,Unsigned32,"M, V",,,
+Server-Assignment-Type,614,6.3.15,Enumerated,"M, V",,,
+Deregistration-Reason,615,6.3.16,Grouped,"M, V",,,
+Reason-Code,616,6.3.17,Enumerated,"M, V",,,
+Reason-Info,617,6.3.18,UTF8String,"M, V",,,
+Charging-Information,618,6.3.19,Grouped,"M, V",,,
+Primary-Event-Charging-Function-Name,619,6.3.20,DiameterURI,"M, V",,,
+Secondary-Event-Charging-Function-Name,620,6.3.21,DiameterURI,"M, V",,,
+Primary-Charging-Collection-Function-Name,621,6.3.22,DiameterURI,"M, V",,,
+Secondary-Charging-Collection-Function-Name,622,6.3.23,DiameterURI,"M, V",,,
+User-Authorization-Type,623,6.3.24,Enumerated,"M, V",,,
+User-Data-Already-Available,624,6.3.26,Enumerated,"M, V",,,
+Confidentiality-Key,625,6.3.27,OctetString,"M, V",,,
+Integrity-Key,626,6.3.28,OctetString,"M, V",,,
+# Note: User-Data-Request-Type (627) removed in 3GPP TS 29.229 V6.5.0 (2005-06).,,,,,,,
+#,,,,,,,
+Supported-Features,628,6.3.29,Grouped,V,M,,
+Feature-List-ID,629,6.3.30,Unsigned32,V,,,M
+Feature-List,630,6.3.31,Unsigned32,V,,,M
+Supported-Applications,631,6.3.32,Grouped,V,,,M
+Associated-Identities,632,6.3.33,Grouped,V,,,M
+Originating-Request,633,6.3.34,Enumerated,"M,V",,,
+Wildcarded-Public-Identity,634,6.3.35,UTF8String,V,,,M
+SIP-Digest-Authenticate,635,6.3.36,Grouped,V,,,M
+Wildcarded-IMPU,636,6.3.43,UTF8String,V,,,M
+UAR-Flags,637,6.3.44,Unsigned32,V,,,M
+Loose-Route-Indication,638,6.3.45,Enumerated,V,,,M
+SCSCF-Restoration-Info,639,6.3.46,Grouped,V,,,M
+Path,640,6.3.47,OctetString,V,,,M
+Contact,641,6.3.48,OctetString,V,,,M
+Subscription-Info,642,6.3.49,Grouped,V,,,M
+Call-ID-SIP-Header,643,6.3.49.1,OctetString,V,,,M
+From-SIP-Header,644,6.3.49.2,OctetString,V,,,M
+To-SIP-Header,645,6.3.49.3,OctetString,V,,,M
+Record-Route,646,6.3.49.4,OctetString,V,,,M
+Associated-Registered-Identities,647,6.3.50,Grouped,V,,,M
+Multiple-Registration-Indication,648,6.3.51,Enumerated,V,,,M
+Restoration-Info,649,6.3.52,Grouped,V,,,M
+Session-Priority,650,6.3.56,Enumerated,V,,,M
+Identity-with-Emergency-Registration,651,6.3.57,Grouped,V,,,M
+Priviledged-Sender-Indication,652,6.3.58,Enumerated,V,,,M
+LIA-Flags,653,6.3.59,Unsigned32,V,,,M
+Initial-CSeq-Sequence-Number,654,6.3.62,Unsigned32,V,,,M
+SAR-Flags,655,6.3.63,Unsigned32,V,,,M
+Allowed-WAF-WWSF-Identities,656,6.3.64,Grouped,V,,,M
+WebRTC-Authentication-Function-Name,657,6.3.65,UTF8String,V,,,M
+WebRTC-Web-Server-Function-Name,658,6.3.66,UTF8String,V,,,M
+RTR-Flags,659,6.3.69,Unsigned32,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.234,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.234 V11.2.0 (2013-06),,,,,,,
+# 3GPP system to Wireless Local Area Network (WLAN),,,,,,,
+# interworking;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29234-b20.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.234 Table 10.1.1: Diameter Multimedia Application AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+3GPP-WLAN-APN-Id,100,10.1.15,OctetString,"M, V",,,
+Authentication-Method,300,10.1.5,Enumerated,"M, V",,,
+Authentication-Information-SIM,301,10.1.6,OctetString,"M, V",,,
+Authorization-Information-SIM,302,10.1.7,OctetString,"M,V",,,
+WLAN-User-Data,303,10.1.8,Grouped,"M, V",,,
+Charging-Data,304,10.1.10,Grouped,"M, V",,,
+WLAN-Access,305,10.1.11,Enumerated,"M, V",,,
+WLAN-3GPP-IP-Access,306,10.1.12,Enumerated,"M, V",,,
+APN-Authorized,307,10.1.14,Grouped,"M, V",,,
+# Note: APN-Id (308) OctetString removed in 3GPP TS 29.234 V6.5.0 (2005-12).,,,,,,,
+#,,,,,,,
+APN-Barring-Type,309,10.1.16,Enumerated,"M, V",,,
+WLAN-Direct-IP-Access,310,10.1.17,Enumerated,"M, V",,,
+Session-Request-Type,311,10.1.23,Enumerated,"M, V",,,
+Routing-Policy,312,10.1.24,IPFilterRule,"M, V",,,
+Max-Requested-Bandwidth,313,10.1.26,OctetString,"M, V",,,
+Charging-Characteristics,314,10.1.27,Integer32,"M, V",,,
+Charging-Nodes,315,10.1.28,Grouped,"M, V",,,
+Primary-OCS-Charging-Function-Name,316,10.1.29,DiameterIdentity,"M, V",,,
+Secondary-OCS-Charging-Function-Name,317,10.1.30,DiameterIdentity,"M, V",,,
+# Note: 3GPP TS 29.273 from Release 12 now defines 3GPP-AAA-Server-Name (318).,,,,,,,
+# ,,,,,,,
+Maximum-Number-Accesses,319,10.1.38,Unsigned32,"M, V",,,
+,,,,,,,
+@standard,3GPP TS 29.272,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.272 V15.10.0 (2019-12),,,,,,,
+# Mobility Management Entity (MME),,,,,,,
+# and Serving GPRS Support Node (SGSN) related interfaces,,,,,,,
+# based on Diameter protocol,,,,,,,
+# ,,,,,,,
+# From 3GPP 29272-fa0.docx,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+"# 3GPP TS 29.272 Table 7.3.1/1: S6a/S6d, S7a/S7d and S13/S13' specific DiameterAVPs",,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Subscription-Data,1400,7.3.2,Grouped,"M,V",,,
+Terminal-Information,1401,7.3.3,Grouped,"M,V",,,
+IMEI,1402,7.3.4,UTF8String,"M,V",,,
+Software-Version,1403,7.3.5,UTF8String,"M,V",,,
+QoS-Subscribed,1404,7.3.77,OctetString,"M,V",,,
+ULR-Flags,1405,7.3.7,Unsigned32,"M,V",,,
+ULA-Flags,1406,7.3.8,Unsigned32,"M,V",,,
+Visited-PLMN-Id,1407,7.3.9,OctetString,"M,V",,,
+Requested-EUTRAN-Authentication-Info,1408,7.3.11,Grouped,"M,V",,,
+Requested-UTRAN-GERAN-Authentication-Info,1409,7.3.12,Grouped,"M,V",,,
+Number-Of-Requested-Vectors,1410,7.3.14,Unsigned32,"M,V",,,
+Re-Synchronization-Info,1411,7.3.15,OctetString,"M,V",,,
+Immediate-Response-Preferred,1412,7.3.16,Unsigned32,"M,V",,,
+Authentication-Info,1413,7.3.17,Grouped,"M,V",,,
+E-UTRAN-Vector,1414,7.3.18,Grouped,"M,V",,,
+UTRAN-Vector,1415,7.3.19,Grouped,"M,V",,,
+GERAN-Vector,1416,7.3.20,Grouped,"M,V",,,
+Network-Access-Mode,1417,7.3.21,Enumerated,"M,V",,,
+HPLMN-ODB,1418,7.3.22,Unsigned32,"M,V",,,
+Item-Number,1419,7.3.23,Unsigned32,"M,V",,,
+Cancellation-Type,1420,7.3.24,Enumerated,"M,V",,,
+DSR-Flags,1421,7.3.25,Unsigned32,"M,V",,,
+DSA-Flags,1422,7.3.26,Unsigned32,"M,V",,,
+Context-Identifier,1423,7.3.27,Unsigned32,"M,V",,,
+Subscriber-Status,1424,7.3.29,Enumerated,"M,V",,,
+Operator-Determined-Barring,1425,7.3.30,Unsigned32,"M,V",,,
+Access-Restriction-Data,1426,7.3.31,Unsigned32,"M,V",,,
+APN-OI-Replacement,1427,7.3.32,UTF8String,"M,V",,,
+All-APN-Configurations-Included-Indicator,1428,7.3.33,Enumerated,"M,V",,,
+APN-Configuration-Profile,1429,7.3.34,Grouped,"M,V",,,
+APN-Configuration,1430,7.3.35,Grouped,"M,V",,,
+EPS-Subscribed-QoS-Profile,1431,7.3.37,Grouped,"M,V",,,
+VPLMN-Dynamic-Address-Allowed,1432,7.3.38,Enumerated,"M,V",,,
+STN-SR,1433,7.3.39,OctetString,"M,V",,,
+Alert-Reason,1434,7.3.83,Enumerated,"M,V",,,
+AMBR,1435,7.3.41,Grouped,"M,V",,,
+CSG-Subscription-Data,1436,7.3.78,Grouped,"M,V",,,
+CSG-Id,1437,7.3.79,Unsigned32,"M,V",,,
+PDN-GW-Allocation-Type,1438,7.3.44,Enumerated,"M,V",,,
+Expiration-Date,1439,7.3.80,Time,"M,V",,,
+RAT-Frequency-Selection-Priority-ID,1440,7.3.46,Unsigned32,"M,V",,,
+IDA-Flags,1441,7.3.47,Unsigned32,"M,V",,,
+PUA-Flags,1442,7.3.48,Unsigned32,"M,V",,,
+NOR-Flags,1443,7.3.49,Unsigned32,"M,V",,,
+User-Id,1444,7.3.50,UTF8String,V,,,M
+Equipment-Status,1445,7.3.51,Enumerated,"M,V",,,
+Regional-Subscription-Zone-Code,1446,7.3.52,OctetString,"M,V",,,
+RAND,1447,7.3.53,OctetString,"M,V",,,
+XRES,1448,7.3.54,OctetString,"M,V",,,
+AUTN,1449,7.3.55,OctetString,"M,V",,,
+KASME,1450,7.3.56,OctetString,"M,V",,,
+Trace-Collection-Entity,1452,7.3.98,Address,"M,V",,,
+Kc,1453,7.3.59,OctetString,"M,V",,,
+SRES,1454,7.3.60,OctetString,"M,V",,,
+PDN-Type,1456,7.3.62,Enumerated,"M,V",,,
+Roaming-Restricted-Due-To-Unsupported-Feature,1457,7.3.81,Enumerated,"M,V",,,
+Trace-Data,1458,7.3.63,Grouped,"M,V",,,
+Trace-Reference,1459,7.3.64,OctetString,"M,V",,,
+Trace-Depth,1462,7.3.67,Enumerated,"M,V",,,
+Trace-NE-Type-List,1463,7.3.68,OctetString,"M,V",,,
+Trace-Interface-List,1464,7.3.69,OctetString,"M,V",,,
+Trace-Event-List,1465,7.3.70,OctetString,"M,V",,,
+OMC-Id,1466,7.3.71,OctetString,"M,V",,,
+GPRS-Subscription-Data,1467,7.3.72,Grouped,"M,V",,,
+Complete-Data-List-Included-Indicator,1468,7.3.73,Enumerated,"M,V",,,
+PDP-Context,1469,7.3.74,Grouped,"M,V",,,
+PDP-Type,1470,7.3.75,OctetString,"M,V",,,
+3GPP2-MEID,1471,7.3.6,OctetString,"M,V",,,
+Specific-APN-Info,1472,7.3.82,Grouped,"M,V",,,
+LCS-Info,1473,7.3.84,Grouped,"M,V",,,
+GMLC-Number,1474,7.3.85,OctetString,"M,V",,,
+LCS-PrivacyException,1475,7.3.86,Grouped,"M,V",,,
+SS-Code,1476,7.3.87,OctetString,"M,V",,,
+# Note: 3GPP TS 29.272 V12.5.0 (2014-06) Table 7.3.1/1,,,,,,,
+# changed row SS-Status (1477) to be OctetString instead of Grouped.,,,,,,,
+# Clause 7.3.88 already described SS-Status (1147) as OctetString.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: SS-Status (1477) type changed from Grouped to OctetString.,,,,,,,
+SS-Status,1477,7.3.88,OctetString,"M,V",,,
+Notification-To-UE-User,1478,7.3.89,Enumerated,"M,V",,,
+External-Client,1479,7.3.90,Grouped,"M,V",,,
+Client-Identity,1480,7.3.91,OctetString,"M,V",,,
+GMLC-Restriction,1481,7.3.92,Enumerated,"M,V",,,
+PLMN-Client,1482,7.3.93,Enumerated,"M,V",,,
+Service-Type,1483,7.3.94,Grouped,"M,V",,,
+ServiceTypeIdentity,1484,7.3.95,Unsigned32,"M,V",,,
+MO-LR,1485,7.3.96,Grouped,"M,V",,,
+Teleservice-List,1486,7.3.99,Grouped,"M,V",,,
+TS-Code,1487,7.3.100,OctetString,"M,V",,,
+# Note: 3GPP TS 29.272 V12.4.0 (2014-03) renamed,,,,,,,
+# Call-Barring-Infor-List (1488) to Call-Barring-Info (1488).,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: Call-Barring-Infor-List (1488) renamed to Call-Barring-Info (1488).,,,,,,,
+Call-Barring-Info,1488,7.3.101,Grouped,"M,V",,,
+SGSN-Number,1489,7.3.102,OctetString,"M,V",,,
+IDR-Flags,1490,7.3.103,Unsigned32,"M,V",,,
+ICS-Indicator,1491,7.3.104,Enumerated,V,,,M
+IMS-Voice-Over-PS-Sessions-Supported,1492,7.3.106,Enumerated,V,,,M
+Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions,1493,7.3.107,Enumerated,V,,,M
+Last-UE-Activity-Time,1494,7.3.108,Time,V,,,M
+EPS-User-State,1495,7.3.110,Grouped,V,,,M
+EPS-Location-Information,1496,7.3.111,Grouped,V,,,M
+MME-User-State,1497,7.3.112,Grouped,V,,,M
+SGSN-User-State,1498,7.3.113,Grouped,V,,,M
+User-State,1499,7.3.114,Enumerated,V,,,M
+# Note: 3GPP TS 29.272 Table 7.3.1/1 row MME-Location-Information (1600),,,,,,,
+# incorrectly has a space instead of hyphen in the name.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: MME-LocationInformation (1600) renamed to MME-Location-Information(1600).,,,,,,,
+MME-Location-Information,1600,7.3.115,Grouped,V,,,M
+SGSN-Location-Information,1601,7.3.116,Grouped,V,,,M
+E-UTRAN-Cell-Global-Identity,1602,7.3.117,OctetString,V,,,M
+Tracking-Area-Identity,1603,7.3.118,OctetString,V,,,M
+Cell-Global-Identity,1604,7.3.119,OctetString,V,,,M
+Routing-Area-Identity,1605,7.3.120,OctetString,V,,,M
+Location-Area-Identity,1606,7.3.121,OctetString,V,,,M
+Service-Area-Identity,1607,7.3.122,OctetString,V,,,M
+Geographical-Information,1608,7.3.123,OctetString,V,,,M
+Geodetic-Information,1609,7.3.124,OctetString,V,,,M
+Current-Location-Retrieved,1610,7.3.125,Enumerated,V,,,M
+Age-Of-Location-Information,1611,7.3.126,Unsigned32,V,,,M
+Active-APN,1612,7.3.127,Grouped,V,,,M
+Error-Diagnostic,1614,7.3.128,Enumerated,V,,,M
+Ext-PDP-Address,1621,7.3.129,Address,V,,,M
+UE-SRVCC-Capability,1615,7.3.130,Enumerated,V,,,M
+MPS-Priority,1616,7.3.131,Unsigned32,V,,,M
+VPLMN-LIPA-Allowed,1617,7.3.132,Enumerated,V,,,M
+LIPA-Permission,1618,7.3.133,Enumerated,V,,,M
+Subscribed-Periodic-RAU-TAU-Timer,1619,7.3.134,Unsigned32,V,,,M
+Ext-PDP-Type,1620,7.3.75A,OctetString,V,,,M
+SIPTO-Permission,1613,7.3.135,Enumerated,V,,,M
+MDT-Configuration,1622,7.3.136,Grouped,V,,,M
+Job-Type,1623,7.3.137,Enumerated,V,,,M
+Area-Scope,1624,7.3.138,Grouped,V,,,M
+List-Of-Measurements,1625,7.3.139,Unsigned32,V,,,M
+Reporting-Trigger,1626,7.3.140,Unsigned32,V,,,M
+Report-Interval,1627,7.3.141,Enumerated,V,,,M
+Report-Amount,1628,7.3.142,Enumerated,V,,,M
+Event-Threshold-RSRP,1629,7.3.143,Unsigned32,V,,,M
+Event-Threshold-RSRQ,1630,7.3.144,Unsigned32,V,,,M
+Logging-Interval,1631,7.3.145,Enumerated,V,,,M
+Logging-Duration,1632,7.3.146,Enumerated,V,,,M
+Relay-Node-Indicator,1633,7.3.147,Enumerated,V,,,M
+MDT-User-Consent,1634,7.3.148,Enumerated,V,,,M
+PUR-Flags,1635,7.3.149,Unsigned32,V,,,M
+Subscribed-VSRVCC,1636,7.3.150,Enumerated,V,,,M
+Equivalent-PLMN-List,1637,7.3.151,Grouped,V,,,M
+CLR-Flags,1638,7.3.152,Unsigned32,V,,,M
+UVR-Flags,1639,7.3.153,Unsigned32,"M,V",,,
+UVA-Flags,1640,7.3.154,Unsigned32,"M,V",,,
+VPLMN-CSG-Subscription-Data,1641,7.3.155,Grouped,"M,V",,,
+Time-Zone,1642,7.3.163,UTF8String,V,,,M
+A-MSISDN,1643,7.3.157,OctetString,V,,,M
+MME-Number-for-MT-SMS,1645,7.3.159,OctetString,V,,,M
+SMS-Register-Request,1648,7.3.162,Enumerated,V,,,M
+Local-Time-Zone,1649,7.3.156,Grouped,V,,,M
+Daylight-Saving-Time,1650,7.3.164,Enumerated,V,,,M
+Subscription-Data-Flags,1654,7.3.165,Unsigned32,V,,,M
+# Note: 3GPP TS 29.272 V12.9.0 (2015-12) changed AVP code of,,,,,,,
+# Measurement-Period-LTE (1655) from 1656.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: Measurement-Period-LTE (1656) code changed to Measurement-Period-LTE (1655).,,,,,,,
+Measurement-Period-LTE,1655,7.3.166,Enumerated,V,,,M
+# Note: 3GPP TS 29.272 V12.9.0 (2015-12) changed AVP code of,,,,,,,
+# Measurement-Period-UMTS (1656) from 1655.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: Measurement-Period-UMTS (1655) code changed to Measurement-Period-UMTS (1656).,,,,,,,
+Measurement-Period-UMTS,1656,7.3.167,Enumerated,V,,,M
+Collection-Period-RRM-LTE,1657,7.3.168,Enumerated,V,,,M
+Collection-Period-RRM-UMTS,1658,7.3.169,Enumerated,V,,,M
+Positioning-Method,1659,7.3.170,OctetString,V,,,M
+Measurement-Quantity,1660,7.3.171,OctetString,V,,,M
+Event-Threshold-Event-1F,1661,7.3.172,Integer32,V,,,M
+Event-Threshold-Event-1I,1662,7.3.173,Integer32,V,,,M
+Restoration-Priority,1663,7.3.174,Unsigned32,V,,,M
+SGs-MME-Identity,1664,7.3.175,UTF8String,V,,,M
+SIPTO-Local-Network-Permission,1665,7.3.176,Unsigned32,V,,,M
+Coupled-Node-Diameter-ID,1666,7.3.177,DiameterIdentity,V,,,M
+WLAN-offloadability,1667,7.3.181,Grouped,V,,,M
+WLAN-offloadability-EUTRAN,1668,7.3.182,Unsigned32,V,,,M
+WLAN-offloadability-UTRAN,1669,7.3.183,Unsigned32,V,,,M
+Reset-ID,1670,7.3.184,OctetString,V,,,M
+MDT-Allowed-PLMN-Id,1671,7.3.185,OctetString,V,,,M
+Adjacent-PLMNs,1672,7.3.186,Grouped,V,,,M
+Adjacent-Access-Restriction-Data,1673,7.3.187,Grouped,V,,,M
+DL-Buffering-Suggested-Packet-Count,1674,7.3.188,Integer32,V,,,M
+IMSI-Group-Id,1675,7.3.189,Grouped,V,,,M
+Group-Service-Id,1676,7.3.190,Unsigned32,V,,,M
+Group-PLMN-Id,1677,7.3.191,OctetString,V,,,M
+Local-Group-Id,1678,7.3.192,OctetString,V,,,M
+AIR-Flags,1679,7.3.201,Unsigned32,V,,,M
+UE-Usage-Type,1680,7.3.202,Unsigned32,V,,,M
+Non-IP-PDN-Type-Indicator,1681,7.3.204,Enumerated,V,,,M
+Non-IP-Data-Delivery-Mechanism,1682,7.3.205,Unsigned32,V,,,M
+# Note: 3GPP TS 29.272 Table 7.3.1/1 row Additional-Context-ID (1683) has,,,,,,,
+"# incorrect name and should be ""Additional-Context-Identifier"" per clause 7.3.206.",,,,,,,
+# ,,,,,,,
+# Fix: Additional-Context-ID (1683) renamed to Additional-Context-Identifier (1683).,,,,,,,
+Additional-Context-Identifier,1683,7.3.206,Unsigned32,V,,,M
+SCEF-Realm,1684,7.3.207,DiameterIdentity,V,,,M
+Subscription-Data-Deletion,1685,7.3.208,Grouped,V,,,M
+# Note: 3GPP TS 29.272 Table 7.3.1/1 row Preferred-Data-Mode (1686),,,,,,,
+"# incorrectly has value type Grouped instead of Unsigned32,",,,,,,,
+# conflicting with clause 7.3.209.,,,,,,,
+# ,,,,,,,
+# Fix: Preferred-Data-Mode (1686) type changed from Grouped to Unsigned32.,,,,,,,
+Preferred-Data-Mode,1686,7.3.209,Unsigned32,V,,,M
+Emergency-Info,1687,7.3.210,Grouped,V,,,M
+V2X-Subscription-Data,1688,7.3.212,Grouped,V,,,M
+V2X-Permission,1689,7.3.213,Unsigned32,V,,,M
+PDN-Connection-Continuity,1690,7.3.214,Unsigned32,V,,,M
+eDRX-Cycle-Length,1691,7.3.215,Grouped,V,,,M
+eDRX-Cycle-Length-Value,1692,7.3.216,OctetString,V,,,M
+UE-PC5-AMBR,1693,7.3.217,Unsigned32,V,,,M
+MBSFN-Area,1694,7.3.219,Grouped,V,,,M
+MBSFN-Area-ID,1695,7.3.220,Unsigned32,V,,,M
+Carrier-Frequency,1696,7.3.221,Unsigned32,V,,,M
+RDS-Indicator,1697,7.3.222,Enumerated,V,,,M
+Service-Gap-Time,1698,7.3.223,Unsigned32,V,,,M
+Aerial-UE-Subscription-Information,1699,7.3.224,Unsigned32,V,,,M
+Broadcast-Location-Assistance-Data-Types,1700,7.3.225,Unsigned64,V,,,M
+Paging-Time-Window,1701,7.3.226,Grouped,V,,,M
+Operation-Mode,1702,7.3.227,Unsigned32,V,,,M
+Paging-Time-Window-Length,1703,7.3.228,OctetString,V,,,M
+Core-Network-Restrictions,1704,7.3.230,Unsigned32,V,,,M
+eDRX-Related-RAT,1705,7.3.229,Grouped,V,,,M
+Interworking-5GS-Indicator,1706,7.3.231,Enumerated,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.273,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 V15.4.0 (2019-09),,,,,,,
+# Evolved Packet System (EPS);,,,,,,,
+# 3GPP EPS AAA interfaces,,,,,,,
+# ,,,,,,,
+# From 3GPP 29273-f40.docx,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 5.2.3.1/1: Diameter STa AVPs,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+ANID,1504,5.2.3.7,UTF8String,"M,V",,,P
+AN-Trusted,1503,5.2.3.9,Enumerated,"M,V",,,P
+MIP-FA-RK,1506,5.2.3.12,OctetString,"M,V",,,P
+MIP-FA-RK-SPI,1507,5.2.3.13,Unsigned32,"M,V",,,P
+Full-Network-Name,1516,5.2.3.14,OctetString,V,,,"M,P"
+Short-Network-Name,1517,5.2.3.15,OctetString,V,,,"M,P"
+WLAN-Identifier,1509,5.2.3.18,Grouped,V,,,"M,P"
+AAA-Failure-Indication,1518,8.2.3.21,Unsigned32,V,,,"M,P"
+Transport-Access-Type,1519,5.2.3.19,Enumerated,V,,,"M,P"
+DER-Flags,1520,5.2.3.20,Unsigned32,V,,,"M,P"
+DEA-Flags,1521,5.2.3.21,Unsigned32,V,,,"M,P"
+SSID,1524,5.2.3.22,UTF8String,V,,,"M,P"
+HESSID,1525,5.2.3.23,UTF8String,V,,,"M,P"
+Access-Network-Info,1526,5.2.3.24,Grouped,V,,,"M,P"
+TWAN-Connection-Mode,1527,5.2.3.25,Unsigned32,V,,,"M,P"
+TWAN-Connectivity-Parameters,1528,5.2.3.26,Grouped,V,,,"M,P"
+Connectivity-Flags,1529,5.2.3.27,Unsigned32,V,,,"M,P"
+TWAN-PCO,1530,5.2.3.28,OctetString,V,,,"M,P"
+TWAG-CP-Address,1531,5.2.3.29,Address,V,,,"M,P"
+TWAG-UP-Address,1532,5.2.3.30,UTF8String,V,,,"M,P"
+TWAN-S2a-Failure-Cause,1533,5.2.3.31,Unsigned32,V,,,"M,P"
+SM-Back-Off-Timer,1534,5.2.3.32,Unsigned32,V,,,"M,P"
+WLCP-Key,1535,5.2.3.33,OctetString,V,,,"M,P"
+Emergency-Services,1538,7.2.3.4,Unsigned32,V,,,"M,P"
+IMEI-Check-In-VPLMN-Result,1540,5.2.3.35,Unsigned32,V,,,"M,P"
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 6.2.3.1/1: Diameter SWd AVPs,,,,,,,
+# ,,,,,,,
+# Note: No AVPs are first defined in this table.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 7.2.3.1/1: Diameter SWm AVPs,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Trace-Info,1505,8.2.3.1.3,Grouped,V,,,"M,P"
+AAR-Flags,1539,7.2.3.5,Unsigned32,V,,,"M,P"
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 8.2.3.0/1: Diameter SWx AVPs,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Non-3GPP-User-Data,1500,8.2.3.1,Grouped,"M,V",,,P
+Non-3GPP-IP-Access,1501,8.2.3.3,Enumerated,"M,V",,,P
+Non-3GPP-IP-Access-APN,1502,8.2.3.4,Enumerated,"M,V",,,P
+PPR-Flags,1508,8.2.3.17,Unsigned32,V,,,"M,P"
+TWAN-Default-APN-Context-Id,1512,8.2.3.18,Unsigned32,V,,,"M,P"
+TWAN-Access-Info,1510,8.2.3.19,Grouped,V,,,"M,P"
+Access-Authorization-Flags,1511,8.2.3.20,Unsigned32,V,,,"M,P"
+3GPP-AAA-Server-Name,318,8.2.3.24,DiameterIdentity,"M, V",,,P
+ERP-Authorization,1541,8.2.3.27,Unsigned32,V,,,"M,P"
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 9.2.3.1.1/1: Diameter S6b AVPs for DSMIPv6,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+RAR-Flags,1522,9.2.3.1.5,Unsigned32,V,,,"M,P"
+# Note: Trust-Relationship-Update (1515) Enumerated removed in 3GPP TS 29.273 V11.4.0 (2012-12).,,,,,,,
+#,,,,,,,
+DER-S6b-Flags,1523,9.2.3.7,Unsigned32,V,,,"M,P"
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 9.2.3.2.1/1: Diameter S6b AVPs for PMIPv6 or GTPv2,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Origination-Time-Stamp,1536,9.2.3.2.6,Unsigned64,V,,,"M,P"
+Maximum-Wait-Time,1537,9.2.3.2.7,Unsigned32,V,,,"M,P"
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.273 Table 9.2.3.6.1/1: Diameter S6b AVPs for MIPv4 FACoA,,,,,,,
+# ,,,,,,,
+# Note: No AVPs are first defined in this table.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+,,,,,,,
+@standard,3GPP TS 29.283,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.283 V15.1.0 (2019-09),,,,,,,
+# Diameter Data Management Applications,,,,,,,
+# ,,,,,,,
+# From 3GPP 29283-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+"# 3GPP TS 29.283 Table 7.3.1-1: MCPTT-2, MCVideo-2, MCData-2 and CSC-13 specific Diameter AVPs",,,,,,,
+#=,,,,,,,
+#,,,,,,,
+MCPTT-ID,4500,7.3.2,UTF8String,"M, V",,,
+Data-Identification,4501,7.3.3,Grouped,"M, V",,,
+Data-Identification-Prefix,4502,7.3.11,Unsigned32,"M,V",,,
+Data-Identification-Flags,4503,7.3.12,Unsigned64,"M,V",,,
+DPR-Flags,4504,7.3.13,Unsigned32,"M,V",,,
+DPA-Flags,4505,7.3.14,Unsigned32,"M,V",,,
+DUR-Flags,4506,7.3.15,Unsigned32,"M,V",,,
+DUA-Flags,4507,7.3.16,Unsigned32,"M,V",,,
+NDR-Flags,4508,7.3.17,Unsigned32,"M,V",,,
+NDA-Flags,4509,7.3.18,Unsigned32,"M,V",,,
+User-Data-Id,4510,7.3.19,Unsigned32,"M,V",,,
+MC-Service-User-Profile-Data,4511,7.3.20,Grouped,"M,V",,,
+# Note: Name conflict with 3GPP TS 29.140 Sequence-Number (1107).,,,,,,,
+# and 3GPP TS 29.329 Sequence-Number (716).,,,,,,,
+# 3GPP TS 29.140 V6.1.0 (2005-06) allocated Sequence-Number (1107).,,,,,,,
+# 3GPP TS 29.329 V10.0.0 (2010-09) CR 0163 added Sequence-Number (716).,,,,,,,
+# 3GPP TS 29.283 V13.1.0 (2016-06) allocated Sequence-Number (4512).,,,,,,,
+# ,,,,,,,
+# Fix: Sequence-Number (4512) renamed to Sequence-Number-29.283 (4512).,,,,,,,
+Sequence-Number-29.283,4512,7.3.21,Unsigned32,"M,V",,,
+Data,4513,7.3.22,Grouped,"M,V",,,
+MCVideo-ID,4514,7.3.24,UTF8String,V,,,M
+MCData-ID,4515,7.3.25,UTF8String,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.329,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.329 V15.2.0 (2019-09),,,,,,,
+# Sh Interface based on the Diameter protocol;,,,,,,,
+# Protocol details,,,,,,,
+# ,,,,,,,
+# From 3GPP 29329-f20.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.329 Table 6.3.1: Table 6.3.1: Diameter Multimedia Application AVPs,,,,,,,
+# ,,,,,,,
+# Note: AVPs referenced from other sources are not added here.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+User-Identity,700,6.3.1,Grouped,"M, V",,,
+MSISDN,701,6.3.2,OctetString,"M, V",,,
+# Note: Name conflict with 3GPP TS 29.229 User-Data (606).,,,,,,,
+# 3GPP TS 29.229 V6.2.0 (2004-09) allocated User-Data (606).,,,,,,,
+# 3GPP TS 29.329 V6.2.0 (2004-09) allocated User-Data (702).,,,,,,,
+# ,,,,,,,
+# Fix: User-Data (702) renamed to User-Data-29.329 (702).,,,,,,,
+User-Data-29.329,702,6.3.3,OctetString,"M, V",,,
+Data-Reference,703,6.3.4,Enumerated,"M, V",,,
+Service-Indication,704,6.3.5,OctetString,"M, V",,,
+Subs-Req-Type,705,6.3.6,Enumerated,"M, V",,,
+Requested-Domain,706,6.3.7,Enumerated,"M, V",,,
+Current-Location,707,6.3.8,Enumerated,"M, V",,,
+Identity-Set,708,6.3.10,Enumerated,V,,,M
+Expiry-Time,709,6.3.16,Time,V,,,M
+Send-Data-Indication,710,6.3.17,Enumerated,V,,,M
+DSAI-Tag,711,6.3.18,OctetString,"M, V",,,
+One-Time-Notification,712,6.3.22,Enumerated,V,,,M
+Requested-Nodes,713,6.3.7A,Unsigned32,V,,,M
+Serving-Node-Indication,714,6.3.23,Enumerated,V,,,M
+Repository-Data-ID,715,6.3.24,Grouped,V,,,M
+# Note: Name conflict with 3GPP TS 29.140 Sequence-Number (1107),,,,,,,
+# and 3GPP TS 29.283 Sequence-Number (4512).,,,,,,,
+# 3GPP TS 29.140 V6.1.0 (2005-06) allocated Sequence-Number (1107).,,,,,,,
+# 3GPP TS 29.329 V10.0.0 (2010-09) CR 0163 added Sequence-Number (716).,,,,,,,
+# 3GPP TS 29.283 V13.1.0 (2016-06) allocated Sequence-Number (4512).,,,,,,,
+Sequence-Number,716,6.3.25,Unsigned32,V,,,M
+Pre-paging-Supported,717,6.3.26,Enumerated,V,,,M
+Local-Time-Zone-Indication,718,6.3.27,Enumerated,V,,,M
+UDR-Flags,719,6.3.28,Unsigned32,V,,,M
+Call-Reference-Info,720,6.3.29,Grouped,V,,,M
+Call-Reference-Number,721,6.3.30,OctetString,V,,,M
+AS-Number,722,6.3.31,OctetString,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.336,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.336 V15.7.0 (2019-09),,,,,,,
+# Home Subscriber Server (HSS) diameter interfaces for,,,,,,,
+# interworking with packet data networks and applications,,,,,,,
+# ,,,,,,,
+# From 3GPP 29336-f70.docx,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.336 Table 6.4.1/1: S6m/S6n specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+IP-SM-GW-Number,3100,6.4.14,OctetString,"M,V",,,
+IP-SM-GW-Name,3101,6.4.15,DiameterIdentity,"M,V",,,
+User-Identifier,3102,6.4.2,Grouped,"M,V",,,
+Service-ID,3103,6.4.3,Enumerated,"M,V",,,
+SCS-Identity,3104,6.4.4,OctetString,"M,V",,,
+Service-Parameters,3105,6.4.5,Grouped,"M,V",,,
+T4-Parameters,3106,6.4.6,Grouped,"M,V",,,
+Service-Data,3107,6.4.7,Grouped,"M,V",,,
+T4-Data,3108,6.4.8,Grouped,"M,V",,,
+HSS-Cause,3109,6.4.9,Unsigned32,"M,V",,,
+SIR-Flags,3110,6.4.10,Unsigned32,"M,V",,,
+# Note: 3GPP TS 29.061 External-Identifier (28) OctetString replaced by,,,,,,,
+# 3GPP TS 29.336 External-Identifier (3111) UTF8String.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: External-Identifier (28) OctetString replaced by External-Identifier (3111) UTF8String.,,,,,,,
+External-Identifier,3111,6.4.11,UTF8String,"M,V",,,
+IP-SM-GW-Realm,3112,6.4.18,DiameterIdentity,"M,V",,,
+#=,,,,,,,
+# 3GPP TS 29.336 Table 8.4.1-1: S6t specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+AESE-Communication-Pattern,3113,8.4.25,Grouped,"M,V",,,
+Communication-Pattern-Set,3114,8.4.26,Grouped,"M,V",,,
+Periodic-Communication-Indicator,3115,8.4.27,Unsigned32,"M,V",,,
+Communication-Duration-Time,3116,8.4.28,Unsigned32,"M,V",,,
+# Note: 3GPP TS 29.336 Table 8.4.1-1 row Periodic-time (3117) has,,,,,,,
+"# incorrect name and should be ""Periodic-Time"" per majority use.",,,,,,,
+# ,,,,,,,
+# Fix: Periodic-time (3117) renamed to Periodic-Time (931).,,,,,,,
+Periodic-Time,3117,8.4.29,Unsigned32,"M,V",,,
+Scheduled-Communication-Time,3118,8.4.30,Grouped,"M,V",,,
+Stationary-Indication,3119,8.4.31,Unsigned32,"M,V",,,
+AESE-Communication-Pattern-Config-Status,3120,8.4.32,Grouped,"M,V",,,
+AESE-Error-Report,3121,8.4.33,Grouped,"M,V",,,
+Monitoring-Event-Configuration,3122,8.4.2,Grouped,"M,V",,,
+Monitoring-Event-Report,3123,8.4.3,Grouped,"M,V",,,
+SCEF-Reference-ID,3124,8.4.4,Unsigned32,"M,V",,,
+SCEF-ID,3125,8.4.5,DiameterIdentity,"M,V",,,
+SCEF-Reference-ID-for-Deletion,3126,8.4.6,Unsigned32,"M,V",,,
+Monitoring-Type,3127,8.4.7,Unsigned32,"M,V",,,
+Maximum-Number-of-Reports,3128,8.4.8,Unsigned32,"M,V",,,
+UE-Reachability-Configuration,3129,8.4.9,Grouped,"M,V",,,
+Monitoring-Duration,3130,8.4.10,Time,"M,V",,,
+Maximum-Detection-Time,3131,8.4.11,Unsigned32,"M,V",,,
+Reachability-Type,3132,8.4.12,Unsigned32,"M,V",,,
+Maximum-Latency,3133,8.4.13,Unsigned32,"M,V",,,
+Maximum-Response-Time,3134,8.4.14,Unsigned32,"M,V",,,
+Location-Information-Configuration,3135,8.4.15,Grouped,"M,V",,,
+MONTE-Location-Type,3136,8.4.16,Unsigned32,"M,V",,,
+Accuracy,3137,8.4.17,Unsigned32,"M,V",,,
+Association-Type,3138,8.4.18,Unsigned32,"M,V",,,
+Roaming-Information,3139,8.4.19,Unsigned32,"M,V",,,
+Reachability-Information,3140,8.4.20,Unsigned32,"M,V",,,
+IMEI-Change,3141,8.4.22,Unsigned32,"M,V",,,
+Monitoring-Event-Config-Status,3142,8.4.24,Grouped,"M,V",,,
+Supported-Services,3143,8.4.40,Grouped,"M,V",,,
+Supported-Monitoring-Events,3144,8.4.41,Unsigned64,"M,V",,,
+CIR-Flags,3145,8.4.39,Unsigned32,"M,V",,,
+Service-Result,3146,8.4.37,Grouped,"M,V",,,
+Service-Result-Code,3147,8.4.38,Unsigned32,"M,V",,,
+Reference-ID-Validity-Time,3148,8.4.42,Time,"M,V",,,
+Event-Handling,3149,8.4.43,Unsigned32,"M,V",,,
+NIDD-Authorization-Request,3150,8.4.44,Grouped,"M,V",,,
+NIDD-Authorization-Response,3151,8.4.45,Grouped,"M,V",,,
+Service-Report,3152,8.4.47,Grouped,"M,V",,,
+Node-Type,3153,8.4.48,Unsigned32,"M,V",,,
+S6t-HSS-Cause,3154,8.4.50,Unsigned32,"M,V",,,
+Enhanced-Coverage-Restriction,3155,8.4.51,Grouped,V,,,M
+Enhanced-Coverage-Restriction-Data,3156,8.4.52,Grouped,V,,,M
+Restricted-PLMN-List,3157,8.4.53,Grouped,V,,,M
+Allowed-PLMN-List,3158,8.4.54,Grouped,V,,,M
+Requested-Validity-Time,3159,8.4.55,Time,V,,,M
+Granted-Validity-Time,3160,8.4.56,Time,V,,,M
+NIDD-Authorization-Update,3161,8.4.57,Grouped,V,,,M
+Loss-Of-Connectivity-Reason,3162,8.4.58,Unsigned32,V,,,M
+Group-Reporting-Guard-Timer,3163,8.4.59,Unsigned32,V,,,M
+CIA-Flags,3164,8.4.60,Unsigned32,V,,,M
+Group-Monitoring-Event-Report,3165,8.4.61,Grouped,V,,,M
+Group-Monitoring-Event-Report-Item,3166,8.4.62,Grouped,V,,,M
+RIR-Flags,3167,8.4.63,Unsigned32,V,,,M
+Type-Of-External-Identifier,3168,8.4.64,Unsigned32,V,,,M
+APN-Validity-Time,3169,8.4.65,Grouped,V,,,M
+Suggested-Network-Configuration,3170,8.4.66,Grouped,V,,,M
+Monitoring-Event-Report-Status,3171,8.4.67,Grouped,V,,,M
+PLMN-ID-Requested,3172,8.4.68,Enumerated,V,,,M
+AdditionalIdentifiers,3173,8.4.69,Grouped,V,,,M
+NIR-Flags,3174,8.4.70,Unsigned32,V,,,M
+Reporting-Time-Stamp,3175,8.4.71,Time,V,,,M
+NIA-Flags,3176,8.4.72,Unsigned32,V,,,M
+Group-User-Identifier,3177,8.4.73,Grouped,V,,,M
+MTC-Provider-Info,3178,8.4.74,Grouped,V,,,M
+MTC-Provider-ID,3179,8.4.75,UTF8String,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.337,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.337 V15.0.0 (2018-06),,,,,,,
+# Diameter-based T4 interface for communications with packet,,,,,,,
+# data networks and applications,,,,,,,
+# ,,,,,,,
+# From 3GPP 29337-f00.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.337 Table 6.3.1/1: T4 specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+SM-Delivery-Outcome-T4,3200,6.3.1,Enumerated,"M, V",,,
+Absent-Subscriber-Diagnostic-T4,3201,6.3.2,Enumerated,"M, V",,,
+Trigger-Action,3202,6.3.6,Unsigned32,V,,,M
+MTC-Error-Diagnostic,3203,6.3.7,Unsigned32,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.338,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.338 V15.1.0 (2018-12),,,,,,,
+# Diameter based protocols to support,,,,,,,
+# Short Message Service (SMS) capable,,,,,,,
+# Mobile Management Entities (MMEs),,,,,,,
+# ,,,,,,,
+# From 3GPP 29338-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.338 Table 5.3.3.1/1: S6c specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+SM-RP-MTI,3308,5.3.3.2,Enumerated,"M, V",,,
+SM-RP-SMEA,3309,5.3.3.3,OctetString,"M, V",,,
+SRR-Flags,3310,5.3.3.4,Unsigned32,"M, V",,,
+SM-Delivery-Not-Intended,3311,5.3.3.5,Enumerated,"M, V",,,
+MWD-Status,3312,5.3.3.8,Unsigned32,"M, V",,,
+MME-Absent-User-Diagnostic-SM,3313,5.3.3.9,Unsigned32,"M, V",,,
+MSC-Absent-User-Diagnostic-SM,3314,5.3.3.10,Unsigned32,"M, V",,,
+SGSN-Absent-User-Diagnostic-SM,3315,5.3.3.11,Unsigned32,"M, V",,,
+SM-Delivery-Outcome,3316,5.3.3.14,Grouped,"M, V",,,
+MME-SM-Delivery-Outcome,3317,5.3.3.15,Grouped,"M, V",,,
+MSC-SM-Delivery-Outcome,3318,5.3.3.16,Grouped,"M, V",,,
+SGSN-SM-Delivery-Outcome,3319,5.3.3.17,Grouped,"M, V",,,
+IP-SM-GW-SM-Delivery-Outcome,3320,5.3.3.18,Grouped,"M, V",,,
+SM-Delivery-Cause,3321,5.3.3.19,Enumerated,"M, V",,,
+Absent-User-Diagnostic-SM,3322,5.3.3.20,Unsigned32,"M, V",,,
+RDR-Flags,3323,5.3.3.21,Unsigned32,V,,,M
+Maximum-UE-Availability-Time,3329,5.3.3.22,Time,V,,,M
+SMS-GMSC-Alert-Event,3333,5.3.3.23,Unsigned32,V,,,M
+#=,,,,,,,
+# 3GPP TS 29.338 Table 6.3.3.1/1: SGd/Gdd specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+SC-Address,3300,6.3.3.2,OctetString,"M, V",,,
+SM-RP-UI,3301,6.3.3.3,OctetString,"M, V",,,
+TFR-Flags,3302,6.3.3.4,Unsigned32,"M, V",,,
+SM-Delivery-Failure-Cause,3303,6.3.3.5,Grouped,"M, V",,,
+SM-Enumerated-Delivery-Failure-Cause,3304,6.3.3.6,Enumerated,"M, V",,,
+SM-Diagnostic-Info,3305,6.3.3.7,OctetString,"M, V",,,
+SM-Delivery-Timer,3306,6.3.3.10,Unsigned32,"M, V",,,
+SM-Delivery-Start-Time,3307,6.3.3.11,Time,"M, V",,,
+SMSMI-Correlation-ID,3324,6.3.3.13,Grouped,V,,,M
+# Note: 3GPP TS 29.338 Table 6.3.3.1/1 row HSS-ID (3325),,,,,,,
+# incorrectly lists type as OctetString instead of UTF8String.,,,,,,,
+# 3GPP TS 29.338 clause 6.3.3.14 uses UTF8String.,,,,,,,
+# ,,,,,,,
+# Fix: HSS-ID (3325) type changed from OctetString to UTF8String.,,,,,,,
+HSS-ID,3325,6.3.3.14,UTF8String,V,,,M
+Originating-SIP-URI,3326,6.3.3.15,UTF8String,V,,,M
+Destination-SIP-URI,3327,6.3.3.16,UTF8String,V,,,M
+OFR-Flags,3328,6.3.3.12,Unsigned32,V,,,M
+Maximum-Retransmission-Time,3330,6.3.3.17,Time,V,,,M
+Requested-Retransmission-Time,3331,6.3.3.18,Time,V,,,M
+SMS-GMSC-Address,3332,6.3.3.19,OctetString,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.343,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.343 V15.1.0 (2019-09),,,,,,,
+# Proximity-services (ProSe) function to,,,,,,,
+# ProSe application server aspects (PC2);,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29343-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.343 Table 6.4.1-1: PC2 specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Origin-App-Layer-User-Id,3600,6.4.2,UTF8String,"M,V",P,,
+Target-App-Layer-User-Id,3601,6.4.3,UTF8String,"M,V",P,,
+ProSe-Function-ID,3602,6.4.4,OctetString,"M,V",P,,
+ProSe-Request-Type,3603,6.4.5,Unsigned32,"M,V",P,,
+PDUID,3604,6.4.6,OctetString,V,P,,M
+Application-Data,3605,6.4.7,UTF8String,V,P,,M
+Allowed-Suffixes-Number,3606,6.4.8,Unsigned32,V,P,,M
+Monitor-Target,3607,6.4.9,Grouped,V,P,,M
+ProSe-Code-Suffix-Mask,3608,6.4.10,Grouped,V,P,,M
+Suffix-Code,3609,6.4.11,OctetString,V,P,,M
+Suffix-Mask,3610,6.4.12,OctetString,V,P,,M
+Banned-User-Target,3611,6.4.17,Grouped,V,P,,M
+Metadata-Indicator,3612,6.4.18,Unsigned32,V,P,,M
+,,,,,,,
+@standard,3GPP TS 29.344,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.344 V15.1.0 (2019-09),,,,,,,
+# Proximity-services (ProSe) Function to Home Subscriber,,,,,,,
+# Server (HSS) aspects;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29344-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.344 Table 6.3.1-1: PC4a specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+ProSe-Subscription-Data,3701,6.3.2,Grouped,"M,V",,,
+ProSe-Permission,3702,6.3.3,Unsigned32,"M,V",,,
+ProSe-Allowed-PLMN,3703,6.3.4,Grouped,"M,V",,,
+ProSe-Direct-Allowed,3704,6.3.5,Unsigned32,"M,V",,,
+UPR-Flags,3705,6.3.6,Unsigned32,"M,V",,,
+PNR-Flags,3706,6.3.7,Unsigned32,"M,V",,,
+ProSe-Initial-Location-Information,3707,6.3.9,Grouped,"M,V",,,
+# Note: 3GPP TS 29.344 Table 6.3.1-1 missing Authorized-Discovery-Range.,,,,,,,
+# Present in 3GPP TS 29.344 clause 6.3.13 and 3GPP TS 29.230 Table 7.1.,,,,,,,
+# ,,,,,,,
+# Fix: Add Authorized-Discovery-Range (3708) Unsigned32.,,,,,,,
+Authorized-Discovery-Range,3708,6.3.13,Unsigned32,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.345,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.345 V15.1.0 (2019-09),,,,,,,
+# Inter-Proximity-services (ProSe) Function signalling aspects;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29345-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.345 Table 6.3.1-1: PC6/PC7 specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+App-Layer-User-Id,3801,6.3.2,UTF8String,"M, V",,,
+# Note: 3GPP TS 29.345 Table 6.3.1-1 row Assistance-info (3802) has,,,,,,,
+"# incorrect name and should be ""Assistance-Info"" per clause 6.3.3.",,,,,,,
+# ,,,,,,,
+# Fix: Assistance-info (3802) renamed to Assistance-Info (3802).,,,,,,,
+Assistance-Info,3802,6.3.3,Grouped,"M, V",,,
+Assistance-Info-Validity-Timer,3803,6.3.4,Unsigned32,"M, V",,,
+Discovery-Type,3804,6.3.5,Unsigned32,"M, V",,,
+Filter-Id,3805,6.3.9,OctetString,"M, V",,,
+MAC-Address,3806,6.3.11,UTF8String,"M, V",,,
+Match-Report,3807,6.3.12,Grouped,"M, V",,,
+Operating-Channel,3808,6.3.14,Unsigned32,"M, V",,,
+P2P-Features,3809,6.3.15,Unsigned32,"M, V",,,
+ProSe-App-Code,3810,6.3.16,OctetString,"M, V",,,
+ProSe-App-Id,3811,6.3.17,UTF8String,"M, V",,,
+ProSe-App-Mask,3812,6.3.18,OctetString,"M, V",,,
+ProSe-Discovery-Filter,3813,6.3.20,Grouped,"M, V",,,
+PRR-Flags,3814,6.3.21,Unsigned32,"M, V",,,
+ProSe-Validity-Timer,3815,6.3.22,Unsigned32,"M, V",,,
+Requesting-EPUID,3816,6.3.23,UTF8String,"M, V",,,
+Targeted-EPUID,3817,6.3.26,UTF8String,"M, V",,,
+# Note: Name conflict with 3GPP TS 29.154 Time-Window (4204).,,,,,,,
+# Time-Window (3818) in 3GPP TS 29.345 V12.1.0 (2014-12) predates,,,,,,,
+# Time-Window (4204) in 3GPP TS 29.154 V13.1.0 (2016-03).,,,,,,,
+Time-Window,3818,6.3.27,Unsigned32,"M, V",,,
+WiFi-P2P-Assistance-Info,3819,6.3.30,Grouped,"M, V",,,
+WLAN-Assistance-Info,3820,6.3.31,Grouped,"M, V",,,
+WLAN-Link-Layer-Id,3821,6.3.32,OctetString,"M, V",,,
+WLAN-Link-Layer-Id-List,3822,6.3.33,Grouped,"M, V",,,
+Location-Update-Trigger,3823,6.3.42,Grouped,"M,V",,,
+Location-Update-Event-Type,3824,6.3.43,Unsigned32,"M,V",,,
+Change-Of-Area-Type,3825,6.3.44,Grouped,"M,V",,,
+Location-Update-Event-Trigger,3826,6.3.45,Unsigned32,"M,V",,,
+Report-Cardinality,3827,6.3.46,Enumerated,"M,V",,,
+Minimum-Interval-Time,3828,6.3.47,Unsigned32,"M,V",,,
+Periodic-Location-Type,3829,6.3.48,Grouped,"M,V",,,
+Location-Report-Interval-Time,3830,6.3.49,Unsigned32,"M,V",,,
+Total-Number-Of-Reports,3831,6.3.50,Unsigned32,"M,V",,,
+Validity-Time-Announce,3832,6.3.36,Unsigned32,"M, V",,,
+Validity-Time-Monitor,3833,6.3.37,Unsigned32,"M, V",,,
+Validity-Time-Communication,3834,6.3.38,Unsigned32,"M, V",,,
+ProSe-App-Code-Info,3835,6.3.39,Grouped,"M, V",,,
+MIC,3836,6.3.40,OctetString,"M, V",,,
+UTC-based-Counter,3837,6.3.41,Unsigned32,"M, V",,,
+ProSe-Match-Refresh-Timer,3838,6.3.52,Unsigned32,"M, V",,,
+ProSe-Metadata-Index-Mask,3839,6.3.60,OctetString,V,,,M
+App-Identifier,3840,6.3.61,Grouped,V,,,M
+OS-ID,3841,6.3.62,OctetString,V,,,M
+OS-App-ID,3842,6.3.63,UTF8String,V,,,M
+Requesting-RPAUID,3843,6.3.64,UTF8String,V,,,M
+Target-RPAUID,3844,6.3.65,UTF8String,V,,,M
+Target-PDUID,3845,6.3.66,OctetString,V,,,M
+ProSe-Restricted-Code,3846,6.3.67,OctetString,V,,,M
+ProSe-Restricted-Code-Suffix-Range,3847,6.3.68,OctetString,V,,,M
+Beginning-Suffix,3848,6.3.69,OctetString,V,,,M
+Ending-Suffix,3849,6.3.70,OctetString,V,,,M
+Discovery-Entry-ID,3850,6.3.59,Unsigned32,V,,,M
+Match-Timestamp,3851,6.3.71,Time,V,,,M
+PMR-Flags,3852,6.3.57,Unsigned32,"M,V",,,
+ProSe-Application-Metadata,3853,6.3.58,UTF8String,"M,V",,,
+Discovery-Auth-Request,3854,6.3.53,Grouped,"M, V",,,
+Discovery-Auth-Response,3855,6.3.54,Grouped,"M, V",,,
+Match-Request,3856,6.3.55,Grouped,"M, V",,,
+Match-Report-Info,3857,6.3.56,Grouped,"M, V",,,
+Banned-RPAUID,3858,6.3.73,UTF8String,V,,,M
+Banned-PDUID,3859,6.3.74,OctetString,V,,,M
+Code-Receiving-Security-Material,3860,6.3.75,Grouped,V,,,M
+Code-Sending-Security-Material,3861,6.3.76,Grouped,V,,,M
+DUSK,3862,6.3.77,OctetString,V,,,M
+DUIK,3863,6.3.78,OctetString,V,,,M
+DUCK,3864,6.3.79,OctetString,V,,,M
+# Note: 3GPP TS 29.345 Table 6.3.1-1 row MIC-Check-indicator (3865) has,,,,,,,
+"# incorrect name and should be ""MIC-Check-Indicator"" per clause 6.3.80.",,,,,,,
+# ,,,,,,,
+# Fix: MIC-Check-indicator (3865) renamed to MIC-Check-Indicator (3865).,,,,,,,
+MIC-Check-Indicator,3865,6.3.80,Unsigned32,V,,,M
+Encrypted-Bitmask,3866,6.3.81,OctetString,V,,,M
+ProSe-App-Code-Suffix-Range,3867,6.3.82,OctetString,V,,,M
+PC5-tech,3868,6.3.84,OctetString,V,,,M
+,,,,,,,
+@standard,3GPP TS 29.368,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.368 V15.1.0 (2019-09),,,,,,,
+# Tsp interface protocol between the MTC Interworking Function,,,,,,,
+# (MTC-IWF) and Service Capability Server (SCS),,,,,,,
+# ,,,,,,,
+# From 3GPP 29368-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.368 Table 6.4.1.1: Tsp specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Device-Action,3001,6. 4.2,Grouped,"M,V",P,,
+Device-Notification,3002,6.4.3,Grouped,"M,V",P,,
+Trigger-Data,3003,6.4.4,Grouped,"M,V",P,,
+Payload,3004,6.4.5,OctetString,"M,V",P,,
+Action-Type,3005,6.4.6,Enumerated,"M,V",P,,
+Priority-Indication,3006,6.4.7,Enumerated,"M,V",P,,
+Reference-Number,3007,6.4.8,Unsigned32,"M,V",P,,
+Request-Status,3008,6.4.9,Enumerated,"M,V",P,,
+Delivery-Outcome,3009,6.4.10,Enumerated,"M,V",P,,
+Application-Port-Identifier,3010,6.4.11,Unsigned32,"M,V",P,,
+Old-Reference-Number,3011,6.4.12,Unsigned32,V,P,,M
+Feature-Supported-In-Final-Target,3012,6.4.13,Unsigned32,V,P,,M
+,,,,,,,
+@standard,3GPP TS 29.388,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.388 V15.1.0 (2019-09),,,,,,,
+# V2X Control Function to Home Subscriber Server (HSS),,,,,,,
+# aspects (V4);,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29388-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.388 Table 6.3.1-1: V4 specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+V2X-PC5-Allowed-PLMN,4600,6.3.3,Grouped,"M,V",,,
+V2X-Update-Flags,4601,6.3.4,Unsigned32,"M,V",,,
+V2X-Notify-Flags,4602,6.3.5,Unsigned32,"M,V",,,
+,,,,,,,
+@standard,3GPP TS 29.389,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.389 V15.1.0 (2019-09),,,,,,,
+# Inter-V2X Control Function Signalling aspects (V6);,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29389-f10.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.389 Table 6.3.1-1: V6 specific Diameter AVPs,,,,,,,
+# ,,,,,,,
+# Fix: All AVPs were missing M and V; assume MUST for both.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+V2X-Authorization-Data,4700,6.3.2,Grouped,"M,V",,,
+V2X-Permission-in-VPLMN,4701,6.3.3,Unsigned32,"M,V",,,
+V2X-Application-Server,4702,6.3.4,Grouped,"M,V",,,
+,,,,,,,
+@standard,3GPP TS 29.468,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.468 V15.8.0 (2019-12),,,,,,,
+# Group Communication System Enablers for LTE (GCSE_LTE);,,,,,,,
+# MB2 Reference Point;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29468-f80.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.468 Table 6.4.1 1: MB2 C specific Diameter AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+BMSC-Address,3500,6.4.2,Address,"M,V",P,,
+BMSC-Port,3501,6.4.3,Unsigned32,"M,V",P,,
+Common-Tunnel-Endpoint-Identifier,3524,6.4.26,OctetString,V,P,,M
+FEC-Request,3525,6.4.27,OctetString,V,P,,M
+FEC-Result,3531,6.4.33,Unsigned32,V,P,,M
+Local-M1-Information,3518,6.4.20,Grouped,V,P,,M
+Local-MB2-U-Information,3519,6.4.21,Grouped,V,P,,M
+MB2U-Security,3517,6.4.19,Unsigned32,"M,V",P,,
+MBMS-Bearer-Event,3502,6.4.4,Unsigned32,"M,V",P,,
+MBMS-Bearer-Event-Notification,3503,6.4.5,Grouped,"M,V",P,,
+MBMS-Bearer-Request,3504,6.4.6,Grouped,"M,V",P,,
+MBMS-Bearer-Response,3505,6.4.7,Grouped,"M,V",P,,
+MBMS-Bearer-Result,3506,6.4.8,Unsigned32,"M,V",P,,
+MBMS-eNB-IP-Multicast-Address,3520,6.4.22,Address,V,P,,M
+MBMS-eNB-IPv6-Multicast-Address,3521,6.4.23,Address,V,P,,M
+# Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IP-Address (924).,,,,,,,
+# 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IP-Address (924).,,,,,,,
+# 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IP-Address (3522).,,,,,,,
+# ,,,,,,,
+# Fix: MBMS-GW-SSM-IP-Address (3522) renamed to MBMS-GW-SSM-IP-Address-29.468 (3522).,,,,,,,
+MBMS-GW-SSM-IP-Address-29.468,3522,6.4.24,Address,V,P,,M
+# Note: Name conflict with 3GPP TS 29.061 MBMS-GW-SSM-IPv6-Address (925).,,,,,,,
+# 3GPP TS 29.061 V10.4.0 (2011-09) CR 0355 added MBMS-GW-SSM-IPv6-Address (925).,,,,,,,
+# 3GPP TS 29.061 V12.6.0 (2014-06) renamed,,,,,,,
+# MBMS-GW-SSM-IPv6-Address (925) to MBMS-GW-SSM-Ipv6-Address.,,,,,,,
+# 3GPP TS 29.468 V14.0.0 (2016-12) CR 0021 added MBMS-GW-SSM-IPv6-Address (3523).,,,,,,,
+# ,,,,,,,
+# Fix: MBMS-GW-SSM-IPv6-Address (3523) renamed to MBMS-GW-SSM-IPv6-Address-29.468 (3523).,,,,,,,
+MBMS-GW-SSM-IPv6-Address-29.468,3523,6.4.25,Address,V,P,,M
+MBMS-Start-Time,3507,6.4.9,Time,"M,V",P,,
+# Note: Name conflict with 3GPP TS 32.299 Radio-Frequency (3462).,,,,,,,
+# 3GPP TS 29.468 V12.0.0 (2014-09) added Radio-Frequency (3508).,,,,,,,
+# 3GPP TS 32.299 V13.1.0 (2015-06) CR 0638 added Radio-Frequency (3462).,,,,,,,
+# ,,,,,,,
+# Fix: Radio-Frequency (3508) renamed to Radio-Frequency-29.468 (3508).,,,,,,,
+Radio-Frequency-29.468,3508,6.4.10,Unsigned32,"M,V",P,,
+ROHC-Full-Header-Periodicity,3527,6.4.29,Float32,V,P,,M
+ROHC-Max-CID,3532,6.4.34,Unsigned32,V,P,,M
+ROHC-Profile,3528,6.4.30,Unsigned32,V,P,,M
+ROHC-Request,3526,6.4.28,Grouped,V,P,,M
+ROHC-Result,3530,6.4.32,Unsigned32,V,P,,M
+TMGI-Allocation-Request,3509,6.4.11,Grouped,"M,V",P,,
+TMGI-Allocation-Response,3510,6.4.12,Grouped,"M,V",P,,
+TMGI-Allocation-Result,3511,6.4.13,Unsigned32,"M,V",P,,
+TMGI-Deallocation-Request,3512,6.4.14,Grouped,"M,V",P,,
+TMGI-Deallocation-Response,3513,6.4.15,Grouped,"M,V",P,,
+TMGI-Deallocation-Result,3514,6.4.16,Unsigned32,"M,V",P,,
+TMGI-Expiry,3515,6.4.17,Grouped,"M,V",P,,
+TMGI-Number,3516,6.4.18,Unsigned32,"M,V",P,,
+Userplane-Protocol-Result,3529,6.4.31,Grouped,V,P,,M
+,,,,,,,
+@standard,3GPP TS 29.561,,,,,,
+#=,,,,,,,
+# 3GPP TS 29.561 V16.3.0 (2020-03),,,,,,,
+# 5G System; Interworking between 5G Network and external,,,,,,,
+# Data Networks;,,,,,,,
+# Stage 3,,,,,,,
+# ,,,,,,,
+# From 3GPP 29561-g30.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# Table 12.4-1: N6 re-used Diameter AVPs,,,,,,,
+#,,,,,,,
+# Note: Only AVPs defined in 3GPP TS 29.561.,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+3GPP-Notification,110,11.3.1,OctetString,V,P,,M
+3GPP-UE-MAC-Address,111,11.3.1,OctetString,V,P,,M
+3GPP-Authorization-Reference,112,11.3.1,OctetString,V,P,,M
+3GPP-Policy-Reference,113,11.3.1,OctetString,V,P,,M
+3GPP-Session-AMBR,114,11.3.1,OctetString,V,P,,M
+3GPP-NAI,115,11.3.1,OctetString,V,P,,M
+3GPP-Session-AMBR-v2,116,11.3.1,OctetString,V,P,,M
+3GPP-IP-Address-Pool-Id,118,11.3.1,OctetString,V,P,,M
+#=,,,,,,,
+# Table 17.4-1: Additional information needed for network slice specific authentication,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+3GPP-S-NSSAI,200,16.3.1,UTF8String,V,P,,M
+,,,,,,,
+@standard,3GPP TS 32.299,,,,,,
+#=,,,,,,,
+# 3GPP TS 32.299 V15.7.0 (2019-06),,,,,,,
+# Charging management;,,,,,,,
+# Diameter charging applications,,,,,,,
+# ,,,,,,,
+# From 3GPP 32299-f70.doc,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+#=,,,,,,,
+# 3GPP TS 32.299 Table 7.2.0.1: 3GPP specific AVPs,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+3GPP-OC-Specific-Reduction,1320,,Grouped,V,,,M
+3GPP-OC-Rating-Group,1321,,Unsigned32,V,,,M
+3GPP-OC-Request-Type,1322,,Enumerated,V,,,M
+# Note: Name conflict with 3GPP TS 29.212 3GPP-PS-Data-Off-Status (2847).,,,,,,,
+# 3GPP TS 29.212 V14.3.0 (2017-03) CR 1559 added 3GPP-PS-Data-Off-Status (2847).,,,,,,,
+# 3GPP TS 32.299 V14.3.0 (2017-03) CR 0760 added 3GPP-PS-Data-Off-Status (4406).,,,,,,,
+# ,,,,,,,
+# Fix: 3GPP-PS-Data-Off-Status (4406) renamed to 3GPP-PS-Data-Off-Status-32.299 (4406).,,,,,,,
+3GPP-PS-Data-Off-Status-32.299,4406,,Enumerated,"V,M",,,
+Access-Network-Info-Change,4401,,Grouped,"V,M",,,
+Access-Network-Information,1263,,OctetString,"V,M",,,
+Access-Transfer-Information,2709,,Grouped,"V,M",,,
+Access-Transfer-Type,2710,,Enumerated,"V,M",,,
+Account-Expiration,2309,,Time,"V,M",,,
+Accumulated-Cost,2052,,Grouped,"V,M",,,
+Adaptations,1217,,Enumerated,"V,M",,,
+Additional-Content-Information,1207,,Grouped,"V,M",,,
+Additional-Exception-Reports,3936,,Enumerated,"V,M",,,
+Additional-Type-Information,1205,,UTF8String,"V,M",,,
+Address-Data,897,,UTF8String,"V,M",,,
+Address-Domain,898,,Grouped,"V,M",,,
+Addressee-Type,1208,,Enumerated,"V,M",,,
+Address-Type,899,,Enumerated,"V,M",,,
+AF-Correlation-Information,1276,,Grouped,"V,M",,,
+Alternate-Charged-Party-Address,1280,,UTF8String,"V,M",,,
+Announcement-Identifier,3905,,Unsigned32,"V,M",,,
+Announcement-Information,3904,,Grouped,"V,M",,,
+Announcement-Order,3906,,Unsigned32,"V,M",,,
+Announcing-PLMN-ID,4408,,UTF8String,"V,M",,,
+Announcing-UE-HPLMN-Identifier,3426,,UTF8String,"V,M",,,
+Announcing-UE-VPLMN-Identifier,3427,,UTF8String,"V,M",,,
+AoC-Cost-Information,2053,,Grouped,"V,M",,,
+AoC-Format,2310,,Enumerated,"V,M",,,
+AoC-Information,2054,,Grouped,"V,M",,,
+AoC-Request-Type,2055,,Enumerated,"V,M",,,
+AoC-Service,2311,,Grouped,"V,M",,,
+AoC-Service-Obligatory-Type,2312,,Enumerated,"V,M",,,
+AoC-Service-Type,2313,,Enumerated,"V,M",,,
+AoC-Subscription-Information,2314,,Grouped,"V,M",,,
+API-Content,1309,,UTF8String,V,,,M
+API-Direction,1310,,Enumerated,V,,,M
+API-Identifier,1311,,OctetString,V,,,M
+API-Invocation-Timestamp,1312,,Time,V,,,M
+API-Network-Service-Node,1315,,Enumerated,V,,,M
+API-Result-Code,1313,,Unsigned32,V,,,M
+API-Size,1314,,Unsigned64,V,,,M
+APN-Rate-Control,3933,,Grouped,"V,M",,,
+APN-Rate-Control-Downlink,3934,,Grouped,"V,M",,,
+APN-Rate-Control-Uplink,3935,,Grouped,"V,M",,,
+Applic-ID,1218,,UTF8String,"V,M",,,
+Application-Provided-Called-Party-Address,837,,UTF8String,"V,M",,,
+Application-Server,836,,UTF8String,"V,M",,,
+Application-Server-Information,850,,Grouped,"V,M",,,
+Application-Specific-Data,3458,,OctetString,"V,M",,,
+Associated-Party-Address,2035,,UTF8String,"V,M",,,
+Associated-URI,856,,UTF8String,"V,M",,,
+Authorised-QoS,849,,UTF8String,"V,M",,,
+Aux-Applic-Info,1219,,UTF8String,"V,M",,,
+Base-Time-Interval,1265,,Unsigned32,"V,M",,,
+Basic-Service-Code,3411,,Grouped,"V,M",,,
+Bearer-Capability,3412,,OctetString,"V,M",,,
+Bearer-Service,854,,OctetString,"V,M",,,
+BSSID,2716,,UTF8String,"V,M",,,
+Called-Asserted-Identity,1250,,UTF8String,"V,M",,,
+Called-Identity,3916,,UTF8String,"V,M",,,
+Called-Identity-Change,3917,,Grouped,"V,M",,,
+Called-Party-Address,832,,UTF8String,"V,M",,,
+Calling-Party-Address,831,,UTF8String,"V,M",,,
+Carrier-Select-Routing-Information,2023,,UTF8String,"V,M",,,
+Cause-Code,861,,Integer32,"V,M",,,
+Cellular-Network-Information,3924,,OctetString,"V,M",,,
+CG-Address,846,,Address,"V,M",,,
+Change-Condition,2037,,Integer32,"V,M",,,
+Change-Time,2038,,Time,"V,M",,,
+Charge-Reason-Code,2118,,Enumerated,"V,M",,,
+Charged-Party,857,,UTF8String,"V,M",,,
+Charging-Characteristics-Selection-Mode,2066,,Enumerated,"V,M",,,
+Charging-Per-IP-CAN-Session-Indicator,4400,,Enumerated,"V,M",,,
+Civic-Address-Information,1305,,UTF8String,V,,,M
+Class-Identifier,1214,,Enumerated,"V,M",,,
+Client-Address,2018,,Address,"V,M",,,
+CN-Operator-Selection-Entity,3421,,Enumerated,"V,M",,,
+Content-Class,1220,,Enumerated,"V,M",,,
+Content-Disposition,828,,UTF8String,"V,M",,,
+Content-Length,827,,Unsigned32,"V,M",,,
+Content-Size,1206,,Unsigned32,"V,M",,,
+Content-Type,826,,UTF8String,"V,M",,,
+Coverage-Info,3459,,Grouped,"V,M",,,
+Coverage-Status,3428,,Enumerated,"V,M",,,
+CP-CIoT-EPS-Optimisation-Indicator,3930,,Enumerated,"V,M",,,
+CPDT-Information,3927,,Grouped,"V,M",,,
+CSG-Access-Mode,2317,,Enumerated,"V,M",,,
+CSG-Membership-Indication,2318,,Enumerated,"V,M",,,
+CUG-Information,2304,,OctetString,"V,M",,,
+Current-Tariff,2056,,Grouped,"V,M",,,
+Data-Coding-Scheme,2001,,Integer32,"V,M",,,
+Deferred-Location-Event-Type,1230,,UTF8String,"V,M",,,
+Delivery-Report-Requested,1216,,Enumerated,"V,M",,,
+Destination-Interface,2002,,Grouped,"V,M",,,
+Diagnostics,2039,,Integer32,"V,M",,,
+Discoveree-UE-HPLMN-Identifier,4402,,UTF8String,"V,M",,,
+Discoveree-UE-VPLMN-Identifier,4403,,UTF8String,"V,M",,,
+Discoverer-UE-HPLMN-Identifier,4404,,UTF8String,"V,M",,,
+Discoverer-UE-VPLMN-Identifier,4405,,UTF8String,"V,M",,,
+Domain-Name,1200,,UTF8String,"V,M",,,
+DRM-Content,1221,,Enumerated,"V,M",,,
+Dynamic-Address-Flag,2051,,Enumerated,"V,M",,,
+Dynamic-Address-Flag-Extension,2068,,Enumerated,"V,M",,,
+Early-Media-Description,1272,,Grouped,"V,M",,,
+Enhanced-Diagnostics,3901,,Grouped,"V,M",,,
+Envelope,1266,,Grouped,"V,M",,,
+Envelope-End-Time,1267,,Time,"V,M",,,
+Envelope-Reporting,1268,,Enumerated,"V,M",,,
+Envelope-Start-Time,1269,,Time,"V,M",,,
+EPDG-Address,3425,,Address,"V,M",,,
+Event,825,,UTF8String,"V,M",,,
+Event-Charging-TimeStamp,1258,,Time,"V,M",,,
+Event-Type,823,,Grouped,"V,M",,,
+Expires,888,,Unsigned32,"V,M",,,
+Exposure-Function-API-Information,1316,,Grouped,V,,,M
+FE-Identifier-List,4413,,UTF8String,"V,M",,,
+File-Repair-Supported,1224,,Enumerated,"V,M",,,
+Forwarding-Pending,3415,,Enumerated,"V,M",,,
+From-Address,2708,,UTF8String,"V,M",,,
+GGSN-Address,847,,Address,"V,M",,,
+IMS-Application-Reference-Identifier,2601,,UTF8String,"V,M",,,
+IMS-Charging-Identifier,841,,UTF8String,"V,M",,,
+IMS-Communication-Service-Identifier,1281,,UTF8String,"V,M",,,
+IMS-Emergency-Indicator,2322,,Enumerated,"V,M",,,
+IMS-Information,876,,Grouped,"V,M",,,
+IMS-Visited-Network-Identifier,2713,,UTF8String,"V,M",,,
+IMSI-Unauthenticated-Flag,2308,,Enumerated,"V,M",,,
+Incoming-Trunk-Group-Id,852,,UTF8String,"V,M",,,
+Incremental-Cost,2062,,Grouped,"V,M",,,
+Initial-IMS-Charging-Identifier,2321,,UTF8String,"V,M",,,
+Instance-Id,3402,,UTF8String,"V,M",,,
+Interface-Id,2003,,UTF8String,"V,M",,,
+Interface-Port,2004,,UTF8String,"V,M",,,
+Interface-Text,2005,,UTF8String,"V,M",,,
+Interface-Type,2006,,Enumerated,"V,M",,,
+Inter-Operator-Identifier,838,,Grouped,"V,M",,,
+Inter-UE-Transfer,3902,,Enumerated,"V,M",,,
+IP-Realm-Default-Indication,2603,,Enumerated,"V,M",,,
+ISUP-Cause,3416,,Grouped,"V,M",,,
+ISUP-Cause-Diagnostics,3422,,OctetString,"V,M",,,
+ISUP-Cause-Location,3423,,Unsigned32,"V,M",,,
+ISUP-Cause-Value,3424,,Unsigned32,"V,M",,,
+ISUP-Location-Number,3414,,OctetString,"V,M",,,
+Language,3914,,UTF8String,"V,M",,,
+Layer-2-Group-ID,3429,,OctetString,"V,M",,,
+LCS-APN,1231,,UTF8String,"V,M",,,
+LCS-Client-Dialed-By-MS,1233,,UTF8String,"V,M",,,
+LCS-Client-External-ID,1234,,UTF8String,"V,M",,,
+LCS-Client-Id,1232,,Grouped,"V,M",,,
+LCS-Client-Name,1235,,Grouped,"V,M",,,
+LCS-Client-Type,1241,,Enumerated,"V,M",,,
+LCS-Data-Coding-Scheme,1236,,UTF8String,"V,M",,,
+LCS-Format-Indicator,1237,,Enumerated,"V,M",,,
+LCS-Information,878,,Grouped,"V,M",,,
+LCS-Name-String,1238,,UTF8String,"V,M",,,
+# Note: 3GPP TS 32.299 V11.8.0 (2013-07) renamed,,,,,,,
+# LCS-Requestor-Id (1239) to LCS-Requestor-ID (1239).,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: LCS-Requestor-Id (1239) renamed to LCS-Requestor-ID (1239).,,,,,,,
+LCS-Requestor-ID,1239,,Grouped,"V,M",,,
+# Note: 3GPP TS 32.299 V11.8.0 (2013-07) renamed,,,,,,,
+# LCS-Requestor-Id-String (1240) to LCS-Requestor-ID-String (1240).,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: LCS-Requestor-Id-String (1240) renamed to LCS-Requestor-ID-String (1240).,,,,,,,
+LCS-Requestor-ID-String,1240,,UTF8String,"V,M",,,
+Local-GW-Inserted-Indication,2604,,Enumerated,"V,M",,,
+Local-Sequence-Number,2063,,Unsigned32,"V,M",,,
+Location-Estimate,1242,,OctetString,"V,M",,,
+Location-Estimate-Type,1243,,Enumerated,"V,M",,,
+Location-Info,3460,,Grouped,"V,M",,,
+Location-Type,1244,,Grouped,"V,M",,,
+Low-Balance-Indication,2020,,Enumerated,"V,M",,,
+Low-Priority-Indicator,2602,,Enumerated,"V,M",,,
+MBMS-Charged-Party,2323,,Enumerated,"V,M",,,
+# Note: 3GPP TS 32.299 V11.8.0 (2013-07) Table 7.2 changed,,,,,,,
+# row MBMS-GW-Address (2307) to have a hyphen instead of space.,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: MBMSGW-Address (2307) renamed to MBMS-GW-Address (2307).,,,,,,,
+MBMS-GW-Address,2307,,Address,"V,M",,,
+MBMS-Information,880,,Grouped,"V,M",,,
+MBMS-User-Service-Type,1225,,Enumerated,"V,M",,,
+Media-Initiator-Flag,882,,Enumerated,"V,M",,,
+Media-Initiator-Party,1288,,UTF8String,"V,M",,,
+Message-Body,889,,Grouped,"V,M",,,
+Message-Class,1213,,Grouped,"V,M",,,
+Message-ID,1210,,UTF8String,"V,M",,,
+Message-Size,1212,,Unsigned32,"V,M",,,
+Message-Type,1211,,Enumerated,"V,M",,,
+MMBox-Storage-Requested,1248,,Enumerated,"V,M",,,
+MM-Content-Type,1203,,Grouped,"V,M",,,
+MMS-Information,877,,Grouped,"V,M",,,
+MMTel-Information,2030,,Grouped,"V,M",,,
+MMTel-SService-Type,2031,,Unsigned32,"V,M",,,
+Monitored-PLMN-Identifier,3430,,UTF8String,"V,M",,,
+Monitoring-Event-Configuration-Activity,3919,,Integer32,"V,M",,,
+Monitoring-Event-Functionality,3922,,Integer32,"V,M",,,
+Monitoring-Event-Information,3921,,Grouped,"V,M",,,
+Monitoring-Event-Report-Data,3920,,Grouped,"V,M",,,
+Monitoring-Event-Report-Number,3923,,Unsigned32,"V,M",,,
+Monitoring-UE-HPLMN-Identifier,3431,,UTF8String,"V,M",,,
+Monitoring-UE-Identifier,3432,,UTF8String,"V,M",,,
+Monitoring-UE-VPLMN-Identifier,3433,,UTF8String,"V,M",,,
+MSC-Address,3417,,OctetString,"V,M",,,
+MTC-IWF-Address,3406,,Address,"V,M",,,
+Neighbour-Node-Address,2705,,Address,"V,M",,,
+Network-Call-Reference-Number,3418,,OctetString,"V,M",,,
+Next-Tariff,2057,,Grouped,"V,M",,,
+NIDD-Submission,3928,,Grouped,"V,M",,,
+NNI-Information,2703,,Grouped,"V,M",,,
+NNI-Type,2704,,Enumerated,"V,M",,,
+Node-Functionality,862,,Enumerated,"V,M",,,
+Node-Id,2064,,UTF8String,"V,M",,,
+Number-Of-Diversions,2034,,Unsigned32,"V,M",,,
+Number-Of-Messages-Sent,2019,,Unsigned32,"V,M",,,
+Number-Of-Participants,885,,Unsigned32,"V,M",,,
+Number-Of-Received-Talk-Bursts,1282,,Unsigned32,"V,M",,,
+Number-Of-Talk-Bursts,1283,,Unsigned32,"V,M",,,
+Number-Portability-Routing-Information,2024,,UTF8String,"V,M",,,
+Offline-Charging,1278,,Grouped,"V,M",,,
+Online-Charging-Flag,2303,,Enumerated,"V,M",,,
+Originating-IOI,839,,UTF8String,"V,M",,,
+Originator,864,,Enumerated,"V,M",,,
+Originator-Address,886,,Grouped,"V,M",,,
+Originator-Interface,2009,,Grouped,"V,M",,,
+Originator-Received-Address,2027,,Grouped,"V,M",,,
+Originator-SCCP-Address,2008,,Address,"V,M",,,
+Outgoing-Session-Id,2320,,UTF8String,"V,M",,,
+Outgoing-Trunk-Group-Id,853,,UTF8String,"V,M",,,
+Participant-Access-Priority,1259,,Enumerated,"V,M",,,
+Participant-Action-Type,2049,,Enumerated,"V,M",,,
+Participant-Group,1260,,Grouped,"V,M",,,
+Participants-Involved,887,,UTF8String,"V,M",,,
+PC3-Control-Protocol-Cause,3434,,Integer32,"V,M",,,
+PC3-EPC-Control-Protocol-Cause,3435,,Integer32,"V,M",,,
+PC5-Radio-Technology,1300,,Enumerated,V,,,M
+PDN-Connection-Charging-ID,2050,,Unsigned32,"V,M",,,
+PDP-Address,1227,,Address,"V,M",,,
+PDP-Address-Prefix-Length,2606,,Unsigned32,"V,M",,,
+PDP-Context-Type,1247,,Enumerated,"V,M",,,
+# Change-1.4.0: PDG-Address (895) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+# Change-1.4.0: PDG-Charging-Id (896) Unsigned32 removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+Play-Alternative,3913,,Enumerated,"V,M",,,
+PoC-Change-Condition,1261,,Enumerated,"V,M",,,
+PoC-Change-Time,1262,,Time,"V,M",,,
+PoC-Controlling-Address,858,,UTF8String,"V,M",,,
+PoC-Event-Type,2025,,Enumerated,"V,M",,,
+PoC-Group-Name,859,,UTF8String,"V,M",,,
+PoC-Information,879,,Grouped,"V,M",,,
+PoC-Server-Role,883,,Enumerated,"V,M",,,
+PoC-Session-Id,1229,,UTF8String,"V,M",,,
+PoC-Session-Initiation-type,1277,,Enumerated,"V,M",,,
+PoC-Session-Type,884,,Enumerated,"V,M",,,
+PoC-User-Role,1252,,Grouped,"V,M",,,
+PoC-User-Role-IDs,1253,,UTF8String,"V,M",,,
+# Note: 3GPP TS 32.299 V13.1.0 (2015-06) renamed,,,,,,,
+# PoC-User-Role-info-Units (1254) to PoC-User-Role-Info-Units (1254).,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: PoC-User-Role-info-Units (1254) renamed to PoC-User-Role-Info-Units (1254).,,,,,,,
+PoC-User-Role-Info-Units,1254,,Enumerated,"V,M",,,
+Positioning-Data,1245,,UTF8String,"V,M",,,
+Preferred-AoC-Currency,2315,,Unsigned32,"V,M",,,
+Priority,1209,,Enumerated,"V,M",,,
+Privacy-Indicator,3915,,Enumerated,"V,M",,,
+ProSe-3rd-Party-Application-ID,3440,,UTF8String,"V,M",,,
+ProSe-Direct-Communication-Reception-Data-Container,3461,,Grouped,"V,M",,,
+ProSe-Direct-Communication-Transmission-Data-Container,3441,,Grouped,"V,M",,,
+ProSe-Direct-Discovery-Model,3442,,Enumerated,"V,M",,,
+ProSe-Event-Type,3443,,Enumerated,"V,M",,,
+ProSe-Function-IP-Address,3444,,Address,"V,M",,,
+ProSe-Function-PLMN-Identifier,3457,,UTF8String,"V,M",,,
+ProSe-Functionality,3445,,Enumerated,"V,M",,,
+ProSe-Group-IP-Multicast-Address,3446,,Address,"V,M",,,
+ProSe-Information,3447,,Grouped,"V,M",,,
+ProSe-Range-Class,3448,,Enumerated,"V,M",,,
+ProSe-Reason-For-Cancellation,3449,,Enumerated,"V,M",,,
+ProSe-Request-Timestamp,3450,,Time,"V,M",,,
+ProSe-Role-Of-UE,3451,,Enumerated,"V,M",,,
+ProSe-Source-IP-Address,3452,,Address,"V,M",,,
+ProSe-Target-Layer-2-ID,4410,,OctetString,"V,M",,,
+ProSe-UE-ID,3453,,OctetString,"V,M",,,
+ProSe-UE-to-Network-Relay-UE-ID,4409,,OctetString,"V,M",,,
+Proximity-Alert-Indication,3454,,Enumerated,"V,M",,,
+Proximity-Alert-Timestamp,3455,,Time,"V,M",,,
+Proximity-Cancellation-Timestamp,3456,,Time,"V,M",,,
+PS-Append-Free-Format-Data,867,,Enumerated,"V,M",,,
+PS-Free-Format-Data,866,,OctetString,"V,M",,,
+PS-Furnish-Charging-Information,865,,Grouped,"V,M",,,
+PS-Information,874,,Grouped,"V,M",,,
+Quota-Consumption-Time,881,,Unsigned32,"V,M",,,
+Quota-Holding-Time,871,,Unsigned32,"V,M",,,
+Quota-Indicator,3912,,Enumerated,"V,M",,,
+# Note: Name conflict with 3GPP TS 32.299 Radio-Frequency (3508),,,,,,,
+# 3GPP TS 29.468 V12.0.0 (2014-09) added Radio-Frequency (3508).,,,,,,,
+# 3GPP TS 32.299 V13.1.0 (2015-06) CR 0638 added Radio-Frequency (3462).,,,,,,,
+Radio-Frequency,3462,,OctetString,"V,M",,,
+Radio-Parameter-Set-Info,3463,,Grouped,"V,M",,,
+Radio-Parameter-Set-Values,3464,,OctetString,"V,M",,,
+Radio-Resources-Indicator,3465,,Integer32,"V,M",,,
+RAN-End-Time,1301,,Time,V,,,M
+RAN-Secondary-RAT-Usage-Report,1302,,Grouped,V,,,M
+RAN-Start-Time,1303,,Time,V,,,M
+Rate-Control-Max-Message-Size,3937,,Unsigned32,"V,M",,,
+Rate-Control-Max-Rate,3938,,Unsigned32,"V,M",,,
+Rate-Control-Time-Unit,3939,,Unsigned32,"V,M",,,
+Rate-Element,2058,,Grouped,"V,M",,,
+Read-Reply-Report-Requested,1222,,Enumerated,"V,M",,,
+Real-Time-Tariff-Information,2305,,Grouped,"V,M",,,
+Reason-Header,3401,,UTF8String,"V,M",,,
+Received-Talk-Burst-Time,1284,,Unsigned32,"V,M",,,
+Received-Talk-Burst-Volume,1285,,Unsigned32,"V,M",,,
+# Note: Name conflict with 3GPP TS 32.299 Recipient-Address (1201);,,,,,,,
+# 3GPP TS 29.140 V6.1.0 (2005-06) allocated Recipient-Address (1108).,,,,,,,
+# 3GPP TS 32.299 V6.4.0 (2005-09) CR 0028 added Recipient-Address (1201).,,,,,,,
+Recipient-Address,1201,,Grouped,"V,M",,,
+Recipient-Info,2026,,Grouped,"V,M",,,
+Recipient-Received-Address,2028,,Grouped,"V,M",,,
+Recipient-SCCP-Address,2010,,Address,"V,M",,,
+Refund-Information,2022,,OctetString,"V,M",,,
+Related-Change-Condition-Information,3925,,Grouped,"V,M",,,
+Related-Trigger,3926,,Grouped,"V,M",,,
+Related-IMS-Charging-Identifier,2711,,UTF8String,"V,M",,,
+Related-IMS-Charging-Identifier-Node,2712,,Address,"V,M",,,
+Relationship-Mode,2706,,Enumerated,"V,M",,,
+Relay-IP-address,4411,,Address,"V,M",,,
+Remaining-Balance,2021,,Grouped,"V,M",,,
+Reply-Applic-ID,1223,,UTF8String,"V,M",,,
+Reply-Path-Requested,2011,,Enumerated,"V,M",,,
+Reporting-Reason,872,,Enumerated,"V,M",,,
+Requested-Party-Address,1251,,UTF8String,"V,M",,,
+Requested-PLMN-Identifier,3436,,UTF8String,"V,M",,,
+Requestor-PLMN-Identifier,3437,,UTF8String,"V,M",,,
+Role-Of-Node,829,,Enumerated,"V,M",,,
+Role-Of-ProSe-Function,3438,,Enumerated,"V,M",,,
+Route-Header-Received,3403,,UTF8String,"V,M",,,
+Route-Header-Transmitted,3404,,UTF8String,"V,M",,,
+Scale-Factor,2059,,Grouped,"V,M",,,
+SCEF-Address,1317,,Address,V,,,M
+SCS-Address,3941,,Address,"V,M",,,
+SCS-AS-Address,3940,,Grouped,"V,M",,,
+SCS-Realm,3942,,DiameterIdentity,"V,M",,,
+SDP-Answer-Timestamp,1275,,Time,"V,M",,,
+SDP-Media-Component,843,,Grouped,"V,M",,,
+SDP-Media-Description,845,,UTF8String,"V,M",,,
+SDP-Media-Name,844,,UTF8String,"V,M",,,
+SDP-Offer-Timestamp,1274,,Time,"V,M",,,
+SDP-Session-Description,842,,UTF8String,"V,M",,,
+SDP-TimeStamps,1273,,Grouped,"V,M",,,
+SDP-Type,2036,,Enumerated,"V,M",,,
+Secondary-RAT-Type,1304,,OctetString,V,,,M
+Serving-Node-Identity,3929,,DiameterIdentity,"V,M",,,
+Served-Party-IP-Address,848,,Address,"V,M",,,
+Service-Data-Container,2040,,Grouped,"V,M",,,
+Service-Id,855,,UTF8String,"V,M",,,
+Service-Information,873,,Grouped,"V,M",,,
+Service-Mode,2032,,Unsigned32,"V,M",,,
+Service-Specific-Data,863,,UTF8String,"V,M",,,
+Service-Specific-Info,1249,,Grouped,"V,M",,,
+Service-Specific-Type,1257,,Unsigned32,"V,M",,,
+Serving-Node-Type,2047,,Enumerated,"V,M",,,
+Session-Direction,2707,,Enumerated,"V,M",,,
+SGi-PtP-Tunnelling-Method,3931,,Enumerated,"V,M",,,
+SGSN-Address,1228,,Address,"V,M",,,
+SGW-Address,2067,,Address,"V,M",,,
+SGW-Change,2065,,Enumerated,"V,M",,,
+SIP-Method,824,,UTF8String,"V,M",,,
+SIP-Request-Timestamp,834,,Time,"V,M",,,
+SIP-Request-Timestamp-Fraction,2301,,Unsigned32,"V,M",,,
+SIP-Response-Timestamp,835,,Time,"V,M",,,
+SIP-Response-Timestamp-Fraction,2302,,Unsigned32,"V,M",,,
+SM-Device-Trigger-Indicator,3407,,Enumerated,"V,M",,,
+SM-Device-Trigger-Information,3405,,Grouped,"V,M",,,
+SM-Discharge-Time,2012,,Time,"V,M",,,
+SM-Message-Type,2007,,Enumerated,"V,M",,,
+SM-Protocol-ID,2013,,OctetString,"V,M",,,
+SM-Sequence-Number,3408,,Unsigned32,"V,M",,,
+SM-Service-Type,2029,,Enumerated,"V,M",,,
+SM-Status,2014,,OctetString,"V,M",,,
+SM-User-Data-Header,2015,,OctetString,"V,M",,,
+SMS-Information,2000,,Grouped,"V,M",,,
+SMS-Node,2016,,Enumerated,"V,M",,,
+SMS-Result,3409,,Unsigned32,"V,M",,,
+SMSC-Address,2017,,Address,"V,M",,,
+Start-of-Charging,3419,,Time,"V,M",,,
+Start-Time,2041,,Time,"V,M",,,
+# Note: 3GPP TS 32.299 V11.10.0 (2013-12) CR 0566 renamed,,,,,,,
+# Status (2702) to Status-Code (2702).,,,,,,,
+# 3GPP TS 32.299 V11.14.0 (2014-12) CR 0617 renamed,,,,,,,
+# Status-Code (2702) to Status-AS-Code (2702).,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: Status (2702) renamed to Status-AS-Code (2702).,,,,,,,
+Status-AS-Code,2702,,Enumerated,"V,M",,,
+Stop-Time,2042,,Time,"V,M",,,
+Submission-Time,1202,,Time,"V,M",,,
+Subscriber-Role,2033,,Enumerated,"V,M",,,
+Supplementary-Service,2048,,Grouped,"V,M",,,
+TAD-Identifier,2717,,Enumerated,"V,M",,,
+Talk-Burst-Exchange,1255,,Grouped,"V,M",,,
+Talk-Burst-Time,1286,,Unsigned32,"V,M",,,
+Talk-Burst-Volume,1287,,Unsigned32,"V,M",,,
+Target-IP-Address,4412,,Address,VM,,,
+Tariff-Information,2060,,Grouped,"V,M",,,
+Tariff-XML,2306,,UTF8String,"V,M",,,
+Teleservice,3413,,OctetString,"V,M",,,
+Terminating-IOI,840,,UTF8String,"V,M",,,
+Time-First-Reception,3466,,Time,"V,M",,,
+Time-First-Transmission,3467,,Time,"V,M",,,
+Time-First-Usage,2043,,Time,"V,M",,,
+Time-Indicator,3911,,Unsigned32,"V,M",,,
+Time-Last-Usage,2044,,Time,"V,M",,,
+Time-Quota-Mechanism,1270,,Grouped,"V,M",,,
+Time-Quota-Threshold,868,,Unsigned32,"V,M",,,
+Time-Quota-Type,1271,,Enumerated,"V,M",,,
+Time-Stamps,833,,Grouped,"V,M",,,
+Time-Usage,2045,,Unsigned32,"V,M",,,
+TLTRI,1318,,Unsigned32,V,,,M
+Token-Text,1215,,UTF8String,"V,M",,,
+Traffic-Data-Volumes,2046,,Grouped,"V,M",,,
+Transcoder-Inserted-Indication,2605,,Enumerated,"V,M",,,
+Transit-IOI-List,2701,,UTF8String,"V,M",,,
+Transmitter-Info,3468,,Grouped,"V,M",,,
+Trigger,1264,,Grouped,"V,M",,,
+Trigger-Type,870,,Enumerated,"V,M",,,
+Trunk-Group-Id,851,,Grouped,"V,M",,,
+TWAG-Address,3903,,Address,"V,M",,,
+TWAN-User-Location-Info,2714,,Grouped,"V,M",,,
+Type-Number,1204,,Enumerated,"V,M",,,
+UNI-PDU-CP-Only-Flag,3932,,Enumerated,"V,M",,,
+Unit-Cost,2061,,Grouped,"V,M",,,
+Unit-Quota-Threshold,1226,,Unsigned32,"V,M",,,
+Unused-Quota-Timer,4407,,Unsigned32,"V,M",,,
+Usage-Information-Report-Sequence-Number,3439,,Integer32,"V,M",,,
+User-CSG-Information,2319,,Grouped,"V,M",,,
+User-Participating-Type,1279,,Enumerated,"V,M",,,
+User-Session-Id,830,,UTF8String,"V,M",,,
+UWAN-User-Location-Info,3918,,Grouped,"V,M",,,
+Variable-Part,3907,,Grouped,"V,M",,,
+Variable-Part-Order,3908,,Unsigned32,"V,M",,,
+Variable-Part-Type,3909,,Unsigned32,"V,M",,,
+Variable-Part-Value,3910,,UTF8String,"V,M",,,
+VCS-Information,3410,,Grouped,"V,M",,,
+VLR-Number,3420,,OctetString,"V,M",,,
+Volume-Quota-Threshold,869,,Unsigned32,"V,M",,,
+# Change-1.4.0: WAG-Address (890) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+# Change-1.4.0: WAG-PLMN-Id (891) OctetString removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+# Change-1.4.0: WLAN-Information (875) Grouped removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+WLAN-Operator-Id,1306,,Grouped,V,,,M
+WLAN-Operator-Name,1307,,UTF8String,V,,,M
+WLAN-PLMN-Id,1308,,UTF8String,V,,,M
+# Change-1.4.0: WLAN-Radio-Container (892) Grouped removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+# Change-1.4.0: WLAN-Session-Id (1246) UTF8String removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+# Change-1.4.0: WLAN-Technology (893) Unsigned32 removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+# Change-1.4.0: WLAN-UE-Local-IPAddress (894) Address removed in 3GPP TS 32.299 V12.6.0 (2014-09).,,,,,,,
+#,,,,,,,
+,,,,,,,
+@standard,OMA DDS Charging Data,,,,,,
+#=,,,,,,,
+# OMA DDS Charging_Data V1.0 20110201-A,,,,,,,
+# Charging Data,,,,,,,
+# ,,,,,,,
+# From OMA OMA-DDS-Charging_Data-V1_0-20110201-A.pdf,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+Application-Server-Id,2101,8.4,UTF8String,"M,V",,,
+# Change-1.4.0: Application-Service-Type (2102) type changed from UTF8String to Enumerated.,,,,,,,
+Application-Service-Type,2102,8.4,Enumerated,"M,V",,,
+# Change-1.4.0: Application-Session-Id (2103) type changed from UTF8String to Unsigned32.,,,,,,,
+Application-Session-Id,2103,8.4,Unsigned32,"M,V",,,
+Content-ID,2116,8.4,UTF8String,"M,V",,,
+Content-provider-ID,2117,8.4,UTF8String,"M,V",,,
+DCD-Information,2115,8.5.5,Grouped,"M,V",,,
+Delivery-Status,2104,8.4,UTF8String,"M,V",,,
+IM-Information,2110,8.5.6,Grouped,"M,V",,,
+Number-Of-Messages-Successfully-Exploded,2111,8.4,Unsigned32,"M,V",,,
+Number-Of-Messages-Successfully-Sent,2112,8.4,Unsigned32,"M,V",,,
+Service-Generic-Information,1256,8.5.10,Grouped,"M,V",,,
+Total-Number-Of-Messages-Exploded,2113,8.4,Unsigned32,"M,V",,,
+Total-Number-Of-Messages-Sent,2114,8.4,Unsigned32,"M,V",,,
+,,,,,,,
+,,,,,,,
+@vendor,5535,,,,,,
+,,,,,,,
+@standard,X.S0057-0,,,,,,
+#=,,,,,,,
+# 3GPP2 X.S0057-0 v2.0,,,,,,,
+# E-UTRAN - eHRPD Connectivity and Interworking:,,,,,,,
+# Core Network Aspects,,,,,,,
+# ,,,,,,,
+# From 3GPP2 X.S0057-0_v2.0_091215.pdf,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+# ,,,,,,,
+# Change-1.4.0: 3GPP2-BSID (9010) type changed from OctetString to UTF8String.,,,,,,,
+# Change-1.4.0: 3GPP2-BSID (9010) flag M MUST.,,,,,,,
+3GPP2-BSID,9010,5.6.2.1.1,UTF8String,"M,V",P,,
diff --git a/extensions/dict_dcca_starent/CMakeLists.txt b/extensions/dict_dcca_starent/CMakeLists.txt index 8152a02..c2ffa70 100644 --- a/extensions/dict_dcca_starent/CMakeLists.txt +++ b/extensions/dict_dcca_starent/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT("Diameter DCCA (Diameter Credit Control Application) Starent dictionary definitions " C) # Compile as a module -FD_ADD_EXTENSION(dict_dcca_starent dict_dcca_starent.c) +FD_ADD_EXTENSION(dict_dcca_starent dict_dcca_starent.c add_avps.c) #### diff --git a/extensions/dict_dcca_starent/add_avps.c b/extensions/dict_dcca_starent/add_avps.c new file mode 100644 index 0000000..ab96364 --- /dev/null +++ b/extensions/dict_dcca_starent/add_avps.c @@ -0,0 +1,355 @@ +/* +Generated by: + csv_to_fd -p fdc dict_dcca_starent.csv + +Do not modify; modify the source .csv files instead. +*/ + +#include <freeDiameter/extension.h> + +#define CHECK_dict_new( _type, _data, _parent, _ref ) \ + CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) ); + +#define CHECK_dict_search( _type, _criteria, _what, _result ) \ + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); + +int add_avps() +{ + struct dict_object * UTF8String_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); + + struct dict_object * Time_type = NULL; + CHECK_dict_search(DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); + + /*==================================================================*/ + /* Cisco ASR 5000 Series AAA Interface */ + /* Administration and Reference */ + /* Release 8.x and 9.0 */ + /* Last Updated June 30, 2010 */ + /* updated using v15 docs from Jan 2014 */ + /* www.cisco.com/c/dam/en/us/td/docs/wireless/asr_5000/15-0/15-0-AAA-Reference.pdf */ + /*==================================================================*/ + + /* SN-Volume-Quota-Threshold, Unsigned32, code 501 */ + { + struct dict_avp_data data = { + 501, /* Code */ + 8164, /* Vendor */ + "SN-Volume-Quota-Threshold", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Unit-Quota-Threshold, Unsigned32, code 502 */ + { + struct dict_avp_data data = { + 502, /* Code */ + 8164, /* Vendor */ + "SN-Unit-Quota-Threshold", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Time-Quota-Threshold, Unsigned32, code 503 */ + { + struct dict_avp_data data = { + 503, /* Code */ + 8164, /* Vendor */ + "SN-Time-Quota-Threshold", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Total-Used-Service-Unit, Grouped, code 504 */ + { + struct dict_avp_data data = { + 504, /* Code */ + 8164, /* Vendor */ + "SN-Total-Used-Service-Unit", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Absolute-Validity-Time, Time, code 505 */ + { + struct dict_avp_data data = { + 505, /* Code */ + 8164, /* Vendor */ + "SN-Absolute-Validity-Time", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SN-Bandwidth-Control, Enumerated, code 512 */ + { + struct dict_avp_data data = { + 512, /* Code */ + 8164, /* Vendor */ + "SN-Bandwidth-Control", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Starent/SN-Bandwidth-Control)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SN-Transparent-Data, OctetString, code 513 */ + { + struct dict_avp_data data = { + 513, /* Code */ + 8164, /* Vendor */ + "SN-Transparent-Data", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Traffic-Policy, UTF8String, code 514 */ + { + struct dict_avp_data data = { + 514, /* Code */ + 8164, /* Vendor */ + "SN-Traffic-Policy", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SN-Firewall-Policy, UTF8String, code 515 */ + { + struct dict_avp_data data = { + 515, /* Code */ + 8164, /* Vendor */ + "SN-Firewall-Policy", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SN-Usage-Monitoring-Control, Grouped, code 517 */ + { + struct dict_avp_data data = { + 517, /* Code */ + 8164, /* Vendor */ + "SN-Usage-Monitoring-Control", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Monitoring-Key, Unsigned32, code 518 */ + { + struct dict_avp_data data = { + 518, /* Code */ + 8164, /* Vendor */ + "SN-Monitoring-Key", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Usage-Volume, Unsigned64, code 519 */ + { + struct dict_avp_data data = { + 519, /* Code */ + 8164, /* Vendor */ + "SN-Usage-Volume", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_UNSIGNED64 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Service-Flow-Detection, Enumerated, code 520 */ + { + struct dict_avp_data data = { + 520, /* Code */ + 8164, /* Vendor */ + "SN-Service-Flow-Detection", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Starent/SN-Service-Flow-Detection)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SN-Usage-Monitoring, Enumerated, code 521 */ + { + struct dict_avp_data data = { + 521, /* Code */ + 8164, /* Vendor */ + "SN-Usage-Monitoring", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_INTEGER32 /* base type of data */ + }; + struct dict_object *type; + struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Starent/SN-Usage-Monitoring)", NULL, NULL, NULL }; + CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); + CHECK_dict_new(DICT_AVP, &data, type, NULL); + }; + + /* SN-Session-Start-Indicator, OctetString, code 522 */ + { + struct dict_avp_data data = { + 522, /* Code */ + 8164, /* Vendor */ + "SN-Session-Start-Indicator", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Phase0-PSAPName, UTF8String, code 523 */ + { + struct dict_avp_data data = { + 523, /* Code */ + 8164, /* Vendor */ + "SN-Phase0-PSAPName", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SN-Charging-Id, OctetString, code 525 */ + { + struct dict_avp_data data = { + 525, /* Code */ + 8164, /* Vendor */ + "SN-Charging-Id", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Remaining-Service-Unit, Grouped, code 526 */ + { + struct dict_avp_data data = { + 526, /* Code */ + 8164, /* Vendor */ + "SN-Remaining-Service-Unit", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_GROUPED /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Service-Start-Timestamp, Time, code 527 */ + { + struct dict_avp_data data = { + 527, /* Code */ + 8164, /* Vendor */ + "SN-Service-Start-Timestamp", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); + }; + + /* SN-Rulebase-Id, UTF8String, code 528 */ + { + struct dict_avp_data data = { + 528, /* Code */ + 8164, /* Vendor */ + "SN-Rulebase-Id", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SN-CF-Policy-ID, Unsigned32, code 529 */ + { + struct dict_avp_data data = { + 529, /* Code */ + 8164, /* Vendor */ + "SN-CF-Policy-ID", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Charging-Collection-Function-Name, UTF8String, code 530 */ + { + struct dict_avp_data data = { + 530, /* Code */ + 8164, /* Vendor */ + "SN-Charging-Collection-Function-Name", /* Name */ + AVP_FLAG_VENDOR, /* Fixed flags */ + AVP_FLAG_VENDOR, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); + }; + + /* SN-Fast-Reauth-Username, OctetString, code 11010 */ + { + struct dict_avp_data data = { + 11010, /* Code */ + 8164, /* Vendor */ + "SN-Fast-Reauth-Username", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + /* SN-Pseudonym-Username, OctetString, code 11011 */ + { + struct dict_avp_data data = { + 11011, /* Code */ + 8164, /* Vendor */ + "SN-Pseudonym-Username", /* Name */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_OCTETSTRING /* base type of data */ + }; + CHECK_dict_new(DICT_AVP, &data, NULL, NULL); + }; + + return 0; +} /* add_avps() */ diff --git a/extensions/dict_dcca_starent/dict_dcca_starent.c b/extensions/dict_dcca_starent/dict_dcca_starent.c index 1617c19..7a1ea60 100644 --- a/extensions/dict_dcca_starent/dict_dcca_starent.c +++ b/extensions/dict_dcca_starent/dict_dcca_starent.c @@ -6,9 +6,6 @@ /* The content of this file follows the same structure as dict_base_proto.c */ -#define CHECK_dict_new( _type, _data, _parent, _ref ) \ - CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) ); - #define CHECK_dict_search( _type, _criteria, _what, _result ) \ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); @@ -38,12 +35,12 @@ struct local_rules_definition { (_rulearray)[__ar].avp_name, \ &__data.rule_avp, 0 ) ); \ if ( !__data.rule_avp ) { \ - TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_name ); \ + LOG_E( "AVP Not found: '%s'", (_rulearray)[__ar].avp_name ); \ return ENOENT; \ } \ CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \ { \ - TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \ + LOG_E( "Error on rule with AVP '%s'", \ (_rulearray)[__ar].avp_name ); \ return EINVAL; \ } ); \ @@ -69,352 +66,8 @@ static int dict_dcca_starent_entry(char * conffile) } - - struct dict_object * Address_type; - struct dict_object * DiameterIdentity_type; - struct dict_object * DiameterURI_type; - struct dict_object * IPFilterRule_type; - struct dict_object * Time_type; - struct dict_object * UTF8String_type; - - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "DiameterIdentity", &DiameterIdentity_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "DiameterURI", &DiameterURI_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "IPFilterRule", &IPFilterRule_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); - CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); - - /* The following is created automatically. Do not modify. */ - /* Changes will be lost during the next update. Modify the source org file instead. */ - - /* Cisco ASR 5000 Series AAA Interface */ - /* Administration and Reference */ - /* Release 8.x and 9.0 */ - /* Last Updated June 30, 2010 */ - /* updated using v15 docs from Jan 2014 */ - /* www.cisco.com/c/dam/en/us/td/docs/wireless/asr_5000/15-0/15-0-AAA-Reference.pdf */ - /* SN-Volume-Quota-Threshold */ - { - struct dict_avp_data data = { - 501, /* Code */ - 8164, /* Vendor */ - "SN-Volume-Quota-Threshold", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Unit-Quota-Threshold */ - { - struct dict_avp_data data = { - 502, /* Code */ - 8164, /* Vendor */ - "SN-Unit-Quota-Threshold", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Time-Quota-Threshold */ - { - struct dict_avp_data data = { - 503, /* Code */ - 8164, /* Vendor */ - "SN-Time-Quota-Threshold", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Total-Used-Service-Unit */ - { - struct dict_avp_data data = { - 504, /* Code */ - 8164, /* Vendor */ - "SN-Total-Used-Service-Unit", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Absolute-Validity-Time */ - { - struct dict_avp_data data = { - 505, /* Code */ - 8164, /* Vendor */ - "SN-Absolute-Validity-Time", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SN-Bandwidth-Control */ - { - struct dict_avp_data data = { - 512, /* Code */ - 8164, /* Vendor */ - "SN-Bandwidth-Control", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Starent/SN-Bandwidth-Control)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SN-Transparent-Data */ - { - struct dict_avp_data data = { - 513, /* Code */ - 8164, /* Vendor */ - "SN-Transparent-Data", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Traffic-Policy */ - { - struct dict_avp_data data = { - 514, /* Code */ - 8164, /* Vendor */ - "SN-Traffic-Policy", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SN-Firewall-Policy */ - { - struct dict_avp_data data = { - 515, /* Code */ - 8164, /* Vendor */ - "SN-Firewall-Policy", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SN-Usage-Monitoring-Control */ - { - struct dict_avp_data data = { - 517, /* Code */ - 8164, /* Vendor */ - "SN-Usage-Monitoring-Control", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Monitoring-Key */ - { - struct dict_avp_data data = { - 518, /* Code */ - 8164, /* Vendor */ - "SN-Monitoring-Key", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Usage-Volume */ - { - struct dict_avp_data data = { - 519, /* Code */ - 8164, /* Vendor */ - "SN-Usage-Volume", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_UNSIGNED64 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Service-Flow-Detection */ - { - struct dict_avp_data data = { - 520, /* Code */ - 8164, /* Vendor */ - "SN-Service-Flow-Detection", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Starent/SN-Service-Flow-Detection)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SN-Usage-Monitoring */ - { - struct dict_avp_data data = { - 521, /* Code */ - 8164, /* Vendor */ - "SN-Usage-Monitoring", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_INTEGER32 /* base type of data */ - }; - struct dict_object *type; - struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Starent/SN-Usage-Monitoring)", NULL, NULL, NULL }; - CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); - CHECK_dict_new(DICT_AVP, &data, type, NULL); - }; - - /* SN-Session-Start-Indicator */ - { - struct dict_avp_data data = { - 522, /* Code */ - 8164, /* Vendor */ - "SN-Session-Start-Indicator", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Phase0-PSAPName */ - { - struct dict_avp_data data = { - 523, /* Code */ - 8164, /* Vendor */ - "SN-Phase0-PSAPName", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SN-Charging-Id */ - { - struct dict_avp_data data = { - 525, /* Code */ - 8164, /* Vendor */ - "SN-Charging-Id", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Remaining-Service-Unit */ - { - struct dict_avp_data data = { - 526, /* Code */ - 8164, /* Vendor */ - "SN-Remaining-Service-Unit", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Service-Start-Timestamp */ - { - struct dict_avp_data data = { - 527, /* Code */ - 8164, /* Vendor */ - "SN-Service-Start-Timestamp", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); - }; - - /* SN-Rulebase-Id */ - { - struct dict_avp_data data = { - 528, /* Code */ - 8164, /* Vendor */ - "SN-Rulebase-Id", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SN-CF-Policy-ID */ - { - struct dict_avp_data data = { - 529, /* Code */ - 8164, /* Vendor */ - "SN-CF-Policy-ID", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Charging-Collection-Function-Name */ - { - struct dict_avp_data data = { - 530, /* Code */ - 8164, /* Vendor */ - "SN-Charging-Collection-Function-Name", /* Name */ - AVP_FLAG_VENDOR, /* Fixed flags */ - AVP_FLAG_VENDOR, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); - }; - - /* SN-Fast-Reauth-Username */ - { - struct dict_avp_data data = { - 11010, /* Code */ - 8164, /* Vendor */ - "SN-Fast-Reauth-Username", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - /* SN-Pseudonym-Username */ - { - struct dict_avp_data data = { - 11011, /* Code */ - 8164, /* Vendor */ - "SN-Pseudonym-Username", /* Name */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_OCTETSTRING /* base type of data */ - }; - CHECK_dict_new(DICT_AVP, &data, NULL, NULL); - }; - - + extern int add_avps(); + CHECK_FCT( add_avps() ); /* Rules section */ diff --git a/extensions/dict_dcca_starent/dict_dcca_starent.csv b/extensions/dict_dcca_starent/dict_dcca_starent.csv new file mode 100644 index 0000000..b26ba8a --- /dev/null +++ b/extensions/dict_dcca_starent/dict_dcca_starent.csv @@ -0,0 +1,35 @@ +Attribute Name,AVP Code,Section defined,Value Type,MUST,MAY,SHOULD NOT,MUST NOT
+@vendor,8164,,,,,,
+#=,,,,,,,
+# Cisco ASR 5000 Series AAA Interface,,,,,,,
+# Administration and Reference,,,,,,,
+# Release 8.x and 9.0,,,,,,,
+"# Last Updated June 30, 2010",,,,,,,
+# updated using v15 docs from Jan 2014,,,,,,,
+# www.cisco.com/c/dam/en/us/td/docs/wireless/asr_5000/15-0/15-0-AAA-Reference.pdf,,,,,,,
+#=,,,,,,,
+#,,,,,,,
+SN-Volume-Quota-Threshold,501,,Unsigned32,"M,V",,,
+SN-Unit-Quota-Threshold,502,,Unsigned32,"M,V",,,
+SN-Time-Quota-Threshold,503,,Unsigned32,"M,V",,,
+SN-Total-Used-Service-Unit,504,,Grouped,V,,,
+SN-Absolute-Validity-Time,505,,Time,V,,,
+SN-Bandwidth-Control,512,,Enumerated,"M,V",,,
+SN-Transparent-Data,513,,OctetString,V,,,
+SN-Traffic-Policy,514,,UTF8String,V,,,
+SN-Firewall-Policy,515,,UTF8String,V,,,
+SN-Usage-Monitoring-Control,517,,Grouped,V,,,
+SN-Monitoring-Key,518,,Unsigned32,V,,,
+SN-Usage-Volume,519,,Unsigned64,V,,,
+SN-Service-Flow-Detection,520,,Enumerated,V,,,
+SN-Usage-Monitoring,521,,Enumerated,V,,,
+SN-Session-Start-Indicator,522,,OctetString,"M,V",,,
+SN-Phase0-PSAPName,523,,UTF8String,V,,,
+SN-Charging-Id,525,,OctetString,V,,,
+SN-Remaining-Service-Unit,526,,Grouped,V,,,
+SN-Service-Start-Timestamp,527,,Time,V,,,
+SN-Rulebase-Id,528,,UTF8String,"M,V",,,
+SN-CF-Policy-ID,529,,Unsigned32,"M,V",,,
+SN-Charging-Collection-Function-Name,530,,UTF8String,V,,,
+SN-Fast-Reauth-Username,11010,,OctetString,"M,V",,,
+SN-Pseudonym-Username,11011,,OctetString,"M,V",,,
diff --git a/extensions/dict_json/CMakeLists.txt b/extensions/dict_json/CMakeLists.txt index 6b27d22..afa4df6 100644 --- a/extensions/dict_json/CMakeLists.txt +++ b/extensions/dict_json/CMakeLists.txt @@ -5,6 +5,7 @@ INCLUDE(FindPkgConfig) # We use JSONCPP and JSON-Schema to parse and validate JSON files PKG_CHECK_MODULES(JSONCPP REQUIRED jsoncpp) +# https://github.com/nfotex/json-schema/ PKG_CHECK_MODULES(JSON_SCHEMA REQUIRED json-schema) PKG_CHECK_MODULES(PCRECPP REQUIRED libpcrecpp) @@ -15,7 +16,7 @@ SET(DICT_JSON_SRC ) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) -INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${JSON_SCHEMA_INCLUDE_DIR}) LINK_DIRECTORIES(${JSONCPP_LIBDIR}) diff --git a/extensions/dict_legacy_xml/dict_lxml_xml.c b/extensions/dict_legacy_xml/dict_lxml_xml.c index 748c43f..3aa3807 100644 --- a/extensions/dict_legacy_xml/dict_lxml_xml.c +++ b/extensions/dict_legacy_xml/dict_lxml_xml.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2017, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/dict_nasreq/dict_nasreq.c b/extensions/dict_nasreq/dict_nasreq.c index a87907b..0878ae1 100644 --- a/extensions/dict_nasreq/dict_nasreq.c +++ b/extensions/dict_nasreq/dict_nasreq.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2017, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/rt_default/rt_default.c b/extensions/rt_default/rt_default.c index 239a89f..0fdfd44 100644 --- a/extensions/rt_default/rt_default.c +++ b/extensions/rt_default/rt_default.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/rt_default/rt_default.h b/extensions/rt_default/rt_default.h index 14bf934..b37e796 100644 --- a/extensions/rt_default/rt_default.h +++ b/extensions/rt_default/rt_default.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2011, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/rt_default/rtd_conf.y b/extensions/rt_default/rtd_conf.y index 928a454..e02303c 100644 --- a/extensions/rt_default/rtd_conf.y +++ b/extensions/rt_default/rtd_conf.y @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/rt_default/rtd_rules.c b/extensions/rt_default/rtd_rules.c index a7f1f44..c1cfe7f 100644 --- a/extensions/rt_default/rtd_rules.c +++ b/extensions/rt_default/rtd_rules.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/rt_deny_by_size/rt_deny_by_size_conf.l b/extensions/rt_deny_by_size/rt_deny_by_size_conf.l index ff8913b..03115e3 100644 --- a/extensions/rt_deny_by_size/rt_deny_by_size_conf.l +++ b/extensions/rt_deny_by_size/rt_deny_by_size_conf.l @@ -3,7 +3,7 @@ * Authors: Thomas Klausner <tk@giga.or.at> based on code by Sebastien Decugis <sdecugis@freediameter.net>* * * * Copyright (c) 2018, Thomas Klausner * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Written under contract by Effortel Technologies SA, http://effortel.com/ * diff --git a/extensions/rt_deny_by_size/rt_deny_by_size_conf.y b/extensions/rt_deny_by_size/rt_deny_by_size_conf.y index 12344e2..586a344 100644 --- a/extensions/rt_deny_by_size/rt_deny_by_size_conf.y +++ b/extensions/rt_deny_by_size/rt_deny_by_size_conf.y @@ -83,7 +83,7 @@ int rt_deny_by_size_conf_handle(char * conffile) TRACE_ERROR( "Unable to parse the configuration file %s.", conffile); return EINVAL; } else { - TRACE_DEBUG(FULL, "[rt__deny_by_size] MaximumSize: %d.", rt_deny_by_size_conf.maximum_size); + TRACE_DEBUG(FULL, "[rt_deny_by_size] MaximumSize: %d.", rt_deny_by_size_conf.maximum_size); } return 0; diff --git a/extensions/rt_ereg/rtereg.c b/extensions/rt_ereg/rtereg.c index 1af73ee..93a584d 100644 --- a/extensions/rt_ereg/rtereg.c +++ b/extensions/rt_ereg/rtereg.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -93,7 +93,7 @@ static int proceed(char * value, size_t len, struct fd_list * candidates, int co int err = 0; struct fd_list * c; - TRACE_DEBUG(ANNOYING, "Attempt pattern matching of '%.*s' with rule '%s'", (int)len, value, r->pattern); + LOG_D("[rt_ereg] attempting pattern matching of '%.*s' with rule '%s'", (int)len, value, r->pattern); #ifdef HAVE_REG_STARTEND { @@ -118,7 +118,7 @@ static int proceed(char * value, size_t len, struct fd_list * candidates, int co size_t bl; /* Error while compiling the regex */ - TRACE_DEBUG(INFO, "Error while executing the regular expression '%s':", r->pattern); + LOG_E("[rt_ereg] error while executing the regular expression '%s':", r->pattern); /* Get the error message size */ bl = regerror(err, &r->preg, NULL, 0); @@ -128,7 +128,7 @@ static int proceed(char * value, size_t len, struct fd_list * candidates, int co /* Get the error message content */ regerror(err, &r->preg, errstr, bl); - TRACE_DEBUG(INFO, "\t%s", errstr); + LOG_E("\t%s", errstr); /* Free the buffer, return the error */ free(errstr); @@ -137,12 +137,7 @@ static int proceed(char * value, size_t len, struct fd_list * candidates, int co } /* From this point, the expression matched the AVP value */ - TRACE_DEBUG(FULL, "[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d", - r->pattern, - (int)len, - value, - r->server, - r->score); + LOG_D("[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d", r->pattern, (int)len, value, r->server, r->score); for (c = candidates->next; c != candidates; c = c->next) { struct rtd_candidate * cand = (struct rtd_candidate *)c; @@ -167,7 +162,7 @@ static int find_avp(msg_or_avp *where, int conf_index, int level, struct fd_list /* iterate over all AVPs and try to find a match */ // for (i = 0; i<rtereg_conf[j].level; i++) { if (level > rtereg_conf[conf_index].level) { - TRACE_DEBUG(INFO, "internal error, dug too deep"); + LOG_E("internal error, dug too deep"); return 1; } what = rtereg_conf[conf_index].avps[level]; @@ -178,11 +173,15 @@ static int find_avp(msg_or_avp *where, int conf_index, int level, struct fd_list CHECK_FCT(fd_msg_avp_hdr(nextavp, &avp_hdr)); if ((avp_hdr->avp_code == dictdata.avp_code) && (avp_hdr->avp_vendor == dictdata.avp_vendor)) { if (level != rtereg_conf[conf_index].level - 1) { - TRACE_DEBUG(INFO, "[rt_ereg] found grouped AVP %d (vendor %d), digging deeper", avp_hdr->avp_code, avp_hdr->avp_vendor); + LOG_D("[rt_ereg] found grouped AVP %d (vendor %d), digging deeper", avp_hdr->avp_code, avp_hdr->avp_vendor); CHECK_FCT(find_avp(nextavp, conf_index, level+1, candidates)); } else { - TRACE_DEBUG(INFO, "[rt_ereg] found AVP %d (vendor %d)", avp_hdr->avp_code, avp_hdr->avp_vendor); + struct dictionary * dict; + LOG_D("[rt_ereg] found AVP %d (vendor %d)", avp_hdr->avp_code, avp_hdr->avp_vendor); + CHECK_FCT(fd_dict_getdict(what, &dict)); + CHECK_FCT_DO(fd_msg_parse_dict(nextavp, dict, NULL), /* nothing */); if (avp_hdr->avp_value != NULL) { + LOG_A("avp_hdr->avp_value NOT NULL, matching"); #ifndef HAVE_REG_STARTEND int ret; @@ -191,8 +190,12 @@ static int find_avp(msg_or_avp *where, int conf_index, int level, struct fd_list /* Augment the buffer if needed */ if (avp_hdr->avp_value->os.len >= bufsz) { - CHECK_MALLOC_DO( buf = realloc(buf, avp_hdr->avp_value->os.len + 1), + char *newbuf; + CHECK_MALLOC_DO( newbuf = realloc(buf, avp_hdr->avp_value->os.len + 1), { pthread_mutex_unlock(&mtx); return ENOMEM; } ); + /* Update buffer and buffer size */ + buf = newbuf; + bufsz = avp_hdr->avp_value->os.len + 1; } /* Copy the AVP value */ @@ -223,7 +226,7 @@ static int rtereg_out(void * cbdata, struct msg ** pmsg, struct fd_list * candid msg_or_avp *where; int j, ret; - TRACE_ENTRY("%p %p %p", cbdata, *pmsg, candidates); + LOG_A("[rt_ereg] rtereg_out arguments: %p %p %p", cbdata, *pmsg, candidates); CHECK_PARAMS(pmsg && *pmsg && candidates); @@ -238,7 +241,7 @@ static int rtereg_out(void * cbdata, struct msg ** pmsg, struct fd_list * candid for (j=0; j<rtereg_conf_size; j++) { where = *pmsg; - TRACE_DEBUG(INFO, "[rt_ereg] iterating over AVP group %d", j); + LOG_D("[rt_ereg] iterating over AVP group %d", j); if ((ret=find_avp(where, j, 0, candidates)) != 0) { break; } @@ -301,12 +304,12 @@ static void sig_hdlr(void) /* entry point */ static int rtereg_entry(char * conffile) { - TRACE_ENTRY("%p", conffile); + LOG_A("[rt_ereg] started with conffile '%p'", conffile); rt_ereg_config_file = conffile; if (rtereg_init() != 0) { - return 1; + return 1; } /* Register reload callback */ @@ -320,12 +323,11 @@ static int rtereg_entry(char * conffile) static int rtereg_init_config(void) { /* Initialize the configuration */ - if ((rtereg_conf=malloc(sizeof(*rtereg_conf))) == NULL) { - TRACE_DEBUG(INFO, "malloc failured"); - return 1; + if ((rtereg_conf=calloc(sizeof(*rtereg_conf), 1)) == NULL) { + LOG_E("[rt_ereg] malloc failured"); + return 1; } rtereg_conf_size = 1; - memset(rtereg_conf, 0, sizeof(*rtereg_conf)); /* Parse the configuration file */ CHECK_FCT( rtereg_conf_handle(rt_ereg_config_file) ); @@ -366,20 +368,29 @@ static int rtereg_init(void) /* Unload */ static void rtereg_fini(void) { - TRACE_ENTRY(); - /* Unregister the cb */ CHECK_FCT_DO( fd_rt_out_unregister ( rtereg_hdl, NULL ), /* continue */ ); - /* Destroy the data */ - rtereg_conf_free(rtereg_conf, rtereg_conf_size); - rtereg_conf = NULL; - rtereg_conf_size = 0; #ifndef HAVE_REG_STARTEND free(buf); buf = NULL; + bufsz = 0; #endif /* HAVE_REG_STARTEND */ + if (pthread_rwlock_wrlock(&rte_lock) != 0) { + fd_log_error("%s: write-locking failed in fini, giving up", MODULE_NAME); + return; + } + /* Destroy the data */ + rtereg_conf_free(rtereg_conf, rtereg_conf_size); + rtereg_conf = NULL; + rtereg_conf_size = 0; + + if (pthread_rwlock_unlock(&rte_lock) != 0) { + fd_log_error("%s: write-unlocking failed in fini", MODULE_NAME); + return; + } + /* Done */ return ; } diff --git a/extensions/rt_ereg/rtereg.h b/extensions/rt_ereg/rtereg.h index 4045f4a..741c314 100644 --- a/extensions/rt_ereg/rtereg.h +++ b/extensions/rt_ereg/rtereg.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2011, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/rt_ereg/rtereg_conf.l b/extensions/rt_ereg/rtereg_conf.l index 8a281a5..b0a6cb3 100644 --- a/extensions/rt_ereg/rtereg_conf.l +++ b/extensions/rt_ereg/rtereg_conf.l @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -80,7 +80,7 @@ qstring \"[^\"\n]*\" /* Match a quoted string. */ CHECK_MALLOC_DO( yylval->string = strdup(yytext+1), { - TRACE_DEBUG(INFO, "Unable to copy the string '%s': %s", yytext, strerror(errno)); + LOG_E("[rt_ereg] unable to copy the string '%s': %s", yytext, strerror(errno)); return LEX_ERROR; /* trig an error in yacc parser */ } ); yylval->string[strlen(yytext) - 2] = '\0'; diff --git a/extensions/rt_ereg/rtereg_conf.y b/extensions/rt_ereg/rtereg_conf.y index 7df1086..28174f8 100644 --- a/extensions/rt_ereg/rtereg_conf.y +++ b/extensions/rt_ereg/rtereg_conf.y @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -61,15 +61,13 @@ int rtereg_conf_handle(char * conffile) extern FILE * rtereg_confin; int ret; - TRACE_ENTRY("%p", conffile); - - TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile); + LOG_D("[rt_ereg] parsing configuration file '%s'", conffile); rtereg_confin = fopen(conffile, "r"); if (rtereg_confin == NULL) { ret = errno; fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret)); - TRACE_DEBUG (INFO, "rt_ereg: error occurred, message logged -- configuration file."); + LOG_E("[rt_ereg] error occurred, message logged -- configuration file."); return ret; } @@ -79,19 +77,19 @@ int rtereg_conf_handle(char * conffile) fclose(rtereg_confin); if (rtereg_conf[rtereg_conf_size-1].finished == 0) { - TRACE_DEBUG(INFO, "rt_ereg: configuration invalid, AVP ended without OCTETSTRING AVP"); + LOG_E("[rt_ereg] configuration invalid, AVP ended without OCTETSTRING AVP"); return EINVAL; } if (ret != 0) { - TRACE_DEBUG(INFO, "rt_ereg: unable to parse the configuration file."); + LOG_E("[rt_ereg] unable to parse the configuration file."); return EINVAL; } else { int i, sum = 0; for (i=0; i<rtereg_conf_size; i++) { sum += rtereg_conf[i].rules_nb; } - TRACE_DEBUG(FULL, "[rt-ereg] Added %d rules successfully.", sum); + LOG_D("[rt-ereg] Added %d rules successfully.", sum); } return 0; @@ -104,25 +102,25 @@ int avp_add(const char *name) if (rtereg_conf[rtereg_conf_size-1].finished) { if ((ret = realloc(rtereg_conf, sizeof(*rtereg_conf)*(rtereg_conf_size+1))) == NULL) { - TRACE_DEBUG(INFO, "rt_ereg: realloc failed"); + LOG_E("[rt_ereg] realloc failed"); return -1; } rtereg_conf_size++; rtereg_conf = ret; memset(&rtereg_conf[rtereg_conf_size-1], 0, sizeof(*rtereg_conf)); - TRACE_DEBUG(INFO, "rt_ereg: New AVP group found starting with %s", name); + LOG_D("[rt_ereg] New AVP group found starting with %s", name); } level = rtereg_conf[rtereg_conf_size-1].level + 1; if ((ret = realloc(rtereg_conf[rtereg_conf_size-1].avps, sizeof(*rtereg_conf[rtereg_conf_size-1].avps)*level)) == NULL) { - TRACE_DEBUG(INFO, "rt_ereg: realloc failed"); + LOG_E("[rt_ereg] realloc failed"); return -1; } rtereg_conf[rtereg_conf_size-1].avps = ret; CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &rtereg_conf[rtereg_conf_size-1].avps[level-1], ENOENT ), { - TRACE_DEBUG(INFO, "rt_ereg: Unable to find '%s' AVP in the loaded dictionaries.", name); + LOG_E("[rt_ereg] Unable to find '%s' AVP in the loaded dictionaries.", name); return -1; } ); @@ -133,7 +131,7 @@ int avp_add(const char *name) if (data.avp_basetype == AVP_TYPE_OCTETSTRING) { rtereg_conf[rtereg_conf_size-1].finished = 1; } else if (data.avp_basetype != AVP_TYPE_GROUPED) { - TRACE_DEBUG(INFO, "rt_ereg: '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype); + LOG_E("[rt_ereg] '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype); return -1; } } @@ -147,7 +145,7 @@ int rtereg_conflex(YYSTYPE *lvalp, YYLTYPE *llocp); /* Function to report the errors */ void yyerror (YYLTYPE *ploc, char * conffile, char const *s) { - TRACE_DEBUG(INFO, "rt_ereg: error in configuration parsing"); + LOG_E("[rt_ereg] error in configuration parsing"); if (ploc->first_line != ploc->last_line) fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); @@ -222,7 +220,7 @@ rule: QSTRING ':' QSTRING '+' '=' INTEGER ';' size_t bl; /* Error while compiling the regex */ - TRACE_DEBUG(INFO, "rt_ereg: error while compiling the regular expression '%s':", new->pattern); + LOG_E("[rt_ereg] error while compiling the regular expression '%s':", new->pattern); /* Get the error message size */ bl = regerror(err, &new->preg, NULL, 0); @@ -232,7 +230,7 @@ rule: QSTRING ':' QSTRING '+' '=' INTEGER ';' /* Get the error message content */ regerror(err, &new->preg, buf, bl); - TRACE_DEBUG(INFO, "\t%s", buf); + LOG_E("\t%s", buf); /* Free the buffer, return the error */ free(buf); diff --git a/extensions/rt_load_balance/rt_load_balance.c b/extensions/rt_load_balance/rt_load_balance.c index 9883a67..c2316c4 100644 --- a/extensions/rt_load_balance/rt_load_balance.c +++ b/extensions/rt_load_balance/rt_load_balance.c @@ -30,9 +30,22 @@ *********************************************************************************************************/ #include <freeDiameter/extension.h> +#include <limits.h> +#include <time.h> + +struct best_candidate_entry { + long load; + struct rtd_candidate *cand; +}; + +static unsigned int seed; + +#define MODULE_NAME "rt_load_balance" /* - * Load balancing extension. Send request to least-loaded node. + * Load balancing extension. Send request to least-loaded node: Add a + * score of 1 to the least loaded candidates among those with highest + * score. */ /* The callback for load balancing the requests across the peers */ @@ -40,37 +53,82 @@ static int rt_load_balancing(void * cbdata, struct msg ** pmsg, struct fd_list * { struct fd_list *lic; struct msg * msg = *pmsg; - + int max_score = -1; + int max_score_count = 0; + TRACE_ENTRY("%p %p %p", cbdata, msg, candidates); - + CHECK_PARAMS(msg && candidates); - + + /* Check if it is worth processing the message */ if (FD_IS_LIST_EMPTY(candidates)) return 0; - /* load balancing */ + /* find out maximal score and how many candidates have it */ for (lic = candidates->next; lic != candidates; lic = lic->next) { struct rtd_candidate * cand = (struct rtd_candidate *) lic; - struct peer_hdr *peer; - long to_receive, to_send, load; - int score; - CHECK_FCT(fd_peer_getbyid(cand->diamid, cand->diamidlen, 0, &peer)); - CHECK_FCT(fd_peer_get_load_pending(peer, &to_receive, &to_send)); - load = to_receive + to_send; - /* other routing mechanisms need to add to the - * appropriate entries so their base value is high - * enough that they are considered */ - - /* logarithmic scaling */ - int load_log = 0; - while (load > 0) { - load_log++; - load /= 2; - } - score = cand->score; - cand->score -= load_log; - TRACE_DEBUG(FULL, "evaluated peer `%.*s', score was %d, now %d", (int)cand->diamidlen, cand->diamid, score, cand->score); + if (max_score < cand->score) { + max_score = cand->score; + max_score_count = 1; + } + else if (cand->score == max_score) { + max_score_count++; + } + } + + if (max_score_count > 0) { + /* find out minimum load among those with maximal + * score, and how many candidates have it */ + struct best_candidate_entry best_candidates[max_score_count]; + long min_load = LONG_MAX; + int min_load_count = 0; + int j; + + for (j = 0, lic = candidates->next; lic != candidates; lic = lic->next) { + struct rtd_candidate * cand = (struct rtd_candidate *) lic; + if (cand->score == max_score) { + long to_receive, to_send, load; + struct peer_hdr *peer; + CHECK_FCT(fd_peer_getbyid(cand->diamid, cand->diamidlen, 0, &peer)); + CHECK_FCT(fd_peer_get_load_pending(peer, &to_receive, &to_send)); + load = to_receive + to_send; + + best_candidates[j].cand = cand; + best_candidates[j].load = load; + j++; + + if (min_load > load) { + min_load = load; + min_load_count = 1; + } else if (min_load == load) { + min_load_count++; + } + } + } + + /* increase score by 1 for all entries with minimum + * load, and further increase by 1 for one randomly + * chosen candidate */ + if (min_load_count > 0) { + int lucky_candidate = rand_r(&seed) % min_load_count; + int i; + for (j = 0, i = 0; j < max_score_count; j++) { + struct best_candidate_entry *entry = best_candidates+j; + if (entry->load == min_load) { + struct rtd_candidate *cand = entry->cand; + int old_score = cand->score; + cand->score++; + TRACE_DEBUG(FULL, "%s: boosting peer `%.*s', score was %d, now %d; load was %ld", MODULE_NAME, (int)cand->diamidlen, cand->diamid, old_score, cand->score, entry->load); + + if (i == lucky_candidate) { + cand->score++; + TRACE_DEBUG(FULL, "%s: boosting lucky peer `%.*s', score was %d, now %d; load was %ld", MODULE_NAME, (int)cand->diamidlen, cand->diamid, old_score, cand->score, entry->load); + } + i++; + } + } + } } return 0; @@ -85,6 +143,8 @@ static int rt_load_balance_entry(char * conffile) /* Register the callback */ CHECK_FCT(fd_rt_out_register(rt_load_balancing, NULL, 10, &rt_load_balancing_hdl)); + seed = (unsigned int)time(NULL); + TRACE_DEBUG(INFO, "Extension 'Load Balancing' initialized"); return 0; } @@ -97,4 +157,4 @@ void fd_ext_fini(void) return ; } -EXTENSION_ENTRY("rt_load_balance", rt_load_balance_entry); +EXTENSION_ENTRY(MODULE_NAME, rt_load_balance_entry); diff --git a/extensions/rt_randomize/rt_randomize.c b/extensions/rt_randomize/rt_randomize.c index a606451..38e677b 100644 --- a/extensions/rt_randomize/rt_randomize.c +++ b/extensions/rt_randomize/rt_randomize.c @@ -46,11 +46,11 @@ static int rt_randomizing(void * cbdata, struct msg ** pmsg, struct fd_list * ca struct msg * msg = *pmsg; int max_score = -1; int max_score_count = 0; - + TRACE_ENTRY("%p %p %p", cbdata, msg, candidates); - + CHECK_PARAMS(msg && candidates); - + /* Check if it is worth processing the message */ if (FD_IS_LIST_EMPTY(candidates)) return 0; diff --git a/extensions/rt_rewrite/rt_rewrite.c b/extensions/rt_rewrite/rt_rewrite.c index 7da26ec..dbceabe 100644 --- a/extensions/rt_rewrite/rt_rewrite.c +++ b/extensions/rt_rewrite/rt_rewrite.c @@ -86,6 +86,7 @@ static void store_free(struct store *store) return; } +/* TODO: convert to fd_msg_search_avp ? */ static int fd_avp_search_avp(msg_or_avp *where, struct dict_object *what, struct avp **avp) { struct avp *nextavp; @@ -391,26 +392,40 @@ static int rt_rewrite(void * cbdata, struct msg **msg) return 0; } - if ((store=store_new()) == NULL) { - fd_log_error("%s: malloc failure"); - return ENOMEM; + if (pthread_rwlock_wrlock(&rt_rewrite_lock) != 0) { + fd_log_error("%s: locking failed, aborting message rewrite", MODULE_NAME); + return errno; } + if ((ret = fd_msg_parse_dict(*msg, fd_g_config->cnf_dict, NULL)) != 0) { fd_log_notice("%s: error parsing message", MODULE_NAME); - free(store); + pthread_rwlock_unlock(&rt_rewrite_lock); return ret; } if ((ret=fd_msg_browse(*msg, MSG_BRW_FIRST_CHILD, &avp, NULL)) != 0) { fd_log_notice("internal error: message has no child"); - free(store); + pthread_rwlock_unlock(&rt_rewrite_lock); return ret; } + if ((store=store_new()) == NULL) { + fd_log_error("%s: malloc failure"); + pthread_rwlock_unlock(&rt_rewrite_lock); + return ENOMEM; + } if (replace_avps(*msg, avp, avp_match_start->children, store) != 0) { fd_log_error("%s: replace AVP function failed", MODULE_NAME); store_free(store); + pthread_rwlock_unlock(&rt_rewrite_lock); return -1; } - return store_apply(*msg, &store); + ret = store_apply(*msg, &store); + + if (pthread_rwlock_unlock(&rt_rewrite_lock) != 0) { + fd_log_error("%s: unlocking failed, returning error", MODULE_NAME); + return errno; + } + + return ret; } /* entry point */ diff --git a/extensions/rt_rewrite/rt_rewrite_conf.y b/extensions/rt_rewrite/rt_rewrite_conf.y index 851bdbf..d648a78 100644 --- a/extensions/rt_rewrite/rt_rewrite_conf.y +++ b/extensions/rt_rewrite/rt_rewrite_conf.y @@ -107,7 +107,11 @@ static void compare_avp_type(const char *source, const char *dest) fd_dict_getval(model_source, &dictdata_source); fd_dict_getval(model_dest, &dictdata_dest); if (dictdata_source.avp_basetype != dictdata_dest.avp_basetype) { - fd_log_notice("rt_rewrite: type mismatch: %s (type %s) mapped to %s (type %s) (continuing anyway)", source, type_base_name[dictdata_source.avp_basetype], dest, type_base_name[dictdata_dest.avp_basetype]); + if (dictdata_source.avp_basetype == AVP_TYPE_OCTETSTRING) { + fd_log_error("rt_rewrite: type mismatch: %s (type %s) mapped to %s (type %s): OctetString cannot be mapped to non-OctetString type", source, type_base_name[dictdata_source.avp_basetype], dest, type_base_name[dictdata_dest.avp_basetype]); + return; + } + fd_log_error("rt_rewrite: type mismatch: %s (type %s) mapped to %s (type %s) (continuing anyway)", source, type_base_name[dictdata_source.avp_basetype], dest, type_base_name[dictdata_dest.avp_basetype]); } return; } diff --git a/extensions/test_app/ta_cli.c b/extensions/test_app/ta_cli.c index 686338a..76a457a 100644 --- a/extensions/test_app/ta_cli.c +++ b/extensions/test_app/ta_cli.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2016, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/extensions/test_cc/test_cc.c b/extensions/test_cc/test_cc.c index ed5a940..959e72e 100644 --- a/extensions/test_cc/test_cc.c +++ b/extensions/test_cc/test_cc.c @@ -35,9 +35,31 @@ struct disp_hdl *ccr_handler_hdl; +struct dict_object * aai_avp_do; /* cache the Auth-Application-Id dictionary object */ +struct dict_object * crn_avp_do; /* cache the CC-Request-Number dictionary object */ +struct dict_object * crt_avp_do; /* cache the CC-Request-Type dictionary object */ + +#define MODULE_NAME "test_cc" + +struct statistics { + uint64_t sent; + time_t first; + time_t last; +} statistics; + +void print_statistics(void) { + if (statistics.first == 0 || statistics.last == 0 || statistics.last == statistics.first) { + return; + } + + fd_log_error("%s: %lld CCA messages sent in %llds (%.2f messages/second)", fd_g_config->cnf_diamid, + (long long)statistics.sent, (long long)(statistics.last-statistics.first), (float)statistics.sent / (statistics.last-statistics.first)); +} + static int ccr_handler(struct msg ** msg, struct avp * avp, struct session * sess, void * data, enum disp_action * act) { struct msg_hdr *hdr = NULL; + time_t now; TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act); @@ -50,24 +72,93 @@ static int ccr_handler(struct msg ** msg, struct avp * avp, struct session * ses struct msg *answer; os0_t s; size_t sl; + struct avp *avp; + union avp_value val; + struct avp *avp_data; + struct avp_hdr *ahdr; + uint32_t crt, crn; + + /* get some necessary information from request */ + if (fd_msg_search_avp(*msg, crt_avp_do, &avp_data) < 0 || avp_data == NULL) { + fd_log_error("[%s] CC-Request-Type not found in CCR", MODULE_NAME); + return 0; + } + if (fd_msg_avp_hdr(avp_data, &ahdr) < 0) { + fd_log_error("[%s] error parsing CC-Request-Type in CCR", MODULE_NAME); + return 0; + } + crt = ahdr->avp_value->i32; + if (fd_msg_search_avp(*msg, crn_avp_do, &avp_data) < 0 || avp_data == NULL) { + fd_log_error("[%s] CC-Request-Number not found in CCR", MODULE_NAME); + return 0; + } + if (fd_msg_avp_hdr(avp_data, &ahdr) < 0) { + fd_log_error("[%s] error parsing CC-Request-Type in CCR", MODULE_NAME); + return 0; + } + crn = ahdr->avp_value->i32; /* Create the answer message */ CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0)); answer = *msg; - /* TODO copy/fill in AVPs in the answer */ + + /* TODO copy/fill in more AVPs in the answer */ + + /* Auth-Application-Id */ + fd_msg_avp_new(aai_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.i32 = 4; + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(answer); + fd_log_error("can't set value for 'Auth-Application-Id' for 'Credit-Control-Request' message"); + return 0; + } + fd_msg_avp_add(answer, MSG_BRW_LAST_CHILD, avp); + + /* CC-Request-Type */ + fd_msg_avp_new(crt_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.i32 = crt; + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(answer); + fd_log_error("can't set value for 'CC-Request-Type' for 'Credit-Control-Request' message"); + return 0; + } + fd_msg_avp_add(answer, MSG_BRW_LAST_CHILD, avp); + + /* CC-Request-Number */ + fd_msg_avp_new(crn_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.i32 = crn; + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(answer); + fd_log_error("can't set value for 'CC-Request-Number' for 'Credit-Control-Request' message"); + return 0; + } + fd_msg_avp_add(answer, MSG_BRW_LAST_CHILD, avp); + /* TODO make result configurable (depending on an AVP?) */ CHECK_FCT(fd_msg_rescode_set(answer, "DIAMETER_SUCCESS", NULL, NULL, 1)); - fd_log_notice("--------------Received the following Credit Control Request:--------------"); + fd_log_debug("--------------Received the following Credit Control Request:--------------"); CHECK_FCT(fd_sess_getsid(sess, &s, &sl)); - fd_log_notice("Session: %.*s",(int)sl, s); + fd_log_debug("Session: %.*s",(int)sl, s); - fd_log_notice("----------------------------------------------------------------------"); + fd_log_debug("----------------------------------------------------------------------"); /* Send the answer */ CHECK_FCT(fd_msg_send(msg, NULL, NULL)); - + now = time(NULL); + if (!statistics.first) { + statistics.first = now; + } + if (statistics.last != now) { + print_statistics(); + } + statistics.last = now; + statistics.sent++; + fd_log_debug("reply sent"); } else { /* We received an answer message, just discard it */ CHECK_FCT(fd_msg_free(*msg)); @@ -84,6 +175,13 @@ static int cc_entry(char * conffile) TRACE_ENTRY("%p", conffile); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Auth-Application-Id", &aai_avp_do, ENOENT), + { LOG_E("Unable to find 'Auth-Application-Id' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "CC-Request-Number", &crn_avp_do, ENOENT), + { LOG_E("Unable to find 'CC-Request-Number' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "CC-Request-Type", &crt_avp_do, ENOENT), + { LOG_E("Unable to find 'CC-Request-Type' AVP in the loaded dictionaries."); }); + memset(&data, 0, sizeof(data)); /* Advertise the support for the Diameter Credit Control application in the peer */ @@ -97,4 +195,19 @@ static int cc_entry(char * conffile) return 0; } -EXTENSION_ENTRY("test_cc", cc_entry); +/* And terminate it */ +void fd_ext_fini(void) +{ + /* Unregister the callbacks */ + if (ccr_handler_hdl) { + CHECK_FCT_DO( fd_disp_unregister(&ccr_handler_hdl, NULL), ); + ccr_handler_hdl = NULL; + } + + print_statistics(); + + return; +} + + +EXTENSION_ENTRY(MODULE_NAME, cc_entry); diff --git a/extensions/test_ccload/CMakeLists.txt b/extensions/test_ccload/CMakeLists.txt new file mode 100644 index 0000000..405331d --- /dev/null +++ b/extensions/test_ccload/CMakeLists.txt @@ -0,0 +1,13 @@ +# The test_ccload extension +PROJECT("Credit Control load generator server" C) + +FD_ADD_EXTENSION(test_ccload test_ccload.c) + + +#### +## INSTALL section ## + +INSTALL(TARGETS test_ccload + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-debug-tools) + diff --git a/extensions/test_ccload/test_ccload.c b/extensions/test_ccload/test_ccload.c new file mode 100644 index 0000000..3c80bb7 --- /dev/null +++ b/extensions/test_ccload/test_ccload.c @@ -0,0 +1,444 @@ +/********************************************************************************************************** + * Software License Agreement(BSD License) * + * Author: Thomas Klausner <tk@giga.or.at> * + * * + * Copyright(c) 2019, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by nfotex IT GmbH, http://nfotex.com/ * + * * + * Redistribution and use of this software in source and binary forms, with or without modification, are * + * permitted provided that the following conditions are met: * + * * + * * Redistributions of source code must retain the above * + * copyright notice, this list of conditions and the * + * following disclaimer. * + * * + * * Redistributions in binary form must reproduce the above * + * copyright notice, this list of conditions and the * + * following disclaimer in the documentation and/or other * + * materials provided with the distribution. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT * + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * + * TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + **********************************************************************************************************/ + +/* This extension waits for a signal (SIGUSR2). When it gets it, it + * generates messages as quickly as possible to the configured target + * host; a second SIGUSR2 signal will stop this. + * If the target host starts with "REALM:", send to that Destination-Realm instead + * of a particular host. */ + +#include <freeDiameter/extension.h> + +#include <pthread.h> +#include <signal.h> + +#define MODULE_NAME "test_ccload" + +static pthread_t gen_thr = (pthread_t)NULL; +struct disp_hdl *ccr_local_hdl; +struct fd_rt_fwd_hdl *ccr_fwd_hdl; +volatile int do_generate = 0; + +const char *target = NULL; + +struct dict_object * aai_avp_do; /* cache the Auth-Application-Id dictionary object */ +struct dict_object * crn_avp_do; /* cache the CC-Request-Number dictionary object */ +struct dict_object * crt_avp_do; /* cache the CC-Request-Type dictionary object */ +struct dict_object * dh_avp_do; /* cache the Destination-Host dictionary object */ +struct dict_object * dr_avp_do; /* cache the Destination-Realm dictionary object */ +struct dict_object * rc_avp_do; /* cache the Result-Code dictionary object */ +struct dict_object * sci_avp_do; /* cache the Service-Context-Id dictionary object */ +struct dict_object * si_avp_do; /* cache the Session-Id dictionary object */ +struct dict_object * pi_avp_do; /* cache the Proxy-Info dictionary object */ +struct dict_object * ph_avp_do; /* cache the Proxy-Host dictionary object */ +struct dict_object * ps_avp_do; /* cache the Proxy-State dictionary object */ + +struct dict_object * ccr_do; /* cache the Credit-Control-Request command dictionary object */ + +struct statistics { + uint64_t sent; + uint64_t success; + uint64_t error; + time_t first; + time_t first_reply; + time_t last; + time_t last_reply; +} statistics; + +void print_statistics(void) { + uint64_t missing, received; + + if (statistics.first == 0 || statistics.last == 0 || statistics.last == statistics.first) { + return; + } + + received = statistics.error + statistics.success; + missing = statistics.sent - received; + + fd_log_error("%s: %lld CCR messages sent in %llds (%.2f messages/second), %lld CCA messages received in %llds (%.2f messages/second), %lld success (%.2f%%), %lld errors (%.2f%%), %lld missing (%.2f%%)", + fd_g_config->cnf_diamid, + (long long)statistics.sent, (long long)(statistics.last-statistics.first), (float)statistics.sent / (statistics.last-statistics.first), + (long long)received, (long long)(statistics.last_reply-statistics.first_reply), (float)received / (statistics.last_reply-statistics.first_reply), + (long long)statistics.success, + 100*(float)statistics.success/statistics.sent, (long long)statistics.error, 100*(float)statistics.error/statistics.sent, + missing, 100*(float)missing/statistics.sent); +} + +static int handle_message(struct msg **msg) { + struct msg_hdr *hdr = NULL; + struct avp_hdr *ahdr = NULL; + struct avp *rc; + + if (msg == NULL) { + fd_log_error("[%s] NULL CCA message", MODULE_NAME); + return -1; + } + + CHECK_FCT(fd_msg_hdr(*msg, &hdr)); + /* handle CCAs only */ + if ((hdr->msg_code != 272) || (hdr->msg_flags & CMD_FLAG_REQUEST)) { + fd_log_error("[%s] invalid message type (type %d, flags 0x%x)", MODULE_NAME, hdr->msg_code, hdr->msg_flags); + return -1; + } + + if (statistics.first_reply == 0) { + statistics.first_reply = time(NULL); + } + /* Answer received, check it */ + if (fd_msg_search_avp(*msg, rc_avp_do, &rc) < 0 || rc == NULL) { + fd_log_error("[%s] Result-Code not found in CCA", MODULE_NAME); + return -1; + } + + if (fd_msg_avp_hdr(rc, &ahdr) < 0) { + fd_log_error("[%s] error parsing Result-Code in CCA", MODULE_NAME); + return -1; + } + statistics.last_reply = time(NULL); + fd_log_debug("Credit-Control-Answer with Result-Code %d received", ahdr->avp_value->i32); + switch (ahdr->avp_value->i32/1000) { + case 2: + statistics.success++; + break; + default: + statistics.error++; + break; + } + if (statistics.sent - statistics.error - statistics.success == 0) { + print_statistics(); + } + + return 0; +} + +static int ccr_local_handler(struct msg ** msg, struct avp * avp, struct session * sess, void * data, enum disp_action * act) +{ + fd_log_debug("[%s] CCR local handler called", MODULE_NAME); + + if (handle_message(msg) < 0) { + fd_log_error("dropping message"); + CHECK_FCT(fd_msg_free(*msg)); + *msg = NULL; + return 0; + } + + CHECK_FCT(fd_msg_free(*msg)); + *msg = NULL; + return 0; +} + +static int ccr_fwd_handler(void *cb_data, struct msg **msg) +{ + fd_log_debug("[%s] CCR FWD handler called", MODULE_NAME); + + if (handle_message(msg) < 0) { + return 0; + } + + return 0; +} + +/* create message to send */ +struct msg *create_message(const char *destination) +{ + struct msg *msg; + struct avp *avp, *avp1; + union avp_value val; + struct msg_hdr *msg_hdr; + const char *realm; + char session_id[800]; + const char *service_context_id = "version2.clci.ipc@vodafone.com"; + const char *proxy_host = "Dummy-Proxy-Host-to-Increase-Package-Size"; + const char *proxy_state = "This is just data to increase the package size\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; + + if (fd_msg_new(ccr_do, MSGFL_ALLOC_ETEID, &msg) != 0) { + fd_log_error("can't create new 'Credit-Control-Request' message"); + return NULL; + } + + /* Application Id in header needs to be set to for since this Credit-Control-Request is for Diameter Credit Control */ + if (fd_msg_hdr(msg, &msg_hdr) != 0) { + fd_log_error("can't get message header for 'Credit-Control-Request' message"); + fd_msg_free(msg); + return NULL; + } + msg_hdr->msg_appl = 4; + + if (fd_msg_add_origin(msg, 0) != 0) { + fd_log_error("can't set Origin for 'Credit-Control-Request' message"); + fd_msg_free(msg); + return NULL; + } + + if (strncmp("REALM:", target, 6) != 0) { + /* Destination-Host */ + fd_msg_avp_new(dh_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.os.data = (uint8_t *)target; + val.os.len = strlen(target); + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Destination-Host' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + if ((realm = strchr(target, '.')) == NULL) { + fd_msg_free(msg); + fd_log_error("can't extract realm from host '%s'", target); + return NULL; + } + /* skip dot */ + realm++; + } else { + realm = target + 6; /* skip "REALM:" */ + } + /* Destination-Realm */ + fd_msg_avp_new(dr_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.os.data = (uint8_t *)realm; + val.os.len = strlen(realm); + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Destination-Realm' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + /* Session-Id */ + snprintf(session_id, sizeof(session_id), "session %ld", random()); + fd_msg_avp_new(si_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.os.data = (uint8_t *)session_id; + val.os.len = strlen(session_id); + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Session-Id' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_FIRST_CHILD, avp); + + /* Auth-Application-Id */ + fd_msg_avp_new(aai_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.i32 = 4; + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Auth-Application-Id' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + /* Service-Context-Id */ + fd_msg_avp_new(sci_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.os.data = (uint8_t *)service_context_id; + val.os.len = strlen(service_context_id); + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Service-Context-Id' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + /* CC-Request-Type */ + fd_msg_avp_new(crt_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.i32 = 1; /* Initial */ + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'CC-Request-Type' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + /* CC-Request-Number */ + fd_msg_avp_new(crn_avp_do, 0, &avp); + memset(&val, 0, sizeof(val)); + val.i32 = 1; + if (fd_msg_avp_setvalue(avp, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'CC-Request-Number' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + /* Proxy-Info */ + fd_msg_avp_new(pi_avp_do, 0, &avp); + /* Proxy-Host */ + fd_msg_avp_new(ph_avp_do, 0, &avp1); + memset(&val, 0, sizeof(val)); + val.os.data = (uint8_t *)proxy_host; + val.os.len = strlen(proxy_host); + if (fd_msg_avp_setvalue(avp1, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Proxy-Host' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avp1); + /* Proxy-State */ + fd_msg_avp_new(ps_avp_do, 0, &avp1); + memset(&val, 0, sizeof(val)); + val.os.data = (uint8_t *)proxy_state; + val.os.len = strlen(proxy_state); + if (fd_msg_avp_setvalue(avp1, &val) != 0) { + fd_msg_free(msg); + fd_log_error("can't set value for 'Proxy-State' for 'Credit-Control-Request' message"); + return NULL; + } + fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avp1); + fd_msg_avp_add(msg, MSG_BRW_LAST_CHILD, avp); + + return msg; +} + +/* The thread that handles expired entries cleanup. */ +void * gen_thr_fct(void * arg) +{ + struct msg *msg; + fd_log_threadname ( "Loadtest/Generator" ); + + do { + if (do_generate) { + time_t now; + if (statistics.first == 0) { + statistics.first = time(NULL); + } + msg = create_message(target); + fd_msg_send(&msg, NULL, NULL); + fd_log_debug("[%s] sent message", MODULE_NAME); + now = time(NULL); + if (statistics.last != now) { + print_statistics(); + } + statistics.last = time(NULL); + statistics.sent++; + } else { + sleep(1); + } + } while (1); +} + +/* signal handler */ +static void sig_hdlr(void) +{ + if (do_generate) { + do_generate = 0; + } else { + do_generate = 1; + } + fd_log_notice("%s: switched generation of CCRs %s", MODULE_NAME, do_generate ? "on" : "off"); +} + +/* entry hook: register callback */ +static int cc_entry(char * conffile) +{ + struct disp_when data; + + /* initialize random number generator for session IDs */ + srandom(time(NULL) | (unsigned int)getpid()); + if ((target = conffile) == NULL) { + fd_log_error("invalid conffile"); + return EINVAL; + } + + memset(&data, 0, sizeof(data)); + + /* Advertise the support for the Diameter Credit Control application in the peer */ + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Credit Control Application", &data.app, ENOENT) ); + CHECK_FCT( fd_disp_app_support ( data.app, NULL, 1, 0 ) ); + + /* the handling of requests is different if it might be locally handled or not */ + /* for possibly locally handled requests, fd_rt_fwd_register is not called, so we need to add handlers for both cases */ + /* register forward handler for CCR -- needs to look at all requests */ + CHECK_FCT(fd_rt_fwd_register(ccr_fwd_handler, NULL, RT_FWD_REQ, &ccr_fwd_hdl)); + /* register local handler for CCR - if not Destination-Host is set, or the local host is used */ + memset(&data, 0, sizeof(data)); + CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Answer", &data.command, ENOENT)); + CHECK_FCT(fd_disp_register(ccr_local_handler, DISP_HOW_CC, &data, NULL, &ccr_local_hdl)); + + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Auth-Application-Id", &aai_avp_do, ENOENT), + { LOG_E("Unable to find 'Auth-Application-Id' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "CC-Request-Number", &crn_avp_do, ENOENT), + { LOG_E("Unable to find 'CC-Request-Number' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "CC-Request-Type", &crt_avp_do, ENOENT), + + { LOG_E("Unable to find 'CC-Request-Type' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Host", &dh_avp_do, ENOENT), + { LOG_E("Unable to find 'Destination-Host' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Realm", &dr_avp_do, ENOENT), + { LOG_E("Unable to find 'Destination-Realm' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &rc_avp_do, ENOENT), + { LOG_E("Unable to find 'Result-Code' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &si_avp_do, ENOENT), + { LOG_E("Unable to find 'Session-Id' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Service-Context-Id", &sci_avp_do, ENOENT), + { LOG_E("Unable to find 'Service-Context-Id' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Proxy-Info", &pi_avp_do, ENOENT), + { LOG_E("Unable to find 'Proxy-Info' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Proxy-Host", &ph_avp_do, ENOENT), + { LOG_E("Unable to find 'Proxy-Host' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Proxy-State", &ps_avp_do, ENOENT), + { LOG_E("Unable to find 'Proxy-State' AVP in the loaded dictionaries."); }); + CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &ccr_do, ENOENT), + { LOG_E("Unable to find 'Credit-Control-Request' command in the loaded dictionaries."); }); + + /* Start the generator thread */ + CHECK_POSIX( pthread_create( &gen_thr, NULL, gen_thr_fct, NULL ) ); + + /* Register generator callback */ + CHECK_FCT(fd_event_trig_regcb(SIGUSR2, MODULE_NAME, sig_hdlr)); + + return 0; +} + +/* And terminate it */ +void fd_ext_fini(void) +{ + /* stop sending */ + do_generate = 0; + + /* Stop the expiry thread */ + CHECK_FCT_DO( fd_thr_term(&gen_thr), ); + + /* Unregister the callbacks */ + if (ccr_local_hdl) { + CHECK_FCT_DO( fd_disp_unregister(&ccr_local_hdl, NULL), ); + ccr_local_hdl = NULL; + } + + print_statistics(); + + return; +} + + +EXTENSION_ENTRY(MODULE_NAME, cc_entry); diff --git a/extensions/test_sip/multimediaauth.c b/extensions/test_sip/multimediaauth.c index b1edb8d..6dc101e 100644 --- a/extensions/test_sip/multimediaauth.c +++ b/extensions/test_sip/multimediaauth.c @@ -335,7 +335,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * //CHECK_FCT(fd_msg_browse ( avp, MSG_BRW_WALK, &avp, NULL) ); - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); if(a2!=NULL) found_cnonce=1; @@ -472,7 +472,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * char * digest_username=NULL, *digest_uri=NULL, *digest_response=NULL, *digest_realm=NULL, *digest_nonce=NULL, *digest_method=NULL, *digest_qop=NULL, *digest_algorithm=NULL, *digest_cnonce=NULL, *digest_noncecount=NULL; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Nonce, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Nonce, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -501,7 +501,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Response, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Response, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -515,7 +515,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Realm, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Realm, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -529,7 +529,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Method, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Method, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -545,7 +545,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * else digest_method=""; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_URI, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_URI, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -559,7 +559,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } } - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_QOP, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_QOP, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -574,7 +574,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } else digest_qop=NULL; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Algorithm, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Algorithm, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -589,7 +589,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } else digest_algorithm=NULL; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_CNonce, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -604,7 +604,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } else digest_cnonce=""; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Nonce_Count, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Nonce_Count, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); @@ -619,7 +619,7 @@ int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * } else digest_noncecount=""; - CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Username, &a2 )); + CHECK_FCT(fd_msg_search_avp (avp, sip_dict.Digest_Username, &a2 )); if(a2!=NULL) { CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) ); diff --git a/freeDiameterd/main.c b/freeDiameterd/main.c index cafd1ce..47037a5 100644 --- a/freeDiameterd/main.c +++ b/freeDiameterd/main.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -45,6 +45,10 @@ #include <locale.h> #include <syslog.h> #include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> /* forward declarations */ static int main_cmdline(int argc, char *argv[]); @@ -52,19 +56,69 @@ static void * catch_signals(void * arg); static pthread_t signals_thr; static char *conffile = NULL; +static int daemon_mode = 0; static int gnutls_debug = 0; +static char *pidfile = NULL; /* gnutls debug */ static void fd_gnutls_debug(int level, const char * str) { fd_log_debug(" [gnutls:%d] %s", level, str); } +static void pidfile_cleanup(void) +{ + if (pidfile != NULL) { + LOG_I("Removing pidfile '%s'", pidfile); + CHECK_SYS_DO( unlink(pidfile), /* ignore */ ); + pidfile = NULL; + } +} + +static int pidfile_create(void) +{ + if (pidfile == NULL) { + return 0; + } + + /* Create pidfile */ + FILE * fp = fopen(pidfile, "w"); + if (fp == NULL) { + int ret = errno; + LOG_F("Unable to write pidfile '%s'; Error: %s", + pidfile, strerror(ret)); + pidfile = NULL; /* disable pidfile_cleanup() */ + return ret; + } + + /* Cleanup pidfile on exit */ + if (atexit(pidfile_cleanup) != 0) { + LOG_F("Unable to setup pidfile cleanup"); + CHECK_SYS( fclose(fp) ); + pidfile_cleanup(); + return EINVAL; + } + + /* Write the pid and close pidfile */ + fprintf(fp, "%d\n", getpid()); + CHECK_SYS_DO( fclose(fp), { pidfile_cleanup(); return __ret__; } ); + + LOG_I("Created pidfile '%s'", pidfile); + return 0; +} + static void syslog_logger(int loglevel, const char * format, va_list args) { + if (loglevel < fd_g_debug_lvl) { + return; + } + int level; switch (loglevel) { + case FD_LOG_INFO: + level = LOG_INFO; + break; case FD_LOG_NOTICE: level = LOG_NOTICE; break; @@ -76,17 +130,13 @@ static void syslog_logger(int loglevel, const char * format, va_list args) break; default: /* fallthrough */ + case FD_LOG_ANNOYING: case FD_LOG_DEBUG: - /* some systems log LOG_DEBUG to a file; but - * freeDiameter debug output is too verbose */ - return; -#if 0 level = LOG_DEBUG; break; -#endif } - vsyslog(level, format, args); + vsyslog(level | LOG_DAEMON, format, args); } @@ -104,14 +154,21 @@ int main(int argc, char * argv[]) /* Parse the command-line */ ret = main_cmdline(argc, argv); if (ret != 0) { - return ret; + return EXIT_FAILURE; } + if (daemon_mode) { + TRACE_DEBUG(INFO, "entering background mode"); + CHECK_SYS_DO( daemon(1, 0), return EXIT_FAILURE ); + } + + CHECK_FCT_DO( pidfile_create(), return EXIT_FAILURE ); + /* Initialize the core library */ ret = fd_core_initialize(); if (ret != 0) { fprintf(stderr, "An error occurred during freeDiameter core library initialization.\n"); - return ret; + return EXIT_FAILURE; } /* Set gnutls debug level ? */ @@ -133,17 +190,17 @@ int main(int argc, char * argv[]) TRACE_DEBUG(INFO, FD_PROJECT_BINARY " daemon initialized."); /* Now, just wait for termination */ - CHECK_FCT( fd_core_wait_shutdown_complete() ); + CHECK_FCT_DO( fd_core_wait_shutdown_complete(), return EXIT_FAILURE ); /* Just in case it was not the result of a signal, we cancel signals_thr */ fd_thr_term(&signals_thr); - return 0; + return EXIT_SUCCESS; error: CHECK_FCT_DO( fd_core_shutdown(), ); - CHECK_FCT( fd_core_wait_shutdown_complete() ); + CHECK_FCT_DO( fd_core_wait_shutdown_complete(), return EXIT_FAILURE ); fd_thr_term(&signals_thr); - return -1; + return EXIT_FAILURE; } @@ -169,19 +226,21 @@ static void main_help( void ) printf( " This daemon is an implementation of the Diameter protocol\n" " used for Authentication, Authorization, and Accounting (AAA).\n"); printf("\nUsage: " FD_PROJECT_BINARY " [OPTIONS]...\n"); - printf( " -h, --help Print help and exit\n" - " -V, --version Print version and exit\n" - " -c, --config=filename Read configuration from this file instead of the \n" - " default location (" DEFAULT_CONF_PATH "/" FD_DEFAULT_CONF_FILENAME ").\n" + printf( " -h, --help Print help and exit\n" + " -V, --version Print version and exit\n" + " -c, --config=filename Read configuration from this file instead of the \n" + " default location (" DEFAULT_CONF_PATH "/" FD_DEFAULT_CONF_FILENAME ")\n" + " -D, --daemon Start program in background\n" + " -p, --pidfile=filename Write PID to filename\n" " -s, --syslog Write log output to syslog (instead of stdout)\n"); printf( "\nDebug:\n" " These options are mostly useful for developers\n" - " -l, --dbglocale Set the locale for error messages\n" - " -d, --debug Increase verbosity of debug messages if default logger is used\n" - " -q, --quiet Decrease verbosity if default logger is used\n" + " -d, --debug Increase verbosity of log messages\n" " -f, --dbg_func <func> Enable all traces within the function <func>\n" " -F, --dbg_file <file.c> Enable all traces within the file <file.c> (basename match)\n" - " --dbg_gnutls <int> Enable GNU TLS debug at level <int>\n" + " -g, --dbg_gnutls <int> Enable GNU TLS debug at level <int>\n" + " -l, --dbglocale Set the locale for error messages\n" + " -q, --quiet Decrease verbosity of log messages\n" ); } @@ -197,6 +256,8 @@ static int main_cmdline(int argc, char *argv[]) { "version", no_argument, NULL, 'V' }, { "config", required_argument, NULL, 'c' }, { "syslog", no_argument, NULL, 's' }, + { "daemon", no_argument, NULL, 'D' }, + { "pidfile", required_argument, NULL, 'p' }, { "debug", no_argument, NULL, 'd' }, { "quiet", no_argument, NULL, 'q' }, { "dbglocale", optional_argument, NULL, 'l' }, @@ -208,18 +269,18 @@ static int main_cmdline(int argc, char *argv[]) /* Loop on arguments */ while (1) { - c = getopt_long (argc, argv, "hVc:dql:f:F:g:s", long_options, &option_index); + c = getopt_long (argc, argv, "hVc:Dp:dql:f:F:g:s", long_options, &option_index); if (c == -1) break; /* Exit from the loop. */ switch (c) { case 'h': /* Print help and exit. */ main_help(); - exit(0); + exit(EXIT_SUCCESS); case 'V': /* Print version and exit. */ main_version(); - exit(0); + exit(EXIT_SUCCESS); case 'c': /* Read configuration from this file instead of the default location.. */ if (optarg == NULL ) { @@ -229,6 +290,18 @@ static int main_cmdline(int argc, char *argv[]) conffile = optarg; break; + case 'D': + daemon_mode = 1; + break; + + case 'p': /* Write pidfile */ + if (optarg == NULL ) { + fprintf(stderr, "Missing argument with --pidfile directive\n"); + return EINVAL; + } + pidfile = optarg; + break; + case 'l': /* Change the locale. */ locale = setlocale(LC_ALL, optarg?:""); if (!locale) { diff --git a/include/freeDiameter/CMakeLists.txt b/include/freeDiameter/CMakeLists.txt index 611f6a2..a700949 100644 --- a/include/freeDiameter/CMakeLists.txt +++ b/include/freeDiameter/CMakeLists.txt @@ -15,6 +15,9 @@ ENDIF (NOT DISABLE_SCTP) # Find TODO items in the code easily ? OPTION(ERRORS_ON_TODO "(development) Generate compilation errors on TODO items ?" OFF) +# Compiler warnings are fatal? +OPTION(ERRORS_ON_WARNINGS "(development) Compiler warnings cause compilation errors ?" OFF) + # In DEBUG mode, each log can contain pid, calling function and file for easy debug. Set to ON to display this information. OPTION(DEBUG_WITH_META "Show calling location in logs?" OFF) diff --git a/include/freeDiameter/extension.h b/include/freeDiameter/extension.h index 76f638a..b6bcc8d 100644 --- a/include/freeDiameter/extension.h +++ b/include/freeDiameter/extension.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -46,8 +46,11 @@ extern "C" { /* Macro that define the entry point of the extension */ #define EXTENSION_ENTRY(_name, _function, _depends...) \ +__attribute__((visibility("default"))) \ const char *fd_ext_depends[] = { _name , ## _depends , NULL }; \ static int extension_loaded = 0; \ + \ +__attribute__((visibility("default"))) \ int fd_ext_init(int major, int minor, char * conffile) { \ if ((major != FD_PROJECT_VERSION_MAJOR) \ || (minor != FD_PROJECT_VERSION_MINOR)) { \ @@ -63,7 +66,11 @@ int fd_ext_init(int major, int minor, char * conffile) { \ } \ extension_loaded++; \ return (_function)(conffile); \ -} +} + +/* Optional exit point (finish function) of the extension */ +__attribute__((visibility("default"))) +void fd_ext_fini(void); #ifdef __cplusplus } diff --git a/include/freeDiameter/freeDiameter-host.h.in b/include/freeDiameter/freeDiameter-host.h.in index 1539b4a..46c9a52 100644 --- a/include/freeDiameter/freeDiameter-host.h.in +++ b/include/freeDiameter/freeDiameter-host.h.in @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2016, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/include/freeDiameter/libfdcore.h b/include/freeDiameter/libfdcore.h index 75ba628..4f6edce 100644 --- a/include/freeDiameter/libfdcore.h +++ b/include/freeDiameter/libfdcore.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2016, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -44,6 +44,7 @@ extern "C" { #include <freeDiameter/libfdproto.h> #include <gnutls/gnutls.h> #include <gnutls/x509.h> +#include <regex.h> /* GNUTLS version */ #ifndef GNUTLS_VERSION @@ -132,9 +133,16 @@ struct fd_config { uint16_t cnf_sctp_str; /* default max number of streams for SCTP associations (def: 30) */ struct fd_list cnf_endpoints; /* the local endpoints to bind the server to. list of struct fd_endpoint. default is empty (bind all). After servers are started, this is the actual list of endpoints including port information. */ int cnf_thr_srv; /* Number of threads per servers handling the connection state machines */ + int cnf_processing_peers_minimum; /* Number of processing peers that must be connected before other peers may connect */ + regex_t cnf_processing_peers_pattern_regex; /* Regex pattern for identifying processing peers */ struct fd_list cnf_apps; /* Applications locally supported (except relay, see flags). Use fd_disp_app_support to add one. list of struct fd_app. */ uint16_t cnf_dispthr; /* Number of dispatch threads to create */ + uint16_t cnf_rtinthr; /* Number of routing in threads to create */ + uint16_t cnf_rtoutthr; /* Number of routing out threads to create */ uint16_t cnf_rr_in_answers; /* include Route-Record AVP in answers */ + int cnf_qin_limit; /* limit for incoming queue*/ + int cnf_qout_limit; /* limit for outgoing queue */ + int cnf_qlocal_limit; /* limit for local queue */ struct { unsigned no_fwd : 1; /* the peer does not relay messages (0xffffff app id) */ unsigned no_ip4 : 1; /* disable IP */ @@ -143,6 +151,7 @@ struct fd_config { unsigned no_sctp: 1; /* disable the use of SCTP */ unsigned pr_tcp : 1; /* prefer TCP over SCTP */ unsigned tls_alg: 1; /* TLS algorithm for initiated cnx. 0: separate port. 1: inband-security (old) */ + unsigned no_bind: 1; /* disable client bind to cnf_endpoints if non configured (bind all) */ } cnf_flags; struct { @@ -544,6 +553,30 @@ int fd_msg_send ( struct msg ** pmsg, void (*anscb)(void *, struct msg **), void int fd_msg_send_timeout ( struct msg ** pmsg, void (*anscb)(void *, struct msg **), void * data, void (*expirecb)(void *, DiamId_t, size_t, struct msg **), const struct timespec *timeout ); /* + * FUNCTION: fd_msg_add_result + * + * PARAMETERS: + * msg : A msg object -- it must be an answer. + * vendor : Vendor. If 0, add Result-Code else add Experimental-Result. + * restype : DICT_TYPE containing rescode (ex: from TYPE_BY_NAME "Enumerated(Result-Code)"). + * rescode : The name of the returned error code (ex: "DIAMETER_INVALID_AVP"). + * errormsg : (optional) human-readable error message to put in Error-Message AVP. + * optavp : (optional) If provided, the content will be put inside a Failed-AVP. + * type_id : 0 => nothing; 1 => adds Origin-Host and Origin-Realm with local info. 2=> adds Error-Reporting-Host. + * + * DESCRIPTION: + * This function adds a Result-Code AVP (if vendor is 0) or Experimental-Result AVP (vendor is not 0) + * to a message, and optionally + * - sets the 'E' error flag in the header, + * - adds Error-Message, Error-Reporting-Host and Failed-AVP AVPs. + * + * RETURN VALUE: + * 0 : Operation complete. + * !0 : an error occurred. + */ +int fd_msg_add_result( struct msg * msg, vendor_id_t vendor, struct dict_object * restype, char * rescode, char * errormsg, struct avp * optavp, int type_id ); + +/* * FUNCTION: fd_msg_rescode_set * * PARAMETERS: @@ -553,14 +586,15 @@ int fd_msg_send_timeout ( struct msg ** pmsg, void (*anscb)(void *, struct msg * * optavp : (optional) If provided, the content will be put inside a Failed-AVP * type_id : 0 => nothing; 1 => adds Origin-Host and Origin-Realm with local info. 2=> adds Error-Reporting-Host. * - * DESCRIPTION: - * This function adds a Result-Code AVP to a message, and optionally + * DESCRIPTION: + * This function adds a Result-Code AVP to a message, and optionally * - sets the 'E' error flag in the header, * - adds Error-Message, Error-Reporting-Host and Failed-AVP AVPs. + * Uses fd_msg_add_result with vendor 0 and restype for Enumerated(Result-Code). * * RETURN VALUE: - * 0 : Operation complete. - * !0 : an error occurred. + * 0 : Operation complete. + * !0 : an error occurred. */ int fd_msg_rescode_set( struct msg * msg, char * rescode, char * errormsg, struct avp * optavp, int type_id ); diff --git a/include/freeDiameter/libfdproto.h b/include/freeDiameter/libfdproto.h index 61eacc2..66f4b3b 100644 --- a/include/freeDiameter/libfdproto.h +++ b/include/freeDiameter/libfdproto.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -29,7 +29,7 @@ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * -* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY S_OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY S_OUT OF THE USE OF THIS SOFTWARE, EVEN IF * * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *********************************************************************************************************/ @@ -138,7 +138,7 @@ extern const char fd_libproto_version[]; * format : Same format string as in the printf function * ... : Same list as printf * - * DESCRIPTION: + * DESCRIPTION: * Write information to log. * The format and arguments may contain UTF-8 encoded data. The * output medium is expected to support this encoding. @@ -151,7 +151,7 @@ void fd_log ( int, const char *, ... ) _ATTRIBUTE_PRINTFLIKE_(2,3); void fd_log_va( int, const char *, va_list); #endif /* SWIG */ -/* these are internal objects of the debug facility, +/* these are internal objects of the debug facility, might be useful to control the behavior from outside */ extern pthread_mutex_t fd_log_lock; extern char * fd_debug_one_function; @@ -163,7 +163,7 @@ extern char * fd_debug_one_file; * PARAMETERS: * name : \0-terminated string containing a name to identify the current thread. * - * DESCRIPTION: + * DESCRIPTION: * Name the current thread, useful for debugging multi-threaded problems. * * This function assumes that a global thread-specific key called "fd_log_thname" exists @@ -185,8 +185,8 @@ extern pthread_key_t fd_log_thname; * incl_date : The day of year is included in the output * incl_ms : millisecond value is included in the output * - * DESCRIPTION: - * Writes the timestamp (in human readable format) in a buffer. + * DESCRIPTION: + * Writes the timestamp (in human readable format) in a buffer. * * RETURN VALUE: * pointer to buf. @@ -245,7 +245,7 @@ int fd_log_handler_unregister ( void ); #define DECLARE_FD_DUMP_PROTOTYPE_simple( function_name ) \ char * function_name(char ** buf, size_t *len, size_t *offset) #endif /* SWIG */ - + /* Helper functions for the *dump functions that add into a buffer */ DECLARE_FD_DUMP_PROTOTYPE( fd_dump_extend, const char * format, ... ) _ATTRIBUTE_PRINTFLIKE_(4,5); @@ -270,6 +270,7 @@ DECLARE_FD_DUMP_PROTOTYPE( fd_dump_extend_hexdump, uint8_t *data, size_t datalen /* log levels definitions, that are passed to the logger */ #define FD_LOG_ANNOYING 0 /* very verbose loops and such "overkill" traces. Only active when the framework is compiled in DEBUG mode. */ #define FD_LOG_DEBUG 1 /* Get a detailed sense of what is going on in the framework. Use this level for normal debug */ +#define FD_LOG_INFO 2 /* Informational execution states */ #define FD_LOG_NOTICE 3 /* Normal execution states worth noting */ #define FD_LOG_ERROR 5 /* Recoverable or expected error conditions */ #define FD_LOG_FATAL 6 /* Unrecoverable error, e.g. malloc fail, etc. that requires the framework to shutdown */ @@ -312,7 +313,7 @@ static char * file_bname_init(char * full) { file_bname = basename(full); return fd_log((printlevel), STD_TRACE_FMT_STRING format STD_TRACE_FMT_ARGS, ## args) /* - * Use the following macros in the code to get traces with location & pid in debug mode: + * Use the following macros in the code to get traces with location & pid in debug mode: */ #ifdef DEBUG # define LOG_A(format,args... ) \ @@ -330,6 +331,10 @@ static char * file_bname_init(char * full) { file_bname = basename(full); return #define LOG_D(format,args... ) \ LOG(FD_LOG_DEBUG, format, ##args) +/* Report an info message */ +#define LOG_I(format,args... ) \ + LOG(FD_LOG_INFO, format,##args) + /* Report a normal message that is useful for normal admin monitoring */ #define LOG_N(format,args... ) \ LOG(FD_LOG_NOTICE, format,##args) @@ -402,12 +407,12 @@ int fd_breakhere(void); * * The name "__ret__" is always available in the __fallback__ parameter and contains the error code. */ - + #define CHECK_PRELUDE(__call__) \ int __ret__; \ TRACE_CALL("Check: %s", #__call__ ); \ __ret__ = (__call__) - + #define DEFAULT_FB return __ret__; /* System check: error case if < 0, error value in errno */ @@ -491,7 +496,7 @@ static __inline__ int old_TRACE_BOOL( enum old_levels level, const char * file, #ifndef SWIG static __inline__ void fd_log_deprecated( int level, const char *format, ... ) MARK_DEPRECATED -{ +{ va_list ap; va_start(ap, format); fd_log_va(level, format, ap); @@ -516,7 +521,7 @@ static __inline__ void replace_me() MARK_DEPRECATED { } int __l__; \ if ((__l__ = TRACE_BOOL(oldlevel))) { \ if (oldlevel <= NONE) { LOG_E(format,##args); } \ - else if (oldlevel <= INFO) { LOG_N(format,##args); } \ + else if (oldlevel <= INFO) { LOG_I(format,##args); } \ else if (__l__ == 2) { LOG_N(format,##args); } \ else if (oldlevel <= FULL) { LOG_D(format,##args); } \ else { LOG_A(format,##args); } \ @@ -557,7 +562,7 @@ static __inline__ void replace_me() MARK_DEPRECATED { } # define CHECK_POSIX( __call__ ) \ CHECK_POSIX_DO( (__call__), return __ret__ ) - + # define CHECK_MALLOC_DO( __call__, __fallback__ ) { \ void * __ptr__; \ TRACE_CALL("Check: %s", #__call__ ); \ @@ -571,7 +576,7 @@ static __inline__ void replace_me() MARK_DEPRECATED { } # define CHECK_MALLOC( __call__ ) \ CHECK_MALLOC_DO( (__call__), return __ret__ ) - + # define CHECK_PARAMS_DO( __bool__, __fallback__ ) { \ TRACE_CALL("Check: %s", #__bool__ ); \ if ( ! (__bool__) ) { \ @@ -588,19 +593,21 @@ static __inline__ void replace_me() MARK_DEPRECATED { } # define CHECK_FCT CHECK_POSIX #endif /* EXCLUDE_DEPRECATED */ - + /*============================================================*/ /* Optimized code: remove all debugging code */ /*============================================================*/ #ifdef STRIP_DEBUG_CODE #undef LOG_D +#undef LOG_I #undef LOG_N #undef LOG_E #undef LOG_F #undef LOG_BUFFER #define LOG_D(format,args... ) /* noop */ +#define LOG_I(format,args...) fd_log(FD_LOG_INFO, format, ## args) #define LOG_N(format,args...) fd_log(FD_LOG_NOTICE, format, ## args) #define LOG_E(format,args...) fd_log(FD_LOG_ERROR, format, ## args) #define LOG_F(format,args...) fd_log(FD_LOG_FATAL, format, ## args) @@ -660,7 +667,7 @@ void fd_sa_sdump_numeric(char * buf /* must be at least sSA_DUMP_STRLEN */, sSA #endif /* DISABLE_SCTP */ /* Define the value of IP loopback address */ -#ifndef INADDR_LOOPBACK +#ifndef INADDR_LOOPBACK #define INADDR_LOOPBACK inet_addr("127.0.0.1") #endif /* INADDR_LOOPBACK */ @@ -682,10 +689,10 @@ void fd_sa_sdump_numeric(char * buf /* must be at least sSA_DUMP_STRLEN */, sSA /* create a V4MAPPED address */ #define IN6_ADDR_V4MAP( a6, a4 ) { \ - ((uint32_t *)(a6))[0] = 0; \ - ((uint32_t *)(a6))[1] = 0; \ - ((uint32_t *)(a6))[2] = htonl(0xffff); \ - ((uint32_t *)(a6))[3] = (uint32_t)(a4); \ + memset(&(*a6)[0], 0, 10); \ + (*a6)[10] = 0xff; \ + (*a6)[11] = 0xff; \ + memcpy(&(*a6)[12], &a4, 4); \ } /* Retrieve a v4 value from V4MAPPED address ( takes a s6_addr as param) */ @@ -701,8 +708,8 @@ void fd_sa_sdump_numeric(char * buf /* must be at least sSA_DUMP_STRLEN */, sSA # define htonll(x) (x) # else /* HOST_BIG_ENDIAN */ /* For these systems, we must reverse the bytes. Use ntohl and htonl on sub-32 blocs, and inverse these blocs. */ -# define ntohll(x) (typeof (x))( (((uint64_t)ntohl( (uint32_t)(x))) << 32 ) | ((uint64_t) ntohl( ((uint64_t)(x)) >> 32 ))) -# define htonll(x) (typeof (x))( (((uint64_t)htonl( (uint32_t)(x))) << 32 ) | ((uint64_t) htonl( ((uint64_t)(x)) >> 32 ))) +# define ntohll(x) (typeof (x))( (((uint64_t)ntohl( (uint32_t)(x))) << 32 ) | ((uint64_t) ntohl( ((uint64_t)(x)) >> 32 ))) +# define htonll(x) (typeof (x))( (((uint64_t)htonl( (uint32_t)(x))) << 32 ) | ((uint64_t) htonl( ((uint64_t)(x)) >> 32 ))) # endif /* HOST_BIG_ENDIAN */ #endif /* HAVE_NTOHLL */ @@ -726,7 +733,7 @@ void fd_sa_sdump_numeric(char * buf /* must be at least sSA_DUMP_STRLEN */, sSA (tsdiff)->tv_sec = (tsend)->tv_sec - (tsstart)->tv_sec; \ (tsdiff)->tv_nsec = (tsend)->tv_nsec - (tsstart)->tv_nsec; \ }} - + /* This gives a good size for buffered reads */ #ifndef BUFSIZ @@ -755,12 +762,12 @@ char * strndup (char *str, size_t len); /* BINARY STRINGS */ /*============================================================*/ -/* Compute a hash value of a binary string. +/* Compute a hash value of a binary string. The hash must remain local to this machine, there is no guarantee that same input will give same output on a different system (endianness) */ uint32_t fd_os_hash ( uint8_t * string, size_t len ); -/* This type used for binary strings that contain no \0 except as their last character. +/* This type used for binary strings that contain no \0 except as their last character. It means some string operations can be used on it. */ typedef uint8_t * os0_t; @@ -786,24 +793,24 @@ typedef char * DiamId_t; rfc3588 states explicitely that such a Diameter Identity consists only of ASCII characters. */ int fd_os_is_valid_DiameterIdentity(uint8_t * os, size_t ossz); -/* The following function validates a string as a Diameter Identity or applies the IDNA transformation on it +/* The following function validates a string as a Diameter Identity or applies the IDNA transformation on it if *inoutsz is != 0 on entry, *id may not be \0-terminated. memory has the following meaning: 0: *id can be realloc'd. 1: *id must be malloc'd on output (was static) */ int fd_os_validate_DiameterIdentity(char ** id, size_t * inoutsz, int memory); -/* Create an order relationship for binary strings (not needed to be \0 terminated). +/* Create an order relationship for binary strings (not needed to be \0 terminated). It does NOT mimic strings relationships so that it is more efficient. It is case sensitive. (the strings are actually first ordered by their lengh, then by their bytes contents) returns: -1 if os1 < os2; +1 if os1 > os2; 0 if they are equal */ int fd_os_cmp_int(os0_t os1, size_t os1sz, os0_t os2, size_t os2sz); #define fd_os_cmp(_o1, _l1, _o2, _l2) fd_os_cmp_int((os0_t)(_o1), _l1, (os0_t)(_o2), _l2) -/* A roughly case-insensitive variant, which actually only compares ASCII chars (0-127) in a case-insentitive maneer +/* A roughly case-insensitive variant, which actually only compares ASCII chars (0-127) in a case-insentitive maneer -- it does not support locales where a lowercase letter uses more space than upper case, such as ß -> ss It is slower than fd_os_cmp. Note that the result is NOT the same as strcasecmp !!! - + This function gives the same order as fd_os_cmp, except when it finds 2 strings to be equal. However this is not always sufficient: for example fd_os_cmp gives: "Ac" < "aB" < "aa" @@ -816,8 +823,8 @@ int fd_os_cmp_int(os0_t os1, size_t os1sz, os0_t os2, size_t os2sz); int fd_os_almostcasesrch_int(uint8_t * os1, size_t os1sz, uint8_t * os2, size_t os2sz, int * maybefurther); #define fd_os_almostcasesrch(_o1, _l1, _o2, _l2, _mb) fd_os_almostcasesrch_int((os0_t)(_o1), _l1, (os0_t)(_o2), _l2, _mb) -/* Analyze a DiameterURI and return its components. - Return EINVAL if the URI is not valid. +/* Analyze a DiameterURI and return its components. + Return EINVAL if the URI is not valid. *diamid is malloc'd on function return and must be freed (it is processed by fd_os_validate_DiameterIdentity). *secure is 0 (no security) or 1 (security enabled) on return. *port is 0 (default) or a value in host byte order on return. @@ -834,40 +841,40 @@ int fd_os_parse_DiameterURI(uint8_t * uri, size_t urisz, DiamId_t * diamid, size static __inline__ int fd_thr_term(pthread_t * th) { void * th_ret = NULL; - + CHECK_PARAMS(th); - + /* Test if it was already terminated */ if (*th == (pthread_t)NULL) return 0; - + /* Cancel the thread if it is still running - ignore error if it was already terminated */ (void) pthread_cancel(*th); - + /* Then join the thread */ CHECK_POSIX( pthread_join(*th, &th_ret) ); - + if (th_ret == PTHREAD_CANCELED) { TRACE_DEBUG(ANNOYING, "The thread %p was canceled", (void *)*th); } else { TRACE_DEBUG(CALL, "The thread %p returned %p", (void *)*th, th_ret); } - + /* Clean the location */ *th = (pthread_t)NULL; - + return 0; } /************* - Cancelation cleanup handlers for common objects + Cancelation cleanup handlers for common objects *************/ static __inline__ void fd_cleanup_mutex( void * mutex ) { CHECK_POSIX_DO( pthread_mutex_unlock((pthread_mutex_t *)mutex), /* */); } - + static __inline__ void fd_cleanup_rwlock( void * rwlock ) { CHECK_POSIX_DO( pthread_rwlock_unlock((pthread_rwlock_t *)rwlock), /* */); @@ -945,7 +952,7 @@ enum dict_object_type { DICT_RULE /* a Rule for AVP in command or grouped AVP */ #define DICT_TYPE_MAX DICT_RULE }; - + /* Initialize a dictionary */ int fd_dict_init(struct dictionary ** dict); /* Destroy a dictionary */ @@ -955,21 +962,21 @@ int fd_dict_fini(struct dictionary ** dict); * FUNCTION: fd_dict_new * * PARAMETERS: - * dict : Pointer to the dictionnary where the object is created + * dict : Pointer to the dictionary where the object is created * type : What kind of object must be created - * data : pointer to the data for the object. + * data : pointer to the data for the object. * type parameter is used to determine the type of data (see below for detail). * parent : a reference to a parent object, if needed. * ref : upon successful creation, reference to new object is stored here if !null. * - * DESCRIPTION: - * Create a new object in the dictionary. + * DESCRIPTION: + * Create a new object in the dictionary. * See following object sections in this header file for more information on data and parent parameters format. * * RETURN VALUE: * 0 : The object is created in the dictionary. * EINVAL : A parameter is invalid. - * EEXIST : This object is already defined in the dictionary (with conflicting data). + * EEXIST : This object is already defined in the dictionary (with conflicting data). * If "ref" is not NULL, it points to the existing element on return. * (other standard errors may be returned, too, with their standard meaning. Example: * ENOMEM : Memory allocation for the new object element failed.) @@ -980,15 +987,15 @@ int fd_dict_new ( struct dictionary * dict, enum dict_object_type type, void * d * FUNCTION: fd_dict_search * * PARAMETERS: - * dict : Pointer to the dictionnary where the object is searched + * dict : Pointer to the dictionary where the object is searched * type : type of object that is being searched * criteria : how the object must be searched. See object-related sections below for more information. * what : depending on criteria, the data that must be searched. * result : On successful return, pointer to the object is stored here. * retval : this value is returned if the object is not found and result is not NULL. * - * DESCRIPTION: - * Perform a search in the dictionary. + * DESCRIPTION: + * Perform a search in the dictionary. * See the object-specific sections below to find how to look for each objects. * If the "result" parameter is NULL, the function is used to check if an object is in the dictionary. * Otherwise, a reference to the object is stored in result if found. @@ -1012,7 +1019,7 @@ int fd_dict_get_error_cmd(struct dictionary * dict, struct dict_object ** obj); * data : pointer to a structure to hold the data for the object. * The type is the same as "data" parameter in fd_dict_new function. * - * DESCRIPTION: + * DESCRIPTION: * Retrieve content of a dictionary object. * See following object sections in this header file for more information on data and parent parameters format. * @@ -1039,7 +1046,7 @@ int fd_dict_delete(struct dict_object * obj); /* *************************************************************************** * - * Vendor object + * Vendor object * * These types are used to manage vendors in the dictionary * @@ -1069,9 +1076,9 @@ enum { Note: the value of "vendor_name" is copied when the object is created, and the string may be disposed afterwards. On the other side, when value is retrieved with dict_getval, the string is not copied and MUST NOT be freed. It will be freed automatically along with the object itself with call to dict_fini later. - + - fd_dict_new: - The "parent" parameter is not used for vendors. + The "parent" parameter is not used for vendors. Sample code to create a vendor: { int ret; @@ -1090,7 +1097,7 @@ be freed automatically along with the object itself with call to dict_fini later - or - ret = fd_dict_search ( dict, DICT_VENDOR, VENDOR_BY_NAME, "my vendor name", &vendor_found, ENOENT); } - + - fd_dict_getval: Sample code to retrieve the data from a vendor object: { @@ -1101,16 +1108,16 @@ be freed automatically along with the object itself with call to dict_fini later ret = fd_dict_getval ( myvendor, &myvendordata ); printf("my vendor id: %d\n", myvendordata.vendor_id ); } - + */ - + /* Special function: */ uint32_t * fd_dict_get_vendorid_list(struct dictionary * dict); - + /* *************************************************************************** * - * Application object + * Application object * * These types are used to manage Diameter applications in the dictionary * @@ -1155,7 +1162,7 @@ The vendor associated to an application is retrieved with VENDOR_OF_APPLICATION 9789, "my vendor's application" }; - + ret = fd_dict_new ( dict, DICT_VENDOR, &vendor_data, NULL, &vendor ); ret = fd_dict_new ( dict, DICT_APPLICATION, &app_data, vendor, &appl ); } @@ -1165,11 +1172,11 @@ The vendor associated to an application is retrieved with VENDOR_OF_APPLICATION { int ret; struct dict_object * vendor, * appli; - + ret = fd_dict_search ( dict, DICT_APPLICATION, APPLICATION_BY_NAME, "my vendor's application", &appli, ENOENT); ret = fd_dict_search ( dict, DICT_VENDOR, VENDOR_OF_APPLICATION, appli, &vendor, ENOENT); } - + - fd_dict_getval: Sample code to retrieve the data from an application object: { @@ -1186,14 +1193,14 @@ The vendor associated to an application is retrieved with VENDOR_OF_APPLICATION /* *************************************************************************** * - * Type object + * Type object * * These types are used to manage AVP data types in the dictionary * *************************************************************************** */ -/* Type to store any AVP value */ +/* Type to store any AVP value */ union avp_value { struct { uint8_t *data; /* bytes buffer */ @@ -1228,7 +1235,7 @@ enum dict_avp_basetype { * val : Pointer to the AVP value that must be interpreted. * interpreted : The result of interpretation is stored here. The format and meaning depends on each type. * - * DESCRIPTION: + * DESCRIPTION: * This callback can be provided with a derived type in order to facilitate the interpretation of formated data. * For example, when an AVP of type "Address" is received, it can be used to convert the octetstring into a struct sockaddr. * This callback is not called directly, but through the message's API msg_avp_value_interpret function. @@ -1245,11 +1252,11 @@ typedef int (*dict_avpdata_interpret) (union avp_value * value, void * interpret * data : The formated data that must be stored in the AVP value. * val : Pointer to the AVP value storage area where the data must be stored. * - * DESCRIPTION: + * DESCRIPTION: * This callback can be provided with a derived type in order to facilitate the encoding of formated data. * For example, it can be used to convert a struct sockaddr in an AVP value of type Address. * This callback is not called directly, but through the message's API msg_avp_value_encode function. - * If the callback is defined for an OctetString based type, the created string must be malloc'd. free will be called + * If the callback is defined for an OctetString based type, the created string must be malloc'd. free will be called * automatically later. * * RETURN VALUE: @@ -1264,12 +1271,12 @@ typedef int (*dict_avpdata_encode) (void * data, union avp_value * val); * PARAMETERS: * val : Pointer to the AVP value that was received and needs to be sanity checked. * data : a parameter stored in the type structure (to enable more generic check functions) - * error_msg: upon erroneous value, a string describing the error can be returned here (it will be strcpy by caller). This description will be returned in the error message, if any. + * error_msg: upon erroneous value, a string describing the error can be returned here (it will be strcpy by caller). This description will be returned in the error message, if any. * - * DESCRIPTION: + * DESCRIPTION: * This callback can be provided with a derived type in order to improve the operation of the * fd_msg_parse_dict function. When this callback is present, the value of the AVP that has - * been parsed is passed to this function for finer granularity check. For example for some + * been parsed is passed to this function for finer granularity check. For example for some * speccific AVP, the format of an OCTETSTRING value can be further checked, or the * interger value can be verified. * @@ -1300,7 +1307,7 @@ enum { }; /**** - Callbacks defined in libfdproto/dictionary_functions.c file -- see that file for usage. + Callbacks defined in libfdproto/dictionary_functions.c file -- see that file for usage. */ /* Convert an Address type AVP into a struct sockaddr_storage */ @@ -1327,14 +1334,14 @@ int fd_dictfct_CharInOS_check(void * data, union avp_value * val, char ** error_ * API usage : - fd_dict_new: - The "parent" parameter may point to an application object, when a type is defined by a Diameter application. - + The "parent" parameter may point to an application object, when a type is defined by a Diameter application. + Sample code: { int ret; struct dict_object * mytype; - struct dict_type_data mytypedata = - { + struct dict_type_data mytypedata = + { AVP_TYPE_OCTETSTRING, "Address", NULL, @@ -1350,13 +1357,13 @@ int fd_dictfct_CharInOS_check(void * data, union avp_value * val, char ** error_ struct dict_object * address_type; ret = fd_dict_search ( dict, DICT_TYPE, TYPE_BY_NAME, "Address", &address_type, ENOENT); } - + */ /* *************************************************************************** * - * Enumerated values object + * Enumerated values object * * These types are used to manage named constants of some AVP, * for enumerated types. freeDiameter allows constants for types others than Unsigned32 @@ -1373,15 +1380,15 @@ struct dict_enumval_data { /* The criteria for searching a constant in the dictionary */ enum { ENUMVAL_BY_STRUCT = 40, /* "what" points to a struct dict_enumval_request as defined below */ - ENUMVAL_BY_NAME, /* This cannot be used for researches */ - ENUMVAL_BY_VALUE /* This cannot be used for researches */ + ENUMVAL_BY_NAME, /* This cannot be used for searches */ + ENUMVAL_BY_VALUE /* This cannot be used for searches */ }; struct dict_enumval_request { /* Identifier of the parent type, one of the following must not be NULL */ struct dict_object *type_obj; char * type_name; - + /* Search criteria for the constant */ struct dict_enumval_data search; /* search.enum_value is used only if search.enum_name == NULL */ }; @@ -1390,13 +1397,13 @@ struct dict_enumval_request { * API usage : - fd_dict_new: - The "parent" parameter must point to a derived type object. + The "parent" parameter must point to a derived type object. Sample code to create a type "Boolean" with two constants "True" and "False": { int ret; struct dict_object * type_boolean; - struct dict_type_data type_boolean_data = - { + struct dict_type_data type_boolean_data = + { AVP_TYPE_INTEGER32, "Boolean", NULL, @@ -1415,7 +1422,7 @@ struct dict_enumval_request { ret = fd_dict_new ( dict, DICT_TYPE, &type_boolean_data, NULL, &type_boolean ); ret = fd_dict_new ( dict, DICT_ENUMVAL, &boolean_false, type_boolean, NULL ); ret = fd_dict_new ( dict, DICT_ENUMVAL, &boolean_true , type_boolean, NULL ); - + } - fd_dict_search: @@ -1429,10 +1436,10 @@ struct dict_enumval_request { .search.enum_name=NULL, .search.enum_value.i32 = -1 }; - + ret = fd_dict_search ( dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &boolean_by_value, &value_found, ENOENT); } - + - fd_dict_getval: Sample code to retrieve the data from a constant object: { @@ -1445,17 +1452,17 @@ struct dict_enumval_request { .search.enum_name=NULL, .search.enum_value.i32 = 0 }; - + ret = fd_dict_search ( dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &boolean_by_value, &value_found, ENOENT); ret = fd_dict_getval ( value_found, &boolean_data ); printf(" Boolean with value 0: %s", boolean_data.enum_name ); } */ - + /* *************************************************************************** * - * AVP object + * AVP object * * These objects are used to manage AVP definitions in the dictionary * @@ -1497,13 +1504,13 @@ enum { AVP_BY_NAME, /* "what" points to a char *, vendor is always 0 */ AVP_BY_NAME_ALL_VENDORS,/* "what" points to a string. Might be quite slow... */ AVP_BY_STRUCT, /* "what" points to a struct dict_avp_request_ex (see below) */ - + /* kept for backward compatibility, better use AVP_BY_STRUCT above instead */ AVP_BY_CODE_AND_VENDOR, /* "what" points to a struct dict_avp_request (see below), where avp_vendor and avp_code are set */ AVP_BY_NAME_AND_VENDOR /* "what" points to a struct dict_avp_request (see below), where avp_vendor and avp_name are set */ }; -/* Struct used for some researchs */ +/* Struct used for some searches */ struct dict_avp_request_ex { struct { /* Only one of the following fields must be set. */ @@ -1511,7 +1518,7 @@ struct dict_avp_request_ex { vendor_id_t vendor_id; /* set to 0 to ignore -- prefer AVP_BY_CODE or AVP_BY_NAME for vendor 0 */ const char * vendor_name; /* set to NULL to ignore */ } avp_vendor; - + struct { /* Only one of the following fields must be set */ avp_code_t avp_code; /* set to 0 to ignore */ @@ -1530,8 +1537,8 @@ struct dict_avp_request { /*** * API usage : -If "parent" parameter is not NULL during AVP creation, it must point to a DICT_TYPE object. -The extended type is then attached to the AVP. In case where it is an enumerated type, the value of +If "parent" parameter is not NULL during AVP creation, it must point to a DICT_TYPE object. +The extended type is then attached to the AVP. In case where it is an enumerated type, the value of AVP is automatically interpreted in debug messages, and in message checks. The derived type of an AVP can be retrieved with: dict_search ( DICT_TYPE, TYPE_OF_AVP, avp, ... ) @@ -1560,14 +1567,14 @@ To create the rules (ABNF) for children of Grouped AVP, see the DICT_RULE relate AVP_FLAG_VENDOR, AVP_TYPE_INTEGER32 // This MUST be the same as parent type's }; - + -- Create an AVP with a base type -- ret = fd_dict_new ( dict, DICT_AVP, &user_name_data, NULL, &user_name_avp ); - + -- Create an AVP with a derived type -- ret = fd_dict_search ( dict, DICT_TYPE, TYPE_BY_NAME, "Boolean", &boolean_type, ENOENT); ret = fd_dict_new ( dict, DICT_AVP, &sample_boolean_data , boolean_type, &sample_boolean_avp ); - + } - fd_dict_search: @@ -1581,16 +1588,16 @@ To create the rules (ABNF) for children of Grouped AVP, see the DICT_RULE relate .avp_vendor = 23455, .avp_name = "Sample-Boolean" }; - + ret = fd_dict_search ( dict, DICT_AVP, AVP_BY_NAME, "User-Name", &avp_username, ENOENT); - + ret = fd_dict_search ( dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &avpvendorboolean, &avp_sampleboolean, ENOENT); -- this would also work, but be slower, because it has to search all vendor dictionaries -- ret = fd_dict_search ( dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Sample-Boolean", &avp_sampleboolean, ENOENT); - + } - + - fd_dict_getval: Sample code to retrieve the data from an AVP object: { @@ -1607,7 +1614,7 @@ To create the rules (ABNF) for children of Grouped AVP, see the DICT_RULE relate /* *************************************************************************** * - * Command object + * Command object * * These types are used to manage commands objects in the dictionary * @@ -1671,9 +1678,9 @@ Note that the "Request" and "Answer" commands are two independant objects. This CMD_FLAG_REQUEST, // mask CMD_FLAG_REQUEST // value. Only the "R" flag is constrained here, set. }; - + ret = fd_dict_new (dict, DICT_COMMAND, &ce_data, NULL, &cer ); - + ce_data.cmd_name = "Capabilities-Exchange-Answer"; ce_data.cmd_flag_val = 0; // Same constraint on "R" flag, but this time it must be cleared. @@ -1689,7 +1696,7 @@ Note that the "Request" and "Answer" commands are two independant objects. This ret = fd_dict_search ( dict, DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &cer, ENOENT); ret = fd_dict_search ( dict, DICT_COMMAND, CMD_BY_CODE_R, &code, &cer, ENOENT); } - + - fd_dict_getval: Sample code to retrieve the data from a command object: { @@ -1763,25 +1770,25 @@ The "parent" parameter can not be NULL. It points to the object (grouped avp or struct dict_avp_data proxy_info_data = { 284, 0, "Proxy-Info", AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, AVP_FLAG_MANDATORY, AVP_TYPE_GROUPED }; struct dict_avp_data proxy_host_data = { 280, 0, "Proxy-Host", AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, AVP_FLAG_MANDATORY, AVP_TYPE_OCTETSTRING }; struct dict_avp_data proxy_state_data = { 33, 0, "Proxy-State",AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, AVP_FLAG_MANDATORY, AVP_TYPE_OCTETSTRING }; - + -- Create the parent AVP ret = fd_dict_new ( dict, DICT_AVP, &proxy_info_data, NULL, &proxy_info_avp ); - + -- Create the first child AVP. ret = fd_dict_new ( dict, DICT_TYPE, &di_type_data, NULL, &diameteridentity_type ); ret = fd_dict_new ( dict, DICT_AVP, &proxy_host_data, diameteridentity_type, &proxy_host_avp ); - + -- Create the other child AVP ret = fd_dict_new ( dict, DICT_AVP, &proxy_state_data, NULL, &proxy_state_avp ); - + -- Now we can create the rules. Both children AVP are mandatory. rule_data.rule_position = RULE_REQUIRED; rule_data.rule_min = -1; rule_data.rule_max = -1; - + rule_data.rule_avp = proxy_host_avp; ret = fd_dict_new ( dict, DICT_RULE, &rule_data, proxy_info_avp, NULL ); - + rule_data.rule_avp = proxy_state_avp; ret = fd_dict_new ( dict, DICT_RULE, &rule_data, proxy_info_avp, NULL ); } @@ -1789,7 +1796,7 @@ The "parent" parameter can not be NULL. It points to the object (grouped avp or - fd_dict_search and fd_dict_getval are similar to previous examples. */ - + /* Define some hard-coded values */ /* Application */ #define AI_RELAY 0xffffffff @@ -1840,7 +1847,7 @@ The "parent" parameter can not be NULL. It points to the object (grouped avp or /* Error codes from Base protocol (reference: http://www.iana.org/assignments/aaa-parameters/aaa-parameters.xml#aaa-parameters-4) -Note that currently, rfc3588bis-26 has some different values for some of these +Note that currently, rfc3588bis-26 has some different values for some of these */ #define ER_DIAMETER_MULTI_ROUND_AUTH 1001 @@ -1908,7 +1915,7 @@ int fd_sess_start(void); * dumper : if not NULL, will be called during fd_sess_dump to display the data associated with a session. NULL otherwise. * opaque : A pointer that is passed to the cleanup callback -- the content is never examined by the framework. * - * DESCRIPTION: + * DESCRIPTION: * Create a new session handler. This is needed by a module to associate a state with a session object. * The cleanup handler is called when the session timeout expires, or fd_sess_destroy is called. It must free * the state associated with the session, and eventually trig other actions (send a STR, ...). @@ -1920,7 +1927,7 @@ int fd_sess_start(void); */ int fd_sess_handler_create ( struct session_handler ** handler, void (*cleanup)(struct sess_state * state, os0_t sid, void * opaque), session_state_dump dumper, void * opaque ); - + /* * FUNCTION: fd_sess_handler_destroy * @@ -1928,7 +1935,7 @@ int fd_sess_handler_create ( struct session_handler ** handler, void (*cleanup)( * handler : location of an handler created by fd_sess_handler_create. * opaque : the opaque pointer registered with the callback is restored here (if ! NULL). * - * DESCRIPTION: + * DESCRIPTION: * This destroys a session handler (typically called when an application is shutting down). * If sessions states are registered with this handler, the cleanup callback is called on them. * @@ -1951,7 +1958,7 @@ int fd_sess_handler_destroy ( struct session_handler ** handler, void **opaque ) * opt : Additional string, or NULL. Usage is described below. * optlen : if opt is \0-terminated, this can be 0. Otherwise, the length of opt. * - * DESCRIPTION: + * DESCRIPTION: * Create a new session object. The Session-Id string associated with this session is generated as follow: * If diamId parameter is provided, the string is created according to the RFC: <diamId>;<high32>;<low32>[;opt] where * diamId is a Diameter Identity. @@ -1976,8 +1983,8 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, * session : On success, pointer to the session object created / retrieved. * isnew : if not NULL, set to 1 on return if the session object has been created, 0 if it was simply retrieved. * - * DESCRIPTION: - * Retrieve a session object from a Session-Id string. In case no session object was previously existing with this + * DESCRIPTION: + * Retrieve a session object from a Session-Id string. In case no session object was previously existing with this * id, a new object is silently created (equivalent to fd_sess_new with flag SESSION_NEW_FULL). * * RETURN VALUE: @@ -1988,7 +1995,7 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, int fd_sess_fromsid ( uint8_t * sid, size_t len, struct session ** session, int * isnew); /* only use the following in specific situations, e.g. app_radgw extension. They are normally handled by the framework only */ -int fd_sess_fromsid_msg ( uint8_t * sid, size_t len, struct session ** session, int * isnew); +int fd_sess_fromsid_msg ( uint8_t * sid, size_t len, struct session ** session, int * isnew); int fd_sess_ref_msg ( struct session * session ); /* @@ -1998,7 +2005,7 @@ int fd_sess_ref_msg ( struct session * session ); * session : Pointer to a session object. * sid : On success, the location of the sid is stored here. * - * DESCRIPTION: + * DESCRIPTION: * Retrieve the session identifier (Session-Id) corresponding to a session object. * The returned sid is a \0-terminated binary string which might be UTF-8 (but there is no guarantee in the framework). * It may be used for example to set the value of an AVP. @@ -2017,15 +2024,15 @@ int fd_sess_getsid ( struct session * session, os0_t * sid, size_t * sidlen ); * session : The session for which to set the timeout. * timeout : The date when the session times out. * - * DESCRIPTION: - * Set the lifetime for a given session object. This function may be + * DESCRIPTION: + * Set the lifetime for a given session object. This function may be * called several times on the same object to update the timeout value. - * When the timeout date is reached, the cleanup handler of each - * module that registered data with this session is called, then the + * When the timeout date is reached, the cleanup handler of each + * module that registered data with this session is called, then the * session is cleared. * * There is a possible race condition between cleanup of the session - * and use of its data; applications should ensure that they are not + * and use of its data; applications should ensure that they are not * using data from a session that is about to expire / expired. * * RETURN VALUE: @@ -2040,10 +2047,10 @@ int fd_sess_settimeout( struct session * session, const struct timespec * timeou * PARAMETERS: * session : Pointer to a session object. * - * DESCRIPTION: + * DESCRIPTION: * Destroys all associated states of a session, if any. * Equivalent to a session timeout expired, but the effect is immediate. - * The session itself is marked as deleted, and will be freed when it is not referenced + * The session itself is marked as deleted, and will be freed when it is not referenced * by any message anymore. * * RETURN VALUE: @@ -2058,7 +2065,7 @@ int fd_sess_destroy ( struct session ** session ); * PARAMETERS: * session : Pointer to a session object. * - * DESCRIPTION: + * DESCRIPTION: * Equivalent to fd_sess_destroy, only if no session_state is associated with the session. * Otherwise, this function has no effect (except that it sets *session to NULL). * @@ -2079,7 +2086,7 @@ int fd_sess_reclaim ( struct session ** session ); * session : The session object with which the state is registered. * state : An application state (opaque data) to store with the session. * - * DESCRIPTION: + * DESCRIPTION: * Stores an application state with a session. This state can later be retrieved * with fd_sess_state_retrieve, or implicitly in the cleanup handler when the session * is destroyed. @@ -2100,9 +2107,9 @@ int fd_sess_state_store ( struct session_handler * handler, struct session * ses * session : The session object with which the state was registered. * state : Location where the state must be saved if it is found. * - * DESCRIPTION: + * DESCRIPTION: * Retrieves a state saved by fd_sess_state_store. - * After this function has been called, the state is no longer associated with + * After this function has been called, the state is no longer associated with * the session. A new call to fd_sess_state_store must be performed in order to * store again the data with the session. * @@ -2110,7 +2117,7 @@ int fd_sess_state_store ( struct session_handler * handler, struct session * ses * 0 : *state is updated (NULL or points to the state if it was found). * EINVAL : A parameter is invalid. */ -int fd_sess_state_retrieve ( struct session_handler * handler, struct session * session, struct sess_state ** state ); +int fd_sess_state_retrieve ( struct session_handler * handler, struct session * session, struct sess_state ** state ); /* For debug */ @@ -2124,7 +2131,7 @@ int fd_sess_getcount(uint32_t *cnt); /* ROUTING */ /*============================================================*/ -/* The following functions are helpers for the routing module. +/* The following functions are helpers for the routing module. The routing data is stored in the message itself. */ /* Structure that contains the routing data for a message */ @@ -2195,7 +2202,7 @@ typedef void msg_or_avp; /* The Diameter protocol version */ #define DIAMETER_VERSION 1 -/* In the two following types, some fields are marked (READONLY). +/* In the two following types, some fields are marked (READONLY). * This means that the content of these fields will be overwritten by the daemon so modifying it is useless. */ @@ -2238,7 +2245,7 @@ enum msg_brw_dir { #define AVPFL_SET_BLANK_VALUE 0x01 /* When creating an AVP, initialize its value to a blank area */ #define AVPFL_SET_RAWDATA_FROM_AVP 0x02 /* When creating an AVP, initialize its rawdata area from an existing AVP -- it is only blank padding (for error reporting) */ #define AVPFL_MAX AVPFL_SET_RAWDATA_FROM_AVP /* The biggest valid flag value */ - + #define MSGFL_ALLOC_ETEID 0x01 /* When creating a message, a new end-to-end ID is allocated and set in the message */ #define MSGFL_ANSW_ERROR 0x02 /* When creating an answer message, set the 'E' bit and use the generic error ABNF instead of command-specific ABNF */ #define MSGFL_ANSW_NOSID 0x04 /* When creating an answer message, do not add the Session-Id even if present in request */ @@ -2256,7 +2263,7 @@ enum msg_brw_dir { * flags : Flags to use in creation (AVPFL_*, see above). * avp : Upon success, pointer to the new avp is stored here. It points to reference AVP upon function call when flags are used. * - * DESCRIPTION: + * DESCRIPTION: * Create a new AVP instance. * * RETURN VALUE: @@ -2275,8 +2282,8 @@ int fd_msg_avp_new ( struct dict_object * model, int flags, struct avp ** avp ); * flags : combination of MSGFL_* flags. * msg : Upon success, pointer to the new message is stored here. * - * DESCRIPTION: - * Create a new empty Diameter message. + * DESCRIPTION: + * Create a new empty Diameter message. * * RETURN VALUE: * 0 : The message is created. @@ -2295,7 +2302,7 @@ int fd_msg_new ( struct dict_object * model, int flags, struct msg ** msg ); * flag : Pass MSGFL_ANSW_ERROR to indicate if the answer is an error message (will set the 'E' bit) * : See other MSGFL_ANSW_* definition above for other flags. * - * DESCRIPTION: + * DESCRIPTION: * This function creates the empty answer message corresponding to a request. * The header is set properly (R flag, ccode, appid, hbhid, eteid) * The Session-Id AVP is copied if present. @@ -2317,7 +2324,7 @@ int fd_msg_new_answer_from_req ( struct dictionary * dict, struct msg ** msg, in * found : If not NULL, updated with the element that has been found, if any, or NULL if no element was found / an error occurred. * depth : If not NULL, points to an integer representing the "depth" of this object in the tree. This is a relative value, updated on return. * - * DESCRIPTION: + * DESCRIPTION: * Explore the content of a message object (hierarchy). If "found" is null, only error checking is performed. * If "depth" is provided, it is updated as follow on successful function return: * - not modified for MSG_BRW_NEXT and MSG_BRW_PREV. @@ -2328,7 +2335,7 @@ int fd_msg_new_answer_from_req ( struct dictionary * dict, struct msg ** msg, in * RETURN VALUE: * 0 : found has been updated (if non NULL). * EINVAL : A parameter is invalid. - * ENOENT : No element has been found where requested, and "found" was NULL (otherwise, *found is set to NULL and 0 is returned). + * ENOENT : No element has been found where requested, and "found" was NULL (otherwise, *found is set to NULL and 0 is returned). */ int fd_msg_browse_internal ( msg_or_avp * reference, enum msg_brw_dir dir, msg_or_avp ** found, int * depth ); /* Macro to avoid having to cast the third parameter everywhere */ @@ -2344,9 +2351,9 @@ int fd_msg_browse_internal ( msg_or_avp * reference, enum msg_brw_dir dir, msg_o * dir : location where the new AVP should be inserted, relative to the reference. MSG_BRW_PARENT and MSG_BRW_WALK are not valid. * avp : pointer to the AVP object that must be inserted. * - * DESCRIPTION: + * DESCRIPTION: * Adds an AVP into an object that can contain it: grouped AVP or message. - * Note that the added AVP will be freed at the same time as the object it is added to, + * Note that the added AVP will be freed at the same time as the object it is added to, * so it should not be freed after the call to this function. * * RETURN VALUE: @@ -2359,22 +2366,22 @@ int fd_msg_avp_add ( msg_or_avp * reference, enum msg_brw_dir dir, struct avp *a * FUNCTION: fd_msg_search_avp * * PARAMETERS: - * msg : The message structure in which to search the AVP. + * reference : Pointer to a valid msg or avp in which to search the AVP. * what : The dictionary model of the AVP to search. * avp : location where the AVP reference is stored if found. * - * DESCRIPTION: - * Search the first top-level AVP of a given model inside a message. + * DESCRIPTION: + * Search for the first top-level AVP of a given model inside a message or AVP. * Note: only the first instance of the AVP is returned by this function. * Note: only top-level AVPs are searched, not inside grouped AVPs. - * Use msg_browse if you need more advanced research features. + * Use msg_browse if you need more advanced search features. * * RETURN VALUE: * 0 : The AVP has been found. * EINVAL : A parameter is invalid. * ENOENT : No AVP has been found, and "avp" was NULL (otherwise, *avp is set to NULL and 0 returned). */ -int fd_msg_search_avp ( struct msg * msg, struct dict_object * what, struct avp ** avp ); +int fd_msg_search_avp ( msg_or_avp * reference, struct dict_object * what, struct avp ** avp ); /* * FUNCTION: fd_msg_free @@ -2382,7 +2389,7 @@ int fd_msg_search_avp ( struct msg * msg, struct dict_object * what, struct avp * PARAMETERS: * object : pointer to the message or AVP object that must be unlinked and freed. * - * DESCRIPTION: + * DESCRIPTION: * Unlink and free a message or AVP object and its children. * If the object is an AVP linked into a message, the AVP is removed before being freed. * @@ -2406,7 +2413,7 @@ int fd_msg_free ( msg_or_avp * object ); * use !0 to force parsing. If parsing fails, the hexa dump is still provided. * recurse : allow the function to go through the children objects if any to dump more information. might require parsing. * - * DESCRIPTION: + * DESCRIPTION: * These functions dump the content of a message or avp into a buffer * either recursively or only the object itself. * @@ -2431,7 +2438,7 @@ DECLARE_FD_DUMP_PROTOTYPE( fd_msg_dump_treeview, msg_or_avp *obj, struct diction * reference : Pointer to a valid msg or avp. * model : on success, pointer to the dictionary model of this command or AVP. NULL if the model is unknown. * - * DESCRIPTION: + * DESCRIPTION: * Retrieve the dictionary object describing this message or avp. If the object is unknown or the fd_msg_parse_dict has not been called, * *model is set to NULL. * @@ -2448,8 +2455,8 @@ int fd_msg_model ( msg_or_avp * reference, struct dict_object ** model ); * msg : Pointer to a valid message object. * pdata : Upon success, pointer to the msg_hdr structure of this message. The fields may be modified. * - * DESCRIPTION: - * Retrieve location of modifiable section of a message. + * DESCRIPTION: + * Retrieve location of modifiable section of a message. * * RETURN VALUE: * 0 : The location has been written. @@ -2464,8 +2471,8 @@ int fd_msg_hdr ( struct msg *msg, struct msg_hdr ** pdata ); * avp : Pointer to a valid avp object. * pdata : Upon success, pointer to the avp_hdr structure of this avp. The fields may be modified. * - * DESCRIPTION: - * Retrieve location of modifiable data of an avp. + * DESCRIPTION: + * Retrieve location of modifiable data of an avp. * * RETURN VALUE: * 0 : The location has been written. @@ -2481,7 +2488,7 @@ int fd_msg_avp_hdr ( struct avp *avp, struct avp_hdr ** pdata ); * query : the corresponding query that had been sent * * DESCRIPTION: - * fd_msg_answ_associate associates a query msg with the received answer. + * fd_msg_answ_associate associates a query msg with the received answer. * Query is retrieved with fd_msg_answ_getq. * If answer message is freed, the query is also freed. * If the msg_answ_detach function is called, the association is removed. @@ -2542,8 +2549,8 @@ int fd_msg_rt_get ( struct msg * msg, struct rt_data ** rtd ); * PARAMETERS: * msg : A msg object. * - * DESCRIPTION: - * This function returns a boolean telling if a given message is routable in the Diameter network, + * DESCRIPTION: + * This function returns a boolean telling if a given message is routable in the Diameter network, * or if it is a local link message only (ex: CER/CEA, DWR/DWA, ...). * * RETURN VALUE: @@ -2560,7 +2567,7 @@ int fd_msg_is_routable ( struct msg * msg ); * diamid,len : The diameter id of the peer from which this message was received. * dict : a dictionary with definition of Route-Record AVP (for fd_msg_source_setrr) * - * DESCRIPTION: + * DESCRIPTION: * Store or retrieve the diameted id of the peer from which this message was received. * Will be used for example by the routing module to add the Route-Record AVP in forwarded requests, * or to direct answers to the appropriate peer. @@ -2579,7 +2586,7 @@ int fd_msg_source_get( struct msg * msg, DiamId_t *diamid, size_t * diamidlen ); * PARAMETERS: * - * - * DESCRIPTION: + * DESCRIPTION: * Get a new unique end-to-end id value for the local peer. * * RETURN VALUE: @@ -2629,11 +2636,11 @@ struct fd_msg_pmdl * fd_msg_pmdl_get(struct msg * msg); * * PARAMETERS: * avp : Pointer to a valid avp object with a NULL avp_value pointer. The model must be known. - * value : pointer to an avp_value. The content will be COPIED into the internal storage area. + * value : pointer to an avp_value. The content will be COPIED into the internal storage area. * If data type is an octetstring, the data is also copied. * If value is a NULL pointer, the previous data is erased and value is unset in the AVP. * - * DESCRIPTION: + * DESCRIPTION: * Initialize the avp_value field of an AVP header. * * RETURN VALUE: @@ -2650,7 +2657,7 @@ int fd_msg_avp_setvalue ( struct avp *avp, union avp_value *value ); * data : Pointer to the data that must be encoded as AVP value and stored in the AVP. * This is only valid for AVPs of derived type for which type_data_encode callback is set. (ex: Address type) * - * DESCRIPTION: + * DESCRIPTION: * Initialize the avp_value field of an AVP object from formatted data, using the AVP's type "type_data_encode" callback. * * RETURN VALUE: @@ -2666,9 +2673,9 @@ int fd_msg_avp_value_encode ( void *data, struct avp *avp ); * avp : Pointer to a valid avp object with a non-NULL avp_value value. * data : Upon success, formatted interpretation of the AVP value is stored here. * - * DESCRIPTION: + * DESCRIPTION: * Interpret the content of an AVP of Derived type and store the result in data pointer. The structure - * of the data pointer is dependent on the AVP type. This function calls the "type_data_interpret" callback + * of the data pointer is dependent on the AVP type. This function calls the "type_data_interpret" callback * of the type. * * RETURN VALUE: @@ -2687,12 +2694,12 @@ int fd_msg_avp_value_interpret ( struct avp *avp, void *data ); * FUNCTION: fd_msg_bufferize * * PARAMETERS: - * msg : A valid msg object. All AVPs must have a value set. - * buffer : Upon success, this points to a buffer (malloc'd) containing the message ready for network transmission (or security transformations). + * msg : A valid msg object. All AVPs must have a value set. + * buffer : Upon success, this points to a buffer (malloc'd) containing the message ready for network transmission (or security transformations). * The buffer may be freed after use. * len : if not NULL, the size of the buffer is written here. In any case, this size is updated in the msg header. * - * DESCRIPTION: + * DESCRIPTION: * Renders a message in memory as a buffer that can be sent over the network to the next peer. * * RETURN VALUE: @@ -2706,11 +2713,11 @@ int fd_msg_bufferize ( struct msg * msg, uint8_t ** buffer, size_t * len ); * FUNCTION: fd_msg_parse_buffer * * PARAMETERS: - * buffer : Pointer to a buffer containing a message received from the network. + * buffer : Pointer to a buffer containing a message received from the network. * buflen : the size in bytes of the buffer. * msg : Upon success, this points to a valid msg object. No AVP value is resolved in this object, nor grouped AVP. * - * DESCRIPTION: + * DESCRIPTION: * This function parses a buffer an creates a msg object to represent the structure of the message. * Since no dictionary lookup is performed, the values of the AVPs are not interpreted. To interpret the values, * the returned message object must be passed to fd_msg_parse_dict function. @@ -2741,12 +2748,12 @@ struct fd_pei { * dict : the dictionary containing the objects definitions to use for resolving all AVPs. * error_info : If not NULL, will contain the detail about error upon return. May be used to generate an error reply. * - * DESCRIPTION: + * DESCRIPTION: * This function looks up for the command and each children AVP definitions in the dictionary. * If the dictionary definition is found, avp_model is set and the value of the AVP is interpreted accordingly and: * - for grouped AVPs, the children AVP are created and interpreted also. * - for numerical AVPs, the value is converted to host byte order and saved in the avp_value field. - * - for octetstring AVPs, the string is copied into a new buffer and its address is saved in avp_value. + * - for octetstring AVPs, the string is copied into a new buffer and its address is saved in avp_value. * If the dictionary definition is not found, avp_model is set to NULL and * the content of the AVP is saved as an octetstring in an internal structure. avp_value is NULL. * As a result, after this function has been called, there is no more dependency of the msg object to the message buffer, that is freed. @@ -2767,7 +2774,7 @@ int fd_msg_parse_dict ( msg_or_avp * object, struct dictionary * dict, struct fd * dict : The dictionary containing the rules definitions. * error_info : If not NULL, the first problem information will be saved here. * - * DESCRIPTION: + * DESCRIPTION: * Check that the children of the object do not conflict with the dictionary rules (ABNF compliance). * * RETURN VALUE: @@ -2784,9 +2791,9 @@ int fd_msg_parse_rules ( msg_or_avp * object, struct dictionary * dict, struct f * FUNCTION: fd_msg_update_length * * PARAMETERS: - * object : Pointer to a valid msg or avp. + * object : Pointer to a valid msg or avp. * - * DESCRIPTION: + * DESCRIPTION: * Update the length field of the object passed as parameter. * As a side effect, all children objects are also updated. Therefore, all avp_value fields of * the children AVPs must be set, or an error will occur. @@ -2888,7 +2895,7 @@ struct disp_when { * * DISP_HOW_AVP_ENUMVAL. * All fields have the same constraints and meaning as in DISP_REG_AVP. In addition, the "value" field must be set - * and points to a valid DICT_ENUMVAL object. + * and points to a valid DICT_ENUMVAL object. * * Here is a sumary of the fields: ( M : must be set; m : may be set; 0 : ignored ) * field: app_id command avp value @@ -2915,14 +2922,14 @@ enum disp_action { * opaque : An opaque pointer that is registered along the session handler. * action : upon return, this tells the daemon what to do next. * - * DESCRIPTION: + * DESCRIPTION: * Called when a received message matchs the condition for which the callback was registered. * This callback may do any kind of processing on the message, including: * - create an answer for a request. * - proxy a request or message, add / remove the Proxy-Info AVP, then forward the message. * - update a routing table or start a connection with a new peer, then forward the message. * - ... - * + * * When *action == DISP_ACT_SEND on callback return, the msg pointed by *msg is passed to the routing module for sending. * When *action == DISP_ACT_CONT, the next registered callback is called. * When the last callback gives also DISP_ACT_CONT action value, a default handler is called. It's behavior is as follow: @@ -2945,10 +2952,10 @@ struct disp_hdl; * how : How the callback must be registered. * when : Values that must match, depending on the how argument. * opaque : A pointer that is passed back to the handler. The content is not interpreted by the framework. - * handle : On success, a handler to the registered callback is stored here if not NULL. + * handle : On success, a handler to the registered callback is stored here if not NULL. * This handler can be used to unregister the cb. * - * DESCRIPTION: + * DESCRIPTION: * Register a new callback to handle messages delivered locally. * * RETURN VALUE: @@ -2956,7 +2963,7 @@ struct disp_hdl; * EINVAL : A parameter is invalid. * ENOMEM : Not enough memory to complete the operation */ -int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, void *, enum disp_action *), +int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, void *, enum disp_action *), enum disp_how how, struct disp_when * when, void * opaque, struct disp_hdl ** handle ); /* @@ -2966,7 +2973,7 @@ int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, * handle : Location of the handle of the callback that must be unregistered. * opaque : If not NULL, the opaque data that was registered is restored here. * - * DESCRIPTION: + * DESCRIPTION: * Removes a callback previously registered by fd_disp_register. * * RETURN VALUE: @@ -2989,7 +2996,7 @@ void fd_disp_unregister_all ( void ); * drop_reason : if set on return, the message must be freed for this reason. * drop_msg : if drop_reason is set, this points to the message to be freed while *msg is NULL. * - * DESCRIPTION: + * DESCRIPTION: * Call all handlers registered for a given message. * The session must have already been resolved on entry. * The msg pointed may be updated during this process. @@ -3021,23 +3028,38 @@ struct fifo; * max : max number of items in the queue. Above this number, adding a new item becomes a * blocking operation. Use 0 to disable this maximum. * - * DESCRIPTION: + * DESCRIPTION: * Create a new empty queue. * * RETURN VALUE : * 0 : The queue has been initialized successfully. * EINVAL : The parameter is invalid. - * ENOMEM : Not enough memory to complete the creation. + * ENOMEM : Not enough memory to complete the creation. */ int fd_fifo_new ( struct fifo ** queue, int max ); /* + * FUNCTION: fd_fifo_set_max + * + * PARAMETERS: + * queue : The queue for which to set the maximum value + * max : max number of items in the queue. + * + * DESCRIPTION: + * Modify the maximum number of entries in a queue + * + * RETURN VALUE : + * 0 : Success + */ +int fd_fifo_set_max ( struct fifo * queue, int max ); + +/* * FUNCTION: fd_fifo_del * * PARAMETERS: * queue : Pointer to an empty queue to delete. * - * DESCRIPTION: + * DESCRIPTION: * Destroys a queue. This is only possible if no thread is waiting for an element, * and the queue is empty. * @@ -3055,7 +3077,7 @@ int fd_fifo_del ( struct fifo ** queue ); * newq : A FIFO that will receive the old data. * loc_update : if non NULL, a place to store the pointer to new FIFO atomically with the move. * - * DESCRIPTION: + * DESCRIPTION: * Empties a queue and move its content to another one atomically. * * RETURN VALUE: @@ -3076,15 +3098,15 @@ int fd_fifo_move ( struct fifo * oldq, struct fifo * newq, struct fifo ** loc_up * total : Cumulated time all items spent in this queue, including blocking time (always growing, use deltas for monitoring) * blocking : Cumulated time threads trying to post new items were blocked (queue full). * last : For the last element retrieved from the queue, how long it take between posting (including blocking) and poping - * - * DESCRIPTION: + * + * DESCRIPTION: * Retrieve the timing information associated with a queue, for monitoring purpose. * * RETURN VALUE: * 0 : The statistics have been updated. * EINVAL : A parameter is invalid. */ -int fd_fifo_getstats( struct fifo * queue, int * current_count, int * limit_count, int * highest_count, long long * total_count, +int fd_fifo_getstats( struct fifo * queue, int * current_count, int * limit_count, int * highest_count, long long * total_count, struct timespec * total, struct timespec * blocking, struct timespec * last); /* @@ -3093,7 +3115,7 @@ int fd_fifo_getstats( struct fifo * queue, int * current_count, int * limit_coun * PARAMETERS: * queue : The queue from which to retrieve the number of elements. * - * DESCRIPTION: + * DESCRIPTION: * Retrieve the number of elements in a queue, without error checking. * * RETURN VALUE: @@ -3112,7 +3134,7 @@ int fd_fifo_length ( struct fifo * queue ); * low : The low-level threshold. Must be < high. * l_cb : If the number of elements decrease to low, this callback is called. * - * DESCRIPTION: + * DESCRIPTION: * This function allows to adjust the number of producer / consumer threads of a queue. * If the consumer are slower than the producers, the number of elements in the queue increase. * By setting a "high" value, we allow a callback to be called when this number is too high. @@ -3141,7 +3163,7 @@ int fd_fifo_setthrhd ( struct fifo * queue, void * data, uint16_t high, void (*h * queue : The queue in which the element must be posted. * item : The element that is put in the queue. * - * DESCRIPTION: + * DESCRIPTION: * An element is added in a queue. Elements are retrieved from the queue in FIFO order * with the fd_fifo_get, fd_fifo_tryget, or fd_fifo_timedget functions. * @@ -3165,9 +3187,9 @@ int fd_fifo_post_noblock( struct fifo * queue, void ** item ); * queue : The queue from which the first element must be retrieved. * item : On return, the first element of the queue is stored here. * - * DESCRIPTION: - * This function retrieves the first element from a queue. If the queue is empty, the function will block the - * thread until a new element is posted to the queue, or until the thread is canceled (in which case the + * DESCRIPTION: + * This function retrieves the first element from a queue. If the queue is empty, the function will block the + * thread until a new element is posted to the queue, or until the thread is canceled (in which case the * function does not return). * * RETURN VALUE: @@ -3185,8 +3207,8 @@ int fd_fifo_get_int ( struct fifo * queue, void ** item ); * queue : The queue from which the element must be retrieved. * item : On return, the first element of the queue is stored here. * - * DESCRIPTION: - * This function is similar to fd_fifo_get, except that it will not block if + * DESCRIPTION: + * This function is similar to fd_fifo_get, except that it will not block if * the queue is empty, but return EWOULDBLOCK instead. * * RETURN VALUE: @@ -3206,8 +3228,8 @@ int fd_fifo_tryget_int ( struct fifo * queue, void ** item ); * item : On return, the element is stored here. * abstime : the absolute time until which we allow waiting for an item. * - * DESCRIPTION: - * This function is similar to fd_fifo_get, except that it will block if the queue is empty + * DESCRIPTION: + * This function is similar to fd_fifo_get, except that it will block if the queue is empty * only until the absolute time abstime (see pthread_cond_timedwait for + info). * If the queue is still empty when the time expires, the function returns ETIMEDOUT * @@ -3228,7 +3250,7 @@ int fd_fifo_timedget_int ( struct fifo * queue, void ** item, const struct times * queue : The queue to test. * abstime : the absolute time until which we can block waiting for an item. If NULL, the function returns immediatly. * - * DESCRIPTION: + * DESCRIPTION: * This function is similar to select(), it waits for data to be available in the queue * until the abstime is expired. * Upon function entry, even if abstime is already expired the data availability is tested. diff --git a/libfdcore/cnxctx.c b/libfdcore/cnxctx.c index 04934e0..dab6812 100644 --- a/libfdcore/cnxctx.c +++ b/libfdcore/cnxctx.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -176,7 +176,7 @@ struct cnxctx * fd_cnx_serv_sctp(uint16_t port, struct fd_list * ep_list) } else { cnx->cc_family = AF_INET6; /* can create socket for both IP and IPv6 */ } - + /* Create the socket */ CHECK_FCT_DO( fd_sctp_create_bind_server( &cnx->cc_socket, cnx->cc_family, ep_list, port ), goto error ); @@ -226,41 +226,41 @@ struct cnxctx * fd_cnx_serv_accept(struct cnxctx * serv) TRACE_ENTRY("%p", serv); CHECK_PARAMS_DO(serv, return NULL); - + /* Accept the new connection -- this is blocking until new client enters or until cancellation */ CHECK_SYS_DO( cli_sock = accept(serv->cc_socket, (sSA *)&ss, &ss_len), return NULL ); - + CHECK_MALLOC_DO( cli = fd_cnx_init(1), { shutdown(cli_sock, SHUT_RDWR); close(cli_sock); return NULL; } ); cli->cc_socket = cli_sock; cli->cc_family = serv->cc_family; cli->cc_proto = serv->cc_proto; - + /* Set the timeout */ fd_cnx_s_setto(cli->cc_socket); - + /* Generate the name for the connection object */ { char addrbuf[INET6_ADDRSTRLEN]; char portbuf[10]; int rc; - + rc = getnameinfo((sSA *)&ss, ss_len, addrbuf, sizeof(addrbuf), portbuf, sizeof(portbuf), NI_NUMERICHOST | NI_NUMERICSERV); if (rc) { snprintf(addrbuf, sizeof(addrbuf), "[err:%s]", gai_strerror(rc)); portbuf[0] = '\0'; } - + /* Numeric values for debug... */ - snprintf(cli->cc_id, sizeof(cli->cc_id), CC_ID_HDR "%s from [%s]:%s (%d<-%d)", + snprintf(cli->cc_id, sizeof(cli->cc_id), CC_ID_HDR "%s from [%s]:%s (%d<-%d)", IPPROTO_NAME(cli->cc_proto), addrbuf, portbuf, serv->cc_socket, cli->cc_socket); - - + + /* ...Name for log messages */ rc = getnameinfo((sSA *)&ss, ss_len, cli->cc_remid, sizeof(cli->cc_remid), NULL, 0, 0); if (rc) snprintf(cli->cc_remid, sizeof(cli->cc_remid), "[err:%s]", gai_strerror(rc)); } - + LOG_D("Incoming connection: '%s' <- '%s' {%s}", fd_cnx_getid(serv), cli->cc_remid, cli->cc_id); #ifndef DISABLE_SCTP @@ -272,7 +272,7 @@ struct cnxctx * fd_cnx_serv_accept(struct cnxctx * serv) cli->cc_sctp_para.pairs = cli->cc_sctp_para.str_out; else cli->cc_sctp_para.pairs = cli->cc_sctp_para.str_in; - + LOG_A( "%s : client '%s' (SCTP:%d, %d/%d streams)", fd_cnx_getid(serv), fd_cnx_getid(cli), cli->cc_socket, cli->cc_sctp_para.str_in, cli->cc_sctp_para.str_out); } #endif /* DISABLE_SCTP */ @@ -286,14 +286,14 @@ struct cnxctx * fd_cnx_cli_connect_tcp(sSA * sa /* contains the port already */, int sock = 0; struct cnxctx * cnx = NULL; char sa_buf[sSA_DUMP_STRLEN]; - + TRACE_ENTRY("%p %d", sa, addrlen); CHECK_PARAMS_DO( sa && addrlen, return NULL ); - + fd_sa_sdump_numeric(sa_buf, sa); - + LOG_D("Connecting to TCP %s...", sa_buf); - + /* Create the socket and connect, which can take some time and/or fail */ { int ret = fd_tcp_client( &sock, sa, addrlen ); @@ -302,36 +302,37 @@ struct cnxctx * fd_cnx_cli_connect_tcp(sSA * sa /* contains the port already */, return NULL; } } - + /* Once the socket is created successfuly, prepare the remaining of the cnx */ CHECK_MALLOC_DO( cnx = fd_cnx_init(1), { shutdown(sock, SHUT_RDWR); close(sock); return NULL; } ); - + cnx->cc_socket = sock; cnx->cc_family = sa->sa_family; cnx->cc_proto = IPPROTO_TCP; - + /* Set the timeout */ fd_cnx_s_setto(cnx->cc_socket); - + /* Generate the names for the object */ { int rc; - + snprintf(cnx->cc_id, sizeof(cnx->cc_id), CC_ID_HDR "TCP,#%d->%s", cnx->cc_socket, sa_buf); - + /* ...Name for log messages */ rc = getnameinfo(sa, addrlen, cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0); if (rc) snprintf(cnx->cc_remid, sizeof(cnx->cc_remid), "[err:%s]", gai_strerror(rc)); } - + LOG_A("TCP connection to %s succeed (socket:%d).", sa_buf, sock); - + return cnx; } -/* Same for SCTP, accepts a list of remote addresses to connect to (see sctp_connectx for how they are used) */ -struct cnxctx * fd_cnx_cli_connect_sctp(int no_ip6, uint16_t port, struct fd_list * list) +/* Same for SCTP, accepts a list of remote addresses to connect to (see sctp_connectx for how they are used). + * If src_list is not NULL and not empty, list of local addresses to connect from via sctp_bindx(). */ +struct cnxctx * fd_cnx_cli_connect_sctp(int no_ip6, uint16_t port, struct fd_list * list, struct fd_list * src_list) { #ifdef DISABLE_SCTP TRACE_DEBUG(INFO, "This function should never be called when SCTP is disabled..."); @@ -343,55 +344,72 @@ struct cnxctx * fd_cnx_cli_connect_sctp(int no_ip6, uint16_t port, struct fd_lis struct cnxctx * cnx = NULL; char sa_buf[sSA_DUMP_STRLEN]; sSS primary; - - TRACE_ENTRY("%p", list); + + TRACE_ENTRY("%p %p", list, src_list); CHECK_PARAMS_DO( list && !FD_IS_LIST_EMPTY(list), return NULL ); - + + /* Log SCTP association source and destination endpoints */ + { + char * buf = NULL; + size_t len = 0, offset = 0; + CHECK_MALLOC_DO( fd_dump_extend( &buf, &len, &offset, "Connecting SCTP endpoints"), ); + CHECK_MALLOC_DO( fd_dump_extend( &buf, &len, &offset, " source: "), ); + if (src_list && !FD_IS_LIST_EMPTY(src_list)) { + CHECK_MALLOC_DO( fd_ep_dump( &buf, &len, &offset, 0, 0, src_list ), ); + } else { + CHECK_MALLOC_DO( fd_dump_extend( &buf, &len, &offset, "(ANY)"), ); + } + CHECK_MALLOC_DO( fd_dump_extend( &buf, &len, &offset, ", destination: "), ); + CHECK_MALLOC_DO( fd_ep_dump( &buf, &len, &offset, 0, 0, list ), ); + LOG_D("%s", buf ?: "Error determining SCTP endpoints"); + free(buf); + } + fd_sa_sdump_numeric(sa_buf, &((struct fd_endpoint *)(list->next))->sa); - + LOG_D("Connecting to SCTP %s:%hu...", sa_buf, port); - + { - int ret = fd_sctp_client( &sock, no_ip6, port, list ); + int ret = fd_sctp_client( &sock, no_ip6, port, list, src_list ); if (ret != 0) { LOG_D("SCTP connection to [%s,...] failed: %s", sa_buf, strerror(ret)); return NULL; } } - + /* Once the socket is created successfuly, prepare the remaining of the cnx */ CHECK_MALLOC_DO( cnx = fd_cnx_init(1), { shutdown(sock, SHUT_RDWR); close(sock); return NULL; } ); - + cnx->cc_socket = sock; cnx->cc_family = no_ip6 ? AF_INET : AF_INET6; cnx->cc_proto = IPPROTO_SCTP; - + /* Set the timeout */ fd_cnx_s_setto(cnx->cc_socket); - + /* Retrieve the number of streams and primary address */ CHECK_FCT_DO( fd_sctp_get_str_info( sock, &cnx->cc_sctp_para.str_in, &cnx->cc_sctp_para.str_out, &primary ), goto error ); if (cnx->cc_sctp_para.str_out < cnx->cc_sctp_para.str_in) cnx->cc_sctp_para.pairs = cnx->cc_sctp_para.str_out; else cnx->cc_sctp_para.pairs = cnx->cc_sctp_para.str_in; - + fd_sa_sdump_numeric(sa_buf, (sSA *)&primary); - + /* Generate the names for the object */ { int rc; - + snprintf(cnx->cc_id, sizeof(cnx->cc_id), CC_ID_HDR "SCTP,#%d->%s", cnx->cc_socket, sa_buf); - + /* ...Name for log messages */ rc = getnameinfo((sSA *)&primary, sSAlen(&primary), cnx->cc_remid, sizeof(cnx->cc_remid), NULL, 0, 0); if (rc) snprintf(cnx->cc_remid, sizeof(cnx->cc_remid), "[err:%s]", gai_strerror(rc)); } - + LOG_A("SCTP connection to %s succeed (socket:%d, %d/%d streams).", sa_buf, sock, cnx->cc_sctp_para.str_in, cnx->cc_sctp_para.str_out); - + return cnx; error: @@ -444,17 +462,17 @@ void fd_cnx_update_id(struct cnxctx * conn) { conn->cc_id[1] = 'C'; else conn->cc_id[1] = '-'; - + if (conn->cc_state & CC_STATUS_ERROR) conn->cc_id[2] = 'E'; else conn->cc_id[2] = '-'; - + if (conn->cc_state & CC_STATUS_SIGNALED) conn->cc_id[3] = 'S'; else conn->cc_id[3] = '-'; - + if (conn->cc_state & CC_STATUS_TLS) conn->cc_id[4] = 'T'; else @@ -508,7 +526,7 @@ int fd_cnx_getremoteeps(struct cnxctx * conn, struct fd_list * eps) { TRACE_ENTRY("%p %p", conn, eps); CHECK_PARAMS(conn && eps); - + /* Check we have a full connection object, not a listening socket (with no remote) */ CHECK_PARAMS( conn->cc_incoming ); @@ -546,16 +564,16 @@ char * fd_cnx_getremoteid(struct cnxctx * conn) static int fd_cnx_may_dtls(struct cnxctx * conn); /* Get a short string representing the connection */ -int fd_cnx_proto_info(struct cnxctx * conn, char * buf, size_t len) +int fd_cnx_proto_info(struct cnxctx * conn, char * buf, size_t len) { CHECK_PARAMS( conn ); - + if (fd_cnx_teststate(conn, CC_STATUS_TLS)) { snprintf(buf, len, "%s,%s,soc#%d", IPPROTO_NAME(conn->cc_proto), fd_cnx_may_dtls(conn) ? "DTLS" : "TLS", conn->cc_socket); } else { snprintf(buf, len, "%s,soc#%d", IPPROTO_NAME(conn->cc_proto), conn->cc_socket); } - + return 0; } @@ -563,27 +581,27 @@ int fd_cnx_proto_info(struct cnxctx * conn, char * buf, size_t len) int fd_cnx_get_local_eps(struct fd_list * list) { struct ifaddrs *iflist, *cur; - + CHECK_SYS(getifaddrs(&iflist)); - + for (cur = iflist; cur != NULL; cur = cur->ifa_next) { if (cur->ifa_flags & IFF_LOOPBACK) continue; - + if (cur->ifa_addr == NULL) /* may happen with ppp interfaces */ continue; - + if (fd_g_config->cnf_flags.no_ip4 && (cur->ifa_addr->sa_family == AF_INET)) continue; - + if (fd_g_config->cnf_flags.no_ip6 && (cur->ifa_addr->sa_family == AF_INET6)) continue; - + CHECK_FCT(fd_ep_add_merge( list, cur->ifa_addr, sSAlen(cur->ifa_addr), EP_FL_LL )); } - + freeifaddrs(iflist); - + return 0; } @@ -597,31 +615,31 @@ void fd_cnx_markerror(struct cnxctx * conn) { TRACE_ENTRY("%p", conn); CHECK_PARAMS_DO( conn, goto fatal ); - + TRACE_DEBUG(FULL, "Error flag set for socket %d (%s, %s)", conn->cc_socket, conn->cc_id, conn->cc_remid); /* Mark the error */ fd_cnx_addstate(conn, CC_STATUS_ERROR); - + /* Report the error if not reported yet, and not closing */ if (!fd_cnx_teststate(conn, CC_STATUS_CLOSING | CC_STATUS_SIGNALED )) { TRACE_DEBUG(FULL, "Sending FDEVP_CNX_ERROR event"); CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_ERROR, 0, NULL), goto fatal); fd_cnx_addstate(conn, CC_STATUS_SIGNALED); } - + return; fatal: /* An unrecoverable error occurred, stop the daemon */ ASSERT(0); - CHECK_FCT_DO(fd_core_shutdown(), ); + CHECK_FCT_DO(fd_core_shutdown(), ); } /* Set the timeout option on the socket */ -void fd_cnx_s_setto(int sock) +void fd_cnx_s_setto(int sock) { struct timeval tv; - + /* Set a timeout on the socket so that in any case we are not stuck waiting for something */ memset(&tv, 0, sizeof(tv)); tv.tv_usec = 100000L; /* 100ms, to react quickly to head-of-the-line blocking. */ @@ -636,15 +654,15 @@ static int fd_cnx_s_select (struct cnxctx * conn, unsigned int ms) { fd_set rfds; struct timeval tv; - + FD_ZERO (&rfds); FD_SET (conn->cc_socket, &rfds); - + tv.tv_sec = ms / 1000; tv.tv_usec = (ms * 1000) % 1000000; - + return select (conn->cc_socket + 1, &rfds, NULL, NULL, &tv); -} +} #endif /* GNUTLS_VERSION_300 */ /* A recv-like function, taking a cnxctx object instead of socket as entry. We use it to quickly react to timeouts without traversing GNUTLS wrapper each time */ @@ -664,13 +682,13 @@ again: goto again; } } - + /* Mark the error */ if (ret <= 0) { CHECK_SYS_DO(ret, /* continue, this is only used to log the error here */); fd_cnx_markerror(conn); } - + return ret; } @@ -686,7 +704,7 @@ again: if ((ret < 0) && ((errno == EAGAIN) || (errno == EINTR))) { ret = -errno; pthread_testcancel(); - + /* Check how much time we were blocked for this sending. */ CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), return -1 ); if ( ((now.tv_sec - ts.tv_sec) * 1000 + ((now.tv_nsec - ts.tv_nsec) / 1000000L)) > MAX_HOTL_BLOCKING_TIME) { @@ -694,17 +712,17 @@ again: } else if (! fd_cnx_teststate(conn, CC_STATUS_CLOSING )) { goto again; /* don't care, just ignore */ } - + /* propagate the error */ errno = -ret; ret = -1; CHECK_SYS_DO(ret, /* continue */); } - + /* Mark the error */ if (ret <= 0) fd_cnx_markerror(conn); - + return ret; } @@ -730,7 +748,7 @@ size_t fd_msg_pmdl_sizewithoverhead(size_t datalen) struct fd_msg_pmdl * fd_msg_pmdl_get_inbuf(uint8_t * buf, size_t datalen) { return (struct fd_msg_pmdl *)(buf + PMDL_PADDED(datalen)); -} +} static int fd_cnx_init_msg_buffer(uint8_t * buffer, size_t expected_len, struct fd_msg_pmdl ** pmdl) { @@ -743,7 +761,7 @@ static int fd_cnx_init_msg_buffer(uint8_t * buffer, size_t expected_len, struct static uint8_t * fd_cnx_alloc_msg_buffer(size_t expected_len, struct fd_msg_pmdl ** pmdl) { uint8_t * ret = NULL; - + CHECK_MALLOC_DO( ret = malloc( fd_msg_pmdl_sizewithoverhead(expected_len) ), return NULL ); CHECK_FCT_DO( fd_cnx_init_msg_buffer(ret, expected_len, pmdl), {free(ret); return NULL;} ); return ret; @@ -753,14 +771,14 @@ static uint8_t * fd_cnx_alloc_msg_buffer(size_t expected_len, struct fd_msg_pmdl static uint8_t * fd_cnx_realloc_msg_buffer(uint8_t * buffer, size_t expected_len, struct fd_msg_pmdl ** pmdl) { uint8_t * ret = NULL; - + CHECK_MALLOC_DO( ret = realloc( buffer, fd_msg_pmdl_sizewithoverhead(expected_len) ), return NULL ); CHECK_FCT_DO( fd_cnx_init_msg_buffer(ret, expected_len, pmdl), {free(ret); return NULL;} ); return ret; } #endif /* DISABLE_SCTP */ -static void free_rcvdata(void * arg) +static void free_rcvdata(void * arg) { struct fd_cnx_rcvdata * data = arg; struct fd_msg_pmdl * pmdl = fd_msg_pmdl_get_inbuf(data->buffer, data->length); @@ -772,21 +790,21 @@ static void free_rcvdata(void * arg) static void * rcvthr_notls_tcp(void * arg) { struct cnxctx * conn = arg; - + TRACE_ENTRY("%p", arg); CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto out); - + /* Set the thread name */ { char buf[48]; snprintf(buf, sizeof(buf), "Receiver (%d) TCP/noTLS)", conn->cc_socket); fd_log_threadname ( buf ); } - + ASSERT( conn->cc_proto == IPPROTO_TCP ); ASSERT( ! fd_cnx_teststate(conn, CC_STATUS_TLS ) ); ASSERT( fd_cnx_target_queue(conn) ); - + /* Receive from a TCP connection: we have to rebuild the message boundaries */ do { uint8_t header[4]; @@ -802,7 +820,7 @@ static void * rcvthr_notls_tcp(void * arg) } received += ret; - + if (header[0] != DIAMETER_VERSION) break; /* No need to wait for 4 bytes in this case */ } while (received < sizeof(header)); @@ -833,22 +851,22 @@ static void * rcvthr_notls_tcp(void * arg) } received += ret; } - + fd_hook_call(HOOK_DATA_RECEIVED, NULL, NULL, &rcv_data, pmdl); - + /* We have received a complete message, pass it to the daemon */ - CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), - { + CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), + { free_rcvdata(&rcv_data); - goto fatal; + goto fatal; } ); - + } while (conn->cc_loop); - + out: - TRACE_DEBUG(FULL, "Thread terminated"); + TRACE_DEBUG(FULL, "Thread terminated"); return NULL; - + fatal: /* An unrecoverable error occurred, stop the daemon */ CHECK_FCT_DO(fd_core_shutdown(), ); @@ -862,21 +880,21 @@ static void * rcvthr_notls_sctp(void * arg) struct cnxctx * conn = arg; struct fd_cnx_rcvdata rcv_data; int event; - + TRACE_ENTRY("%p", arg); CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto fatal); - + /* Set the thread name */ { char buf[48]; snprintf(buf, sizeof(buf), "Receiver (%d) SCTP/noTLS)", conn->cc_socket); fd_log_threadname ( buf ); } - + ASSERT( conn->cc_proto == IPPROTO_SCTP ); ASSERT( ! fd_cnx_teststate(conn, CC_STATUS_TLS ) ); ASSERT( fd_cnx_target_queue(conn) ); - + do { struct fd_msg_pmdl *pmdl=NULL; CHECK_FCT_DO( fd_sctp_recvmeta(conn, NULL, &rcv_data.buffer, &rcv_data.length, &event), goto fatal ); @@ -884,7 +902,7 @@ static void * rcvthr_notls_sctp(void * arg) fd_cnx_markerror(conn); goto out; } - + if (event == FDEVP_CNX_SHUTDOWN) { /* Just ignore the notification for now, we will get another error later anyway */ continue; @@ -895,11 +913,11 @@ static void * rcvthr_notls_sctp(void * arg) fd_hook_call(HOOK_DATA_RECEIVED, NULL, NULL, &rcv_data, pmdl); } CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), event, rcv_data.length, rcv_data.buffer), goto fatal ); - + } while (conn->cc_loop || (event != FDEVP_CNX_MSG_RECV)); - + out: - TRACE_DEBUG(FULL, "Thread terminated"); + TRACE_DEBUG(FULL, "Thread terminated"); return NULL; fatal: @@ -913,15 +931,15 @@ fatal: int fd_cnx_start_clear(struct cnxctx * conn, int loop) { TRACE_ENTRY("%p %i", conn, loop); - + CHECK_PARAMS( conn && fd_cnx_target_queue(conn) && (!fd_cnx_teststate(conn, CC_STATUS_TLS)) && (!conn->cc_loop)); - + /* Release resources in case of a previous call was already made */ CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */); - + /* Save the loop request */ conn->cc_loop = loop; - + switch (conn->cc_proto) { case IPPROTO_TCP: /* Start the tcp_notls thread */ @@ -938,7 +956,7 @@ int fd_cnx_start_clear(struct cnxctx * conn, int loop) ASSERT(0); return ENOTSUP; } - + return 0; } @@ -949,11 +967,11 @@ int fd_cnx_start_clear(struct cnxctx * conn, int loop) static ssize_t fd_tls_recv_handle_error(struct cnxctx * conn, gnutls_session_t session, void * data, size_t sz) { ssize_t ret; -again: - CHECK_GNUTLS_DO( ret = gnutls_record_recv(session, data, sz), +again: + CHECK_GNUTLS_DO( ret = gnutls_record_recv(session, data, sz), { switch (ret) { - case GNUTLS_E_REHANDSHAKE: + case GNUTLS_E_REHANDSHAKE: if (!fd_cnx_teststate(conn, CC_STATUS_CLOSING)) { CHECK_GNUTLS_DO( ret = gnutls_handshake(session), { @@ -975,7 +993,7 @@ again: /* The connection is closed */ TRACE_DEBUG(FULL, "Got 0 size while reading the socket, probably connection closed..."); break; - + default: if (gnutls_error_is_fatal (ret) == 0) { LOG_N("Ignoring non-fatal GNU TLS error: %s", gnutls_strerror (ret)); @@ -984,11 +1002,11 @@ again: LOG_E("Fatal GNUTLS error: %s", gnutls_strerror (ret)); } } ); - + if (ret == 0) CHECK_GNUTLS_DO( gnutls_bye(session, GNUTLS_SHUT_RDWR), ); - -end: + +end: if (ret <= 0) fd_cnx_markerror(conn); return ret; @@ -1000,12 +1018,12 @@ static ssize_t fd_tls_send_handle_error(struct cnxctx * conn, gnutls_session_t s ssize_t ret; struct timespec ts, now; CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &ts), return -1 ); -again: +again: CHECK_GNUTLS_DO( ret = gnutls_record_send(session, data, sz), { pthread_testcancel(); switch (ret) { - case GNUTLS_E_REHANDSHAKE: + case GNUTLS_E_REHANDSHAKE: if (!fd_cnx_teststate(conn, CC_STATUS_CLOSING)) { CHECK_GNUTLS_DO( ret = gnutls_handshake(session), { @@ -1034,10 +1052,10 @@ again: LOG_E("Fatal GNUTLS error: %s", gnutls_strerror (ret)); } } ); -end: +end: if (ret <= 0) fd_cnx_markerror(conn); - + return ret; } @@ -1045,8 +1063,8 @@ end: /* The function that receives TLS data and re-builds a Diameter message -- it exits only on error or cancelation */ /* For the case of DTLS, since we are not using SCTP_UNORDERED, the messages over a single stream are ordered. Furthermore, as long as messages are shorter than the MTU [2^14 = 16384 bytes], they are delivered in a single - record, as far as I understand. - For larger messages, however, it is possible that pieces of messages coming from different streams can get interleaved. + record, as far as I understand. + For larger messages, however, it is possible that pieces of messages coming from different streams can get interleaved. As a result, we do not use the following function for DTLS reception, because we use the sequence number to rebuild the messages. */ int fd_tls_rcvthr_core(struct cnxctx * conn, gnutls_session_t session) @@ -1095,19 +1113,19 @@ int fd_tls_rcvthr_core(struct cnxctx * conn, gnutls_session_t session) } received += ret; } - + fd_hook_call(HOOK_DATA_RECEIVED, NULL, NULL, &rcv_data, pmdl); - + /* We have received a complete message, pass it to the daemon */ - CHECK_FCT_DO( ret = fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), - { + CHECK_FCT_DO( ret = fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), + { free_rcvdata(&rcv_data); CHECK_FCT_DO(fd_core_shutdown(), ); - return ret; + return ret; } ); - + } while (1); - + out: return (ret == 0) ? 0 : ENOTCONN; } @@ -1116,24 +1134,24 @@ out: static void * rcvthr_tls_single(void * arg) { struct cnxctx * conn = arg; - + TRACE_ENTRY("%p", arg); CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), return NULL ); - + /* Set the thread name */ { char buf[48]; snprintf(buf, sizeof(buf), "Receiver (%d) TLS/single stream", conn->cc_socket); fd_log_threadname ( buf ); } - + ASSERT( fd_cnx_teststate(conn, CC_STATUS_TLS) ); ASSERT( fd_cnx_target_queue(conn) ); - /* The next function only returns when there is an error on the socket */ + /* The next function only returns when there is an error on the socket */ CHECK_FCT_DO(fd_tls_rcvthr_core(conn, conn->cc_tls_para.session), /* continue */); - TRACE_DEBUG(FULL, "Thread terminated"); + TRACE_DEBUG(FULL, "Thread terminated"); return NULL; } @@ -1151,7 +1169,7 @@ int fd_tls_prepare(gnutls_session_t * session, int mode, int dtls, char * priori /* Set the algorithm suite */ if (priority) { const char * errorpos; - CHECK_GNUTLS_DO( gnutls_priority_set_direct( *session, priority, &errorpos ), + CHECK_GNUTLS_DO( gnutls_priority_set_direct( *session, priority, &errorpos ), { TRACE_DEBUG(INFO, "Error in priority string '%s' at position: '%s'", priority, errorpos); return EINVAL; } ); } else { CHECK_GNUTLS_DO( gnutls_priority_set( *session, fd_g_config->cnf_sec_data.prio_cache ), return EINVAL ); @@ -1164,7 +1182,7 @@ int fd_tls_prepare(gnutls_session_t * session, int mode, int dtls, char * priori if (mode == GNUTLS_SERVER) { gnutls_certificate_server_set_request (*session, GNUTLS_CERT_REQUIRE); } - + return 0; } @@ -1179,17 +1197,17 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in unsigned int cert_list_size; gnutls_x509_crt_t cert; time_t now; - + TRACE_ENTRY("%p %d", conn, verbose); CHECK_PARAMS(conn); - + /* Trace the session information -- http://www.gnu.org/software/gnutls/manual/gnutls.html#Obtaining-session-information */ #ifdef DEBUG if (verbose) { const char *tmp; gnutls_kx_algorithm_t kx; gnutls_credentials_type_t cred; - + LOG_D("TLS Session information for connection '%s':", conn->cc_id); /* print the key exchange's algorithm name */ @@ -1229,7 +1247,7 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in gnutls_dh_get_prime_bits (session)); } break; -#ifdef ENABLE_SRP +#ifdef ENABLE_SRP case GNUTLS_CRD_SRP: LOG_D("\t - SRP session with username %s", gnutls_srp_server_get_username (session)); @@ -1263,7 +1281,7 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in LOG_D("\t - MAC: %s", tmp); } #endif /* DEBUG */ - + /* First, use built-in verification */ CHECK_GNUTLS_DO( gnutls_certificate_verify_peers2 (session, >ret), return EINVAL ); if (gtret) { @@ -1280,33 +1298,33 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in LOG_E(" - The certificate signature uses a weak algorithm."); return EINVAL; } - + /* Code from http://www.gnu.org/software/gnutls/manual/gnutls.html#Verifying-peer_0027s-certificate */ if (gnutls_certificate_type_get (session) != GNUTLS_CRT_X509) { LOG_E("TLS: Remote peer did not present a certificate, other mechanisms are not supported yet. socket %d (Remote: '%s')(Connection: '%s') :", conn->cc_socket, conn->cc_remid, conn->cc_id); return EINVAL; } - + GNUTLS_TRACE( cert_list = gnutls_certificate_get_peers (session, &cert_list_size) ); if (cert_list == NULL) return EINVAL; - + now = time(NULL); - + #ifdef DEBUG char serial[40]; char dn[128]; size_t size; unsigned int algo, bits; time_t expiration_time, activation_time; - + LOG_D("TLS Certificate information for connection '%s' (%d certs provided):", conn->cc_id, cert_list_size); for (i = 0; i < cert_list_size; i++) { CHECK_GNUTLS_DO( gnutls_x509_crt_init (&cert), return EINVAL); CHECK_GNUTLS_DO( gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER), return EINVAL); - + LOG_A(" Certificate %d info:", i); GNUTLS_TRACE( expiration_time = gnutls_x509_crt_get_expiration_time (cert) ); @@ -1318,7 +1336,7 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in /* Print the serial number of the certificate. */ size = sizeof (serial); gnutls_x509_crt_get_serial (cert, serial, &size); - + { int j; char buf[1024]; @@ -1354,24 +1372,24 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in for (i = 0; i < cert_list_size; i++) { time_t deadline; - + CHECK_GNUTLS_DO( gnutls_x509_crt_init (&cert), return EINVAL); CHECK_GNUTLS_DO( gnutls_x509_crt_import (cert, &cert_list[i], GNUTLS_X509_FMT_DER), return EINVAL); - + GNUTLS_TRACE( deadline = gnutls_x509_crt_get_expiration_time(cert) ); if ((deadline != (time_t)-1) && (deadline < now)) { LOG_E("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :", conn->cc_socket, conn->cc_remid, conn->cc_id); LOG_E(" - The certificate %d in the chain is expired", i); ret = EINVAL; } - + GNUTLS_TRACE( deadline = gnutls_x509_crt_get_activation_time(cert) ); if ((deadline != (time_t)-1) && (deadline > now)) { LOG_E("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :", conn->cc_socket, conn->cc_remid, conn->cc_id); LOG_E(" - The certificate %d in the chain is not yet activated", i); ret = EINVAL; } - + if ((i == 0) && (conn->cc_tls_para.cn)) { if (!gnutls_x509_crt_check_hostname (cert, conn->cc_tls_para.cn)) { LOG_E("TLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :", conn->cc_socket, conn->cc_remid, conn->cc_id); @@ -1379,7 +1397,7 @@ int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, in ret = EINVAL; } } - + GNUTLS_TRACE( gnutls_x509_crt_deinit (cert) ); } @@ -1400,10 +1418,10 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) int hostname_verified = 0; TRACE_ENTRY("%p", session); - + /* get the associated connection */ conn = gnutls_session_get_ptr (session); - + /* Trace the session information -- http://www.gnu.org/software/gnutls/manual/gnutls.html#Obtaining-session-information */ #ifdef DEBUG const char *tmp; @@ -1414,7 +1432,7 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) dhe = ecdh = 0; LOG_A("TLS Session information for connection '%s':", conn->cc_id); - + /* print the key exchange's algorithm name */ GNUTLS_TRACE( kx = gnutls_kx_get (session) ); @@ -1474,7 +1492,7 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) dhe = 1; else if (kx == GNUTLS_KX_ECDHE_RSA || kx == GNUTLS_KX_ECDHE_ECDSA) ecdh = 1; - + /* Now print some info on the remote certificate */ if (gnutls_certificate_type_get (session) == GNUTLS_CRT_X509) { gnutls_datum_t cinfo; @@ -1504,7 +1522,7 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) LOG_D("\t\t%s", cinfo.data); gnutls_free (cinfo.data); } - + if (conn->cc_tls_para.cn) { if (!gnutls_x509_crt_check_hostname (cert, conn->cc_tls_para.cn)) { LOG_E("\tTLS: Remote certificate invalid on socket %d (Remote: '%s')(Connection: '%s') :", conn->cc_socket, conn->cc_remid, conn->cc_id); @@ -1512,7 +1530,7 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) gnutls_x509_crt_deinit (cert); return GNUTLS_E_CERTIFICATE_ERROR; } - + } hostname_verified = 1; @@ -1535,7 +1553,7 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) LOG_D("\t - Ephemeral DH using prime of %d bits", gnutls_dh_get_prime_bits (session)); - /* print the protocol's name (ie TLS 1.0) + /* print the protocol's name (ie TLS 1.0) */ tmp = gnutls_protocol_get_name (gnutls_protocol_get_version (session)); LOG_D("\t - Protocol: %s", tmp); @@ -1557,8 +1575,8 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) */ tmp = gnutls_mac_get_name (gnutls_mac_get (session)); LOG_D("\t - MAC: %s", tmp); - -#endif /* DEBUG */ + +#endif /* DEBUG */ /* This verification function uses the trusted CAs in the credentials * structure. So you must have installed one or more CA certificates. @@ -1577,12 +1595,12 @@ int fd_tls_verify_credentials_2(gnutls_session_t session) if (status & GNUTLS_CERT_NOT_ACTIVATED) LOG_E(" - The certificate is not yet activated."); - } + } if (status & GNUTLS_CERT_INVALID) { return GNUTLS_E_CERTIFICATE_ERROR; } - + /* Up to here the process is the same for X.509 certificates and * OpenPGP keys. From now on X.509 certificates are assumed. This can * be easily extended to work with openpgp keys as well. @@ -1634,22 +1652,22 @@ static int fd_cnx_uses_dtls(struct cnxctx * conn) { int fd_cnx_handshake(struct cnxctx * conn, int mode, int algo, char * priority, void * alt_creds) { int dtls = 0; - + TRACE_ENTRY( "%p %d %d %p %p", conn, mode, algo, priority, alt_creds); CHECK_PARAMS( conn && (!fd_cnx_teststate(conn, CC_STATUS_TLS)) && ( (mode == GNUTLS_CLIENT) || (mode == GNUTLS_SERVER) ) && (!conn->cc_loop) ); /* Save the mode */ conn->cc_tls_para.mode = mode; conn->cc_tls_para.algo = algo; - + /* Cancel receiving thread if any -- it should already be terminated anyway, we just release the resources */ CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */); - + /* Once TLS handshake is done, we don't stop after the first message */ conn->cc_loop = 1; - + dtls = fd_cnx_may_dtls(conn); - + /* Prepare the master session credentials and priority */ CHECK_FCT( fd_tls_prepare(&conn->cc_tls_para.session, mode, dtls, priority, alt_creds) ); @@ -1682,32 +1700,32 @@ int fd_cnx_handshake(struct cnxctx * conn, int mode, int algo, char * priority, return ENOTSUP; } } - + /* additional initialization for gnutls 3.x */ #ifdef GNUTLS_VERSION_300 /* the verify function has already been set in the global initialization in config.c */ - + /* fd_tls_verify_credentials_2 uses the connection */ gnutls_session_set_ptr (conn->cc_tls_para.session, (void *) conn); - + if ((conn->cc_tls_para.cn != NULL) && (mode == GNUTLS_CLIENT)) { /* this might allow virtual hosting on the remote peer */ CHECK_GNUTLS_DO( gnutls_server_name_set (conn->cc_tls_para.session, GNUTLS_NAME_DNS, conn->cc_tls_para.cn, strlen(conn->cc_tls_para.cn)), /* ignore failure */); } - + #endif /* GNUTLS_VERSION_300 */ #ifdef GNUTLS_VERSION_310 GNUTLS_TRACE( gnutls_handshake_set_timeout( conn->cc_tls_para.session, GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT)); #endif /* GNUTLS_VERSION_310 */ - + /* Mark the connection as protected from here, so that the gnutls credentials will be freed */ fd_cnx_addstate(conn, CC_STATUS_TLS); - + /* Handshake master session */ { int ret; - + CHECK_GNUTLS_DO( ret = gnutls_handshake(conn->cc_tls_para.session), { if (TRACE_BOOL(INFO)) { @@ -1719,15 +1737,15 @@ int fd_cnx_handshake(struct cnxctx * conn, int mode, int algo, char * priority, #ifndef GNUTLS_VERSION_300 /* Now verify the remote credentials are valid -- only simple tests here */ - CHECK_FCT_DO( fd_tls_verify_credentials(conn->cc_tls_para.session, conn, 1), - { + CHECK_FCT_DO( fd_tls_verify_credentials(conn->cc_tls_para.session, conn, 1), + { CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_RDWR), ); fd_cnx_markerror(conn); return EINVAL; }); #endif /* GNUTLS_VERSION_300 */ } - + /* Multi-stream TLS: handshake other streams as well */ if ((!dtls) && (conn->cc_sctp_para.pairs > 1)) { #ifndef DISABLE_SCTP @@ -1750,7 +1768,7 @@ int fd_cnx_handshake(struct cnxctx * conn, int mode, int algo, char * priority, return ENOTSUP; } } - + return 0; } @@ -1759,10 +1777,10 @@ int fd_cnx_getcred(struct cnxctx * conn, const gnutls_datum_t **cert_list, unsig { TRACE_ENTRY("%p %p %p", conn, cert_list, cert_list_size); CHECK_PARAMS( conn && fd_cnx_teststate(conn, CC_STATUS_TLS) && cert_list && cert_list_size ); - + /* This function only works for X.509 certificates. */ CHECK_PARAMS( gnutls_certificate_type_get (conn->cc_tls_para.session) == GNUTLS_CRT_X509 ); - + GNUTLS_TRACE( *cert_list = gnutls_certificate_get_peers (conn->cc_tls_para.session, cert_list_size) ); if (*cert_list == NULL) { TRACE_DEBUG(INFO, "No certificate was provided by remote peer / an error occurred."); @@ -1770,7 +1788,7 @@ int fd_cnx_getcred(struct cnxctx * conn, const gnutls_datum_t **cert_list, unsig } TRACE_DEBUG( FULL, "Saved certificate chain (%d certificates) in peer structure.", *cert_list_size); - + return 0; } @@ -1781,7 +1799,7 @@ int fd_cnx_receive(struct cnxctx * conn, struct timespec * timeout, unsigned cha int ev; size_t ev_sz; void * ev_data; - + TRACE_ENTRY("%p %p %p %p", conn, timeout, buf, len); CHECK_PARAMS(conn && (conn->cc_socket > 0) && buf && len); CHECK_PARAMS(conn->cc_rcvthr != (pthread_t)NULL); @@ -1794,27 +1812,27 @@ get_next: } else { CHECK_FCT( fd_event_get(conn->cc_incoming, &ev, &ev_sz, &ev_data) ); } - + switch (ev) { case FDEVP_CNX_MSG_RECV: /* We got one */ *len = ev_sz; *buf = ev_data; return 0; - + case FDEVP_PSM_TIMEOUT: TRACE_DEBUG(FULL, "Timeout event received"); return ETIMEDOUT; - + case FDEVP_CNX_EP_CHANGE: /* We ignore this event */ goto get_next; - + case FDEVP_CNX_ERROR: TRACE_DEBUG(FULL, "Received ERROR event on the connection"); return ENOTCONN; } - + TRACE_DEBUG(INFO, "Received unexpected event %d (%s)", ev, fd_pev_str(ev)); return EINVAL; } @@ -1835,12 +1853,12 @@ int fd_cnx_recv_setaltfifo(struct cnxctx * conn, struct fifo * alt_fifo) int ret; TRACE_ENTRY( "%p %p", conn, alt_fifo ); CHECK_PARAMS( conn && alt_fifo && conn->cc_incoming ); - + /* The magic function does it all */ CHECK_POSIX_DO( pthread_mutex_lock(&state_lock), { ASSERT(0); } ); CHECK_FCT_DO( ret = fd_fifo_move( conn->cc_incoming, alt_fifo, &conn->cc_alt ), ); CHECK_POSIX_DO( pthread_mutex_unlock(&state_lock), { ASSERT(0); } ); - + return ret; } @@ -1861,7 +1879,7 @@ static int send_simple(struct cnxctx * conn, unsigned char * buf, size_t len) } if (ret <= 0) return ENOTCONN; - + sent += ret; } while ( sent < len ); return 0; @@ -1871,16 +1889,16 @@ static int send_simple(struct cnxctx * conn, unsigned char * buf, size_t len) int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len) { TRACE_ENTRY("%p %p %zd", conn, buf, len); - + CHECK_PARAMS(conn && (conn->cc_socket > 0) && (! fd_cnx_teststate(conn, CC_STATUS_ERROR)) && buf && len); TRACE_DEBUG(FULL, "Sending %zdb %sdata on connection %s", len, fd_cnx_teststate(conn, CC_STATUS_TLS) ? "TLS-protected ":"", conn->cc_id); - + switch (conn->cc_proto) { case IPPROTO_TCP: CHECK_FCT( send_simple(conn, buf, len) ); break; - + #ifndef DISABLE_SCTP case IPPROTO_SCTP: { int dtls = fd_cnx_uses_dtls(conn); @@ -1892,14 +1910,14 @@ int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len) limit = conn->cc_sctp_para.pairs; else limit = conn->cc_sctp_para.str_out; - + if (limit > 1) { conn->cc_sctp_para.next += 1; conn->cc_sctp_para.next %= limit; stream = conn->cc_sctp_para.next; } } - + if (stream == 0) { /* We can use default function, it sends over stream #0 */ CHECK_FCT( send_simple(conn, buf, len) ); @@ -1908,7 +1926,7 @@ int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len) struct iovec iov; iov.iov_base = buf; iov.iov_len = len; - + CHECK_SYS_DO( fd_sctp_sendstrv(conn, stream, &iov, 1), { fd_cnx_markerror(conn); return ENOTCONN; } ); } else { /* push the data to the appropriate session */ @@ -1932,13 +1950,13 @@ int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len) } break; #endif /* DISABLE_SCTP */ - + default: TRACE_DEBUG(INFO, "Unknown protocol: %d", conn->cc_proto); ASSERT(0); return ENOTSUP; /* or EINVAL... */ } - + return 0; } @@ -1951,11 +1969,11 @@ int fd_cnx_send(struct cnxctx * conn, unsigned char * buf, size_t len) void fd_cnx_destroy(struct cnxctx * conn) { TRACE_ENTRY("%p", conn); - + CHECK_PARAMS_DO(conn, return); - + fd_cnx_addstate(conn, CC_STATUS_CLOSING); - + /* Initiate shutdown of the TLS session(s): call gnutls_bye(WR), then read until error */ if (fd_cnx_teststate(conn, CC_STATUS_TLS)) { #ifndef DISABLE_SCTP @@ -1985,7 +2003,7 @@ void fd_cnx_destroy(struct cnxctx * conn) GNUTLS_TRACE( gnutls_deinit(conn->cc_tls_para.session) ); conn->cc_tls_para.session = NULL; } - + /* Destroy the wrapper (also stops the demux thread) */ fd_sctp3436_destroy(conn); @@ -2007,7 +2025,7 @@ void fd_cnx_destroy(struct cnxctx * conn) /* Cancel the receiver thread in case it did not already terminate */ CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ ); } - + /* Free the resources of the TLS session */ if (conn->cc_tls_para.session) { GNUTLS_TRACE( gnutls_deinit(conn->cc_tls_para.session) ); @@ -2017,25 +2035,25 @@ void fd_cnx_destroy(struct cnxctx * conn) } #endif /* DISABLE_SCTP */ } - + /* Terminate the thread in case it is not done yet -- is there any such case left ?*/ CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ ); - + /* Shut the connection down */ if (conn->cc_socket > 0) { shutdown(conn->cc_socket, SHUT_RDWR); close(conn->cc_socket); conn->cc_socket = -1; } - + /* Empty and destroy FIFO list */ if (conn->cc_incoming) { fd_event_destroy( &conn->cc_incoming, free ); } - + /* Free the object */ free(conn); - + /* Done! */ return; } diff --git a/libfdcore/cnxctx.h b/libfdcore/cnxctx.h index dcc4bea..e6438bc 100644 --- a/libfdcore/cnxctx.h +++ b/libfdcore/cnxctx.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -43,14 +43,14 @@ /* The connection context structure */ struct cnxctx { - char cc_id[60]; /* The name of this connection. the first 5 chars are reserved for flags display (cc_state). */ + char cc_id[100]; /* The name of this connection. the first 5 chars are reserved for flags display (cc_state). */ char cc_remid[60]; /* Id of remote peer */ - + int cc_socket; /* The socket object of the connection -- <=0 if no socket is created */ int cc_family; /* AF_INET or AF_INET6 (mixed) */ int cc_proto; /* IPPROTO_TCP or IPPROTO_SCTP */ - + uint32_t cc_state; /* True if the object is being destroyed: we don't send events anymore. access with fd_cnx_getstate() */ #define CC_STATUS_CLOSING 1 #define CC_STATUS_ERROR 2 @@ -59,7 +59,7 @@ struct cnxctx { pthread_t cc_rcvthr; /* thread for receiving messages on the connection */ int cc_loop; /* tell the thread if it loops or stops after the first message is received */ - + struct fifo * cc_incoming; /* FIFO queue of events received on the connection, FDEVP_CNX_* */ struct fifo * cc_alt; /* alternate fifo to send FDEVP_CNX_* events to. */ @@ -117,7 +117,7 @@ int fd_tcp_get_remote_ep(int sock, sSS * ss, socklen_t *sl); /* SCTP */ int fd_sctp_create_bind_server( int * sock, int family, struct fd_list * list, uint16_t port ); int fd_sctp_listen( int sock ); -int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list ); +int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list, struct fd_list * src_list ); int fd_sctp_get_local_ep(int sock, struct fd_list * list); int fd_sctp_get_remote_ep(int sock, struct fd_list * list); int fd_sctp_get_str_info( int sock, uint16_t *in, uint16_t *out, sSS *primary ); diff --git a/libfdcore/config.c b/libfdcore/config.c index d05c8ba..dae6c6c 100644 --- a/libfdcore/config.c +++ b/libfdcore/config.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -59,7 +59,13 @@ int fd_conf_init() fd_g_config->cnf_port_tls = DIAMETER_SECURE_PORT; fd_g_config->cnf_sctp_str = 30; fd_g_config->cnf_thr_srv = 5; + fd_g_config->cnf_processing_peers_minimum = 0; fd_g_config->cnf_dispthr = 4; + fd_g_config->cnf_rtinthr = 1; + fd_g_config->cnf_rtoutthr = 1; + fd_g_config->cnf_qin_limit = 20; + fd_g_config->cnf_qout_limit = 30; + fd_g_config->cnf_qlocal_limit = 25; fd_list_init(&fd_g_config->cnf_endpoints, NULL); fd_list_init(&fd_g_config->cnf_apps, NULL); #ifdef DISABLE_SCTP @@ -101,11 +107,18 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_conf_dump) CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Number of SCTP streams . : %hu\n", fd_g_config->cnf_sctp_str), return NULL); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Number of clients thr .. : %d\n", fd_g_config->cnf_thr_srv), return NULL); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Number of app threads .. : %hu\n", fd_g_config->cnf_dispthr), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Minimal processing peers : %d\n", fd_g_config->cnf_processing_peers_minimum), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Number of rtin threads . : %hu\n", fd_g_config->cnf_rtinthr), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Number of rtout threads : %hu\n", fd_g_config->cnf_rtoutthr), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Incoming queue limit : %d\n", fd_g_config->cnf_qin_limit), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Outgoing queue limit : %d\n", fd_g_config->cnf_qout_limit), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Local queue limit : %d\n", fd_g_config->cnf_qlocal_limit), return NULL); if (FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints)) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Local endpoints ........ : Default (use all available)\n"), return NULL); } else { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Local endpoints ........ : "), return NULL); CHECK_MALLOC_DO( fd_ep_dump( FD_DUMP_STD_PARAMS, 0, 0, &fd_g_config->cnf_endpoints ), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); } if (FD_IS_LIST_EMPTY(&fd_g_config->cnf_apps)) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Local applications ..... : (none)"), return NULL); @@ -134,6 +147,7 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_conf_dump) #endif /* DISABLE_SCTP */ CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " - Pref. proto .. : %s\n", fd_g_config->cnf_flags.pr_tcp ? "TCP" : "SCTP"), return NULL); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " - TLS method ... : %s\n", fd_g_config->cnf_flags.tls_alg ? "INBAND" : "Separate port"), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " - Client bind .. : %s\n", fd_g_config->cnf_flags.no_bind ? "DISABLED" : "Enabled"), return NULL); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " TLS : - Certificate .. : %s\n", fd_g_config->cnf_sec_data.cert_file ?: "(NONE)"), return NULL); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " - Private key .. : %s\n", fd_g_config->cnf_sec_data.key_file ?: "(NONE)"), return NULL); @@ -338,7 +352,8 @@ int fd_conf_parse() } /* Validate local endpoints */ - if ((!FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints)) && (fd_g_config->cnf_flags.no_ip4 || fd_g_config->cnf_flags.no_ip6)) { + fd_g_config->cnf_flags.no_bind = FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints); + if ((!fd_g_config->cnf_flags.no_bind) && (fd_g_config->cnf_flags.no_ip4 || fd_g_config->cnf_flags.no_ip6)) { struct fd_list * li; for ( li = fd_g_config->cnf_endpoints.next; li != &fd_g_config->cnf_endpoints; li = li->next) { struct fd_endpoint * ep = (struct fd_endpoint *)li; diff --git a/libfdcore/core.c b/libfdcore/core.c index 078e7fd..17d4326 100644 --- a/libfdcore/core.c +++ b/libfdcore/core.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -315,6 +315,8 @@ static int fd_core_start_int(void) int fd_core_start(void) { int ret; + CHECK_FCT( fd_queues_init_after_conf() ); + CHECK_POSIX( pthread_mutex_lock(&core_lock) ); ret = fd_core_start_int(); CHECK_POSIX( pthread_mutex_unlock(&core_lock) ); diff --git a/libfdcore/dict_base_proto.c b/libfdcore/dict_base_proto.c index 5c023f6..5eb7c58 100644 --- a/libfdcore/dict_base_proto.c +++ b/libfdcore/dict_base_proto.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -1582,7 +1582,37 @@ int fd_dict_base_protocol(struct dictionary * dict) }; CHECK_dict_new( DICT_AVP, &data , NULL, NULL); } - + + /* Experimental-Result-Code */ + { + /* + The Experimental-Result-Code AVP (AVP Code 298) is of type Unsigned32 + and contains a vendor-assigned value representing the result of + processing the request. + + It is recommended that vendor-specific result codes follow the same + conventions given for the Result-Code AVP regarding the different + types of result codes and the handling of errors (for non 2xxx + values). + */ + /* Although the RFC does not specify an "Enumerated" type here, we go forward and create one. + * This is the reason for the "*" in the type name. Vendors will have to define their values. + */ + struct dict_object * type; + struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Experimental-Result-Code)" , NULL, NULL, NULL }; + struct dict_avp_data data = { + 298, /* Code */ + 0, /* Vendor */ + "Experimental-Result-Code", /* Name */ + AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_TYPE_UNSIGNED32 /* base type of data */ + }; + + CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type); + CHECK_dict_new( DICT_AVP, &data , type, NULL); + } + /* Experimental-Result */ { /* @@ -1594,8 +1624,8 @@ int fd_dict_base_protocol(struct dictionary * dict) AVP Format Experimental-Result ::= < AVP Header: 297 > - { Vendor-Id } - { Experimental-Result-Code } + { Vendor-Id } + { Experimental-Result-Code } The Vendor-Id AVP (see Section 5.3.3) in this grouped AVP identifies the vendor responsible for the assignment of the result code which @@ -1603,47 +1633,23 @@ int fd_dict_base_protocol(struct dictionary * dict) applications MUST include either one Result-Code AVP or one Experimental-Result AVP. */ - struct dict_avp_data data = { - 297, /* Code */ - 0, /* Vendor */ - "Experimental-Result", /* Name */ - AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ + struct dict_object * avp = NULL; + struct dict_avp_data data = { + 297, /* Code */ + 0, /* Vendor */ + "Experimental-Result", /* Name */ + AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_GROUPED /* base type of data */ + AVP_TYPE_GROUPED /* base type of data */ }; - CHECK_dict_new( DICT_AVP, &data , NULL, NULL); + struct local_rules_definition rules[] = { + { "Vendor-Id", RULE_REQUIRED, -1, 1 }, + { "Experimental-Result-Code", RULE_REQUIRED, -1, 1 }, + }; + CHECK_dict_new( DICT_AVP, &data , NULL, &avp); + PARSE_loc_rules( rules, avp ); } - - /* Experimental-Result-Code */ - { - /* - The Experimental-Result-Code AVP (AVP Code 298) is of type Unsigned32 - and contains a vendor-assigned value representing the result of - processing the request. - It is recommended that vendor-specific result codes follow the same - conventions given for the Result-Code AVP regarding the different - types of result codes and the handling of errors (for non 2xxx - values). - */ - /* Although the RFC does not specify an "Enumerated" type here, we go forward and create one. - * This is the reason for the "*" in the type name. Vendors will have to define their values. - */ - struct dict_object * type; - struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated(Experimental-Result-Code)" , NULL, NULL, NULL }; - struct dict_avp_data data = { - 298, /* Code */ - 0, /* Vendor */ - "Experimental-Result-Code", /* Name */ - AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ - AVP_FLAG_MANDATORY, /* Fixed flag values */ - AVP_TYPE_UNSIGNED32 /* base type of data */ - }; - - CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type); - CHECK_dict_new( DICT_AVP, &data , type, NULL); - } - /* Auth-Request-Type */ { /* diff --git a/libfdcore/fdcore-internal.h b/libfdcore/fdcore-internal.h index 7fac852..03d6eed 100644 --- a/libfdcore/fdcore-internal.h +++ b/libfdcore/fdcore-internal.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -109,6 +109,7 @@ extern struct fifo * fd_g_outgoing; /* messages to be sent to other peers on the extern struct fifo * fd_g_local; /* messages to be handled to local extensions */ /* Message queues */ int fd_queues_init(void); +int fd_queues_init_after_conf(void); int fd_queues_fini(struct fifo ** queue); /* Trigged events */ @@ -341,7 +342,7 @@ struct cnxctx * fd_cnx_serv_sctp(uint16_t port, struct fd_list * ep_list); int fd_cnx_serv_listen(struct cnxctx * conn); struct cnxctx * fd_cnx_serv_accept(struct cnxctx * serv); struct cnxctx * fd_cnx_cli_connect_tcp(sSA * sa, socklen_t addrlen); -struct cnxctx * fd_cnx_cli_connect_sctp(int no_ip6, uint16_t port, struct fd_list * list); +struct cnxctx * fd_cnx_cli_connect_sctp(int no_ip6, uint16_t port, struct fd_list * list, struct fd_list * src_list); int fd_cnx_start_clear(struct cnxctx * conn, int loop); void fd_cnx_sethostname(struct cnxctx * conn, DiamId_t hn); int fd_cnx_proto_info(struct cnxctx * conn, char * buf, size_t len); diff --git a/libfdcore/fdd.l b/libfdcore/fdd.l index 8835def..348ae74 100644 --- a/libfdcore/fdd.l +++ b/libfdcore/fdd.l @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -241,34 +241,44 @@ nomatch: } /* Full words tokens (keywords) */ -(?i:"Identity") { return IDENTITY; } -(?i:"Realm") { return REALM; } -(?i:"Port") { return PORT; } -(?i:"SecPort") { return SECPORT; } - /* (?i:"SctpSec3436") { return SEC3436; } */ -(?i:"No_IPv6") { return NOIP6; } -(?i:"No_IP") { return NOIP; } -(?i:"No_TCP") { return NOTCP; } -(?i:"No_SCTP") { return NOSCTP; } -(?i:"Prefer_TCP") { return PREFERTCP; } -(?i:"TLS_old_method") { return OLDTLS; } -(?i:"SCTP_streams") { return SCTPSTREAMS; } -(?i:"AppServThreads") { return APPSERVTHREADS;} -(?i:"ListenOn") { return LISTENON; } -(?i:"ThreadsPerServer") { return THRPERSRV; } -(?i:"TcTimer") { return TCTIMER; } -(?i:"TwTimer") { return TWTIMER; } -(?i:"NoRelay") { return NORELAY; } -(?i:"LoadExtension") { return LOADEXT; } -(?i:"ConnectPeer") { return CONNPEER; } -(?i:"ConnectTo") { return CONNTO; } -(?i:"No_TLS") { return NOTLS; } -(?i:"TLS_Cred") { return TLS_CRED; } -(?i:"TLS_CA") { return TLS_CA; } -(?i:"TLS_CRL") { return TLS_CRL; } -(?i:"TLS_Prio") { return TLS_PRIO; } -(?i:"TLS_DH_bits") { return TLS_DH_BITS; } -(?i:"TLS_DH_file") { return TLS_DH_FILE; } +(?i:"Identity") { return IDENTITY; } +(?i:"Realm") { return REALM; } +(?i:"Port") { return PORT; } +(?i:"SecPort") { return SECPORT; } + /* (?i:"SctpSec3436") { return SEC3436; } */ +(?i:"No_IPv6") { return NOIP6; } +(?i:"No_IP") { return NOIP; } +(?i:"No_TCP") { return NOTCP; } +(?i:"No_SCTP") { return NOSCTP; } +(?i:"Prefer_TCP") { return PREFERTCP; } +(?i:"TLS_old_method") { return OLDTLS; } +(?i:"SCTP_streams") { return SCTPSTREAMS; } +(?i:"AppServThreads") { return APPSERVTHREADS; } +(?i:"RoutingInThreads") { return ROUTINGINTHREADS; } +(?i:"RoutingOutThreads") { return ROUTINGOUTTHREADS; } +(?i:"IncomingQueueLimit") { return QINLIMIT; } +(?i:"OutgoingQueueLimit") { return QOUTLIMIT; } +(?i:"LocalQueueLimit") { return QLOCALLIMIT; } +(?i:"ListenOn") { return LISTENON; } +(?i:"ThreadsPerServer") { return THRPERSRV; } +(?i:"ProcessingPeersPattern") { return PROCESSINGPEERSPATTERN; } +(?i:"ProcessingPeersMinimum") { return PROCESSINGPEERSMINIMUM; } +(?i:"TcTimer") { return TCTIMER; } +(?i:"TwTimer") { return TWTIMER; } +(?i:"NoRelay") { return NORELAY; } +(?i:"LoadExtension") { return LOADEXT; } +(?i:"ConnectPeer") { return CONNPEER; } +(?i:"ConnectTo") { return CONNTO; } +(?i:"No_TLS") { return NOTLS; } +(?i:"TLS_Cred") { return TLS_CRED; } +(?i:"TLS_CA") { return TLS_CA; } +(?i:"TLS_CRL") { return TLS_CRL; } +(?i:"TLS_Prio") { return TLS_PRIO; } +(?i:"TLS_DH_bits") { return TLS_DH_BITS; } +(?i:"TLS_DH_file") { return TLS_DH_FILE; } +(?i:"RouteRecordInAnswers") { return RR_IN_ANSWERS; } +(?i:"Never") { return NEVER; } +(?i:"Always") { return ALWAYS; } /* Valid single characters for yyparse */ diff --git a/libfdcore/fdd.y b/libfdcore/fdd.y index db27243..9b36887 100644 --- a/libfdcore/fdd.y +++ b/libfdcore/fdd.y @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -107,8 +107,15 @@ struct peer_info fddpi; %token NOTLS %token SCTPSTREAMS %token APPSERVTHREADS +%token ROUTINGINTHREADS +%token ROUTINGOUTTHREADS +%token QINLIMIT +%token QOUTLIMIT +%token QLOCALLIMIT %token LISTENON %token THRPERSRV +%token PROCESSINGPEERSPATTERN +%token PROCESSINGPEERSMINIMUM %token TCTIMER %token TWTIMER %token NORELAY @@ -141,8 +148,15 @@ conffile: /* Empty is OK -- for simplicity here, we reject in daemon later */ | conffile sctpstreams | conffile listenon | conffile thrpersrv + | conffile processingpeerspattern + | conffile processingpeersminimum | conffile norelay | conffile appservthreads + | conffile routinginthreads + | conffile routingoutthreads + | conffile qinlimit + | conffile qoutlimit + | conffile qlocallimit | conffile noip | conffile noip6 | conffile notcp @@ -252,6 +266,45 @@ thrpersrv: THRPERSRV '=' INTEGER ';' } ; +processingpeerspattern: PROCESSINGPEERSPATTERN '=' QSTRING ';' + { + char *pattern = $3; + int err; + CHECK_FCT_DO( err=regcomp(&conf->cnf_processing_peers_pattern_regex, pattern, REG_EXTENDED | REG_NOSUB), + { + char * buf; + size_t bl; + + /* Error while compiling the regex */ + TRACE_DEBUG(INFO, "error while compiling the regular expression '%s':", pattern); + + /* Get the error message size */ + bl = regerror(err, &conf->cnf_processing_peers_pattern_regex, NULL, 0); + + /* Alloc the buffer for error message */ + CHECK_MALLOC( buf = malloc(bl) ); + + /* Get the error message content */ + regerror(err, &conf->cnf_processing_peers_pattern_regex, buf, bl); + TRACE_DEBUG(INFO, "\t%s", buf); + + /* Free the buffer, return the error */ + free(buf); + + yyerror (&yylloc, conf, "Invalid regular expression in ProcessingPeersPattern"); + YYERROR; + } ); + } + ; + +processingpeersminimum: PROCESSINGPEERSMINIMUM '=' INTEGER ';' + { + CHECK_PARAMS_DO( ($3 >= 0), + { yyerror (&yylloc, conf, "Invalid value"); YYERROR; } ); + conf->cnf_processing_peers_minimum = $3; + } + ; + norelay: NORELAY ';' { conf->cnf_flags.no_fwd = 1; @@ -266,6 +319,46 @@ appservthreads: APPSERVTHREADS '=' INTEGER ';' } ; +routinginthreads: ROUTINGINTHREADS '=' INTEGER ';' + { + CHECK_PARAMS_DO( ($3 > 0) && ($3 < 256), + { yyerror (&yylloc, conf, "Invalid value"); YYERROR; } ); + conf->cnf_rtinthr = (uint16_t)$3; + } + ; + +routingoutthreads: ROUTINGOUTTHREADS '=' INTEGER ';' + { + CHECK_PARAMS_DO( ($3 > 0) && ($3 < 256), + { yyerror (&yylloc, conf, "Invalid value"); YYERROR; } ); + conf->cnf_rtoutthr = (uint16_t)$3; + } + ; + +qinlimit: QINLIMIT '=' INTEGER ';' + { + CHECK_PARAMS_DO( ($3 >= 0), + { yyerror (&yylloc, conf, "Invalid value"); YYERROR; } ); + conf->cnf_qin_limit = $3; + } + ; + +qoutlimit: QOUTLIMIT '=' INTEGER ';' + { + CHECK_PARAMS_DO( ($3 >= 0), + { yyerror (&yylloc, conf, "Invalid value"); YYERROR; } ); + conf->cnf_qout_limit = $3; + } + ; + +qlocallimit: QLOCALLIMIT '=' INTEGER ';' + { + CHECK_PARAMS_DO( ($3 >= 0), + { yyerror (&yylloc, conf, "Invalid value"); YYERROR; } ); + conf->cnf_qlocal_limit = $3; + } + ; + noip: NOIP ';' { if (got_peer_noipv6) { diff --git a/libfdcore/hooks.c b/libfdcore/hooks.c index 885be86..b812649 100644 --- a/libfdcore/hooks.c +++ b/libfdcore/hooks.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -332,7 +332,9 @@ void fd_hook_call(enum fd_hook_type type, struct msg * msg, struct fd_peer * p /* There was no registered handler, default behavior for this hook */ switch (type) { case HOOK_DATA_RECEIVED: { +#ifdef DEBUG struct fd_cnx_rcvdata *rcv_data = other; +#endif LOG_A("RCV: %zd bytes", rcv_data->length); break; } diff --git a/libfdcore/messages.c b/libfdcore/messages.c index c13bfff..e0f8a56 100644 --- a/libfdcore/messages.c +++ b/libfdcore/messages.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -42,6 +42,9 @@ static struct dict_object * dict_avp_EM = NULL; /* Error-Message */ static struct dict_object * dict_avp_ERH = NULL; /* Error-Reporting-Host */ static struct dict_object * dict_avp_FAVP= NULL; /* Failed-AVP */ static struct dict_object * dict_avp_RC = NULL; /* Result-Code */ +static struct dict_object * dict_avp_ER = NULL; /* Experimental-Result */ +static struct dict_object * dict_avp_VI = NULL; /* Vendor-Id */ +static struct dict_object * dict_avp_ERC = NULL; /* Experimental-Result-Code */ struct dict_object * fd_dict_avp_OSI = NULL; /* Origin-State-Id */ struct dict_object * fd_dict_cmd_CER = NULL; /* Capabilities-Exchange-Request */ struct dict_object * fd_dict_cmd_DWR = NULL; /* Device-Watchdog-Request */ @@ -52,25 +55,28 @@ struct dict_object * fd_dict_cmd_DPR = NULL; /* Disconnect-Peer-Request */ int fd_msg_init(void) { TRACE_ENTRY(""); - + /* Initialize the dictionary objects that we may use frequently */ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &dict_avp_SI , ENOENT) ); CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-Host", &dict_avp_OH , ENOENT) ); CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-Realm", &dict_avp_OR , ENOENT) ); CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-State-Id", &fd_dict_avp_OSI , ENOENT) ); - + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &dict_avp_RC , ENOENT) ); CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Error-Message", &dict_avp_EM , ENOENT) ); CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Error-Reporting-Host", &dict_avp_ERH , ENOENT) ); CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Failed-AVP", &dict_avp_FAVP, ENOENT) ); - + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &dict_avp_ER, ENOENT) ); + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Vendor-Id", &dict_avp_VI, ENOENT) ); + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result-Code", &dict_avp_ERC, ENOENT) ); + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Disconnect-Cause", &fd_dict_avp_DC , ENOENT) ); - + CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &fd_dict_cmd_CER, ENOENT ) ); CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Device-Watchdog-Request", &fd_dict_cmd_DWR, ENOENT ) ); CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Disconnect-Peer-Request", &fd_dict_cmd_DPR, ENOENT ) ); - - + + return 0; } @@ -81,35 +87,35 @@ int fd_msg_add_origin ( struct msg * msg, int osi ) struct avp * avp_OH = NULL; struct avp * avp_OR = NULL; struct avp * avp_OSI = NULL; - + TRACE_ENTRY("%p", msg); CHECK_PARAMS( msg ); - + /* Create the Origin-Host AVP */ CHECK_FCT( fd_msg_avp_new( dict_avp_OH, 0, &avp_OH ) ); - + /* Set its value */ memset(&val, 0, sizeof(val)); val.os.data = (os0_t)fd_g_config->cnf_diamid; val.os.len = fd_g_config->cnf_diamid_len; CHECK_FCT( fd_msg_avp_setvalue( avp_OH, &val ) ); - + /* Add it to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_OH ) ); - - + + /* Create the Origin-Realm AVP */ CHECK_FCT( fd_msg_avp_new( dict_avp_OR, 0, &avp_OR ) ); - + /* Set its value */ memset(&val, 0, sizeof(val)); val.os.data = (os0_t)fd_g_config->cnf_diamrlm; val.os.len = fd_g_config->cnf_diamrlm_len; CHECK_FCT( fd_msg_avp_setvalue( avp_OR, &val ) ); - + /* Add it to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_OR ) ); - + if (osi) { /* Create the Origin-State-Id AVP */ CHECK_FCT( fd_msg_avp_new( fd_dict_avp_OSI, 0, &avp_OSI ) ); @@ -122,7 +128,7 @@ int fd_msg_add_origin ( struct msg * msg, int osi ) /* Add it to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_OSI ) ); } - + return 0; } @@ -134,93 +140,127 @@ int fd_msg_new_session( struct msg * msg, os0_t opt, size_t optlen ) struct session * sess = NULL; os0_t sid; size_t sidlen; - + TRACE_ENTRY("%p %p %zd", msg, opt, optlen); CHECK_PARAMS( msg ); - + /* Check there is not already a session in the message */ CHECK_FCT( fd_msg_sess_get(fd_g_config->cnf_dict, msg, &sess, NULL) ); CHECK_PARAMS( sess == NULL ); - + /* Ok, now create the session */ CHECK_FCT( fd_sess_new ( &sess, fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len, opt, optlen ) ); CHECK_FCT( fd_sess_getsid( sess, &sid, &sidlen) ); - + /* Create an AVP to hold it */ CHECK_FCT( fd_msg_avp_new( dict_avp_SI, 0, &avp ) ); - + /* Set its value */ memset(&val, 0, sizeof(val)); val.os.data = sid; val.os.len = sidlen; CHECK_FCT( fd_msg_avp_setvalue( avp, &val ) ); - + /* Add it to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_FIRST_CHILD, avp ) ); - + /* Save the session associated with the message */ CHECK_FCT( fd_msg_sess_set( msg, sess) ); - + /* Done! */ return 0; } -/* Add Result-Code and eventually Failed-AVP, Error-Message and Error-Reporting-Host AVPs */ -int fd_msg_rescode_set( struct msg * msg, char * rescode, char * errormsg, struct avp * optavp, int type_id ) +/* Add Result-Code or Experimental-Result, and eventually Failed-AVP, Error-Message and Error-Reporting-Host AVPs */ +int fd_msg_add_result( struct msg * msg, vendor_id_t vendor, struct dict_object * restype, char * rescode, char * errormsg, struct avp * optavp, int type_id ) { union avp_value val; - struct avp * avp_RC = NULL; - struct avp * avp_EM = NULL; - struct avp * avp_ERH = NULL; - struct avp * avp_FAVP= NULL; uint32_t rc_val = 0; int set_e_bit=0; int std_err_msg=0; - - TRACE_ENTRY("%p %s %p %p %d", msg, rescode, errormsg, optavp, type_id); - - CHECK_PARAMS( msg && rescode ); - + + TRACE_ENTRY("%p %d %p %s %p %p %d", msg, vendor, restype, rescode, errormsg, optavp, type_id); + + CHECK_PARAMS( msg && restype && rescode ); + /* Find the enum value corresponding to the rescode string, this will give the class of error */ { struct dict_object * enum_obj = NULL; + + /* Search in the restype */ struct dict_enumval_request req; memset(&req, 0, sizeof(struct dict_enumval_request)); - - /* First, get the enumerated type of the Result-Code AVP (this is fast, no need to cache the object) */ - CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, dict_avp_RC, &(req.type_obj), ENOENT ) ); - + req.type_obj = restype; + /* Now search for the value given as parameter */ req.search.enum_name = rescode; CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &req, &enum_obj, ENOTSUP) ); - + /* finally retrieve its data */ CHECK_FCT_DO( fd_dict_getval( enum_obj, &(req.search) ), return EINVAL ); - + /* copy the found value, we're done */ rc_val = req.search.enum_value.u32; } - + if (type_id == 1) { /* Add the Origin-Host and Origin-Realm AVP */ CHECK_FCT( fd_msg_add_origin ( msg, 0 ) ); } - - /* Create the Result-Code AVP */ - CHECK_FCT( fd_msg_avp_new( dict_avp_RC, 0, &avp_RC ) ); - - /* Set its value */ - memset(&val, 0, sizeof(val)); - val.u32 = rc_val; - CHECK_FCT( fd_msg_avp_setvalue( avp_RC, &val ) ); - - /* Add it to the message */ - CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_RC ) ); - + + if (vendor == 0) { + /* Vendor 0; create the Result-Code AVP */ + struct avp * avp_RC = NULL; + CHECK_FCT( fd_msg_avp_new( dict_avp_RC, 0, &avp_RC ) ); + + /* Set its value */ + memset(&val, 0, sizeof(val)); + val.u32 = rc_val; + CHECK_FCT( fd_msg_avp_setvalue( avp_RC, &val ) ); + + /* Add it to the message */ + CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_RC ) ); + } else { + /* Vendor !0; create the Experimental-Result AVP */ + struct avp * avp_ER = NULL; + CHECK_FCT( fd_msg_avp_new( dict_avp_ER, 0, &avp_ER ) ); + + /* Create the Vendor-Id AVP and add to Experimental-Result */ + { + struct avp * avp_VI = NULL; + CHECK_FCT( fd_msg_avp_new( dict_avp_VI, 0, &avp_VI ) ); + + /* Set Vendor-Id value to vendor */ + memset(&val, 0, sizeof(val)); + val.u32 = vendor; + CHECK_FCT( fd_msg_avp_setvalue( avp_VI, &val ) ); + + /* Add it to Experimental-Result */ + CHECK_FCT( fd_msg_avp_add( avp_ER, MSG_BRW_LAST_CHILD, avp_VI ) ); + } + + /* Create the Experimental-Result-Code AVP and add to Experimental-Result */ + { + struct avp * avp_ERC = NULL; + CHECK_FCT( fd_msg_avp_new( dict_avp_ERC, 0, &avp_ERC ) ); + + /* Set Experimental-Result-Code value to rc_val */ + memset(&val, 0, sizeof(val)); + val.u32 = rc_val; + CHECK_FCT( fd_msg_avp_setvalue( avp_ERC, &val ) ); + + /* Add it to Experimental-Result */ + CHECK_FCT( fd_msg_avp_add( avp_ER, MSG_BRW_LAST_CHILD, avp_ERC ) ); + } + + /* Add it to the message */ + CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_ER ) ); + } + if (type_id == 2) { /* Add the Error-Reporting-Host AVP */ - + struct avp * avp_ERH = NULL; CHECK_FCT( fd_msg_avp_new( dict_avp_ERH, 0, &avp_ERH ) ); /* Set its value */ @@ -231,60 +271,60 @@ int fd_msg_rescode_set( struct msg * msg, char * rescode, char * errormsg, struc /* Add it to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_ERH ) ); - } - - /* Now add the optavp in a FailedAVP if provided */ + + /* Now add the optavp in a Failed-AVP if provided */ if (optavp) { + struct avp * avp_FAVP= NULL; struct avp * optavp_cpy = NULL; struct avp_hdr *opt_hdr, *optcpy_hdr; struct dict_object * opt_model = NULL; int is_grouped = 0; - + /* Create the Failed-AVP AVP */ CHECK_FCT( fd_msg_avp_new( dict_avp_FAVP, 0, &avp_FAVP ) ); - + /* Was this AVP a grouped one? Best effort only here */ if (!fd_msg_model ( optavp, &opt_model ) && (opt_model != NULL)) { struct dict_avp_data dictdata; CHECK_FCT( fd_dict_getval(opt_model, &dictdata) ); - if (dictdata.avp_basetype == AVP_TYPE_GROUPED) + if (dictdata.avp_basetype == AVP_TYPE_GROUPED) is_grouped = 1; } - + /* Create a new AVP with a copy of the data of the invalid or missing AVP */ optavp_cpy = optavp; - + if (is_grouped) { CHECK_FCT( fd_msg_avp_new( opt_model, 0, &optavp_cpy) ); } else { CHECK_FCT( fd_msg_avp_new( NULL, AVPFL_SET_BLANK_VALUE | AVPFL_SET_RAWDATA_FROM_AVP, &optavp_cpy) ); - + CHECK_FCT( fd_msg_avp_hdr(optavp, &opt_hdr) ); CHECK_FCT( fd_msg_avp_hdr(optavp_cpy, &optcpy_hdr) ); memcpy(optcpy_hdr, opt_hdr, sizeof(struct avp_hdr)); } - + /* Add the passed AVP inside it */ CHECK_FCT( fd_msg_avp_add( avp_FAVP, MSG_BRW_LAST_CHILD, optavp_cpy ) ); - + /* And add to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_FAVP ) ); } - - + + /* Deal with the 'E' bit and the error message */ switch (rc_val / 1000) { case 1: /* Informational */ case 2: /* Success */ /* Nothing special here: no E bit, no error message unless one is specified */ break; - + case 3: /* Protocol Errors */ set_e_bit = 1; std_err_msg = 1; break; - + case 4: /* Transcient Failure */ case 5: /* Permanent Failure */ if (rc_val == 5017) /* DIAMETER_NO_COMMON_SECURITY */ { @@ -293,28 +333,28 @@ int fd_msg_rescode_set( struct msg * msg, char * rescode, char * errormsg, struc default: std_err_msg = 1; break; - + } - + { struct msg_hdr * hdr = NULL; - + CHECK_FCT( fd_msg_hdr( msg, &hdr ) ); - + if (set_e_bit) hdr->msg_flags |= CMD_FLAG_ERROR; else hdr->msg_flags &= ~ CMD_FLAG_ERROR; } - + if (std_err_msg || errormsg) { /* Add the Error-Message AVP */ - + struct avp * avp_EM = NULL; CHECK_FCT( fd_msg_avp_new( dict_avp_EM, 0, &avp_EM ) ); /* Set its value */ memset(&val, 0, sizeof(val)); - + if (errormsg) { val.os.data = (uint8_t *)errormsg; val.os.len = strlen(errormsg); @@ -327,18 +367,25 @@ int fd_msg_rescode_set( struct msg * msg, char * rescode, char * errormsg, struc /* Add it to the message */ CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_LAST_CHILD, avp_EM ) ); } - + return 0; } +int fd_msg_rescode_set( struct msg * msg, char * rescode, char * errormsg, struct avp * optavp, int type_id ) +{ + struct dict_object * restype = NULL; + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, dict_avp_RC, &restype, ENOENT ) ); + return fd_msg_add_result(msg, 0, restype, rescode, errormsg, optavp, type_id); +} + static int fd_msg_send_int( struct msg ** pmsg, void (*anscb)(void *, struct msg **), void * data, void (*expirecb)(void *, DiamId_t, size_t, struct msg **), const struct timespec *timeout ) { struct msg_hdr *hdr; DiamId_t diamid; - + /* Save the callback in the message, with the timeout */ CHECK_FCT( fd_msg_anscb_associate( *pmsg, anscb, data, expirecb, timeout ) ); - + /* If this is a new request, call the HOOK_MESSAGE_LOCAL hook */ if ( (fd_msg_hdr(*pmsg, &hdr) == 0) && (hdr->msg_flags & CMD_FLAG_REQUEST) @@ -346,10 +393,10 @@ static int fd_msg_send_int( struct msg ** pmsg, void (*anscb)(void *, struct msg && (diamid == NULL)) { fd_hook_call(HOOK_MESSAGE_LOCAL, *pmsg, NULL, NULL, fd_msg_pmdl_get(*pmsg)); } - + /* Post the message in the outgoing queue */ CHECK_FCT( fd_fifo_post(fd_g_outgoing, pmsg) ); - + return 0; } @@ -358,7 +405,7 @@ int fd_msg_send ( struct msg ** pmsg, void (*anscb)(void *, struct msg **), void { TRACE_ENTRY("%p %p %p", pmsg, anscb, data); CHECK_PARAMS( pmsg ); - + return fd_msg_send_int(pmsg, anscb, data, NULL, NULL); } @@ -367,7 +414,7 @@ int fd_msg_send_timeout ( struct msg ** pmsg, void (*anscb)(void *, struct msg * { TRACE_ENTRY("%p %p %p %p %p", pmsg, anscb, data, expirecb, timeout); CHECK_PARAMS( pmsg && expirecb && timeout ); - + return fd_msg_send_int(pmsg, anscb, data, expirecb, timeout); } @@ -379,70 +426,78 @@ int fd_msg_parse_or_error( struct msg ** msg, struct msg **error) struct msg * m; struct msg_hdr * hdr = NULL; struct fd_pei pei; - + TRACE_ENTRY("%p", msg); - + CHECK_PARAMS(msg && *msg && error); m = *msg; *error = NULL; - + /* Parse the message against our dictionary */ ret = fd_msg_parse_rules ( m, fd_g_config->cnf_dict, &pei); if ((ret != EBADMSG) /* Parsing grouped AVP failed / Conflicting rule found */ && (ret != ENOTSUP)) /* Command is not supported / Mandatory AVP is not supported */ return ret; /* 0 or another error */ - + /* Log */ fd_hook_call(HOOK_MESSAGE_PARSING_ERROR, m, NULL, pei.pei_message ?: pei.pei_errcode, fd_msg_pmdl_get(m)); - + CHECK_FCT( fd_msg_hdr(m, &hdr) ); - + /* Now create an answer error if the message is a query */ if (hdr->msg_flags & CMD_FLAG_REQUEST) { - + /* Create the error message */ CHECK_FCT( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, &m, pei.pei_protoerr ? MSGFL_ANSW_ERROR : 0 ) ); - + /* Set the error code */ CHECK_FCT( fd_msg_rescode_set(m, pei.pei_errcode, pei.pei_message, pei.pei_avp, 1 ) ); - + /* free the pei AVP to avoid memory leak */ if (pei.pei_avp_free) { fd_msg_free(pei.pei_avp); } - + *msg = NULL; *error = m; - + } else { do { /* Rescue error messages */ struct avp * avp; union avp_value * rc = NULL; - + /* Search the Result-Code AVP */ CHECK_FCT_DO( fd_msg_browse(*msg, MSG_BRW_FIRST_CHILD, &avp, NULL), break ); while (avp) { struct avp_hdr * ahdr; CHECK_FCT_DO( fd_msg_avp_hdr( avp, &ahdr ), break ); - + if ((ahdr->avp_code == AC_RESULT_CODE) && (! (ahdr->avp_flags & AVP_FLAG_VENDOR)) ) { /* Parse this AVP */ - ASSERT( ahdr->avp_value ); + if (fd_msg_parse_dict(avp, fd_g_config->cnf_dict, &pei) < 0) { + TRACE_DEBUG(INFO, "error parsing Result-Code AVP"); + rc = NULL; + break; + } rc = ahdr->avp_value; + if (rc == NULL) { + TRACE_DEBUG(INFO, "invalid Result-Code AVP"); + break; + } break; } - + /* Go to next AVP */ CHECK_FCT_DO( fd_msg_browse(avp, MSG_BRW_NEXT, &avp, NULL), break ); } - + if (rc) { switch (rc->u32 / 1000) { case 1: /* 1xxx : Informational */ case 2: /* 2xxx : Sucess */ /* In these cases, we want the message to validate the ABNF, so we will discard the bad message */ break; - + default: /* Other errors */ /* We let the application decide what to do with the message, we rescue it */ *error = m; @@ -450,6 +505,6 @@ int fd_msg_parse_or_error( struct msg ** msg, struct msg **error) } } while (0); } - + return EBADMSG; /* We convert ENOTSUP to EBADMSG as well */ } diff --git a/libfdcore/p_ce.c b/libfdcore/p_ce.c index 1b4cd13..3f3af76 100644 --- a/libfdcore/p_ce.c +++ b/libfdcore/p_ce.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -704,7 +704,7 @@ int fd_p_ce_handle_newcnx(struct fd_peer * peer, struct cnxctx * initiator) int fd_p_ce_msgrcv(struct msg ** msg, int req, struct fd_peer * peer) { uint32_t rc = 0; - int st; + int st = STATE_NEW; struct fd_pei pei; TRACE_ENTRY("%p %p", msg, peer); @@ -833,6 +833,26 @@ cleanup: return 0; } +/* Check if enough processing peers are connected to allow connections by other peers */ +static int sufficient_processing_peers(void) { + int processing_peers_count = 0; + struct fd_list * li; + + CHECK_FCT( pthread_rwlock_rdlock(&fd_g_activ_peers_rw) ); + for (li = fd_g_activ_peers.next; li != &fd_g_activ_peers; li = li->next) { + struct fd_peer * p = (struct fd_peer *)li->o; + + TRACE_DEBUG(FULL, "comparing '%s' against processing peers pattern", p->p_hdr.info.pi_diamid); + if (regexec(&fd_g_config->cnf_processing_peers_pattern_regex, p->p_hdr.info.pi_diamid, 0, NULL, 0) == 0) { + processing_peers_count++; + } + } + CHECK_FCT( pthread_rwlock_unlock(&fd_g_activ_peers_rw) ); + + TRACE_DEBUG(FULL, "%d processing peers found", processing_peers_count); + return (processing_peers_count >= fd_g_config->cnf_processing_peers_minimum); +} + /* Handle the receiver side to go to OPEN or OPEN_NEW state (any election is resolved) */ int fd_p_ce_process_receiver(struct fd_peer * peer) { @@ -883,6 +903,26 @@ int fd_p_ce_process_receiver(struct fd_peer * peer) CHECK_FCT( res ); } + /* Check peer type and if enough processing peers are already connected */ + if (fd_g_config->cnf_processing_peers_minimum > 0) { + if (regexec(&fd_g_config->cnf_processing_peers_pattern_regex, peer->p_hdr.info.pi_diamid, 0, NULL, 0) != 0) { + /* peer is not a processing peer */ + if (!sufficient_processing_peers()) { + pei.pei_errcode = "DIAMETER_TOO_BUSY"; + goto error_abort; + } + } + } + + if (peer->p_flags.pf_responder) { + int res = fd_peer_validate( peer ); + if (res < 0) { + TRACE_DEBUG(INFO, "Rejected CER from peer '%s', validation failed (returning DIAMETER_UNKNOWN_PEER).", peer->p_hdr.info.pi_diamid); + pei.pei_errcode = "DIAMETER_UNKNOWN_PEER"; + goto error_abort; + } + CHECK_FCT( res ); + } /* Check if we have common applications */ if ( fd_g_config->cnf_flags.no_fwd && (! peer->p_hdr.info.runtime.pir_relay) ) { int got_common; diff --git a/libfdcore/p_cnx.c b/libfdcore/p_cnx.c index 9dc2a03..009e73d 100644 --- a/libfdcore/p_cnx.c +++ b/libfdcore/p_cnx.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -261,12 +261,14 @@ static void * connect_thr(void * arg) switch (nc->proto) { case IPPROTO_TCP: +/* TODO: use no_bind and first of cnf_endpoints of nc->ss.sa_family ? */ cnx = fd_cnx_cli_connect_tcp((sSA *)&nc->ss, sSAlen(&nc->ss)); break; #ifndef DISABLE_SCTP case IPPROTO_SCTP: cnx = fd_cnx_cli_connect_sctp((peer->p_hdr.info.config.pic_flags.pro3 == PI_P3_IP) ? 1 : fd_g_config->cnf_flags.no_ip6, - nc->port, &peer->p_hdr.info.pi_endpoints); + nc->port, &peer->p_hdr.info.pi_endpoints, + fd_g_config->cnf_flags.no_bind ? NULL : &fd_g_config->cnf_endpoints); break; #endif /* DISABLE_SCTP */ } diff --git a/libfdcore/p_out.c b/libfdcore/p_out.c index b410f11..ef4f6a5 100644 --- a/libfdcore/p_out.c +++ b/libfdcore/p_out.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2016, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/libfdcore/p_psm.c b/libfdcore/p_psm.c index d2a9bbd..755e133 100644 --- a/libfdcore/p_psm.c +++ b/libfdcore/p_psm.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -40,16 +40,16 @@ This file implement a Peer State Machine which is a mix of: - the state machine described in rfc3588bis - the state machine described in rfc3539#section-3.4 - the following observations. - + The delivery of Diameter messages must not always be unordered: order is important at -begining and end of a connection lifetime. It means we need agility to +beginning and end of a connection lifetime. It means we need agility to switch between "ordering enforced" and "ordering not enforced to counter Head of the Line Blocking" modes of operation. The connection state machine represented in RFC3588 (and RFC6733) is incomplete, because it lacks the SUSPECT state and the 3 DWR/DWA exchanges (section 5.1) when the peer recovers from this state. -Personnally I don't see the rationale for exchanging 3 messages (why 3?) +Personally I don't see the rationale for exchanging 3 messages (why 3?) but, if we require at least 1 DWR/DWA exchange to be always performed after the CER/CEA exchange (and initiated by the peer that sent the CEA), we have a simple way to deal with our ordering problem, as resumed @@ -96,8 +96,8 @@ they require much more time to deliver. I really cannot see a way to counter this effect by using the ordering of the messages, except by applying a timer (state STATE_CLOSING_GRACE). -This timer can be also useful when we detect that some messages has not -yet received an answer on this link, to give time to the application to +This timer can be also useful when we detect that some messages has not +yet received an answer on this link, to give time to the application to complete the exchange ongoing. However, this problem must be balanced with the fact that the message @@ -127,7 +127,7 @@ static int fd_psm_waitstart() int ret = 0; TRACE_ENTRY(""); CHECK_POSIX( pthread_mutex_lock(&started_mtx) ); -awake: +awake: if (!ret && !started) { pthread_cleanup_push( fd_cleanup_mutex, &started_mtx ); CHECK_POSIX_DO( ret = pthread_cond_wait(&started_cnd, &started_mtx), ); @@ -159,7 +159,7 @@ static int enter_open_state(struct fd_peer * peer) { struct fd_list * li; CHECK_PARAMS( FD_IS_LIST_EMPTY(&peer->p_actives) ); - + /* Callback registered by the credential validator (fd_peer_validate_register) */ if (peer->p_cb2) { CHECK_FCT_DO( (*peer->p_cb2)(&peer->p_hdr.info), @@ -170,19 +170,19 @@ static int enter_open_state(struct fd_peer * peer) peer->p_cb2 = NULL; return 0; } - + /* Insert in the active peers list */ CHECK_POSIX( pthread_rwlock_wrlock(&fd_g_activ_peers_rw) ); for (li = fd_g_activ_peers.next; li != &fd_g_activ_peers; li = li->next) { struct fd_peer * next_p = (struct fd_peer *)li->o; - int cmp = fd_os_cmp(peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen, + int cmp = fd_os_cmp(peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen, next_p->p_hdr.info.pi_diamid, next_p->p_hdr.info.pi_diamidlen); if (cmp < 0) break; } fd_list_insert_before(li, &peer->p_actives); CHECK_POSIX( pthread_rwlock_unlock(&fd_g_activ_peers_rw) ); - + /* Callback registered when the peer was added, by fd_peer_add */ if (peer->p_cb) { TRACE_DEBUG(FULL, "Calling add callback for peer %s", peer->p_hdr.info.pi_diamid); @@ -190,13 +190,13 @@ static int enter_open_state(struct fd_peer * peer) peer->p_cb = NULL; peer->p_cb_data = NULL; } - + /* Start the thread to handle outgoing messages */ CHECK_FCT( fd_out_start(peer) ); - + /* Update the expiry timer now */ CHECK_FCT( fd_p_expi_update(peer) ); - + return 0; } static int leave_open_state(struct fd_peer * peer, int skip_failover) @@ -205,15 +205,15 @@ static int leave_open_state(struct fd_peer * peer, int skip_failover) CHECK_POSIX( pthread_rwlock_wrlock(&fd_g_activ_peers_rw) ); fd_list_unlink( &peer->p_actives ); CHECK_POSIX( pthread_rwlock_unlock(&fd_g_activ_peers_rw) ); - + /* Stop the "out" thread */ CHECK_FCT( fd_out_stop(peer) ); - + /* Failover the messages */ if (!skip_failover) { fd_peer_failover_msg(peer); } - + return 0; } @@ -233,11 +233,11 @@ void fd_psm_events_free(struct fd_peer * peer) fd_cnx_destroy(ev->data); } break; - + case FDEVP_TERMINATE: /* Do not free the string since it is a constant */ break; - + case FDEVP_CNX_INCOMING: { struct cnx_incoming * evd = ev->data; fd_hook_call(HOOK_MESSAGE_DROPPED, evd->cer, NULL, "Message discarded while cleaning peer state machine queue.", fd_msg_pmdl_get(evd->cer)); @@ -255,16 +255,16 @@ void fd_psm_events_free(struct fd_peer * peer) int fd_peer_get_state(struct peer_hdr *peer) { int ret; - + struct fd_peer * p = (struct fd_peer *)peer; - + if (!CHECK_PEER(p)) return -1; - + CHECK_POSIX_DO( pthread_mutex_lock(&p->p_state_mtx), return -1 ); ret = p->p_state; CHECK_POSIX_DO( pthread_mutex_unlock(&p->p_state_mtx), return -1 ); - + return ret; } @@ -273,24 +273,24 @@ int fd_peer_get_state(struct peer_hdr *peer) int fd_psm_change_state(struct fd_peer * peer, int new_state) { int old; - + TRACE_ENTRY("%p %d(%s)", peer, new_state, STATE_STR(new_state)); CHECK_PARAMS( CHECK_PEER(peer) ); - + old = fd_peer_getstate(peer); if (old == new_state) return 0; - + LOG(((old == STATE_OPEN) || (new_state == STATE_OPEN)) ? ((new_state == STATE_SUSPECT || new_state == STATE_CLOSED) ? FD_LOG_ERROR : FD_LOG_NOTICE ): FD_LOG_DEBUG, "'%s'\t-> '%s'\t'%s'", STATE_STR(old), STATE_STR(new_state), peer->p_hdr.info.pi_diamid); - - + + CHECK_POSIX( pthread_mutex_lock(&peer->p_state_mtx) ); peer->p_state = new_state; CHECK_POSIX( pthread_mutex_unlock(&peer->p_state_mtx) ); - + if (old == STATE_OPEN) { CHECK_FCT( leave_open_state(peer, new_state == STATE_CLOSING_GRACE) ); } @@ -301,20 +301,20 @@ int fd_psm_change_state(struct fd_peer * peer, int new_state) if (new_state == STATE_OPEN) { CHECK_FCT( enter_open_state(peer) ); } - + if (new_state == STATE_CLOSED) { /* Purge event list */ fd_psm_events_free(peer); - - /* Reset the counter of pending anwers to send */ + + /* Reset the counter of pending answers to send */ peer->p_reqin_count = 0; - - /* If the peer is not persistant, we destroy it */ + + /* If the peer is not persistent, we destroy it */ if (peer->p_hdr.info.config.pic_flags.persist == PI_PRST_NONE) { CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, 0, NULL) ); } } - + return 0; } @@ -322,10 +322,10 @@ int fd_psm_change_state(struct fd_peer * peer, int new_state) void fd_psm_next_timeout(struct fd_peer * peer, int add_random, int delay) { TRACE_DEBUG(FULL, "Peer timeout reset to %d seconds%s", delay, add_random ? " (+/- 2)" : "" ); - + /* Initialize the timer */ CHECK_POSIX_DO( clock_gettime( CLOCK_REALTIME, &peer->p_psm_timer ), ASSERT(0) ); - + if (add_random) { if (delay > 2) delay -= 2; @@ -340,9 +340,9 @@ void fd_psm_next_timeout(struct fd_peer * peer, int add_random, int delay) peer->p_psm_timer.tv_sec ++; } } - + peer->p_psm_timer.tv_sec += delay; - + #ifdef SLOW_PSM /* temporary for debug */ peer->p_psm_timer.tv_sec += 10; @@ -356,29 +356,29 @@ void fd_psm_cleanup(struct fd_peer * peer, int terminate) if (fd_peer_getstate(peer) != STATE_ZOMBIE) { CHECK_FCT_DO( fd_psm_change_state(peer, STATE_CLOSED), /* continue */ ); } - + fd_p_cnx_abort(peer, terminate); - + fd_p_ce_clear_cnx(peer, NULL); - + if (peer->p_receiver) { fd_cnx_destroy(peer->p_receiver); peer->p_receiver = NULL; } - + if (terminate) { fd_psm_events_free(peer); CHECK_FCT_DO( fd_fifo_del(&peer->p_events), /* continue */ ); } - + } /************************************************************************/ /* The PSM thread */ /************************************************************************/ -/* Cancelation cleanup : set ZOMBIE state in the peer */ -void cleanup_setstate(void * arg) +/* Cancellation cleanup : set ZOMBIE state in the peer */ +void cleanup_setstate(void * arg) { struct fd_peer * peer = (struct fd_peer *)arg; CHECK_PARAMS_DO( CHECK_PEER(peer), return ); @@ -388,7 +388,7 @@ void cleanup_setstate(void * arg) return; } -/* The state machine thread (controler) */ +/* The state machine thread (controller) */ static void * p_psm_th( void * arg ) { struct fd_peer * peer = (struct fd_peer *)arg; @@ -397,18 +397,18 @@ static void * p_psm_th( void * arg ) size_t ev_sz; void * ev_data; int cur_state; - + CHECK_PARAMS_DO( CHECK_PEER(peer), ASSERT(0) ); - + pthread_cleanup_push( cleanup_setstate, arg ); - + /* Set the thread name */ { char buf[48]; snprintf(buf, sizeof(buf), "PSM/%s", peer->p_hdr.info.pi_diamid); fd_log_threadname ( buf ); } - + /* The state machine starts in CLOSED state */ CHECK_POSIX_DO( pthread_mutex_lock(&peer->p_state_mtx), goto psm_end ); peer->p_state = STATE_CLOSED; @@ -416,24 +416,24 @@ static void * p_psm_th( void * arg ) /* Wait that the PSM are authorized to start in the daemon */ CHECK_FCT_DO( fd_psm_waitstart(), goto psm_end ); - + /* Initialize the timer */ if (peer->p_flags.pf_responder) { fd_psm_next_timeout(peer, 0, INCNX_TIMEOUT); } else { fd_psm_next_timeout(peer, created_started, 0); } - + psm_loop: /* Get next event */ TRACE_DEBUG(FULL, "'%s' in state '%s' waiting for next event.", peer->p_hdr.info.pi_diamid, STATE_STR(fd_peer_getstate(peer))); CHECK_FCT_DO( fd_event_timedget(peer->p_events, &peer->p_psm_timer, FDEVP_PSM_TIMEOUT, &event, &ev_sz, &ev_data), goto psm_end ); - + cur_state = fd_peer_getstate(peer); if (cur_state == -1) goto psm_end; - + TRACE_DEBUG(FULL, "'%s'\t<-- '%s'\t(%p,%zd)\t'%s'", STATE_STR(cur_state), fd_pev_str(event), ev_data, ev_sz, @@ -462,8 +462,8 @@ psm_loop: /* We cannot just close the connection, we have to send a DPR first */ CHECK_FCT_DO( fd_p_dp_initiate(peer, ev_data), goto psm_end ); goto psm_loop; - - /* + + /* case STATE_CLOSING: case STATE_CLOSING_GRACE: case STATE_WAITCNXACK: @@ -477,30 +477,30 @@ psm_loop: goto psm_end; } } - + /* A message was received */ if (event == FDEVP_CNX_MSG_RECV) { struct msg * msg = NULL; struct msg_hdr * hdr; struct fd_cnx_rcvdata rcv_data; struct fd_msg_pmdl * pmdl = NULL; - + rcv_data.buffer = ev_data; rcv_data.length = ev_sz; pmdl = fd_msg_pmdl_get_inbuf(rcv_data.buffer, rcv_data.length); - + /* Parse the received buffer */ - CHECK_FCT_DO( fd_msg_parse_buffer( (void *)&ev_data, ev_sz, &msg), + CHECK_FCT_DO( fd_msg_parse_buffer( (void *)&ev_data, ev_sz, &msg), { fd_hook_call(HOOK_MESSAGE_PARSING_ERROR, NULL, peer, &rcv_data, pmdl ); free(ev_data); CHECK_FCT_DO( fd_event_send(peer->p_events, FDEVP_CNX_ERROR, 0, NULL), goto psm_reset ); goto psm_loop; } ); - + fd_hook_associate(msg, pmdl); CHECK_FCT_DO( fd_msg_source_set( msg, peer->p_hdr.info.pi_diamid, peer->p_hdr.info.pi_diamidlen), goto psm_end); - + /* If the current state does not allow receiving messages, just drop it */ if (cur_state == STATE_CLOSED) { /* In such case, just discard the message */ @@ -508,10 +508,10 @@ psm_loop: fd_msg_free(msg); goto psm_loop; } - + /* Extract the header */ CHECK_FCT_DO( fd_msg_hdr(msg, &hdr), goto psm_end ); - + /* If it is an answer, associate with the request or drop */ if (!(hdr->msg_flags & CMD_FLAG_REQUEST)) { struct msg * req; @@ -522,20 +522,20 @@ psm_loop: fd_msg_free(msg); goto psm_loop; } - + /* Associate */ CHECK_FCT_DO( fd_msg_answ_associate( msg, req ), goto psm_end ); - + } - + /* Log incoming message */ fd_hook_call(HOOK_MESSAGE_RECEIVED, msg, peer, NULL, fd_msg_pmdl_get(msg)); - + if (cur_state == STATE_OPEN_NEW) { /* OK, we have received something, so the connection is supposedly now in OPEN state at the remote site */ fd_psm_change_state(peer, STATE_OPEN ); } - + /* Now handle non-link-local messages */ if (fd_msg_is_routable(msg)) { switch (cur_state) { @@ -562,7 +562,7 @@ psm_loop: peer->p_reqin_count++; CHECK_POSIX_DO( pthread_mutex_unlock(&peer->p_state_mtx), goto psm_end ); } - + /* Requeue to the global incoming queue */ CHECK_FCT_DO(fd_fifo_post(fd_g_incoming, &msg), goto psm_end ); @@ -571,7 +571,7 @@ psm_loop: fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_twtimer ?: fd_g_config->cnf_timer_tw); } break; - + /* In other states, we discard the message, it is either old or invalid to send it for the remote peer */ case STATE_WAITCNXACK: case STATE_WAITCNXACK_ELEC: @@ -587,19 +587,19 @@ psm_loop: } goto psm_loop; } - + /* Link-local message: They must be understood by our dictionary, otherwise we return an error */ { struct msg * error = NULL; int ret = fd_msg_parse_or_error( &msg, &error ); if (ret != EBADMSG) { - CHECK_FCT_DO( ret, + CHECK_FCT_DO( ret, { char buf[256]; - snprintf(buf, sizeof(buf), "%s: An unexpected error occurred while parsing a link-local message", peer->p_hdr.info.pi_diamid); + snprintf(buf, sizeof(buf), "%s: An unexpected error occurred while parsing a link-local message", peer->p_hdr.info.pi_diamid); fd_hook_call(HOOK_MESSAGE_DROPPED, msg, peer, buf, fd_msg_pmdl_get(msg)); - fd_msg_free(msg); - goto psm_end; + fd_msg_free(msg); + goto psm_end; } ); } else { if (msg == NULL) { @@ -608,7 +608,7 @@ psm_loop: if (error) { char buf[256]; /* Only if an error occurred & the message was not saved / dumped */ - snprintf(buf, sizeof(buf), "%s: error sending a message", peer->p_hdr.info.pi_diamid); + snprintf(buf, sizeof(buf), "%s: error sending a message", peer->p_hdr.info.pi_diamid); fd_hook_call(HOOK_MESSAGE_DROPPED, error, peer, buf, fd_msg_pmdl_get(error)); CHECK_FCT_DO( fd_msg_free(error), goto psm_end); } @@ -623,29 +623,29 @@ psm_loop: goto psm_loop; } } - + /* Handle the LL message and update the expiry timer appropriately */ switch (hdr->msg_code) { case CC_CAPABILITIES_EXCHANGE: - CHECK_FCT_DO( fd_p_ce_msgrcv(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer), + CHECK_FCT_DO( fd_p_ce_msgrcv(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer), { if (msg) CHECK_FCT_DO( fd_msg_free(msg), ); goto psm_reset; } ); break; - + case CC_DISCONNECT_PEER: CHECK_FCT_DO( fd_p_dp_handle(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer), goto psm_reset ); if (fd_peer_getstate(peer) == STATE_CLOSING) goto psm_end; break; - + case CC_DEVICE_WATCHDOG: CHECK_FCT_DO( fd_p_dw_handle(&msg, (hdr->msg_flags & CMD_FLAG_REQUEST), peer), goto psm_reset ); break; - + default: /* Unknown / unexpected / invalid message -- but validated by our dictionary */ TRACE_DEBUG(INFO, "Invalid non-routable command received: %u.", hdr->msg_code); @@ -664,7 +664,7 @@ psm_loop: /* We did ASK for it ??? */ TRACE_DEBUG(INFO, "Received answer with erroneous 'is_routable' result..."); } - + /* Cleanup the message if not done */ if (msg) { char buf[256]; @@ -674,7 +674,7 @@ psm_loop: msg = NULL; } }; - + /* At this point the message must have been fully handled already */ if (msg) { char buf[256]; @@ -682,10 +682,10 @@ psm_loop: fd_hook_call(HOOK_MESSAGE_DROPPED, msg, NULL, buf, fd_msg_pmdl_get(msg)); fd_msg_free(msg); } - + goto psm_loop; } - + /* The connection object is broken */ if (event == FDEVP_CNX_ERROR) { switch (cur_state) { @@ -695,7 +695,7 @@ psm_loop: /* Process the receiver side */ CHECK_FCT_DO( fd_p_ce_process_receiver(peer), goto psm_end ); break; - + case STATE_WAITCEA: case STATE_OPEN: case STATE_OPEN_NEW: @@ -705,43 +705,43 @@ psm_loop: default: /* Mark the connection problem */ peer->p_flags.pf_cnx_pb = 1; - + fd_hook_call(HOOK_PEER_CONNECT_FAILED, NULL, peer, "The connection was broken", NULL); - + /* Destroy the connection, restart the timer to a new connection attempt */ fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); - + case STATE_CLOSED: goto psm_reset; - + case STATE_CLOSING: /* We sent a DPR so we are terminating, do not wait for DPA */ goto psm_end; - + case STATE_CLOSING_GRACE: if (peer->p_flags.pf_localterm) /* initiated here */ goto psm_end; - + fd_psm_cleanup(peer, 0); - + /* Reset the timer for next connection attempt */ fd_psm_next_timeout(peer, 1, fd_p_dp_newdelay(peer)); goto psm_loop; } goto psm_loop; } - + /* The connection notified a change in endpoints */ if (event == FDEVP_CNX_EP_CHANGE) { /* We actually don't care if we are in OPEN state here... */ - + /* Cleanup the remote LL and primary addresses */ CHECK_FCT_DO( fd_ep_filter( &peer->p_hdr.info.pi_endpoints, EP_FL_CONF | EP_FL_DISC | EP_FL_ADV ), /* ignore the error */); CHECK_FCT_DO( fd_ep_clearflags( &peer->p_hdr.info.pi_endpoints, EP_FL_PRIMARY ), /* ignore the error */); - + /* Get the new ones */ CHECK_FCT_DO( fd_cnx_getremoteeps(peer->p_cnxctx, &peer->p_hdr.info.pi_endpoints), /* ignore the error */); - + /* We do not support local endpoints change currently, but it could be added here if needed (refresh fd_g_config->cnf_endpoints) */ { char * buf = NULL; @@ -749,19 +749,19 @@ psm_loop: LOG_D("Got low layer notification (IGNORED): remote endpoint(s) changed: %s", fd_ep_dump(&buf, &len, NULL, 0, 0, &peer->p_hdr.info.pi_endpoints) ?: "error"); free(buf); } - + /* Done */ goto psm_loop; } - + /* A new connection was established and CER containing this peer id was received */ if (event == FDEVP_CNX_INCOMING) { struct cnx_incoming * params = ev_data; ASSERT(params); - + /* Handle the message */ CHECK_FCT_DO( fd_p_ce_handle_newCER(¶ms->cer, peer, ¶ms->cnx, params->validate), goto psm_end ); - + /* Cleanup if needed */ if (params->cnx) { fd_cnx_destroy(params->cnx); @@ -771,43 +771,43 @@ psm_loop: CHECK_FCT_DO( fd_msg_free(params->cer), ); params->cer = NULL; } - + /* Loop */ free(ev_data); goto psm_loop; } - + /* A new connection has been established with the remote peer */ if (event == FDEVP_CNX_ESTABLISHED) { struct cnxctx * cnx = ev_data; - + /* Release the resources of the connecting thread */ CHECK_POSIX_DO( pthread_join( peer->p_ini_thr, NULL), /* ignore, it is not a big deal */); peer->p_ini_thr = (pthread_t)NULL; - + switch (cur_state) { case STATE_WAITCNXACK_ELEC: case STATE_WAITCNXACK: LOG_D("%s: Connection established, %s", peer->p_hdr.info.pi_diamid, fd_cnx_getid(cnx)); fd_p_ce_handle_newcnx(peer, cnx); break; - + default: /* Just abort the attempt and continue */ TRACE_DEBUG(FULL, "Connection attempt successful but current state is %s, closing... (too slow?)", STATE_STR(cur_state)); fd_cnx_destroy(cnx); } - + goto psm_loop; } - + /* A new connection has not been established with the remote peer */ if (event == FDEVP_CNX_FAILED) { - + /* Release the resources of the connecting thread */ CHECK_POSIX_DO( pthread_join( peer->p_ini_thr, NULL), /* ignore, it is not a big deal */); peer->p_ini_thr = (pthread_t)NULL; - + switch (cur_state) { case STATE_WAITCNXACK_ELEC: /* Abort the initiating side */ @@ -815,20 +815,20 @@ psm_loop: /* Process the receiver side */ CHECK_FCT_DO( fd_p_ce_process_receiver(peer), goto psm_end ); break; - + case STATE_WAITCNXACK: /* Go back to CLOSE */ fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); goto psm_reset; - + default: /* Just ignore */ TRACE_DEBUG(FULL, "Connection attempt failed but current state is %s, ignoring...", STATE_STR(cur_state)); } - + goto psm_loop; } - + /* The timeout for the current state has been reached */ if (event == FDEVP_PSM_TIMEOUT) { switch (cur_state) { @@ -837,14 +837,14 @@ psm_loop: case STATE_OPEN_NEW: CHECK_FCT_DO( fd_p_dw_timeout(peer), goto psm_end ); goto psm_loop; - + case STATE_CLOSED: LOG_D("%s: Connecting...", peer->p_hdr.info.pi_diamid); CHECK_FCT_DO( fd_psm_change_state(peer, STATE_WAITCNXACK), goto psm_end ); fd_psm_next_timeout(peer, 0, CNX_TIMEOUT); CHECK_FCT_DO( fd_p_cnx_init(peer), goto psm_end ); goto psm_loop; - + case STATE_SUSPECT: /* Mark the connection problem */ peer->p_flags.pf_cnx_pb = 1; @@ -855,29 +855,29 @@ psm_loop: /* Destroy the connection, restart the timer to a new connection attempt */ fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc); goto psm_reset; - + case STATE_CLOSING_GRACE: /* The grace period is completed, now close */ if (peer->p_flags.pf_localterm) goto psm_end; - + fd_psm_cleanup(peer, 0); /* Reset the timer for next connection attempt */ fd_psm_next_timeout(peer, 1, fd_p_dp_newdelay(peer)); goto psm_loop; - + case STATE_WAITCNXACK_ELEC: /* Abort the initiating side */ fd_p_cnx_abort(peer, 0); /* Process the receiver side */ CHECK_FCT_DO( fd_p_ce_process_receiver(peer), goto psm_end ); goto psm_loop; - + default: ASSERT(0); /* implementation problem, we did not foresee this case? */ } } - + /* Default action : the handling has not yet been implemented. [for debug only] */ TRACE_DEBUG(INFO, "Missing handler in PSM for '%s'\t<-- '%s'", STATE_STR(cur_state), fd_pev_str(event)); psm_reset: @@ -885,7 +885,7 @@ psm_reset: goto psm_end; fd_psm_cleanup(peer, 0); goto psm_loop; - + psm_end: cur_state = fd_peer_getstate(peer); if ((cur_state == STATE_CLOSING) || (cur_state == STATE_CLOSING_GRACE)) { @@ -911,16 +911,16 @@ psm_end: int fd_psm_begin(struct fd_peer * peer ) { TRACE_ENTRY("%p", peer); - + /* Check the peer and state are OK */ CHECK_PARAMS( fd_peer_getstate(peer) == STATE_NEW ); - + /* Create the FIFO for events */ CHECK_FCT( fd_fifo_new(&peer->p_events, 0) ); - - /* Create the PSM controler thread */ + + /* Create the PSM controller thread */ CHECK_POSIX( pthread_create( &peer->p_psm, NULL, p_psm_th, peer ) ); - + /* We're done */ return 0; } @@ -930,7 +930,7 @@ int fd_psm_terminate(struct fd_peer * peer, char * reason ) { TRACE_ENTRY("%p", peer); CHECK_PARAMS( CHECK_PEER(peer) ); - + if (fd_peer_getstate(peer) != STATE_ZOMBIE) { CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, 0, reason) ); } else { @@ -943,16 +943,16 @@ int fd_psm_terminate(struct fd_peer * peer, char * reason ) void fd_psm_abord(struct fd_peer * peer ) { TRACE_ENTRY("%p", peer); - + /* Cancel PSM thread */ CHECK_FCT_DO( fd_thr_term(&peer->p_psm), /* continue */ ); - + /* Cleanup the data */ fd_psm_cleanup(peer, 1); - + /* Destroy the event list */ CHECK_FCT_DO( fd_fifo_del(&peer->p_events), /* continue */ ); - + /* Remaining cleanups are performed in fd_peer_free */ return; } diff --git a/libfdcore/peers.c b/libfdcore/peers.c index 98f1921..5ac9ccf 100644 --- a/libfdcore/peers.c +++ b/libfdcore/peers.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -40,7 +40,7 @@ struct fd_list fd_g_peers = FD_LIST_INITIALIZER(fd_g_peers); pthread_rwlock_t fd_g_peers_rw = PTHREAD_RWLOCK_INITIALIZER; /* List of active peers */ -struct fd_list fd_g_activ_peers = FD_LIST_INITIALIZER(fd_g_activ_peers); /* peers linked by their p_actives oredered by p_diamid */ +struct fd_list fd_g_activ_peers = FD_LIST_INITIALIZER(fd_g_activ_peers); /* peers linked by their p_actives ordered by p_diamid */ pthread_rwlock_t fd_g_activ_peers_rw = PTHREAD_RWLOCK_INITIALIZER; /* List of validation callbacks (registered with fd_peer_validate_register) */ diff --git a/libfdcore/queues.c b/libfdcore/queues.c index b317d34..561eaec 100644 --- a/libfdcore/queues.c +++ b/libfdcore/queues.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -44,9 +44,19 @@ struct fifo * fd_g_local = NULL; int fd_queues_init(void) { TRACE_ENTRY(); - CHECK_FCT( fd_fifo_new ( &fd_g_incoming, 20 ) ); - CHECK_FCT( fd_fifo_new ( &fd_g_outgoing, 30 ) ); - CHECK_FCT( fd_fifo_new ( &fd_g_local, 25 ) ); + CHECK_FCT( fd_fifo_new ( &fd_g_incoming, fd_g_config->cnf_qin_limit ) ); + CHECK_FCT( fd_fifo_new ( &fd_g_outgoing, fd_g_config->cnf_qout_limit ) ); + CHECK_FCT( fd_fifo_new ( &fd_g_local, fd_g_config->cnf_qlocal_limit ) ); + return 0; +} + +/* Resize according to values given in configuration file */ +int fd_queues_init_after_conf(void) +{ + TRACE_ENTRY(); + CHECK_FCT( fd_fifo_set_max ( fd_g_incoming, fd_g_config->cnf_qin_limit ) ); + CHECK_FCT( fd_fifo_set_max ( fd_g_outgoing, fd_g_config->cnf_qout_limit ) ); + CHECK_FCT( fd_fifo_set_max ( fd_g_local, fd_g_config->cnf_qlocal_limit ) ); return 0; } diff --git a/libfdcore/routing_dispatch.c b/libfdcore/routing_dispatch.c index a147d79..20d8e7f 100644 --- a/libfdcore/routing_dispatch.c +++ b/libfdcore/routing_dispatch.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -35,6 +35,13 @@ #include "fdcore-internal.h" +#ifdef linux +/* This needs -D_USE_GNU, and since I have no idea what else that does, let's simply copy the declaration. */ + +/* Set thread name visible in the kernel and its interfaces. */ +extern int pthread_setname_np (pthread_t __target_thread, const char *__name); +#endif + /********************************************************************************/ /* First part : handling the extensions callbacks */ /********************************************************************************/ @@ -1152,28 +1159,44 @@ static void * routing_out_thr(void * arg) static pthread_t * dispatch = NULL; static enum thread_state * disp_state = NULL; -/* Later: make this more dynamic */ -static pthread_t rt_out = (pthread_t)NULL; -static enum thread_state out_state = NOTRUNNING; +static pthread_t * rt_out = NULL; +static enum thread_state * out_state = NULL; -static pthread_t rt_in = (pthread_t)NULL; -static enum thread_state in_state = NOTRUNNING; +static pthread_t * rt_in = NULL; +static enum thread_state * in_state = NULL; /* Initialize the routing and dispatch threads */ int fd_rtdisp_init(void) { int i; - /* Prepare the array for dispatch */ + /* Prepare the array for threads */ CHECK_MALLOC( disp_state = calloc(fd_g_config->cnf_dispthr, sizeof(enum thread_state)) ); CHECK_MALLOC( dispatch = calloc(fd_g_config->cnf_dispthr, sizeof(pthread_t)) ); + CHECK_MALLOC( out_state = calloc(fd_g_config->cnf_rtoutthr, sizeof(enum thread_state)) ); + CHECK_MALLOC( rt_out = calloc(fd_g_config->cnf_rtoutthr, sizeof(pthread_t)) ); + CHECK_MALLOC( in_state = calloc(fd_g_config->cnf_rtinthr, sizeof(enum thread_state)) ); + CHECK_MALLOC( rt_in = calloc(fd_g_config->cnf_rtinthr, sizeof(pthread_t)) ); /* Create the threads */ for (i=0; i < fd_g_config->cnf_dispthr; i++) { CHECK_POSIX( pthread_create( &dispatch[i], NULL, dispatch_thr, &disp_state[i] ) ); +#ifdef linux + pthread_setname_np(dispatch[i], "fd-dispatch"); +#endif + } + for (i=0; i < fd_g_config->cnf_rtoutthr; i++) { + CHECK_POSIX( pthread_create( &rt_out[i], NULL, routing_out_thr, &out_state[i] ) ); +#ifdef linux + pthread_setname_np(rt_out[i], "fd-routing-out"); +#endif + } + for (i=0; i < fd_g_config->cnf_rtinthr; i++) { + CHECK_POSIX( pthread_create( &rt_in[i], NULL, routing_in_thr, &in_state[i] ) ); +#ifdef linux + pthread_setname_np(rt_in[i], "fd-routing-in"); +#endif } - CHECK_POSIX( pthread_create( &rt_out, NULL, routing_out_thr, &out_state) ); - CHECK_POSIX( pthread_create( &rt_in, NULL, routing_in_thr, &in_state) ); /* Later: TODO("Set the thresholds for the queues to create more threads as needed"); */ @@ -1244,13 +1267,33 @@ int fd_rtdisp_fini(void) CHECK_FCT_DO( fd_queues_fini(&fd_g_incoming), /* ignore */); /* Stop the routing IN thread */ - stop_thread_delayed(&in_state, &rt_in, "IN routing"); + if (rt_in != NULL) { + for (i=0; i < fd_g_config->cnf_rtinthr; i++) { + stop_thread_delayed(&in_state[i], &rt_in[i], "IN routing"); + } + free(rt_in); + rt_in = NULL; + } + if (in_state != NULL) { + free(in_state); + in_state = NULL; + } /* Destroy the outgoing queue */ CHECK_FCT_DO( fd_queues_fini(&fd_g_outgoing), /* ignore */); /* Stop the routing OUT thread */ - stop_thread_delayed(&out_state, &rt_out, "OUT routing"); + if (rt_out != NULL) { + for (i=0; i < fd_g_config->cnf_rtinthr; i++) { + stop_thread_delayed(&out_state[i], &rt_out[i], "OUT routing"); + } + free(rt_out); + rt_out = NULL; + } + if (out_state != NULL) { + free(out_state); + out_state = NULL; + } /* Destroy the local queue */ CHECK_FCT_DO( fd_queues_fini(&fd_g_local), /* ignore */); diff --git a/libfdcore/sctp.c b/libfdcore/sctp.c index cf7974a..9305b31 100644 --- a/libfdcore/sctp.c +++ b/libfdcore/sctp.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -48,7 +48,7 @@ /* #define OLD_SCTP_SOCKET_API */ /* Automatically fallback to old API if some of the new symbols are not defined */ -#if (!defined(SCTP_CONNECTX_4_ARGS) || (!defined(SCTP_RECVRCVINFO)) || (!defined(SCTP_SNDINFO))) +#if (!defined(SCTP_CONNECTX_4_ARGS) || (!defined(SCTP_RECVRCVINFO)) || (!defined(SCTP_SNDINFO)) || (!defined(SCTP_SEND_FAILED_EVENT))) # define OLD_SCTP_SOCKET_API #endif @@ -58,6 +58,34 @@ #define ADJUST_RTX_PARAMS #endif /* USE_DEFAULT_SCTP_RTX_PARAMS */ + +DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump_array, sSA * saddrs, int saddrs_count) +{ + union { + sSA *sa; + uint8_t *buf; + } ptr; + int i; + int salen; + + FD_DUMP_HANDLE_OFFSET(); + + ptr.sa = saddrs; + for (i = 0; i < saddrs_count; i++) { + salen = sSAlen(ptr.sa); + if (salen == 0) { + LOG_E("fd_sa_dump_array: Unknown sockaddr family"); + break; + } + if (i > 0) { + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " "), return NULL); + } + CHECK_MALLOC_DO( fd_sa_dump( FD_DUMP_STD_PARAMS, ptr.sa, NI_NUMERICHOST | NI_NUMERICSERV), return NULL); + ptr.buf += salen; + } + return *buf; +} + /* Pre-binding socket options -- # streams read in config */ static int fd_setsockopt_prebind(int sk) { @@ -82,7 +110,7 @@ static int fd_setsockopt_prebind(int sk) if (TRACE_BOOL(ANNOYING)) { sz = sizeof(rtoinfo); /* Read socket defaults */ - CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_RTOINFO, &rtoinfo, &sz) ); + CHECK_SYS( sctp_opt_info(sk, 0, SCTP_RTOINFO, &rtoinfo, &sz) ); if (sz != sizeof(rtoinfo)) { TRACE_DEBUG(INFO, "Invalid size of socket option: %d / %d", sz, (socklen_t)sizeof(rtoinfo)); @@ -102,7 +130,7 @@ static int fd_setsockopt_prebind(int sk) if (TRACE_BOOL(ANNOYING)) { /* Check new values */ - CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_RTOINFO, &rtoinfo, &sz) ); + CHECK_SYS( sctp_opt_info(sk, 0, SCTP_RTOINFO, &rtoinfo, &sz) ); fd_log_debug( "New SCTP_RTOINFO : srto_initial : %u", rtoinfo.srto_initial); fd_log_debug( " srto_max : %u", rtoinfo.srto_max); fd_log_debug( " srto_min : %u", rtoinfo.srto_min); @@ -121,7 +149,7 @@ static int fd_setsockopt_prebind(int sk) if (TRACE_BOOL(ANNOYING)) { sz = sizeof(assoc); /* Read socket defaults */ - CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_ASSOCINFO, &assoc, &sz) ); + CHECK_SYS( sctp_opt_info(sk, 0, SCTP_ASSOCINFO, &assoc, &sz) ); if (sz != sizeof(assoc)) { TRACE_DEBUG(INFO, "Invalid size of socket option: %d / %d", sz, (socklen_t)sizeof(assoc)); @@ -142,7 +170,7 @@ static int fd_setsockopt_prebind(int sk) if (TRACE_BOOL(ANNOYING)) { /* Check new values */ - CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_ASSOCINFO, &assoc, &sz) ); + CHECK_SYS( sctp_opt_info(sk, 0, SCTP_ASSOCINFO, &assoc, &sz) ); fd_log_debug( "New SCTP_ASSOCINFO : sasoc_asocmaxrxt : %hu", assoc.sasoc_asocmaxrxt); fd_log_debug( " sasoc_number_peer_destinations : %hu", assoc.sasoc_number_peer_destinations); fd_log_debug( " sasoc_peer_rwnd : %u" , assoc.sasoc_peer_rwnd); @@ -318,7 +346,7 @@ static int fd_setsockopt_prebind(int sk) sz = sizeof(parms); /* Read socket defaults */ - CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &parms, &sz) ); + CHECK_SYS( sctp_opt_info(sk, 0, SCTP_PEER_ADDR_PARAMS, &parms, &sz) ); if (sz != sizeof(parms)) { TRACE_DEBUG(INFO, "Invalid size of socket option: %d / %d", sz, (socklen_t)sizeof(parms)); @@ -347,7 +375,7 @@ static int fd_setsockopt_prebind(int sk) if (TRACE_BOOL(ANNOYING)) { /* Check new values */ - CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &parms, &sz) ); + CHECK_SYS( sctp_opt_info(sk, 0, SCTP_PEER_ADDR_PARAMS, &parms, &sz) ); fd_log_debug( "New SCTP_PEER_ADDR_PARAMS : spp_hbinterval : %u", parms.spp_hbinterval); fd_log_debug( " spp_pathmaxrxt : %hu", parms.spp_pathmaxrxt); fd_log_debug( " spp_pathmtu : %u", parms.spp_pathmtu); @@ -814,21 +842,16 @@ redo: bind_default = 1; goto redo; } - - #if 0 - union { - sSA *sa; - uint8_t *buf; - } ptr; - int i; - ptr.sa = sar; - fd_log_debug("Calling sctp_bindx with the following address array:"); - for (i = 0; i < count; i++) { - TRACE_sSA(FD_LOG_DEBUG, FULL, " - ", ptr.sa, NI_NUMERICHOST | NI_NUMERICSERV, "" ); - ptr.buf += (ptr.sa->sa_family == AF_INET) ? sizeof(sSA4) : sizeof(sSA6) ; - } - #endif - + + /* Debug: show bound addresses */ + { + char * buf = NULL; + size_t len = 0; + CHECK_MALLOC_DO( fd_sa_dump_array( &buf, &len, 0, sar, count), ); + LOG_D("SCTP server binding local addresses: %s", buf); + free(buf); + } + /* Bind to this array */ CHECK_SYS( sctp_bindx(*sock, sar, count, SCTP_BINDX_ADD_ADDR) ); @@ -840,22 +863,19 @@ redo: CHECK_FCT( fd_setsockopt_postbind(*sock, bind_default) ); /* Debug: show all local listening addresses */ - #if 0 - sSA *sar; - union { - sSA *sa; - uint8_t *buf; - } ptr; - int sz; - + { + sSA *sar = NULL; + int sz = 0; + char * buf = NULL; + size_t len = 0; + CHECK_SYS( sz = sctp_getladdrs(*sock, 0, &sar) ); - - fd_log_debug("SCTP server bound on :"); - for (ptr.sa = sar; sz-- > 0; ptr.buf += (ptr.sa->sa_family == AF_INET) ? sizeof(sSA4) : sizeof(sSA6)) { - TRACE_sSA(FD_LOG_DEBUG, FULL, " - ", ptr.sa, NI_NUMERICHOST | NI_NUMERICSERV, "" ); - } + + CHECK_MALLOC_DO( fd_sa_dump_array( &buf, &len, 0, sar, sz), ); + LOG_D("SCTP server locally bound addresses: %s", buf); sctp_freeladdrs(sar); - #endif + free(buf); + } return 0; } @@ -869,7 +889,7 @@ int fd_sctp_listen( int sock ) } /* Create a client socket and connect to remote server */ -int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list ) +int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list, struct fd_list * src_list ) { int family; union { @@ -879,11 +899,13 @@ int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list size_t size = 0; int count = 0; int ret; + int bind_default = 1; /* enable ASCONF in postbind */ sar.buf = NULL; - TRACE_ENTRY("%p %i %hu %p", sock, no_ip6, port, list); + TRACE_ENTRY("%p %i %hu %p %p", sock, no_ip6, port, list, src_list); CHECK_PARAMS( sock && list && (!FD_IS_LIST_EMPTY(list)) ); + CHECK_PARAMS( !src_list || (src_list && (!FD_IS_LIST_EMPTY(src_list))) ); if (no_ip6) { family = AF_INET; @@ -899,31 +921,47 @@ int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list /* Set the socket options */ CHECK_FCT_DO( ret = fd_setsockopt_prebind(*sock), goto out ); - + + /* Bind to explicit source addresses if requested */ + if (src_list && !FD_IS_LIST_EMPTY(src_list)) { + sSA * bindsar = NULL; /* array of addresses */ + size_t sz = 0; /* size of the array */ + int sarcount = 0; /* number of sock addr in the array */ + + /* Create the array of configured addresses */ + CHECK_FCT_DO( ret = add_addresses_from_list_mask((void *)&bindsar, &sz, &sarcount, family, 0, src_list, EP_FL_CONF, EP_FL_CONF), goto out ); + + if (sarcount) { + char * buf = NULL; + size_t len = 0; + CHECK_MALLOC_DO( fd_sa_dump_array( &buf, &len, 0, bindsar, sarcount), goto out ); + LOG_A("SCTP client binding local addresses: %s", buf); + free(buf); + + CHECK_SYS_DO( ret = sctp_bindx(*sock, bindsar, sarcount, SCTP_BINDX_ADD_ADDR), goto out ); + } + + /* Disable ASCONF option in postbind */ + bind_default = 0; + + /* We don't need bindsar anymore */ + free(bindsar); + } + /* Create the array of addresses, add first the configured addresses, then the discovered, then the other ones */ CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF, EP_FL_CONF ), goto out ); CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF | EP_FL_DISC, EP_FL_DISC ), goto out ); CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF | EP_FL_DISC, 0 ), goto out ); /* Try connecting */ - LOG_A("Attempting SCTP connection (%d addresses attempted) ", count); - -#if 0 - /* Dump the SAs */ - union { - uint8_t *buf; - sSA *sa; - sSA4 *sin; - sSA6 *sin6; - } ptr; - int i; - ptr.buf = sar.buf; - for (i=0; i< count; i++) { - TRACE_sSA(FD_LOG_DEBUG, FULL, " - ", ptr.sa, NI_NUMERICHOST | NI_NUMERICSERV, "" ); - ptr.buf += (ptr.sa->sa_family == AF_INET) ? sizeof(sSA4) : sizeof(sSA6); - } -#endif - + { + char * buf = NULL; + size_t len = 0; + CHECK_MALLOC_DO( fd_sa_dump_array( &buf, &len, 0, sar.sa, count), goto out ); + LOG_A("SCTP client connecting to addresses: %s", buf); + free(buf); + } + /* Bug in some Linux kernel, the sctp_connectx is not a cancellation point. To avoid blocking freeDiameter, we allow async cancel here */ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); #ifdef SCTP_CONNECTX_4_ARGS @@ -944,7 +982,7 @@ int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list free(sar.buf); sar.buf = NULL; /* Set the remaining sockopts */ - CHECK_FCT_DO( ret = fd_setsockopt_postbind(*sock, 1), + CHECK_FCT_DO( ret = fd_setsockopt_postbind(*sock, bind_default), { CHECK_SYS_DO( shutdown(*sock, SHUT_RDWR), /* continue */ ); } ); @@ -982,7 +1020,7 @@ int fd_sctp_get_str_info( int sock, uint16_t *in, uint16_t *out, sSS *primary ) } #if 0 char sa_buf[sSA_DUMP_STRLEN]; - fd_sa_sdump_numeric(sa_buf, &status.sstat_primary.spinfo_address); + fd_sa_sdump_numeric(sa_buf, (sSA *)&status.sstat_primary.spinfo_address); fd_log_debug( "SCTP_STATUS : sstat_state : %i" , status.sstat_state); fd_log_debug( " sstat_rwnd : %u" , status.sstat_rwnd); fd_log_debug( " sstat_unackdata : %hu", status.sstat_unackdata); @@ -1218,6 +1256,7 @@ again: /* Handle the case where the data received is a notification */ if (mhdr.msg_flags & MSG_NOTIFICATION) { union sctp_notification * notif = (union sctp_notification *) data; + char sa_buf[sSA_DUMP_STRLEN]; TRACE_DEBUG(FULL, "Received %zdb data of notification on socket %d", datasize, conn->cc_socket); @@ -1235,7 +1274,8 @@ again: case SCTP_PEER_ADDR_CHANGE: TRACE_DEBUG(FULL, "Received SCTP_PEER_ADDR_CHANGE notification"); - /* TRACE_sSA(FD_LOG_DEBUG, ANNOYING, " intf_change : ", &(notif->sn_paddr_change.spc_aaddr), NI_NUMERICHOST | NI_NUMERICSERV, "" ); */ + fd_sa_sdump_numeric(sa_buf, (sSA *)&(notif->sn_paddr_change.spc_aaddr)); + TRACE_DEBUG(ANNOYING, " intf_change : %s", sa_buf); TRACE_DEBUG(ANNOYING, " state : %d", notif->sn_paddr_change.spc_state); TRACE_DEBUG(ANNOYING, " error : %d", notif->sn_paddr_change.spc_error); @@ -1271,10 +1311,12 @@ again: break; #ifndef OLD_SCTP_SOCKET_API +#ifdef SCTP_NOTIFICATIONS_STOPPED_EVENT case SCTP_NOTIFICATIONS_STOPPED_EVENT: TRACE_DEBUG(INFO, "Received SCTP_NOTIFICATIONS_STOPPED_EVENT notification, marking the association in error state"); *event = FDEVP_CNX_ERROR; break; +#endif /* SCTP_NOTIFICATIONS_STOPPED_EVENT */ #endif /* OLD_SCTP_SOCKET_API */ default: diff --git a/libfdcore/sctp3436.c b/libfdcore/sctp3436.c index c7c7d04..28a244b 100644 --- a/libfdcore/sctp3436.c +++ b/libfdcore/sctp3436.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -137,7 +137,7 @@ fatal: static void * decipher(void * arg) { struct sctp3436_ctx * ctx = arg; - struct cnxctx *cnx; + struct cnxctx *cnx = NULL; TRACE_ENTRY("%p", arg); CHECK_PARAMS_DO(ctx && ctx->raw_recv && ctx->parent, goto error); diff --git a/libfdproto/dictionary-internal.h b/libfdproto/dictionary-internal.h new file mode 100644 index 0000000..47842b6 --- /dev/null +++ b/libfdproto/dictionary-internal.h @@ -0,0 +1,136 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Sebastien Decugis <sdecugis@freediameter.net> * +* * +* Copyright (c) 2020, WIDE Project and NICT * +* All rights reserved. * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the WIDE Project or NICT nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of WIDE Project and * +* NICT. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + +#ifndef HAD_DICTIONARY_INTERNAL_H +#define HAD_DICTIONARY_INTERNAL_H + +/* Names of the base types */ +extern const char * type_base_name[]; + +/* The number of lists in an object */ +#define NB_LISTS_PER_OBJ 3 + +/* Definition of the dictionary objects */ +struct dict_object { + enum dict_object_type type; /* What type of object is this? */ + int objeyec;/* eyecatcher for this object */ + int typeyec;/* eyecatcher for this type of object */ + struct dictionary *dico; /* The dictionary this object belongs to */ + + union { + struct dict_vendor_data vendor; /* datastr_len = strlen(vendor_name) */ + struct dict_application_data application; /* datastr_len = strlen(application_name) */ + struct dict_type_data type; /* datastr_len = strlen(type_name) */ + struct dict_enumval_data enumval; /* datastr_len = strlen(enum_name) */ + struct dict_avp_data avp; /* datastr_len = strlen(avp_name) */ + struct dict_cmd_data cmd; /* datastr_len = strlen(cmd_name) */ + struct dict_rule_data rule; /* datastr_len = 0 */ + } data; /* The data of this object */ + + size_t datastr_len; /* cached length of the string inside the data. Saved when the object is created. */ + + struct dict_object * parent; /* The parent of this object, if any */ + + struct fd_list list[NB_LISTS_PER_OBJ];/* used to chain objects.*/ + /* More information about the lists : + + - the use for each list depends on the type of object. See detail below. + + - a sentinel for a list has its 'o' field cleared. (this is the criteria to detect end of a loop) + + - The lists are always ordered. The criteria are described below. the functions to order them are referenced in dict_obj_info + + - The dict_lock must be held for any list operation. + + => VENDORS: + list[0]: list of the vendors, ordered by their id. The sentinel is g_dict_vendors (vendor with id 0) + list[1]: sentinel for the list of AVPs from this vendor, ordered by AVP code. + list[2]: sentinel for the list of AVPs from this vendor, ordered by AVP name (fd_os_cmp). + + => APPLICATIONS: + list[0]: list of the applications, ordered by their id. The sentinel is g_dict_applications (application with id 0) + list[1]: not used + list[2]: not used. + + => TYPES: + list[0]: list of the types, ordered by their names. The sentinel is g_list_types. + list[1]: sentinel for the type_enum list of this type, ordered by their constant name (fd_os_cmp). + list[2]: sentinel for the type_enum list of this type, ordered by their constant value. + + => TYPE_ENUMS: + list[0]: list of the contants for a given type, ordered by the constant name (fd_os_cmp). Sentinel is a (list[1]) element of a TYPE object. + list[1]: list of the contants for a given type, ordered by the constant value. Sentinel is a (list[2]) element of a TYPE object. + list[2]: not used + + => AVPS: + list[0]: list of the AVP from a given vendor, ordered by avp code. Sentinel is a list[1] element of a VENDOR object. + list[1]: list of the AVP from a given vendor, ordered by avp name (fd_os_cmp). Sentinel is a list[2] element of a VENDOR object. + list[2]: sentinel for the rule list that apply to this AVP. + + => COMMANDS: + list[0]: list of the commands, ordered by their names (fd_os_cmp). The sentinel is g_list_cmd_name. + list[1]: list of the commands, ordered by their command code and 'R' flag. The sentinel is g_list_cmd_code. + list[2]: sentinel for the rule list that apply to this command. + + => RULES: + list[0]: list of the rules for a given (grouped) AVP or Command, ordered by the AVP vendor & code to which they refer. sentinel is list[2] of a command or (grouped) avp. + list[1]: not used + list[2]: not used. + + */ + + /* Sentinel for the dispatch callbacks */ + struct fd_list disp_cbs; + +}; + +/* Definition of the dictionary structure */ +struct dictionary { + int dict_eyec; /* Eye-catcher for the dictionary (DICT_EYECATCHER) */ + + pthread_rwlock_t dict_lock; /* The global rwlock for the dictionary */ + + struct dict_object dict_vendors; /* Sentinel for the list of vendors, corresponding to vendor 0 */ + struct dict_object dict_applications; /* Sentinel for the list of applications, corresponding to app 0 */ + struct fd_list dict_types; /* Sentinel for the list of types */ + struct fd_list dict_cmd_name; /* Sentinel for the list of commands, ordered by names */ + struct fd_list dict_cmd_code; /* Sentinel for the list of commands, ordered by codes */ + + struct dict_object dict_cmd_error; /* Special command object for answers with the 'E' bit set */ + + int dict_count[DICT_TYPE_MAX + 1]; /* Number of objects of each type */ +}; + +#endif /* HAD_DICTIONARY_INTERNAL_H */ diff --git a/libfdproto/dictionary.c b/libfdproto/dictionary.c index ff902a0..9476555 100644 --- a/libfdproto/dictionary.c +++ b/libfdproto/dictionary.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -34,6 +34,7 @@ *********************************************************************************************************/ #include "fdproto-internal.h" +#include "dictionary-internal.h" #include <inttypes.h> /* Names of the base types */ @@ -48,104 +49,10 @@ const char * type_base_name[] = { /* must keep in sync with dict_avp_basetype */ "FLOAT64" /* AVP_TYPE_FLOAT64 */ }; -/* The number of lists in an object */ -#define NB_LISTS_PER_OBJ 3 - /* Some eye catchers definitions */ #define OBJECT_EYECATCHER (0x0b13c7) #define DICT_EYECATCHER (0x00d1c7) -/* Definition of the dictionary objects */ -struct dict_object { - enum dict_object_type type; /* What type of object is this? */ - int objeyec;/* eyecatcher for this object */ - int typeyec;/* eyecatcher for this type of object */ - struct dictionary *dico; /* The dictionary this object belongs to */ - - union { - struct dict_vendor_data vendor; /* datastr_len = strlen(vendor_name) */ - struct dict_application_data application; /* datastr_len = strlen(application_name) */ - struct dict_type_data type; /* datastr_len = strlen(type_name) */ - struct dict_enumval_data enumval; /* datastr_len = strlen(enum_name) */ - struct dict_avp_data avp; /* datastr_len = strlen(avp_name) */ - struct dict_cmd_data cmd; /* datastr_len = strlen(cmd_name) */ - struct dict_rule_data rule; /* datastr_len = 0 */ - } data; /* The data of this object */ - - size_t datastr_len; /* cached length of the string inside the data. Saved when the object is created. */ - - struct dict_object * parent; /* The parent of this object, if any */ - - struct fd_list list[NB_LISTS_PER_OBJ];/* used to chain objects.*/ - /* More information about the lists : - - - the use for each list depends on the type of object. See detail below. - - - a sentinel for a list has its 'o' field cleared. (this is the criteria to detect end of a loop) - - - The lists are always ordered. The criteria are described below. the functions to order them are referenced in dict_obj_info - - - The dict_lock must be held for any list operation. - - => VENDORS: - list[0]: list of the vendors, ordered by their id. The sentinel is g_dict_vendors (vendor with id 0) - list[1]: sentinel for the list of AVPs from this vendor, ordered by AVP code. - list[2]: sentinel for the list of AVPs from this vendor, ordered by AVP name (fd_os_cmp). - - => APPLICATIONS: - list[0]: list of the applications, ordered by their id. The sentinel is g_dict_applications (application with id 0) - list[1]: not used - list[2]: not used. - - => TYPES: - list[0]: list of the types, ordered by their names. The sentinel is g_list_types. - list[1]: sentinel for the type_enum list of this type, ordered by their constant name (fd_os_cmp). - list[2]: sentinel for the type_enum list of this type, ordered by their constant value. - - => TYPE_ENUMS: - list[0]: list of the contants for a given type, ordered by the constant name (fd_os_cmp). Sentinel is a (list[1]) element of a TYPE object. - list[1]: list of the contants for a given type, ordered by the constant value. Sentinel is a (list[2]) element of a TYPE object. - list[2]: not used - - => AVPS: - list[0]: list of the AVP from a given vendor, ordered by avp code. Sentinel is a list[1] element of a VENDOR object. - list[1]: list of the AVP from a given vendor, ordered by avp name (fd_os_cmp). Sentinel is a list[2] element of a VENDOR object. - list[2]: sentinel for the rule list that apply to this AVP. - - => COMMANDS: - list[0]: list of the commands, ordered by their names (fd_os_cmp). The sentinel is g_list_cmd_name. - list[1]: list of the commands, ordered by their command code and 'R' flag. The sentinel is g_list_cmd_code. - list[2]: sentinel for the rule list that apply to this command. - - => RULES: - list[0]: list of the rules for a given (grouped) AVP or Command, ordered by the AVP vendor & code to which they refer. sentinel is list[2] of a command or (grouped) avp. - list[1]: not used - list[2]: not used. - - */ - - /* Sentinel for the dispatch callbacks */ - struct fd_list disp_cbs; - -}; - -/* Definition of the dictionary structure */ -struct dictionary { - int dict_eyec; /* Eye-catcher for the dictionary (DICT_EYECATCHER) */ - - pthread_rwlock_t dict_lock; /* The global rwlock for the dictionary */ - - struct dict_object dict_vendors; /* Sentinel for the list of vendors, corresponding to vendor 0 */ - struct dict_object dict_applications; /* Sentinel for the list of applications, corresponding to app 0 */ - struct fd_list dict_types; /* Sentinel for the list of types */ - struct fd_list dict_cmd_name; /* Sentinel for the list of commands, ordered by names */ - struct fd_list dict_cmd_code; /* Sentinel for the list of commands, ordered by codes */ - - struct dict_object dict_cmd_error; /* Special command object for answers with the 'E' bit set */ - - int dict_count[DICT_TYPE_MAX + 1]; /* Number of objects of each type */ -}; - /* Forward declarations of dump functions */ static DECLARE_FD_DUMP_PROTOTYPE(dump_vendor_data, void * data ); static DECLARE_FD_DUMP_PROTOTYPE(dump_application_data, void * data ); @@ -177,32 +84,32 @@ static struct { int haslist[NB_LISTS_PER_OBJ]; /* Tell if this list is used */ } dict_obj_info[] = { { 0, "(error)", 0, 0, 0, 0, NULL, NULL, {0, 0, 0} } - /* type name datasize parent parenttype + /* type name datasize parent parenttype eyecatcher dump_data search_fct, haslist[] */ ,{ DICT_VENDOR, "VENDOR", sizeof(struct dict_vendor_data), 0, 0, OBJECT_EYECATCHER + 1, dump_vendor_data, search_vendor, { 1, 0, 0 } } - + ,{ DICT_APPLICATION, "APPLICATION", sizeof(struct dict_application_data), 1, DICT_VENDOR, OBJECT_EYECATCHER + 2, dump_application_data, search_application, { 1, 0, 0 } } - + ,{ DICT_TYPE, "TYPE", sizeof(struct dict_type_data), 1, DICT_APPLICATION, OBJECT_EYECATCHER + 3, dump_type_data, search_type, { 1, 0, 0 } } - + ,{ DICT_ENUMVAL, "ENUMVAL", sizeof(struct dict_enumval_data), 2, DICT_TYPE, OBJECT_EYECATCHER + 4, NULL, search_enumval, { 1, 1, 0 } } - + ,{ DICT_AVP, "AVP", sizeof(struct dict_avp_data), 1, DICT_TYPE, OBJECT_EYECATCHER + 5, dump_avp_data, search_avp, { 1, 1, 0 } } - + ,{ DICT_COMMAND, "COMMAND", sizeof(struct dict_cmd_data), 1, DICT_APPLICATION, OBJECT_EYECATCHER + 6, dump_command_data, search_cmd, { 1, 1, 0 } } - + ,{ DICT_RULE, "RULE", sizeof(struct dict_rule_data), 2, -1 /* special case: grouped avp or command */, OBJECT_EYECATCHER + 7, dump_rule_data, search_rule, { 1, 0, 0 } } - + }; - + /* Macro to verify a "type" value */ #define CHECK_TYPE( type ) ( ((type) > 0) && ((type) <= DICT_TYPE_MAX) ) @@ -230,17 +137,17 @@ static struct { *(plen) = strlen((str)); \ str = os0dup( str, *(plen)); \ } - + /* Initialize an object */ static void init_object( struct dict_object * obj, enum dict_object_type type ) { int i; - + TRACE_ENTRY("%p %d", obj, type); - + /* Clean the object first */ memset ( obj, 0, sizeof(struct dict_object)); - + CHECK_PARAMS_DO( CHECK_TYPE(type), return ); obj->type = type; @@ -248,15 +155,15 @@ static void init_object( struct dict_object * obj, enum dict_object_type type ) obj->typeyec = _OBINFO(obj).eyecatcher; /* We don't initialize the data nor the parent here */ - + /* Now init the lists */ for (i=0; i<NB_LISTS_PER_OBJ; i++) { - if (_OBINFO(obj).haslist[i] != 0) + if (_OBINFO(obj).haslist[i] != 0) fd_list_init(&obj->list[i], obj); else fd_list_init(&obj->list[i], NULL); } - + fd_list_init(&obj->disp_cbs, NULL); } @@ -265,31 +172,31 @@ static int init_object_data(struct dict_object * dest, void * source, enum dict_ { TRACE_ENTRY("%p %p %d", dest, source, type); CHECK_PARAMS( dest && source && CHECK_TYPE(type) ); - - /* Generic: copy the full data structure */ + + /* Generic: copy the full data structure */ memcpy( &dest->data, source, dict_obj_info[type].datasize ); - + /* Then strings must be duplicated, not copied */ /* This function might be simplified by always defining the "name" field as the first field of the structures, but... it's error-prone */ switch (type) { case DICT_VENDOR: DUP_string_len( dest->data.vendor.vendor_name, &dest->datastr_len ); break; - + case DICT_APPLICATION: DUP_string_len( dest->data.application.application_name, &dest->datastr_len ); break; - + case DICT_TYPE: DUP_string_len( dest->data.type.type_name, &dest->datastr_len ); break; - + case DICT_ENUMVAL: DUP_string_len( dest->data.enumval.enum_name, &dest->datastr_len ); if (dupos) { // we also need to duplicate the octetstring constant value since it is a pointer. - dest->data.enumval.enum_value.os.data = os0dup( - ((struct dict_enumval_data *)source)->enum_value.os.data, + dest->data.enumval.enum_value.os.data = os0dup( + ((struct dict_enumval_data *)source)->enum_value.os.data, ((struct dict_enumval_data *)source)->enum_value.os.len ); } @@ -298,16 +205,16 @@ static int init_object_data(struct dict_object * dest, void * source, enum dict_ case DICT_AVP: DUP_string_len( dest->data.avp.avp_name, &dest->datastr_len ); break; - + case DICT_COMMAND: DUP_string_len( dest->data.cmd.cmd_name, &dest->datastr_len ); break; - + default: /* Nothing to do for RULES */ ; } - + return 0; } @@ -315,7 +222,7 @@ static int init_object_data(struct dict_object * dest, void * source, enum dict_ static int verify_object( struct dict_object * obj ) { TRACE_ENTRY("%p", obj); - + CHECK_PARAMS_DO( obj && (obj->objeyec == OBJECT_EYECATCHER) && CHECK_TYPE(obj->type) @@ -333,7 +240,7 @@ static int verify_object( struct dict_object * obj ) } return 0; } ); - + /* The object is probably valid. */ return 1; } @@ -342,20 +249,20 @@ static int verify_object( struct dict_object * obj ) static void destroy_object_data(struct dict_object * obj) { /* TRACE_ENTRY("%p", obj); */ - + switch (obj->type) { case DICT_VENDOR: free( obj->data.vendor.vendor_name ); break; - + case DICT_APPLICATION: free( obj->data.application.application_name ); break; - + case DICT_TYPE: free( obj->data.type.type_name ); break; - + case DICT_ENUMVAL: free( obj->data.enumval.enum_name ); break; @@ -363,11 +270,11 @@ static void destroy_object_data(struct dict_object * obj) case DICT_AVP: free( obj->data.avp.avp_name ); break; - + case DICT_COMMAND: free( obj->data.cmd.cmd_name ); break; - + default: /* nothing to do */ ; @@ -378,10 +285,10 @@ static void destroy_object_data(struct dict_object * obj) static void destroy_object(struct dict_object * obj); /* Destroy all objects in a list - the lock must be held */ -static void destroy_list(struct fd_list * head) +static void destroy_list(struct fd_list * head) { /* TRACE_ENTRY("%p", head); */ - + /* loop in the list */ while (!FD_IS_LIST_EMPTY(head)) { @@ -389,24 +296,24 @@ static void destroy_list(struct fd_list * head) destroy_object(_O(head->next->o)); } } - + /* Free an object and its sublists */ static void destroy_object(struct dict_object * obj) { int i; - + /* TRACE_ENTRY("%p", obj); */ - + /* Update global count */ - if (obj->dico) + if (obj->dico) obj->dico->dict_count[obj->type]--; - + /* Mark the object as invalid */ obj->objeyec = 0xdead; - + /* First, destroy the data associated to the object */ destroy_object_data(obj); - + for (i=0; i<NB_LISTS_PER_OBJ; i++) { if (_OBINFO(obj).haslist[i]) /* unlink the element from the list */ @@ -415,14 +322,14 @@ static void destroy_object(struct dict_object * obj) /* This is either a sentinel or unused (=emtpy) list, let's destroy it */ destroy_list( &obj->list[i] ); } - + /* Unlink all elements from the dispatch list; they will be freed when callback is unregistered */ CHECK_POSIX_DO( pthread_rwlock_wrlock(&fd_disp_lock), /* continue */ ); while (!FD_IS_LIST_EMPTY(&obj->disp_cbs)) { fd_list_unlink( obj->disp_cbs.next ); } CHECK_POSIX_DO( pthread_rwlock_unlock(&fd_disp_lock), /* continue */ ); - + /* Last, destroy the object */ free(obj); } @@ -437,14 +344,14 @@ static void destroy_object(struct dict_object * obj) /* Compare two values */ #define ORDER_scalar( i1, i2 ) \ - ((i1 < i2 ) ? -1 : ( i1 > i2 ? 1 : 0 )) + ((i1 < i2 ) ? -1 : ( i1 > i2 ? 1 : 0 )) /* Compare two vendor objects by their id (checks already performed) */ static int order_vendor_by_id ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return ORDER_scalar( o1->data.vendor.vendor_id, o2->data.vendor.vendor_id ); } @@ -452,7 +359,7 @@ static int order_vendor_by_id ( struct dict_object *o1, struct dict_object *o2 ) static int order_appli_by_id ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return ORDER_scalar( o1->data.application.application_id, o2->data.application.application_id ); } @@ -460,7 +367,7 @@ static int order_appli_by_id ( struct dict_object *o1, struct dict_object *o2 ) static int order_type_by_name ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return fd_os_cmp( o1->data.type.type_name, o1->datastr_len, o2->data.type.type_name, o2->datastr_len ); } @@ -468,7 +375,7 @@ static int order_type_by_name ( struct dict_object *o1, struct dict_object *o2 ) static int order_enum_by_name ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return fd_os_cmp( o1->data.enumval.enum_name, o1->datastr_len, o2->data.enumval.enum_name, o2->datastr_len ); } @@ -476,13 +383,13 @@ static int order_enum_by_name ( struct dict_object *o1, struct dict_object *o2 ) static int order_enum_by_val ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + /* The comparison function depends on the type of data */ switch ( o1->parent->data.type.type_base ) { case AVP_TYPE_OCTETSTRING: - return fd_os_cmp( o1->data.enumval.enum_value.os.data, o1->data.enumval.enum_value.os.len, + return fd_os_cmp( o1->data.enumval.enum_value.os.data, o1->data.enumval.enum_value.os.len, o2->data.enumval.enum_value.os.data, o2->data.enumval.enum_value.os.len); - + case AVP_TYPE_INTEGER32: return ORDER_scalar( o1->data.enumval.enum_value.i32, o2->data.enumval.enum_value.i32 ); @@ -512,7 +419,7 @@ static int order_enum_by_val ( struct dict_object *o1, struct dict_object *o2 ) static int order_avp_by_code ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return ORDER_scalar( o1->data.avp.avp_code, o2->data.avp.avp_code ); } @@ -520,7 +427,7 @@ static int order_avp_by_code ( struct dict_object *o1, struct dict_object *o2 ) static int order_avp_by_name ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return fd_os_cmp( o1->data.avp.avp_name, o1->datastr_len, o2->data.avp.avp_name, o2->datastr_len ); } @@ -528,7 +435,7 @@ static int order_avp_by_name ( struct dict_object *o1, struct dict_object *o2 ) static int order_cmd_by_name ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - + return fd_os_cmp( o1->data.cmd.cmd_name, o1->datastr_len, o2->data.cmd.cmd_name, o2->datastr_len ); } @@ -537,28 +444,28 @@ static int order_cmd_by_codefl( struct dict_object *o1, struct dict_object *o2 ) { uint8_t fl1, fl2; int cmp = 0; - + TRACE_ENTRY("%p %p", o1, o2); - + cmp = ORDER_scalar( o1->data.cmd.cmd_code, o2->data.cmd.cmd_code ); - if (cmp) + if (cmp) return cmp; - + /* Same command code, we must compare the value of the 'R' flag */ fl1 = o1->data.cmd.cmd_flag_val & CMD_FLAG_REQUEST; fl2 = o2->data.cmd.cmd_flag_val & CMD_FLAG_REQUEST; - + /* We want requests first, so we reverse the operators here */ return ORDER_scalar(fl2, fl1); - + } /* Compare two rule object by the AVP vendor & code that they refer (checks already performed) */ static int order_rule_by_avpvc ( struct dict_object *o1, struct dict_object *o2 ) { TRACE_ENTRY("%p %p", o1, o2); - - return ORDER_scalar(o1->data.rule.rule_avp->data.avp.avp_vendor, o2->data.rule.rule_avp->data.avp.avp_vendor) + + return ORDER_scalar(o1->data.rule.rule_avp->data.avp.avp_vendor, o2->data.rule.rule_avp->data.avp.avp_vendor) ?: ORDER_scalar(o1->data.rule.rule_avp->data.avp.avp_code, o2->data.rule.rule_avp->data.avp.avp_code) ; } @@ -744,30 +651,30 @@ static int search_vendor ( struct dictionary * dict, int criteria, const void * { int ret = 0; vendor_id_t id; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case VENDOR_BY_ID: id = *(vendor_id_t *) what; SEARCH_scalar( id, &dict->dict_vendors.list[0], vendor.vendor_id, 1, &dict->dict_vendors ); break; - + case VENDOR_BY_NAME: /* "what" is a vendor name */ SEARCH_os0( what, &dict->dict_vendors.list[0], vendor.vendor_name, 0); break; - + case VENDOR_OF_APPLICATION: /* "what" should be an application object */ SEARCH_childs_parent( DICT_APPLICATION, &dict->dict_vendors ); break; - + case VENDOR_OF_AVP: /* "what" should be an avp object */ SEARCH_sentinel( DICT_AVP, 0, 1 ); break; - + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -780,31 +687,31 @@ static int search_application ( struct dictionary * dict, int criteria, const vo { int ret = 0; application_id_t id; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case APPLICATION_BY_ID: id = *(application_id_t *) what; SEARCH_scalar( id, &dict->dict_applications.list[0], application.application_id, 1, &dict->dict_applications ); break; - + case APPLICATION_BY_NAME: /* "what" is an application name */ SEARCH_os0( what, &dict->dict_applications.list[0], application.application_name, 0); break; - + case APPLICATION_OF_TYPE: /* "what" should be a type object */ SEARCH_childs_parent( DICT_TYPE, &dict->dict_applications ); break; - + case APPLICATION_OF_COMMAND: /* "what" should be a command object */ SEARCH_childs_parent( DICT_COMMAND, &dict->dict_applications ); break; - + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -816,26 +723,26 @@ end: static int search_type ( struct dictionary * dict, int criteria, const void * what, struct dict_object **result ) { int ret = 0; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case TYPE_BY_NAME: /* "what" is a type name */ SEARCH_os0( what, &dict->dict_types, type.type_name, 1); break; - + case TYPE_OF_ENUMVAL: /* "what" should be a type_enum object */ SEARCH_childs_parent( DICT_ENUMVAL, NULL ); break; - + case TYPE_OF_AVP: /* "what" should be an avp object */ SEARCH_childs_parent( DICT_AVP, NULL ); break; - - + + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -847,17 +754,17 @@ end: static int search_enumval ( struct dictionary * dict, int criteria, const void * what, struct dict_object **result ) { int ret = 0; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case ENUMVAL_BY_STRUCT: { struct dict_object * parent = NULL; struct dict_enumval_request * _what = (struct dict_enumval_request *) what; - + CHECK_PARAMS( _what && ( _what->type_obj || _what->type_name ) ); - + if (_what->type_obj != NULL) { parent = _what->type_obj; CHECK_PARAMS( verify_object(parent) && (parent->type == DICT_TYPE) ); @@ -866,9 +773,9 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * CHECK_FCT_DO( search_type( dict, TYPE_BY_NAME, _what->type_name, &parent ), CHECK_PARAMS( 0 ) ); } - + /* From here the "parent" object is valid */ - + if ( _what->search.enum_name != NULL ) { /* We are looking for this string */ SEARCH_os0( _what->search.enum_name, &parent->list[1], enumval.enum_name, 1 ); @@ -876,10 +783,10 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * /* We are looking for the value in enum_value */ switch (parent->data.type.type_base) { case AVP_TYPE_OCTETSTRING: - SEARCH_os( _what->search.enum_value.os.data, - _what->search.enum_value.os.len, - &parent->list[2], - enumval.enum_value.os , + SEARCH_os( _what->search.enum_value.os.data, + _what->search.enum_value.os.len, + &parent->list[2], + enumval.enum_value.os , 1 ); break; @@ -890,7 +797,7 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * 1, (struct dict_object *)NULL); break; - + case AVP_TYPE_INTEGER64: SEARCH_scalar( _what->search.enum_value.i64, &parent->list[2], @@ -898,7 +805,7 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * 1, (struct dict_object *)NULL); break; - + case AVP_TYPE_UNSIGNED32: SEARCH_scalar( _what->search.enum_value.u32, &parent->list[2], @@ -906,7 +813,7 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * 1, (struct dict_object *)NULL); break; - + case AVP_TYPE_UNSIGNED64: SEARCH_scalar( _what->search.enum_value.u64, &parent->list[2], @@ -914,7 +821,7 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * 1, (struct dict_object *)NULL); break; - + case AVP_TYPE_FLOAT32: SEARCH_scalar( _what->search.enum_value.f32, &parent->list[2], @@ -922,7 +829,7 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * 1, (struct dict_object *)NULL); break; - + case AVP_TYPE_FLOAT64: SEARCH_scalar( _what->search.enum_value.f64, &parent->list[2], @@ -930,17 +837,17 @@ static int search_enumval ( struct dictionary * dict, int criteria, const void * 1, (struct dict_object *)NULL); break; - + default: /* Invalid parent type basetype */ CHECK_PARAMS( parent = NULL ); } } - + } break; - - + + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -952,9 +859,9 @@ end: static int search_avp ( struct dictionary * dict, int criteria, const void * what, struct dict_object **result ) { int ret = 0; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case AVP_BY_CODE: { @@ -964,20 +871,20 @@ static int search_avp ( struct dictionary * dict, int criteria, const void * wha SEARCH_scalar( code, &dict->dict_vendors.list[1], avp.avp_code, 1, (struct dict_object *)NULL ); } break; - + case AVP_BY_NAME: /* "what" is the AVP name, vendor 0 */ SEARCH_os0( what, &dict->dict_vendors.list[2], avp.avp_name, 1); break; - + case AVP_BY_CODE_AND_VENDOR: case AVP_BY_NAME_AND_VENDOR: { struct dict_avp_request * _what = (struct dict_avp_request *) what; struct dict_object * vendor = NULL; - + CHECK_PARAMS( (criteria != AVP_BY_NAME_AND_VENDOR) || _what->avp_name ); - + /* Now look for the vendor first */ CHECK_FCT( search_vendor( dict, VENDOR_BY_ID, &_what->avp_vendor, &vendor ) ); if (vendor == NULL) { @@ -987,7 +894,7 @@ static int search_avp ( struct dictionary * dict, int criteria, const void * wha ret = ENOENT; goto end; } - + /* We now have our vendor = head of the appropriate avp list */ if (criteria == AVP_BY_NAME_AND_VENDOR) { SEARCH_os0( _what->avp_name, &vendor->list[2], avp.avp_name, 1); @@ -997,15 +904,15 @@ static int search_avp ( struct dictionary * dict, int criteria, const void * wha } } break; - + case AVP_BY_STRUCT: { struct dict_avp_request_ex * _what = (struct dict_avp_request_ex *) what; struct dict_object * vendor = NULL; - + CHECK_PARAMS( _what->avp_vendor.vendor || _what->avp_vendor.vendor_id || _what->avp_vendor.vendor_name ); CHECK_PARAMS( _what->avp_data.avp_code || _what->avp_data.avp_name ); - + /* Now look for the vendor first */ if (_what->avp_vendor.vendor) { CHECK_PARAMS( ! _what->avp_vendor.vendor_id && ! _what->avp_vendor.vendor_name ); @@ -1016,7 +923,7 @@ static int search_avp ( struct dictionary * dict, int criteria, const void * wha } else { CHECK_FCT( search_vendor( dict, VENDOR_BY_NAME, _what->avp_vendor.vendor_name, &vendor ) ); } - + if (vendor == NULL) { if (result) *result = NULL; @@ -1024,7 +931,7 @@ static int search_avp ( struct dictionary * dict, int criteria, const void * wha ret = ENOENT; goto end; } - + /* We now have our vendor = head of the appropriate avp list */ if (_what->avp_data.avp_code) { CHECK_PARAMS( ! _what->avp_data.avp_name ); @@ -1034,22 +941,22 @@ static int search_avp ( struct dictionary * dict, int criteria, const void * wha } } break; - + case AVP_BY_NAME_ALL_VENDORS: { struct fd_list * li; size_t wl = strlen((char *)what); - + /* First, search for vendor 0 */ SEARCH_os0_l( what, wl, &dict->dict_vendors.list[2], avp.avp_name, 1); - + /* If not found, loop for all vendors, until found */ for (li = dict->dict_vendors.list[0].next; li != &dict->dict_vendors.list[0]; li = li->next) { SEARCH_os0_l( what, wl, &_O(li->o)->list[2], avp.avp_name, 1); } } break; - + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -1061,45 +968,45 @@ end: static int search_cmd ( struct dictionary * dict, int criteria, const void * what, struct dict_object **result ) { int ret = 0; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case CMD_BY_NAME: /* "what" is a command name */ SEARCH_os0( what, &dict->dict_cmd_name, cmd.cmd_name, 1); break; - + case CMD_BY_CODE_R: case CMD_BY_CODE_A: { command_code_t code; uint8_t searchfl = 0; - + /* The command code that we are searching */ code = *(command_code_t *) what; - + /* The flag (request or answer) of the command we are searching */ if (criteria == CMD_BY_CODE_R) { searchfl = CMD_FLAG_REQUEST; } - + /* perform the search */ SEARCH_codefl( code, searchfl, &dict->dict_cmd_code ); } break; - + case CMD_ANSWER: { /* "what" is a command object of type "request" */ struct dict_object * req = (struct dict_object *) what; struct dict_object * ans = NULL; - - CHECK_PARAMS( verify_object(req) + + CHECK_PARAMS( verify_object(req) && (req->type == DICT_COMMAND) && (req->data.cmd.cmd_flag_mask & CMD_FLAG_REQUEST) && (req->data.cmd.cmd_flag_val & CMD_FLAG_REQUEST) ); - + /* The answer is supposed to be the next element in the list, if it exists */ ans = req->list[1].next->o; if ( ans == NULL ) { @@ -1107,7 +1014,7 @@ static int search_cmd ( struct dictionary * dict, int criteria, const void * wha ret = ENOENT; goto end; } - + /* Now check that the ans element is really the correct one */ if ( (ans->data.cmd.cmd_code != req->data.cmd.cmd_code) || (!(ans->data.cmd.cmd_flag_mask & CMD_FLAG_REQUEST)) @@ -1116,13 +1023,13 @@ static int search_cmd ( struct dictionary * dict, int criteria, const void * wha ret = ENOENT; goto end; } - + if (result) *result = ans; ret = 0; - } + } break; - + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -1134,32 +1041,32 @@ end: static int search_rule ( struct dictionary * dict, int criteria, const void * what, struct dict_object **result ) { int ret = 0; - + TRACE_ENTRY("%p %d %p %p", dict, criteria, what, result); - + switch (criteria) { case RULE_BY_AVP_AND_PARENT: { struct dict_object * parent = NULL; struct dict_object * avp = NULL; struct dict_rule_request * _what = (struct dict_rule_request *) what; - - CHECK_PARAMS( _what + + CHECK_PARAMS( _what && (parent = _what->rule_parent) && (avp = _what->rule_avp ) ); - - CHECK_PARAMS( verify_object(parent) - && ((parent->type == DICT_COMMAND) + + CHECK_PARAMS( verify_object(parent) + && ((parent->type == DICT_COMMAND) || ((parent->type == DICT_AVP) && (parent->data.avp.avp_basetype == AVP_TYPE_GROUPED))) ); - + CHECK_PARAMS( verify_object(avp) && (avp->type == DICT_AVP) ); - + /* Perform the search */ SEARCH_ruleavpname( avp->data.avp.avp_name, avp->datastr_len, &parent->list[2]); - + } break; - + default: /* Invalid criteria */ CHECK_PARAMS( criteria = 0 ); @@ -1179,7 +1086,7 @@ end: static DECLARE_FD_DUMP_PROTOTYPE(dump_vendor_data, void * data ) { struct dict_vendor_data * vendor = (struct dict_vendor_data *)data; - + return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: %-6u \"%s\"", vendor->vendor_id, vendor->vendor_name); } static DECLARE_FD_DUMP_PROTOTYPE(dump_application_data, void * data ) @@ -1190,9 +1097,9 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_application_data, void * data ) static DECLARE_FD_DUMP_PROTOTYPE(dump_type_data, void * data ) { struct dict_type_data * type = ( struct dict_type_data * ) data; - - return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: %-12s \"%s\"", - type_base_name[type->type_base], + + return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: %-12s \"%s\"", + type_base_name[type->type_base], type->type_name); } static DECLARE_FD_DUMP_PROTOTYPE(dump_enumval_data, struct dict_enumval_data * enumval, enum dict_avp_basetype type ) @@ -1211,7 +1118,7 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_enumval_data, struct dict_enumval_data * e CHECK_MALLOC_DO(fd_dump_extend( FD_DUMP_STD_PARAMS, "..."), return NULL); } break; - + case AVP_TYPE_INTEGER32: CHECK_MALLOC_DO(fd_dump_extend( FD_DUMP_STD_PARAMS, "%i", enumval->enum_value.i32), return NULL); break; @@ -1235,7 +1142,7 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_enumval_data, struct dict_enumval_data * e case AVP_TYPE_FLOAT64: CHECK_MALLOC_DO(fd_dump_extend( FD_DUMP_STD_PARAMS, "%g", enumval->enum_value.f64), return NULL); break; - + default: CHECK_MALLOC_DO(fd_dump_extend( FD_DUMP_STD_PARAMS, "??? (ERROR unknown type %d)", type), return NULL); } @@ -1244,26 +1151,26 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_enumval_data, struct dict_enumval_data * e static DECLARE_FD_DUMP_PROTOTYPE(dump_avp_data, void * data ) { struct dict_avp_data * avp = (struct dict_avp_data * ) data; - return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: v/m:" DUMP_AVPFL_str "/" DUMP_AVPFL_str ", %12s, %-6u \"%s\"", - DUMP_AVPFL_val(avp->avp_flag_val), - DUMP_AVPFL_val(avp->avp_flag_mask), - type_base_name[avp->avp_basetype], - avp->avp_code, + return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: v/m:" DUMP_AVPFL_str "/" DUMP_AVPFL_str ", %12s, %-6u \"%s\"", + DUMP_AVPFL_val(avp->avp_flag_val), + DUMP_AVPFL_val(avp->avp_flag_mask), + type_base_name[avp->avp_basetype], + avp->avp_code, avp->avp_name ); } static DECLARE_FD_DUMP_PROTOTYPE(dump_command_data, void * data ) { struct dict_cmd_data * cmd = (struct dict_cmd_data *) data; - return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: v/m:" DUMP_CMDFL_str "/" DUMP_CMDFL_str ", %-6u \"%s\"", + return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: v/m:" DUMP_CMDFL_str "/" DUMP_CMDFL_str ", %-6u \"%s\"", DUMP_CMDFL_val(cmd->cmd_flag_val), DUMP_CMDFL_val(cmd->cmd_flag_mask), cmd->cmd_code, cmd->cmd_name); } static DECLARE_FD_DUMP_PROTOTYPE(dump_rule_data, void * data ) { struct dict_rule_data * rule = (struct dict_rule_data * )data; return fd_dump_extend( FD_DUMP_STD_PARAMS, "data: pos:%d ord:%d m/M:%2d/%2d avp:\"%s\"", - rule->rule_position, - rule->rule_order, - rule->rule_min, + rule->rule_position, + rule->rule_order, + rule->rule_min, rule->rule_max, rule->rule_avp->data.avp.avp_name); } @@ -1290,27 +1197,27 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_list, struct fd_list * sentinel, int paren static DECLARE_FD_DUMP_PROTOTYPE(dump_object, struct dict_object * obj, int parents, int depth, int indent ) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%*s{dictobj}(@%p): ", indent, "", obj), return NULL); - + if (!verify_object(obj)) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); return *buf; } - - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s p:%p ", - _OBINFO(obj).name, + + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s p:%p ", + _OBINFO(obj).name, obj->parent), return NULL); - + if (obj->type == DICT_ENUMVAL) { CHECK_MALLOC_DO( dump_enumval_data ( FD_DUMP_STD_PARAMS, &obj->data.enumval, obj->parent->data.type.type_base ), return NULL); } else { CHECK_MALLOC_DO( _OBINFO(obj).dump_data(FD_DUMP_STD_PARAMS, &obj->data), return NULL); } - + if (parents) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n%*sparent:", indent + 1, ""), return NULL); CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, obj->parent, parents-1, 0, 0 ), return NULL); } - + if (depth) { int i; for (i=0; i<NB_LISTS_PER_OBJ; i++) { @@ -1320,16 +1227,16 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_object, struct dict_object * obj, int pare } } } - + return *buf; } DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump_object, struct dict_object * obj) { FD_DUMP_HANDLE_OFFSET(); - + CHECK_MALLOC_DO( dump_object(FD_DUMP_STD_PARAMS, obj, 1, 2, 0), return NULL); - + return *buf; } @@ -1337,44 +1244,44 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump, struct dictionary * dict) { int i; struct fd_list * li; - + FD_DUMP_HANDLE_OFFSET(); - + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{dictionary}(@%p): ", dict), return NULL); - + if ((dict == NULL) || (dict->dict_eyec != DICT_EYECATCHER)) { return fd_dump_extend(FD_DUMP_STD_PARAMS, "INVALID/NULL"); } - + CHECK_POSIX_DO( pthread_rwlock_rdlock( &dict->dict_lock ), /* ignore */ ); - - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : VENDORS / AVP / RULES}\n", dict), goto error); + + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict}(@%p): VENDORS / AVP / RULES\n", dict), goto error); CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, &dict->dict_vendors, 0, 3, 3 ), goto error); for (li = dict->dict_vendors.list[0].next; li != &dict->dict_vendors.list[0]; li = li->next) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, li->o, 0, 3, 3 ), goto error); } - - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : APPLICATIONS}\n", dict), goto error); + + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict}(@%p): APPLICATIONS\n", dict), goto error); CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, &dict->dict_applications, 0, 1, 3 ), goto error); for (li = dict->dict_applications.list[0].next; li != &dict->dict_applications.list[0]; li = li->next) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, li->o, 0, 1, 3 ), goto error); } - - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : TYPES / ENUMVAL}", dict), goto error); + + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict}(@%p): TYPES / ENUMVAL", dict), goto error); CHECK_MALLOC_DO( dump_list(FD_DUMP_STD_PARAMS, &dict->dict_types, 0, 2, 3 ), goto error); - - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : COMMANDS / RULES}", dict), goto error); + + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict}(@%p): COMMANDS / RULES", dict), goto error); CHECK_MALLOC_DO( dump_list(FD_DUMP_STD_PARAMS, &dict->dict_cmd_code, 0, 0, 3 ), goto error); - - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : statistics}", dict), goto error); + + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict}(@%p): statistics", dict), goto error); for (i=1; i<=DICT_TYPE_MAX; i++) CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n %5d: %s", dict->dict_count[i], dict_obj_info[i].name), goto error); - + CHECK_POSIX_DO( pthread_rwlock_unlock( &dict->dict_lock ), /* ignore */ ); return *buf; -error: +error: /* Free the rwlock */ CHECK_POSIX_DO( pthread_rwlock_unlock( &dict->dict_lock ), /* ignore */ ); return NULL; @@ -1386,7 +1293,7 @@ error: static DECLARE_FD_DUMP_PROTOTYPE(dump_val_os, union avp_value * value) { int i; - + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "<"), return NULL); for (i = 0; i < value->os.len; i++) { if (i == 1024) { /* Dump only up to 1024 bytes of the buffer */ @@ -1435,7 +1342,7 @@ static DECLARE_FD_DUMP_PROTOTYPE((*get_default_dump_val_cb(enum dict_avp_basetyp switch (datatype) { case AVP_TYPE_OCTETSTRING: return &dump_val_os; - + case AVP_TYPE_INTEGER32: return &dump_val_i32; @@ -1453,7 +1360,7 @@ static DECLARE_FD_DUMP_PROTOTYPE((*get_default_dump_val_cb(enum dict_avp_basetyp case AVP_TYPE_FLOAT64: return &dump_val_f64; - + case AVP_TYPE_GROUPED: TRACE_DEBUG(FULL, "error: grouped AVP with a value!"); } @@ -1467,24 +1374,24 @@ static DECLARE_FD_DUMP_PROTOTYPE((*get_default_dump_val_cb(enum dict_avp_basetyp typedef DECLARE_FD_DUMP_PROTOTYPE((*dump_val_cb_t), union avp_value *); /* Formatter for the AVP value dump line */ -static DECLARE_FD_DUMP_PROTOTYPE(dump_avp_val, union avp_value *avp_value, - dump_val_cb_t def_dump_val_cb, - dump_val_cb_t dump_val_cb, - enum dict_avp_basetype datatype, - char * type_name, - char * const_name, - int indent, +static DECLARE_FD_DUMP_PROTOTYPE(dump_avp_val, union avp_value *avp_value, + dump_val_cb_t def_dump_val_cb, + dump_val_cb_t dump_val_cb, + enum dict_avp_basetype datatype, + char * type_name, + char * const_name, + int indent, int header) { if (header) { /* Header for all AVP values dumps: */ CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, INOBJHDR "value ", INOBJHDRVAL), return NULL); - + /* If the type is provided, write it */ if (type_name) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "t: '%s' ", type_name), return NULL); } - + /* Always give the base datatype anyway */ CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(%s) ", type_base_name[datatype]), return NULL); @@ -1502,7 +1409,7 @@ static DECLARE_FD_DUMP_PROTOTYPE(dump_avp_val, union avp_value *avp_value, if (const_name) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, ")"), return NULL); } - + /* Done! */ return *buf; } @@ -1514,9 +1421,9 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump_avp_value, union avp_value *avp_value, st struct dict_object * type = NULL; char * type_name = NULL; char * const_name = NULL; - + FD_DUMP_HANDLE_OFFSET(); - + /* Handle invalid parameters */ if (!avp_value) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(avp value not set)"), return NULL); @@ -1527,24 +1434,24 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump_avp_value, union avp_value *avp_value, st CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(model not set)"), return NULL); return *buf; } - + if (! ( verify_object(model) && (model->type == DICT_AVP) )) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(invalid model)"), return NULL); return *buf; } - + /* Get the type definition of this AVP */ type = model->parent; if (type) { struct dict_enumval_request request; struct dict_object * enumval = NULL; - + type_name = type->data.type.type_name; - + /* overwrite the dump function ? */ if (type->data.type.type_dump) dump_val_cb = type->data.type.type_dump; - + /* Now check if the AVP value matches a constant */ memset(&request, 0, sizeof(request)); request.type_obj = type; @@ -1555,7 +1462,7 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump_avp_value, union avp_value *avp_value, st const_name = enumval->data.enumval.enum_name; } } - + /* And finally, dump the value */ CHECK_MALLOC_DO( dump_avp_val(FD_DUMP_STD_PARAMS, avp_value, get_default_dump_val_cb(model->data.avp.avp_basetype), dump_val_cb, model->data.avp.avp_basetype, type_name, const_name, indent, header), return NULL ); return *buf; @@ -1575,9 +1482,9 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump_avp_value, union avp_value *avp_value, st int fd_dict_gettype ( struct dict_object * object, enum dict_object_type * type) { TRACE_ENTRY("%p %p", object, type); - + CHECK_PARAMS( type && verify_object(object) ); - + /* Copy the value and return */ *type = object->type; return 0; @@ -1586,9 +1493,9 @@ int fd_dict_gettype ( struct dict_object * object, enum dict_object_type * type) int fd_dict_getdict ( struct dict_object * object, struct dictionary ** dict) { TRACE_ENTRY("%p %p", object, dict); - + CHECK_PARAMS( dict && verify_object(object) ); - + /* Copy the value and return */ *dict = object->dico; return 0; @@ -1599,9 +1506,9 @@ int fd_dict_getdict ( struct dict_object * object, struct dictionary ** dict) int fd_dict_getval ( struct dict_object * object, void * val) { TRACE_ENTRY("%p %p", object, val); - + CHECK_PARAMS( val && verify_object(object) ); - + /* Copy the value and return */ memcpy(val, &object->data, _OBINFO(object).datasize);; return 0; @@ -1615,49 +1522,49 @@ int fd_dict_new ( struct dictionary * dict, enum dict_object_type type, void * d struct dict_object * new = NULL; struct dict_object * vendor = NULL; struct dict_object * locref = NULL; - + TRACE_ENTRY("%p %d(%s) %p %p %p", dict, type, dict_obj_info[CHECK_TYPE(type) ? type : 0].name, data, parent, ref); - + /* Check parameters */ CHECK_PARAMS( dict && (dict->dict_eyec == DICT_EYECATCHER) && CHECK_TYPE(type) && data ); - + /* Check the "parent" parameter */ switch (dict_obj_info[type].parent) { case 0: /* parent is forbidden */ CHECK_PARAMS_DO( parent == NULL, goto error_param ); - + case 1: /* parent is optional */ if (parent == NULL) break; - + case 2: /* parent is mandatory */ CHECK_PARAMS_DO( verify_object(parent), goto error_param ); - + if (type == DICT_RULE ) { /* Special case : grouped AVP or Command parents are allowed */ - CHECK_PARAMS_DO( (parent->type == DICT_COMMAND ) + CHECK_PARAMS_DO( (parent->type == DICT_COMMAND ) || ( (parent->type == DICT_AVP) && (parent->data.avp.avp_basetype == AVP_TYPE_GROUPED ) ), goto error_param ); } else { CHECK_PARAMS_DO( parent->type == dict_obj_info[type].parenttype, goto error_param ); } } - + /* For AVP object, we must also check that the "vendor" referenced exists */ if (type == DICT_AVP) { CHECK_FCT_DO( fd_dict_search( dict, DICT_VENDOR, VENDOR_BY_ID, &(((struct dict_avp_data *)data)->avp_vendor), (void*)&vendor, ENOENT ), { TRACE_DEBUG(INFO, "Unable to find vendor '%d' referenced in the AVP data", ((struct dict_avp_data *)data)->avp_vendor); goto error_param; } ); - + /* Also check if a parent is provided, that the type are the same */ if (parent) { CHECK_PARAMS_DO( parent->data.type.type_base == ((struct dict_avp_data *)data)->avp_basetype, goto error_param ); } } - + /* For RULE object, we must also check that the "avp" referenced exists */ if (type == DICT_RULE) { CHECK_PARAMS_DO( verify_object(((struct dict_rule_data *)data)->rule_avp), goto error_param ); CHECK_PARAMS_DO( ((struct dict_rule_data *)data)->rule_avp->type == DICT_AVP, goto error_param ); } - + /* For COMMAND object, check that the 'R' flag is fixed */ if (type == DICT_COMMAND) { CHECK_PARAMS_DO( ((struct dict_cmd_data *)data)->cmd_flag_mask & CMD_FLAG_REQUEST, goto error_param ); @@ -1668,7 +1575,7 @@ int fd_dict_new ( struct dictionary * dict, enum dict_object_type type, void * d if (parent->data.type.type_base == AVP_TYPE_OCTETSTRING) dupos = 1; } - + /* We have to check that the new values are not equal to the sentinels */ if (type == DICT_VENDOR) { CHECK_PARAMS_DO( ((struct dict_vendor_data *)data)->vendor_id != 0, goto error_param ); @@ -1676,19 +1583,19 @@ int fd_dict_new ( struct dictionary * dict, enum dict_object_type type, void * d if (type == DICT_APPLICATION) { CHECK_PARAMS_DO( ((struct dict_application_data *)data)->application_id != 0, goto error_param ); } - + /* Parameters are valid, create the new object */ CHECK_MALLOC( new = malloc(sizeof(struct dict_object)) ); - + /* Initialize the data of the new object */ init_object(new, type); init_object_data(new, data, type, dupos); new->dico = dict; new->parent = parent; - + /* We will change the dictionary => acquire the write lock */ CHECK_POSIX_DO( ret = pthread_rwlock_wrlock(&dict->dict_lock), goto error_free ); - + /* Now link the object -- this also checks that no object with same keys already exists */ switch (type) { case DICT_VENDOR: @@ -1697,83 +1604,83 @@ int fd_dict_new ( struct dictionary * dict, enum dict_object_type type, void * d if (ret) goto error_unlock; break; - + case DICT_APPLICATION: /* An application object is linked in the g_dict_applciations.list[0], by their id */ ret = fd_list_insert_ordered ( &dict->dict_applications.list[0], &new->list[0], (int (*)(void*, void *))order_appli_by_id, (void **)&locref ); if (ret) goto error_unlock; break; - + case DICT_TYPE: /* A type object is linked in g_list_types by its name */ ret = fd_list_insert_ordered ( &dict->dict_types, &new->list[0], (int (*)(void*, void *))order_type_by_name, (void **)&locref ); if (ret) goto error_unlock; break; - + case DICT_ENUMVAL: /* A type_enum object is linked in it's parent 'type' object lists 1 and 2 by its name and values */ ret = fd_list_insert_ordered ( &parent->list[1], &new->list[0], (int (*)(void*, void *))order_enum_by_name, (void **)&locref ); if (ret) goto error_unlock; - + ret = fd_list_insert_ordered ( &parent->list[2], &new->list[1], (int (*)(void*, void *))order_enum_by_val, (void **)&locref ); - if (ret) { - fd_list_unlink(&new->list[0]); - goto error_unlock; + if (ret) { + fd_list_unlink(&new->list[0]); + goto error_unlock; } break; - + case DICT_AVP: /* An avp object is linked in lists 1 and 2 of its vendor, by code and name */ ret = fd_list_insert_ordered ( &vendor->list[1], &new->list[0], (int (*)(void*, void *))order_avp_by_code, (void **)&locref ); if (ret) goto error_unlock; - + ret = fd_list_insert_ordered ( &vendor->list[2], &new->list[1], (int (*)(void*, void *))order_avp_by_name, (void **)&locref ); if (ret) { fd_list_unlink(&new->list[0]); goto error_unlock; } break; - + case DICT_COMMAND: /* A command object is linked in g_list_cmd_name and g_list_cmd_code by its name and code */ ret = fd_list_insert_ordered ( &dict->dict_cmd_code, &new->list[1], (int (*)(void*, void *))order_cmd_by_codefl, (void **)&locref ); if (ret) goto error_unlock; - + ret = fd_list_insert_ordered ( &dict->dict_cmd_name, &new->list[0], (int (*)(void*, void *))order_cmd_by_name, (void **)&locref ); if (ret) { fd_list_unlink(&new->list[1]); goto error_unlock; } break; - + case DICT_RULE: /* A rule object is linked in list[2] of its parent command or AVP by the name of the AVP it refers */ ret = fd_list_insert_ordered ( &parent->list[2], &new->list[0], (int (*)(void*, void *))order_rule_by_avpvc, (void **)&locref ); if (ret) goto error_unlock; break; - + default: ASSERT(0); } - + /* A new object has been created, increment the global counter */ dict->dict_count[type]++; - + /* Unlock the dictionary */ CHECK_POSIX_DO( ret = pthread_rwlock_unlock(&dict->dict_lock), goto error_free ); - + /* Save the pointer to the new object */ if (ref) *ref = new; - + return 0; - + error_param: ret = EINVAL; goto all_errors; @@ -1786,19 +1693,19 @@ error_unlock: case DICT_VENDOR: TRACE_DEBUG(FULL, "Vendor %s already in dictionary", new->data.vendor.vendor_name); /* if we are here, it means the two vendors id are identical */ - if (fd_os_cmp(locref->data.vendor.vendor_name, locref->datastr_len, + if (fd_os_cmp(locref->data.vendor.vendor_name, locref->datastr_len, new->data.vendor.vendor_name, new->datastr_len)) { TRACE_DEBUG(INFO, "Conflicting vendor name: %s", new->data.vendor.vendor_name); break; } /* Otherwise (same name), we consider the function succeeded, since the (same) object is in the dictionary */ - ret = 0; + ret = 0; break; case DICT_APPLICATION: TRACE_DEBUG(FULL, "Application %s already in dictionary", new->data.application.application_name); /* got same id */ - if (fd_os_cmp(locref->data.application.application_name, locref->datastr_len, + if (fd_os_cmp(locref->data.application.application_name, locref->datastr_len, new->data.application.application_name, new->datastr_len)) { TRACE_DEBUG(FULL, "Conflicting application name"); break; @@ -1936,15 +1843,15 @@ all_errors: if (ret != 0) { char * buf = NULL; size_t len = 0, offset=0; - + if (type == DICT_ENUMVAL) { CHECK_MALLOC( dump_enumval_data ( &buf, &len, &offset, data, parent->data.type.type_base )); } else { CHECK_MALLOC( dict_obj_info[CHECK_TYPE(type) ? type : 0].dump_data(&buf, &len, &offset, data) ); } - + TRACE_DEBUG(INFO, "An error occurred while adding the following data in the dictionary: %s", buf); - + if (ret == EEXIST) { offset=0; CHECK_MALLOC( dump_object(&buf, &len, &offset, locref, 0, 0, 0) ); @@ -1963,14 +1870,14 @@ int fd_dict_delete(struct dict_object * obj) int i; struct dictionary * dict; int ret=0; - + /* check params */ CHECK_PARAMS( verify_object(obj) && obj->dico); dict = obj->dico; /* Lock the dictionary for change */ CHECK_POSIX( pthread_rwlock_wrlock(&dict->dict_lock) ); - + /* check the object is not sentinel for another list */ for (i=0; i<NB_LISTS_PER_OBJ; i++) { if (!_OBINFO(obj).haslist[i] && !(FD_IS_LIST_EMPTY(&obj->list[i]))) { @@ -1983,14 +1890,14 @@ int fd_dict_delete(struct dict_object * obj) break; } } - + /* ok, now destroy the object */ if (!ret) destroy_object(obj); - + /* Unlock */ CHECK_POSIX( pthread_rwlock_unlock(&dict->dict_lock) ); - + return ret; } @@ -1998,25 +1905,25 @@ int fd_dict_delete(struct dict_object * obj) int fd_dict_search ( struct dictionary * dict, enum dict_object_type type, int criteria, const void * what, struct dict_object **result, int retval ) { int ret = 0; - + TRACE_ENTRY("%p %d(%s) %d %p %p %d", dict, type, dict_obj_info[CHECK_TYPE(type) ? type : 0].name, criteria, what, result, retval); - + /* Check param */ CHECK_PARAMS( dict && (dict->dict_eyec == DICT_EYECATCHER) && CHECK_TYPE(type) ); - + /* Lock the dictionary for reading */ CHECK_POSIX( pthread_rwlock_rdlock(&dict->dict_lock) ); - + /* Now call the type-specific search function */ ret = dict_obj_info[type].search_fct (dict, criteria, what, result); - + /* Unlock */ CHECK_POSIX( pthread_rwlock_unlock(&dict->dict_lock) ); - + /* Update the return value as needed */ if ((result != NULL) && (*result == NULL)) ret = retval; - + return ret; } @@ -2029,14 +1936,14 @@ All returned list must be accessed like this: ... } -The following criteria are allowed, with corresponding parent. +The following criteria are allowed, with corresponding parent. The parent is either struct dictionary * or struct dict_object * - + VENDOR_BY_ID : (parent = dictionary) returns list of vendors ordered by ID APPLICATION_BY_ID : (parent = dictionary) returns list of applications ordered by ID - ** for these two lists, the Vendor with id 0 and applciation with id 0 are excluded. + ** for these two lists, the Vendor with id 0 and applciation with id 0 are excluded. You must resolve them separatly with dict_search. - + TYPE_BY_NAME : (parent = dictionary) returns list of types ordered by name (osstring order) ENUMVAL_BY_NAME : (parent = type object) return list of constants for this type ordered by name (osstring order) ENUMVAL_BY_VALUE : (parent = type object) return list of constants for this type ordered by values @@ -2052,69 +1959,69 @@ int fd_dict_getlistof(int criteria, void * parent, struct fd_list ** sentinel) { struct dictionary * dict = parent; struct dict_object * obj_parent = parent; - + TRACE_ENTRY("%i %p %p", criteria, parent, sentinel); - + CHECK_PARAMS(sentinel && parent); - + switch(criteria) { case VENDOR_BY_ID: /* parent must be the dictionary */ CHECK_PARAMS(dict->dict_eyec == DICT_EYECATCHER); *sentinel = &dict->dict_vendors.list[0]; break; - + case APPLICATION_BY_ID: /* parent must be the dictionary */ CHECK_PARAMS(dict->dict_eyec == DICT_EYECATCHER); *sentinel = &dict->dict_applications.list[0]; break; - + case TYPE_BY_NAME: /* parent must be the dictionary */ CHECK_PARAMS(dict->dict_eyec == DICT_EYECATCHER); *sentinel = &dict->dict_types; break; - + case ENUMVAL_BY_NAME: /* parent must be a type object */ CHECK_PARAMS(verify_object(obj_parent) && (obj_parent->type == DICT_TYPE)); *sentinel = &obj_parent->list[1]; break; - + case ENUMVAL_BY_VALUE: /* parent must be a type object */ CHECK_PARAMS(verify_object(obj_parent) && (obj_parent->type == DICT_TYPE)); *sentinel = &obj_parent->list[2]; break; - + case AVP_BY_NAME: /* parent must be a VENDOR object */ CHECK_PARAMS(verify_object(obj_parent) && (obj_parent->type == DICT_VENDOR)); *sentinel = &obj_parent->list[2]; break; - + case AVP_BY_CODE: /* parent must be a VENDOR object */ CHECK_PARAMS(verify_object(obj_parent) && (obj_parent->type == DICT_VENDOR)); *sentinel = &obj_parent->list[1]; break; - + case CMD_BY_NAME: /* parent must be the dictionary */ CHECK_PARAMS(dict->dict_eyec == DICT_EYECATCHER); *sentinel = &dict->dict_cmd_name; break; - + case CMD_BY_CODE_R: /* parent must be the dictionary */ CHECK_PARAMS(dict->dict_eyec == DICT_EYECATCHER); *sentinel = &dict->dict_cmd_code; break; - + case RULE_BY_AVP_AND_PARENT: /* parent must be command or grouped AVP */ CHECK_PARAMS(verify_object(obj_parent)); CHECK_PARAMS( (obj_parent->type == DICT_COMMAND) || - ((obj_parent->type == DICT_AVP) + ((obj_parent->type == DICT_AVP) && (obj_parent->data.avp.avp_basetype == AVP_TYPE_GROUPED)) ); *sentinel = &obj_parent->list[2]; break; - + default: CHECK_PARAMS(0); } - + return 0; } @@ -2130,23 +2037,23 @@ int fd_dict_getlistof(int criteria, void * parent, struct fd_list ** sentinel) int fd_dict_init ( struct dictionary ** dict) { struct dictionary * new = NULL; - + TRACE_ENTRY("%p", dict); - + /* Sanity checks */ ASSERT( (sizeof(type_base_name) / sizeof(type_base_name[0])) == (AVP_TYPE_MAX + 1) ); ASSERT( (sizeof(dict_obj_info) / sizeof(dict_obj_info[0])) == (DICT_TYPE_MAX + 1) ); CHECK_PARAMS(dict); - + /* Allocate the memory for the dictionary */ CHECK_MALLOC( new = malloc(sizeof(struct dictionary)) ); memset(new, 0, sizeof(struct dictionary)); - + new->dict_eyec = DICT_EYECATCHER; - + /* Initialize the lock for the dictionary */ CHECK_POSIX( pthread_rwlock_init(&new->dict_lock, NULL) ); - + /* Initialize the sentinel for vendors and AVP lists */ init_object( &new->dict_vendors, DICT_VENDOR ); #define NO_VENDOR_NAME "(no vendor)" @@ -2154,7 +2061,7 @@ int fd_dict_init ( struct dictionary ** dict) new->dict_vendors.datastr_len = CONSTSTRLEN(NO_VENDOR_NAME); /* new->dict_vendors.list[0].o = NULL; *//* overwrite since element is also sentinel for this list. */ new->dict_vendors.dico = new; - + /* Initialize the sentinel for applications */ init_object( &new->dict_applications, DICT_APPLICATION ); #define APPLICATION_0_NAME "Diameter Common Messages" @@ -2162,14 +2069,14 @@ int fd_dict_init ( struct dictionary ** dict) new->dict_applications.datastr_len = CONSTSTRLEN(APPLICATION_0_NAME); /* new->dict_applications.list[0].o = NULL; *//* overwrite since since element is also sentinel for this list. */ new->dict_applications.dico = new; - + /* Initialize the sentinel for types */ fd_list_init ( &new->dict_types, NULL ); - + /* Initialize the sentinels for commands */ fd_list_init ( &new->dict_cmd_name, NULL ); fd_list_init ( &new->dict_cmd_code, NULL ); - + /* Initialize the error command object */ init_object( &new->dict_cmd_error, DICT_COMMAND ); #define GENERIC_ERROR_NAME "(generic error format)" @@ -2178,9 +2085,9 @@ int fd_dict_init ( struct dictionary ** dict) new->dict_cmd_error.data.cmd.cmd_flag_mask=CMD_FLAG_ERROR | CMD_FLAG_REQUEST | CMD_FLAG_RETRANSMIT; new->dict_cmd_error.data.cmd.cmd_flag_val =CMD_FLAG_ERROR; new->dict_cmd_error.dico = new; - + *dict = new; - + /* Done */ return 0; } @@ -2189,13 +2096,13 @@ int fd_dict_init ( struct dictionary ** dict) int fd_dict_fini ( struct dictionary ** dict) { int i; - + TRACE_ENTRY(""); CHECK_PARAMS( dict && *dict && ((*dict)->dict_eyec == DICT_EYECATCHER) ); - + /* Acquire the write lock to make sure no other operation is ongoing */ CHECK_POSIX( pthread_rwlock_wrlock(&(*dict)->dict_lock) ); - + /* Empty all the lists, free the elements */ destroy_list ( &(*dict)->dict_cmd_error.list[2] ); destroy_list ( &(*dict)->dict_cmd_code ); @@ -2205,14 +2112,14 @@ int fd_dict_fini ( struct dictionary ** dict) destroy_list ( &(*dict)->dict_applications.list[i] ); destroy_list ( &(*dict)->dict_vendors.list[i] ); } - + /* Dictionary is empty, now destroy the lock */ CHECK_POSIX( pthread_rwlock_unlock(&(*dict)->dict_lock) ); CHECK_POSIX( pthread_rwlock_destroy(&(*dict)->dict_lock) ); - + free(*dict); *dict = NULL; - + return 0; } @@ -2229,32 +2136,32 @@ int fd_dict_iterate_rules ( struct dict_object *parent, void * data, int (*cb)(v { int ret = 0; struct fd_list * li; - + TRACE_ENTRY("%p %p %p", parent, data, cb); - + /* Check parameters */ CHECK_PARAMS( verify_object(parent) ); - CHECK_PARAMS( (parent->type == DICT_COMMAND) + CHECK_PARAMS( (parent->type == DICT_COMMAND) || ((parent->type == DICT_AVP) && (parent->data.avp.avp_basetype == AVP_TYPE_GROUPED)) ); - TRACE_DEBUG (FULL, "Iterating on rules of %s: '%s'.", - _OBINFO(parent).name, - parent->type == DICT_COMMAND ? + TRACE_DEBUG (FULL, "Iterating on rules of %s: '%s'.", + _OBINFO(parent).name, + parent->type == DICT_COMMAND ? parent->data.cmd.cmd_name : parent->data.avp.avp_name); - + /* Acquire the read lock */ CHECK_POSIX( pthread_rwlock_rdlock(&parent->dico->dict_lock) ); - + /* go through the list and call the cb on each rule data */ for (li = &(parent->list[2]); li->next != &(parent->list[2]); li = li->next) { ret = (*cb)(data, &(_O(li->next->o)->data.rule)); if (ret != 0) break; } - + /* Release the lock */ CHECK_POSIX( pthread_rwlock_unlock(&parent->dico->dict_lock) ); - + return ret; } @@ -2264,25 +2171,25 @@ uint32_t * fd_dict_get_vendorid_list(struct dictionary * dict) uint32_t * ret = NULL; int i = 0; struct fd_list * li; - + TRACE_ENTRY(); - + /* Acquire the read lock */ CHECK_POSIX_DO( pthread_rwlock_rdlock(&dict->dict_lock), return NULL ); - + /* Allocate an array to contain all the elements */ CHECK_MALLOC_DO( ret = calloc( dict->dict_count[DICT_VENDOR] + 1, sizeof(uint32_t) ), goto out ); - + /* Copy the vendors IDs */ for (li = dict->dict_vendors.list[0].next; li != &(dict->dict_vendors.list[0]); li = li->next) { ret[i] = _O(li->o)->data.vendor.vendor_id; i++; ASSERT( i <= dict->dict_count[DICT_VENDOR] ); } -out: +out: /* Release the lock */ CHECK_POSIX_DO( pthread_rwlock_unlock(&dict->dict_lock), return NULL ); - + return ret; } diff --git a/libfdproto/dictionary_functions.c b/libfdproto/dictionary_functions.c index 315b417..9c45903 100644 --- a/libfdproto/dictionary_functions.c +++ b/libfdproto/dictionary_functions.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -287,7 +287,7 @@ static int time_t_to_diameter_string(time_t time_stamp, char **result) { int fd_dictfct_Time_encode(void * data, union avp_value * avp_value) { - char * buf; + char * buf = NULL; size_t len; TRACE_ENTRY("%p %p", data, avp_value); diff --git a/libfdproto/fifo.c b/libfdproto/fifo.c index cf5b7fc..4740b90 100644 --- a/libfdproto/fifo.c +++ b/libfdproto/fifo.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -50,18 +50,18 @@ /* Definition of a FIFO queue object */ struct fifo { int eyec; /* An eye catcher, also used to check a queue is valid. FIFO_EYEC */ - + pthread_mutex_t mtx; /* Mutex protecting this queue */ pthread_cond_t cond_pull; /* condition variable for pulling threads */ pthread_cond_t cond_push; /* condition variable for pushing threads */ - + struct fd_list list; /* sentinel for the list of elements */ int count; /* number of objects in the list */ int thrs; /* number of threads waiting for a new element (when count is 0) */ - + int max; /* maximum number of items to accept if not 0 */ int thrs_push; /* number of threads waitnig to push an item */ - + uint16_t high; /* High level threshold (see libfreeDiameter.h for details) */ uint16_t low; /* Low level threshhold */ void *data; /* Opaque pointer for threshold callbacks */ @@ -69,12 +69,12 @@ struct fifo { void (*l_cb)(struct fifo *, void **); int highest;/* The highest count value for which h_cb has been called */ int highest_ever; /* The max count value this queue has reached (for tweaking) */ - + long long total_items; /* Cumulated number of items that went through this fifo (excluding current count), always increasing. */ struct timespec total_time; /* Cumulated time all items spent in this queue, including blocking time (always growing, use deltas for monitoring) */ struct timespec blocking_time; /* Cumulated time threads trying to post new items were blocked (queue full). */ struct timespec last_time; /* For the last element retrieved from the queue, how long it take between posting (including blocking) and poping */ - + }; struct fifo_item { @@ -93,231 +93,252 @@ struct fifo_item { int fd_fifo_new ( struct fifo ** queue, int max ) { struct fifo * new; - + TRACE_ENTRY( "%p", queue ); - + CHECK_PARAMS( queue ); - + /* Create a new object */ CHECK_MALLOC( new = malloc (sizeof (struct fifo) ) ); - + /* Initialize the content */ memset(new, 0, sizeof(struct fifo)); - + new->eyec = FIFO_EYEC; CHECK_POSIX( pthread_mutex_init(&new->mtx, NULL) ); CHECK_POSIX( pthread_cond_init(&new->cond_pull, NULL) ); CHECK_POSIX( pthread_cond_init(&new->cond_push, NULL) ); new->max = max; - + fd_list_init(&new->list, NULL); - + /* We're done */ *queue = new; return 0; } +int fd_fifo_set_max (struct fifo * queue, int max) +{ + queue->max = max; + return 0; +} + + /* Dump the content of a queue */ DECLARE_FD_DUMP_PROTOTYPE(fd_fifo_dump, char * name, struct fifo * queue, fd_fifo_dump_item_cb dump_item) { FD_DUMP_HANDLE_OFFSET(); - + if (name) { - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'(@%p): ", name, queue), return NULL); + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'(@%p): ", name, queue), return NULL); } else { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{fifo}(@%p): ", queue), return NULL); } - + if (!CHECK_FIFO( queue )) { return fd_dump_extend(FD_DUMP_STD_PARAMS, "INVALID/NULL"); } - + CHECK_POSIX_DO( pthread_mutex_lock( &queue->mtx ), /* continue */ ); - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "items:%d,%d,%d threads:%d,%d stats:%lld/%ld.%06ld,%ld.%06ld,%ld.%06ld thresholds:%d,%d,%d,%p,%p,%p", + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "items:%d,%d,%d threads:%d,%d stats:%lld/%ld.%06ld,%ld.%06ld,%ld.%06ld thresholds:%d,%d,%d,%p,%p,%p", queue->count, queue->highest_ever, queue->max, queue->thrs, queue->thrs_push, queue->total_items,(long)queue->total_time.tv_sec,(long)(queue->total_time.tv_nsec/1000),(long)queue->blocking_time.tv_sec,(long)(queue->blocking_time.tv_nsec/1000),(long)queue->last_time.tv_sec,(long)(queue->last_time.tv_nsec/1000), - queue->high, queue->low, queue->highest, queue->h_cb, queue->l_cb, queue->data), + queue->high, queue->low, queue->highest, queue->h_cb, queue->l_cb, queue->data), goto error); - + if (dump_item) { struct fd_list * li; int i = 0; for (li = queue->list.next; li != &queue->list; li = li->next) { struct fifo_item * fi = (struct fifo_item *)li; - CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n [#%i](@%p)@%ld.%06ld: ", - i++, fi->item.o, (long)fi->posted_on.tv_sec,(long)(fi->posted_on.tv_nsec/1000)), + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n [#%i](@%p)@%ld.%06ld: ", + i++, fi->item.o, (long)fi->posted_on.tv_sec,(long)(fi->posted_on.tv_nsec/1000)), goto error); CHECK_MALLOC_DO( (*dump_item)(FD_DUMP_STD_PARAMS, fi->item.o), goto error); } } CHECK_POSIX_DO( pthread_mutex_unlock( &queue->mtx ), /* continue */ ); - + return *buf; error: CHECK_POSIX_DO( pthread_mutex_unlock( &queue->mtx ), /* continue */ ); return NULL; } -/* Delete a queue. It must be empty. */ +/* Delete a queue. It must be empty. */ int fd_fifo_del ( struct fifo ** queue ) { struct fifo * q; +#ifndef NDEBUG int loops = 0; - +#endif + TRACE_ENTRY( "%p", queue ); + if (queue && *queue == NULL) { + /* Queue already (in the process of being) deleted */ + return 0; + } + CHECK_PARAMS( queue && CHECK_FIFO( *queue ) ); - + q = *queue; - + CHECK_POSIX( pthread_mutex_lock( &q->mtx ) ); - + if ((q->count != 0) || (q->data != NULL)) { TRACE_DEBUG(INFO, "The queue cannot be destroyed (%d, %p)", q->count, q->data); CHECK_POSIX_DO( pthread_mutex_unlock( &q->mtx ), /* no fallback */ ); return EINVAL; } - + /* Ok, now invalidate the queue */ q->eyec = 0xdead; - + /* Have all waiting threads return an error */ while (q->thrs) { CHECK_POSIX( pthread_mutex_unlock( &q->mtx )); CHECK_POSIX( pthread_cond_signal(&q->cond_pull) ); usleep(1000); - + CHECK_POSIX( pthread_mutex_lock( &q->mtx ) ); - ASSERT( ++loops < 20 ); /* detect infinite loops */ + ASSERT( ++loops < 200 ); /* detect infinite loops */ } - + /* sanity check */ ASSERT(FD_IS_LIST_EMPTY(&q->list)); - + /* And destroy it */ CHECK_POSIX( pthread_mutex_unlock( &q->mtx ) ); - + CHECK_POSIX_DO( pthread_cond_destroy( &q->cond_pull ), ); - + CHECK_POSIX_DO( pthread_cond_destroy( &q->cond_push ), ); - + CHECK_POSIX_DO( pthread_mutex_destroy( &q->mtx ), ); - + free(q); *queue = NULL; - + return 0; } /* Move the content of old into new, and update loc_update atomically. We leave the old queue empty but valid */ int fd_fifo_move ( struct fifo * old, struct fifo * new, struct fifo ** loc_update ) { +#ifndef NDEBUG int loops = 0; - +#endif + TRACE_ENTRY("%p %p %p", old, new, loc_update); CHECK_PARAMS( CHECK_FIFO( old ) && CHECK_FIFO( new )); - + CHECK_PARAMS( ! old->data ); if (new->high) { TODO("Implement support for thresholds in fd_fifo_move..."); } - + /* Update loc_update */ if (loc_update) *loc_update = new; - + /* Lock the queues */ CHECK_POSIX( pthread_mutex_lock( &old->mtx ) ); - + CHECK_PARAMS_DO( (! old->thrs_push), { pthread_mutex_unlock( &old->mtx ); return EINVAL; } ); - + CHECK_POSIX( pthread_mutex_lock( &new->mtx ) ); - + /* Any waiting thread on the old queue returns an error */ old->eyec = 0xdead; while (old->thrs) { CHECK_POSIX( pthread_mutex_unlock( &old->mtx )); CHECK_POSIX( pthread_cond_signal( &old->cond_pull ) ); usleep(1000); - + CHECK_POSIX( pthread_mutex_lock( &old->mtx ) ); ASSERT( loops < 20 ); /* detect infinite loops */ } - + /* Move all data from old to new */ fd_list_move_end( &new->list, &old->list ); if (old->count && (!new->count)) { CHECK_POSIX( pthread_cond_signal(&new->cond_pull) ); } new->count += old->count; - + /* Reset old */ old->count = 0; old->eyec = FIFO_EYEC; - + /* Merge the stats in the new queue */ new->total_items += old->total_items; old->total_items = 0; - + new->total_time.tv_nsec += old->total_time.tv_nsec; new->total_time.tv_sec += old->total_time.tv_sec + (new->total_time.tv_nsec / 1000000000); new->total_time.tv_nsec %= 1000000000; old->total_time.tv_nsec = 0; old->total_time.tv_sec = 0; - + new->blocking_time.tv_nsec += old->blocking_time.tv_nsec; new->blocking_time.tv_sec += old->blocking_time.tv_sec + (new->blocking_time.tv_nsec / 1000000000); new->blocking_time.tv_nsec %= 1000000000; old->blocking_time.tv_nsec = 0; old->blocking_time.tv_sec = 0; - + /* Unlock, we're done */ CHECK_POSIX( pthread_mutex_unlock( &new->mtx ) ); CHECK_POSIX( pthread_mutex_unlock( &old->mtx ) ); - + return 0; } /* Get the information on the queue */ -int fd_fifo_getstats( struct fifo * queue, int * current_count, int * limit_count, int * highest_count, long long * total_count, +int fd_fifo_getstats( struct fifo * queue, int * current_count, int * limit_count, int * highest_count, long long * total_count, struct timespec * total, struct timespec * blocking, struct timespec * last) { TRACE_ENTRY( "%p %p %p %p %p %p %p %p", queue, current_count, limit_count, highest_count, total_count, total, blocking, last); - + + if (queue == NULL) { + /* It is not an error if the queue is not available; happens e.g. when peers disappear */ + return 0; + } + /* Check the parameters */ CHECK_PARAMS( CHECK_FIFO( queue ) ); - + /* lock the queue */ CHECK_POSIX( pthread_mutex_lock( &queue->mtx ) ); - + if (current_count) *current_count = queue->count; - + if (limit_count) *limit_count = queue->max; - + if (highest_count) *highest_count = queue->highest_ever; - + if (total_count) *total_count = queue->total_items; - + if (total) memcpy(total, &queue->total_time, sizeof(struct timespec)); - + if (blocking) memcpy(blocking, &queue->blocking_time, sizeof(struct timespec)); - + if (last) memcpy(last, &queue->last_time, sizeof(struct timespec)); - + /* Unlock */ CHECK_POSIX( pthread_mutex_unlock( &queue->mtx ) ); - + /* Done */ return 0; } @@ -328,7 +349,7 @@ int fd_fifo_length ( struct fifo * queue ) { if ( !CHECK_FIFO( queue ) ) return 0; - + return queue->count; /* Let's hope it's read atomically, since we are not locking... */ } @@ -336,23 +357,23 @@ int fd_fifo_length ( struct fifo * queue ) int fd_fifo_setthrhd ( struct fifo * queue, void * data, uint16_t high, void (*h_cb)(struct fifo *, void **), uint16_t low, void (*l_cb)(struct fifo *, void **) ) { TRACE_ENTRY( "%p %p %hu %p %hu %p", queue, data, high, h_cb, low, l_cb ); - + /* Check the parameters */ CHECK_PARAMS( CHECK_FIFO( queue ) && (high > low) && (queue->data == NULL) ); - + /* lock the queue */ CHECK_POSIX( pthread_mutex_lock( &queue->mtx ) ); - + /* Save the values */ queue->high = high; queue->low = low; queue->data = data; queue->h_cb = h_cb; queue->l_cb = l_cb; - + /* Unlock */ CHECK_POSIX( pthread_mutex_unlock( &queue->mtx ) ); - + /* Done */ return 0; } @@ -363,13 +384,13 @@ static void fifo_cleanup_push(void * queue) { struct fifo * q = (struct fifo *)queue; TRACE_ENTRY( "%p", queue ); - + /* The thread has been cancelled, therefore it does not wait on the queue anymore */ q->thrs_push--; - + /* Now unlock the queue, and we're done */ CHECK_POSIX_DO( pthread_mutex_unlock( &q->mtx ), /* nothing */ ); - + /* End of cleanup handler */ return; } @@ -381,37 +402,40 @@ int fd_fifo_post_internal ( struct fifo * queue, void ** item, int skip_max ) struct fifo_item * new; int call_cb = 0; struct timespec posted_on, queued_on; - + /* Get the timing of this call */ CHECK_SYS( clock_gettime(CLOCK_REALTIME, &posted_on) ); - + /* lock the queue */ CHECK_POSIX( pthread_mutex_lock( &queue->mtx ) ); - + if ((!skip_max) && (queue->max)) { while (queue->count >= queue->max) { int ret = 0; - + /* We have to wait for an item to be pulled */ queue->thrs_push++ ; pthread_cleanup_push( fifo_cleanup_push, queue); ret = pthread_cond_wait( &queue->cond_push, &queue->mtx ); pthread_cleanup_pop(0); queue->thrs_push-- ; - + +#ifdef NDEBUG + (void)ret; +#endif ASSERT( ret == 0 ); } } - + /* Create a new list item */ CHECK_MALLOC_DO( new = malloc (sizeof (struct fifo_item)) , { pthread_mutex_unlock( &queue->mtx ); return ENOMEM; } ); - + fd_list_init(&new->item, *item); *item = NULL; - + /* Add the new item at the end */ fd_list_insert_before( &queue->list, &new->item); queue->count++; @@ -421,10 +445,10 @@ int fd_fifo_post_internal ( struct fifo * queue, void ** item, int skip_max ) call_cb = 1; queue->highest = queue->count; } - + /* store timing */ memcpy(&new->posted_on, &posted_on, sizeof(struct timespec)); - + /* update queue timing info "blocking time" */ { long long blocked_ns; @@ -435,7 +459,7 @@ int fd_fifo_post_internal ( struct fifo * queue, void ** item, int skip_max ) queue->blocking_time.tv_sec += blocked_ns / 1000000000; queue->blocking_time.tv_nsec = blocked_ns % 1000000000; } - + /* Signal if threads are asleep */ if (queue->thrs > 0) { CHECK_POSIX( pthread_cond_signal(&queue->cond_pull) ); @@ -444,14 +468,14 @@ int fd_fifo_post_internal ( struct fifo * queue, void ** item, int skip_max ) /* cascade */ CHECK_POSIX( pthread_cond_signal(&queue->cond_push) ); } - + /* Unlock */ CHECK_POSIX( pthread_mutex_unlock( &queue->mtx ) ); - + /* Call high-watermark cb as needed */ if (call_cb && queue->h_cb) (*queue->h_cb)(queue, &queue->data); - + /* Done */ return 0; } @@ -460,24 +484,24 @@ int fd_fifo_post_internal ( struct fifo * queue, void ** item, int skip_max ) int fd_fifo_post_int ( struct fifo * queue, void ** item ) { TRACE_ENTRY( "%p %p", queue, item ); - + /* Check the parameters */ CHECK_PARAMS( CHECK_FIFO( queue ) && item && *item ); - + return fd_fifo_post_internal ( queue,item, 0 ); - + } /* Post a new item in the queue, not blocking */ int fd_fifo_post_noblock ( struct fifo * queue, void ** item ) { TRACE_ENTRY( "%p %p", queue, item ); - + /* Check the parameters */ CHECK_PARAMS( CHECK_FIFO( queue ) && item && *item ); - + return fd_fifo_post_internal ( queue,item, 1 ); - + } /* Pop the first item from the queue */ @@ -486,35 +510,35 @@ static void * mq_pop(struct fifo * queue) void * ret = NULL; struct fifo_item * fi; struct timespec now; - + ASSERT( ! FD_IS_LIST_EMPTY(&queue->list) ); - + fi = (struct fifo_item *)(queue->list.next); ret = fi->item.o; fd_list_unlink(&fi->item); queue->count--; queue->total_items++; - + /* Update the timings */ CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), goto skip_timing ); { long long elapsed = (now.tv_sec - fi->posted_on.tv_sec) * 1000000000; elapsed += now.tv_nsec - fi->posted_on.tv_nsec; - + queue->last_time.tv_sec = elapsed / 1000000000; queue->last_time.tv_nsec = elapsed % 1000000000; - + elapsed += queue->total_time.tv_nsec; queue->total_time.tv_sec += elapsed / 1000000000; queue->total_time.tv_nsec = elapsed % 1000000000; } -skip_timing: +skip_timing: free(fi); - + if (queue->thrs_push) { CHECK_POSIX_DO( pthread_cond_signal( &queue->cond_push ), ); } - + return ret; } @@ -523,12 +547,12 @@ static __inline__ int test_l_cb(struct fifo * queue) { if ((queue->high == 0) || (queue->low == 0) || (queue->l_cb == 0)) return 0; - + if (((queue->count % queue->high) == queue->low) && (queue->highest > queue->count)) { queue->highest -= queue->high; return 1; } - + return 0; } @@ -537,15 +561,15 @@ int fd_fifo_tryget_int ( struct fifo * queue, void ** item ) { int wouldblock = 0; int call_cb = 0; - + TRACE_ENTRY( "%p %p", queue, item ); - + /* Check the parameters */ CHECK_PARAMS( CHECK_FIFO( queue ) && item ); - + /* lock the queue */ CHECK_POSIX( pthread_mutex_lock( &queue->mtx ) ); - + /* Check queue status */ if (queue->count > 0) { got_item: @@ -562,18 +586,18 @@ got_item: if (queue->count > 0) goto got_item; } - + wouldblock = 1; *item = NULL; } - + /* Unlock */ CHECK_POSIX( pthread_mutex_unlock( &queue->mtx ) ); - + /* Call low watermark callback as needed */ if (call_cb) (*queue->l_cb)(queue, &queue->data); - + /* Done */ return wouldblock ? EWOULDBLOCK : 0; } @@ -583,13 +607,13 @@ static void fifo_cleanup(void * queue) { struct fifo * q = (struct fifo *)queue; TRACE_ENTRY( "%p", queue ); - + /* The thread has been cancelled, therefore it does not wait on the queue anymore */ q->thrs--; - + /* Now unlock the queue, and we're done */ CHECK_POSIX_DO( pthread_mutex_unlock( &q->mtx ), /* nothing */ ); - + /* End of cleanup handler */ return; } @@ -599,16 +623,16 @@ static int fifo_tget ( struct fifo * queue, void ** item, int istimed, const str { int call_cb = 0; int ret = 0; - + /* Check the parameters */ CHECK_PARAMS( CHECK_FIFO( queue ) && item && (abstime || !istimed) ); - + /* Initialize the return value */ *item = NULL; - + /* lock the queue */ CHECK_POSIX( pthread_mutex_lock( &queue->mtx ) ); - + awaken: /* Check queue status */ if (!CHECK_FIFO( queue )) { @@ -617,7 +641,7 @@ awaken: TRACE_DEBUG(FULL, "The queue is being destroyed -> EPIPE"); return EPIPE; } - + if (queue->count > 0) { /* There are items in the queue, so pick the first one */ *item = mq_pop(queue); @@ -635,17 +659,17 @@ awaken: queue->thrs-- ; if (ret == 0) goto awaken; /* test for spurious wake-ups */ - + /* otherwise (ETIMEDOUT / other error) just continue */ } - + /* Unlock */ CHECK_POSIX( pthread_mutex_unlock( &queue->mtx ) ); - + /* Call low watermark callback as needed */ if (call_cb) (*queue->l_cb)(queue, &queue->data); - + /* Done */ return ret; } @@ -669,13 +693,13 @@ int fd_fifo_select ( struct fifo * queue, const struct timespec *abstime ) { int ret = 0; TRACE_ENTRY( "%p %p", queue, abstime ); - + CHECK_PARAMS_DO( CHECK_FIFO( queue ), return -EINVAL ); - + /* lock the queue */ CHECK_POSIX_DO( pthread_mutex_lock( &queue->mtx ), return -__ret__ ); - -awaken: + +awaken: ret = (queue->count > 0 ) ? queue->count : 0; if ((ret == 0) && (abstime != NULL)) { /* We have to wait for a new item */ @@ -686,15 +710,15 @@ awaken: queue->thrs-- ; if (ret == 0) goto awaken; /* test for spurious wake-ups */ - + if (ret == ETIMEDOUT) ret = 0; - else + else ret = -ret; } - + /* Unlock */ CHECK_POSIX_DO( pthread_mutex_unlock( &queue->mtx ), return -__ret__ ); - + return ret; } diff --git a/libfdproto/log.c b/libfdproto/log.c index 7bbe307..c0b6ec5 100644 --- a/libfdproto/log.c +++ b/libfdproto/log.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -112,6 +112,7 @@ static void fd_internal_logger( int printlevel, const char *format, va_list ap ) switch(printlevel) { case FD_LOG_ANNOYING: printf("%s A ", (use_colors == 1) ? "\e[0;37m" : ""); break; case FD_LOG_DEBUG: printf("%s DBG ", (use_colors == 1) ? "\e[0;37m" : ""); break; + case FD_LOG_INFO: printf("%sINFO ", (use_colors == 1) ? "\e[1;37m" : ""); break; case FD_LOG_NOTICE: printf("%sNOTI ", (use_colors == 1) ? "\e[1;37m" : ""); break; case FD_LOG_ERROR: printf("%sERROR ", (use_colors == 1) ? "\e[0;31m" : ""); break; case FD_LOG_FATAL: printf("%sFATAL! ", (use_colors == 1) ? "\e[0;31m" : ""); break; diff --git a/libfdproto/messages.c b/libfdproto/messages.c index a94602e..ed8186f 100644 --- a/libfdproto/messages.c +++ b/libfdproto/messages.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -596,29 +596,29 @@ int fd_msg_avp_add ( msg_or_avp * reference, enum msg_brw_dir dir, struct avp *a return 0; } -/* Search a given AVP model in a message */ -int fd_msg_search_avp ( struct msg * msg, struct dict_object * what, struct avp ** avp ) +/* Search a given AVP model in a message or AVP */ +int fd_msg_search_avp ( msg_or_avp * reference, struct dict_object * what, struct avp ** avp ) { struct avp * nextavp; struct dict_avp_data dictdata; enum dict_object_type dicttype; - TRACE_ENTRY("%p %p %p", msg, what, avp); + TRACE_ENTRY("%p %p %p", reference, what, avp); - CHECK_PARAMS( CHECK_MSG(msg) && what ); + CHECK_PARAMS( VALIDATE_OBJ(reference) && what ); CHECK_PARAMS( (fd_dict_gettype(what, &dicttype) == 0) && (dicttype == DICT_AVP) ); CHECK_FCT( fd_dict_getval(what, &dictdata) ); - /* Loop on all top AVPs */ - CHECK_FCT( fd_msg_browse(msg, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL) ); + /* Loop on all top AVPs in message or AVP */ + CHECK_FCT( fd_msg_browse(reference, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL) ); while (nextavp) { if ( (nextavp->avp_public.avp_code == dictdata.avp_code) && (nextavp->avp_public.avp_vendor == dictdata.avp_vendor) ) /* always 0 if no V flag */ break; - /* Otherwise move to next AVP in the message */ + /* Otherwise move to next AVP in the message or AVP */ CHECK_FCT( fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL) ); } @@ -1946,6 +1946,14 @@ static int parsebuf_list(unsigned char * buf, size_t buflen, struct fd_list * he offset += 4; } + /* Check the length is valid */ + if ( avp->avp_public.avp_len < GETAVPHDRSZ(avp->avp_public.avp_flags) ) { + TRACE_DEBUG(INFO, "Invalid AVP size %d", + avp->avp_public.avp_len); + free(avp); + return EBADMSG; + } + /* Check there is enough remaining data in the buffer */ if ( (avp->avp_public.avp_len > GETAVPHDRSZ(avp->avp_public.avp_flags)) && (buflen - offset < avp->avp_public.avp_len - GETAVPHDRSZ(avp->avp_public.avp_flags))) { @@ -1992,6 +2000,10 @@ int fd_msg_parse_buffer ( unsigned char ** buffer, size_t buflen, struct msg ** TRACE_DEBUG(INFO, "Truncated message (%zd / %d)", buflen, msglen ); return EBADMSG; } + if ( msglen < GETMSGHDRSZ() ) { + TRACE_DEBUG(INFO, "Invalid message length (%d)", msglen ); + return EBADMSG; + } /* Create a new object */ CHECK_MALLOC( new = malloc (sizeof(struct msg)) ); @@ -2234,7 +2246,7 @@ static int parsedict_do_avp(struct dictionary * dict, struct avp * avp, int mand if (error_info) { error_info->pei_errcode = "DIAMETER_INVALID_AVP_VALUE"; error_info->pei_avp = avp; - strncpy(error_message, err, sizeof(error_message)); + snprintf(error_message, sizeof(error_message), "%s", err); error_info->pei_message = error_message; } else { char * buf = NULL; @@ -2284,7 +2296,9 @@ static int parsedict_do_msg(struct dictionary * dict, struct msg * msg, int only /* First, check if we already have a model. */ if (msg->msg_model != NULL) { /* Check if this model is still valid for the message data */ +#ifndef NDEBUG enum dict_object_type dicttype; +#endif struct dict_cmd_data data; ASSERT(((fd_dict_gettype(msg->msg_model, &dicttype) == 0) && (dicttype == DICT_COMMAND))); (void)fd_dict_getval( msg->msg_model, &data); diff --git a/libfdproto/sessions.c b/libfdproto/sessions.c index b6c94fa..ca81dba 100644 --- a/libfdproto/sessions.c +++ b/libfdproto/sessions.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -34,7 +34,7 @@ *********************************************************************************************************/ /* Sessions module. - * + * * Basic functionalities to help implementing User sessions state machines from RFC3588. */ @@ -91,15 +91,15 @@ struct state { /* Session object, one for each value of Session-Id AVP */ struct session { int eyec; /* Eyecatcher, SI_EYEC */ - + os0_t sid; /* The \0-terminated Session-Id */ size_t sidlen; /* cached length of sid */ uint32_t hash; /* computed hash of sid */ struct fd_list chain_h;/* chaining in the hash table of sessions. */ - + struct timespec timeout;/* Timeout date for the session */ struct fd_list expire; /* List of expiring sessions, ordered by timeouts. */ - + pthread_mutex_t stlock; /* A lock to protect the list of states associated with this session */ struct fd_list states; /* Sentinel for the list of states of this session. */ int msg_cnt;/* Reference counter for the messages pointing to this session */ @@ -125,7 +125,7 @@ static pthread_mutex_t sid_lock = PTHREAD_MUTEX_INITIALIZER; /* Expiring sessions management */ static struct fd_list exp_sentinel = FD_LIST_INITIALIZER(exp_sentinel); /* list of sessions ordered by their timeout date */ static pthread_mutex_t exp_lock = PTHREAD_MUTEX_INITIALIZER; /* lock protecting the list. */ -static pthread_cond_t exp_cond = PTHREAD_COND_INITIALIZER; /* condvar used by the expiry mecahinsm. */ +static pthread_cond_t exp_cond = PTHREAD_COND_INITIALIZER; /* condvar used by the expiry mechainsm. */ static pthread_t exp_thr = (pthread_t)NULL; /* The expiry thread that handles cleanup of expired sessions */ /* Hierarchy of the locks, to avoid deadlocks: @@ -140,27 +140,27 @@ static pthread_t exp_thr = (pthread_t)NULL; /* The expiry thread that handles c static struct session * new_session(os0_t sid, size_t sidlen, uint32_t hash) { struct session * sess; - + TRACE_ENTRY("%p %zd", sid, sidlen); CHECK_PARAMS_DO( sid && sidlen, return NULL ); - + CHECK_MALLOC_DO( sess = malloc(sizeof(struct session)), return NULL ); memset(sess, 0, sizeof(struct session)); - + sess->eyec = SI_EYEC; - + sess->sid = sid; sess->sidlen = sidlen; sess->hash = hash; fd_list_init(&sess->chain_h, sess); - + CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &sess->timeout), return NULL ); sess->timeout.tv_sec += SESS_DEFAULT_LIFETIME; fd_list_init(&sess->expire, sess); - + CHECK_POSIX_DO( pthread_mutex_init(&sess->stlock, NULL), return NULL ); fd_list_init(&sess->states, sess); - + return sess; } @@ -174,21 +174,21 @@ static void del_session(struct session * s) CHECK_POSIX_DO( pthread_mutex_destroy(&s->stlock), /* continue */ ); free(s); } - + /* The expiry thread */ static void * exp_fct(void * arg) { fd_log_threadname ( "Session/expire" ); TRACE_ENTRY( "" ); - - + + do { struct timespec now; struct session * first; - + CHECK_POSIX_DO( pthread_mutex_lock(&exp_lock), break ); pthread_cleanup_push( fd_cleanup_mutex, &exp_lock ); -again: +again: /* Check if there are expiring sessions available */ if (FD_IS_LIST_EMPTY(&exp_sentinel)) { /* Just wait for a change or cancelation */ @@ -196,39 +196,53 @@ again: /* Restart the loop on wakeup */ goto again; } - + /* Get the pointer to the session that expires first */ first = (struct session *)(exp_sentinel.next->o); ASSERT( VALIDATE_SI(first) ); - + /* Get the current time */ CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), break ); /* If first session is not expired, we just wait until it happens */ if ( TS_IS_INFERIOR( &now, &first->timeout ) ) { - - CHECK_POSIX_DO2( pthread_cond_timedwait( &exp_cond, &exp_lock, &first->timeout ), - ETIMEDOUT, /* ETIMEDOUT is a normal error, continue */, - /* on other error, */ break ); - - /* on wakeup, loop */ - goto again; + int ret; + + ret = pthread_cond_timedwait(&exp_cond, &exp_lock, &first->timeout); + switch (ret) { + case 0: + case ETIMEDOUT: + /* on wakeup or time-out, loop */ + goto again; + case EINVAL: + if (clock_gettime(CLOCK_REALTIME, &now) < 0) { + break; + } + if (TS_IS_INFERIOR(&now, &first->timeout)) { + TRACE_DEBUG(FULL, "'pthread_cond_timedwait(&exp_cond, &exp_lock, &first->timeout)' : timer expired before loop could start"); + goto again; + } + /* FALLTHROUGH */ + default: + TRACE_ERROR("ERROR: in 'pthread_cond_timedwait(&exp_cond, &exp_lock, &first->timeout)' :\t%s", strerror(ret)); + break; + } } - + /* Now, the first session in the list is expired; destroy it */ pthread_cleanup_pop( 0 ); CHECK_POSIX_DO( pthread_mutex_unlock(&exp_lock), break ); - + CHECK_FCT_DO( fd_sess_destroy( &first ), break ); - + } while (1); - + TRACE_DEBUG(INFO, "A system error occurred in session module! Expiry thread is terminating..."); ASSERT(0); return NULL; } - - + + /********************************************************************************************************/ @@ -236,19 +250,19 @@ again: int fd_sess_init(void) { int i; - + TRACE_ENTRY( "" ); - + /* Initialize the global counters */ sid_h = (uint32_t) time(NULL); sid_l = 0; - + /* Initialize the hash table */ for (i = 0; i < sizeof(sess_hash) / sizeof(sess_hash[0]); i++) { fd_list_init( &sess_hash[i].sentinel, NULL ); CHECK_POSIX( pthread_mutex_init(&sess_hash[i].lock, NULL) ); } - + return 0; } @@ -257,7 +271,7 @@ int fd_sess_start(void) { /* Start session garbage collector (expiry) */ CHECK_POSIX( pthread_create(&exp_thr, NULL, exp_fct, NULL) ); - + return 0; } @@ -266,9 +280,9 @@ void fd_sess_fini(void) { TRACE_ENTRY(""); CHECK_FCT_DO( fd_thr_term(&exp_thr), /* continue */ ); - + /* Destroy all sessions in the hash table, and the hash table itself? -- How to do it without a race condition ? */ - + return; } @@ -276,28 +290,28 @@ void fd_sess_fini(void) int fd_sess_handler_create ( struct session_handler ** handler, void (*cleanup)(struct sess_state *, os0_t, void *), session_state_dump dumper, void * opaque ) { struct session_handler *new; - + TRACE_ENTRY("%p %p", handler, cleanup); - + CHECK_PARAMS( handler && cleanup ); - + CHECK_MALLOC( new = malloc(sizeof(struct session_handler)) ); memset(new, 0, sizeof(struct session_handler)); - + CHECK_POSIX( pthread_mutex_lock(&hdl_lock) ); new->id = ++hdl_id; CHECK_POSIX( pthread_mutex_unlock(&hdl_lock) ); - + new->eyec = SH_EYEC; new->cleanup = cleanup; new->state_dump = dumper; new->opaque = opaque; - + *handler = new; return 0; } -/* Destroy a handler, and all states attached to this handler. This operation is very slow but we don't care since it's rarely used. +/* Destroy a handler, and all states attached to this handler. This operation is very slow but we don't care since it's rarely used. * Note that it's better to call this function after all sessions have been deleted... */ int fd_sess_handler_destroy ( struct session_handler ** handler, void ** opaque ) { @@ -305,20 +319,20 @@ int fd_sess_handler_destroy ( struct session_handler ** handler, void ** opaque /* place to save the list of states to be cleaned up. We do it after finding them to avoid deadlocks. the "o" field becomes a copy of the sid. */ struct fd_list deleted_states = FD_LIST_INITIALIZER( deleted_states ); int i; - + TRACE_ENTRY("%p", handler); CHECK_PARAMS( handler && VALIDATE_SH(*handler) ); - + del = *handler; *handler = NULL; - + del->eyec = 0xdead; /* The handler is not valid anymore for any other operation */ - + /* Now find all sessions with data registered for this handler, and move this data to the deleted_states list. */ for (i = 0; i < sizeof(sess_hash) / sizeof(sess_hash[0]); i++) { struct fd_list * li_si; CHECK_POSIX( pthread_mutex_lock(&sess_hash[i].lock) ); - + for (li_si = sess_hash[i].sentinel.next; li_si != &sess_hash[i].sentinel; li_si = li_si->next) { /* for each session in the hash line */ struct fd_list * li_st; struct session * sess = (struct session *)(li_si->o); @@ -340,7 +354,7 @@ int fd_sess_handler_destroy ( struct session_handler ** handler, void ** opaque } CHECK_POSIX( pthread_mutex_unlock(&sess_hash[i].lock) ); } - + /* Now, delete all states after calling their cleanup handler */ while (!FD_IS_LIST_EMPTY(&deleted_states)) { struct state * st = (struct state *)(deleted_states.next->o); @@ -349,13 +363,13 @@ int fd_sess_handler_destroy ( struct session_handler ** handler, void ** opaque fd_list_unlink(&st->chain); free(st); } - + if (opaque) *opaque = del->opaque; - + /* Free the handler */ free(del); - + return 0; } @@ -371,20 +385,20 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, struct fd_list * li; int found = 0; int ret = 0; - + TRACE_ENTRY("%p %p %zd %p %zd", session, diamid, diamidlen, opt, optlen); CHECK_PARAMS( session && (diamid || opt) ); - if (diamid) { + if (diamid) { if (!diamidlen) { diamidlen = strlen(diamid); - } + } /* We check if the string is a valid DiameterIdentity */ CHECK_PARAMS( fd_os_is_valid_DiameterIdentity((uint8_t *)diamid, diamidlen) ); } else { diamidlen = 0; } - if (opt) { + if (opt) { if (!optlen) { optlen = strlen((char *)opt); } else { @@ -393,7 +407,7 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, } else { optlen = 0; } - + /* Ok, first create the identifier for the string */ if (diamid == NULL) { /* opt is the full string */ @@ -409,49 +423,49 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, sidlen += 1 + optlen; /* ';opt' */ sidlen++; /* space for the final \0 also */ CHECK_MALLOC( sid = malloc(sidlen) ); - + CHECK_POSIX( pthread_mutex_lock(&sid_lock) ); if ( ++sid_l == 0 ) /* overflow */ ++sid_h; sid_h_cpy = sid_h; sid_l_cpy = sid_l; CHECK_POSIX( pthread_mutex_unlock(&sid_lock) ); - + if (opt) { sidlen = snprintf((char*)sid, sidlen, "%.*s;%u;%u;%.*s", (int)diamidlen, diamid, sid_h_cpy, sid_l_cpy, (int)optlen, opt); } else { sidlen = snprintf((char*)sid, sidlen, "%.*s;%u;%u", (int)diamidlen, diamid, sid_h_cpy, sid_l_cpy); } } - + hash = fd_os_hash(sid, sidlen); - + /* Now find the place to add this object in the hash table. */ CHECK_POSIX( pthread_mutex_lock( H_LOCK(hash) ) ); pthread_cleanup_push( fd_cleanup_mutex, H_LOCK(hash) ); - + for (li = H_LIST(hash)->next; li != H_LIST(hash); li = li->next) { int cmp; struct session * s = (struct session *)(li->o); - + /* The list is ordered by hash and sid (in case of collisions) */ if (s->hash < hash) continue; if (s->hash > hash) break; - + cmp = fd_os_cmp(s->sid, s->sidlen, sid, sidlen); if (cmp < 0) continue; if (cmp > 0) break; - + /* A session with the same sid was already in the hash table */ found = 1; *session = s; break; } - + /* If the session did not exist, we can create it & link it in global tables */ if (!found) { CHECK_MALLOC_DO(sess = new_session(sid, sidlen, hash), @@ -460,16 +474,16 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, free(sid); goto out; } ); - + fd_list_insert_before(li, &sess->chain_h); /* hash table */ sess->msg_cnt++; } else { free(sid); - - CHECK_POSIX( pthread_mutex_lock(&(*session)->stlock) ); + + CHECK_POSIX( pthread_mutex_lock(&(*session)->stlock) ); (*session)->msg_cnt++; - CHECK_POSIX( pthread_mutex_unlock(&(*session)->stlock) ); - + CHECK_POSIX( pthread_mutex_unlock(&(*session)->stlock) ); + /* it was found: was it previously destroyed? */ if ((*session)->is_destroyed == 0) { ret = EALREADY; @@ -478,13 +492,13 @@ int fd_sess_new ( struct session ** session, DiamId_t diamid, size_t diamidlen, /* the session was marked destroyed, let's re-activate it. */ sess = *session; sess->is_destroyed = 0; - + /* update the expiry time */ CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &sess->timeout), { ASSERT(0); } ); sess->timeout.tv_sec += SESS_DEFAULT_LIFETIME; } } - + /* We must insert in the expiry list */ CHECK_POSIX( pthread_mutex_lock( &exp_lock ) ); pthread_cleanup_push( fd_cleanup_mutex, &exp_lock ); @@ -511,10 +525,10 @@ out: ; pthread_cleanup_pop(0); CHECK_POSIX( pthread_mutex_unlock( H_LOCK(hash) ) ); - + if (ret) /* in case of error */ return ret; - + *session = sess; return 0; } @@ -523,28 +537,28 @@ out: int fd_sess_fromsid_msg ( uint8_t * sid, size_t len, struct session ** session, int * new) { int ret; - + TRACE_ENTRY("%p %zd %p %p", sid, len, session, new); CHECK_PARAMS( sid && session ); - + if (!fd_os_is_valid_os0(sid,len)) { TRACE_DEBUG(INFO, "Warning: a Session-Id value contains \\0 chars... (len:%zd, begin:'%.*s') => Debug messages may be truncated.", len, (int)len, sid); } - + /* All the work is done in sess_new */ ret = fd_sess_new ( session, NULL, 0, sid, len ); switch (ret) { case 0: case EALREADY: break; - + default: CHECK_FCT(ret); } - + if (new) *new = ret ? 0 : 1; - + return 0; } @@ -552,13 +566,13 @@ int fd_sess_fromsid_msg ( uint8_t * sid, size_t len, struct session ** session, int fd_sess_getsid ( struct session * session, os0_t * sid, size_t * sidlen ) { TRACE_ENTRY("%p %p", session, sid); - + CHECK_PARAMS( VALIDATE_SI(session) && sid ); - + *sid = session->sid; if (sidlen) *sidlen = session->sidlen; - + return 0; } @@ -566,18 +580,18 @@ int fd_sess_getsid ( struct session * session, os0_t * sid, size_t * sidlen ) int fd_sess_settimeout( struct session * session, const struct timespec * timeout ) { struct fd_list * li; - + TRACE_ENTRY("%p %p", session, timeout); CHECK_PARAMS( VALIDATE_SI(session) && timeout ); - + /* Lock -- do we need to lock the hash table as well? I don't think so... */ CHECK_POSIX( pthread_mutex_lock( &exp_lock ) ); pthread_cleanup_push( fd_cleanup_mutex, &exp_lock ); - + /* Update the timeout */ fd_list_unlink(&session->expire); memcpy(&session->timeout, timeout, sizeof(struct timespec)); - + /* Find the new position in expire list. We take it in normal order */ for (li = exp_sentinel.next; li != &exp_sentinel; li = li->next) { struct session * s = (struct session *)(li->o); @@ -597,7 +611,7 @@ int fd_sess_settimeout( struct session * session, const struct timespec * timeou /* We're done */ pthread_cleanup_pop(0); CHECK_POSIX( pthread_mutex_unlock( &exp_lock ) ); - + return 0; } @@ -608,28 +622,30 @@ int fd_sess_destroy ( struct session ** session ) int destroy_now; os0_t sid; int ret = 0; - + /* place to save the list of states to be cleaned up. We do it after finding them to avoid deadlocks. the "o" field becomes a copy of the sid. */ struct fd_list deleted_states = FD_LIST_INITIALIZER( deleted_states ); - + TRACE_ENTRY("%p", session); CHECK_PARAMS( session && VALIDATE_SI(*session) ); - + sess = *session; *session = NULL; - + /* Lock the hash line */ CHECK_POSIX( pthread_mutex_lock( H_LOCK(sess->hash) ) ); pthread_cleanup_push( fd_cleanup_mutex, H_LOCK(sess->hash) ); - + /* Unlink from the expiry list */ CHECK_POSIX_DO( pthread_mutex_lock( &exp_lock ), { ASSERT(0); /* otherwise cleanup handler is not pop'd */ } ); + pthread_cleanup_push( fd_cleanup_mutex, &exp_lock ); if (!FD_IS_LIST_EMPTY(&sess->expire)) { sess_cnt--; fd_list_unlink( &sess->expire ); /* no need to signal the condition here */ } + pthread_cleanup_pop(0); CHECK_POSIX_DO( pthread_mutex_unlock( &exp_lock ), { ASSERT(0); /* otherwise cleanup handler is not pop'd */ } ); - + /* Now move all states associated to this session into deleted_states */ CHECK_POSIX_DO( pthread_mutex_lock( &sess->stlock ), { ASSERT(0); /* otherwise cleanup handler is not pop'd */ } ); while (!FD_IS_LIST_EMPTY(&sess->states)) { @@ -638,7 +654,7 @@ int fd_sess_destroy ( struct session ** session ) fd_list_insert_before(&deleted_states, &st->chain); } CHECK_POSIX_DO( pthread_mutex_unlock( &sess->stlock ), { ASSERT(0); /* otherwise cleanup handler is not pop'd */ } ); - + /* Mark the session as destroyed */ destroy_now = (sess->msg_cnt == 0); if (destroy_now) { @@ -650,10 +666,10 @@ int fd_sess_destroy ( struct session ** session ) } pthread_cleanup_pop(0); CHECK_POSIX( pthread_mutex_unlock( H_LOCK(sess->hash) ) ); - + if (ret) return ret; - + /* Now, really delete the states */ while (!FD_IS_LIST_EMPTY(&deleted_states)) { struct state * st = (struct state *)(deleted_states.next->o); @@ -662,14 +678,14 @@ int fd_sess_destroy ( struct session ** session ) (*st->hdl->cleanup)(st->state, sid, st->hdl->opaque); free(st); } - + /* Finally, destroy the session itself, if it is not referrenced by any message anymore */ if (destroy_now) { del_session(sess); } else { free(sid); } - + return 0; } @@ -679,20 +695,21 @@ int fd_sess_reclaim ( struct session ** session ) struct session * sess; uint32_t hash; int destroy_now = 0; - + TRACE_ENTRY("%p", session); CHECK_PARAMS( session && VALIDATE_SI(*session) ); - + sess = *session; hash = sess->hash; *session = NULL; - + CHECK_POSIX( pthread_mutex_lock( H_LOCK(hash) ) ); pthread_cleanup_push( fd_cleanup_mutex, H_LOCK(hash) ); CHECK_POSIX_DO( pthread_mutex_lock( &sess->stlock ), { ASSERT(0); /* otherwise, cleanup not poped on FreeBSD */ } ); pthread_cleanup_push( fd_cleanup_mutex, &sess->stlock ); CHECK_POSIX_DO( pthread_mutex_lock( &exp_lock ), { ASSERT(0); /* otherwise, cleanup not poped on FreeBSD */ } ); - + pthread_cleanup_push( fd_cleanup_mutex, &exp_lock ); + /* We only do something if the states list is empty */ if (FD_IS_LIST_EMPTY(&sess->states)) { /* In this case, we do as in destroy */ @@ -705,16 +722,17 @@ int fd_sess_reclaim ( struct session ** session ) sess->is_destroyed = 1; } } - + + pthread_cleanup_pop(0); CHECK_POSIX_DO( pthread_mutex_unlock( &exp_lock ), { ASSERT(0); /* otherwise, cleanup not poped on FreeBSD */ } ); pthread_cleanup_pop(0); CHECK_POSIX_DO( pthread_mutex_unlock( &sess->stlock ), { ASSERT(0); /* otherwise, cleanup not poped on FreeBSD */ } ); pthread_cleanup_pop(0); CHECK_POSIX( pthread_mutex_unlock( H_LOCK(hash) ) ); - + if (destroy_now) del_session(sess); - + return 0; } @@ -725,38 +743,38 @@ int fd_sess_state_store ( struct session_handler * handler, struct session * ses struct fd_list * li; int already = 0; int ret = 0; - + TRACE_ENTRY("%p %p %p", handler, session, state); CHECK_PARAMS( handler && VALIDATE_SH(handler) && session && VALIDATE_SI(session) && (!session->is_destroyed) && state ); - + /* Lock the session state list */ CHECK_POSIX( pthread_mutex_lock(&session->stlock) ); pthread_cleanup_push( fd_cleanup_mutex, &session->stlock ); - + /* Create the new state object */ CHECK_MALLOC_DO(new = malloc(sizeof(struct state)), { ret = ENOMEM; goto out; } ); memset(new, 0, sizeof(struct state)); - + new->eyec = SD_EYEC; new->state= *state; fd_list_init(&new->chain, new); new->hdl = handler; - + /* find place for this state in the list */ for (li = session->states.next; li != &session->states; li = li->next) { struct state * st = (struct state *)(li->o); /* The list is ordered by handler's id */ if (st->hdl->id < handler->id) continue; - + if (st->hdl->id == handler->id) { TRACE_DEBUG(INFO, "A state was already stored for session '%s' and handler '%p', at location %p", session->sid, st->hdl, st->state); already = EALREADY; } - + break; } - + if (!already) { fd_list_insert_before(li, &new->chain); *state = NULL; @@ -764,10 +782,10 @@ int fd_sess_state_store ( struct session_handler * handler, struct session * ses free(new); } out: - ; + ; pthread_cleanup_pop(0); CHECK_POSIX( pthread_mutex_unlock(&session->stlock) ); - + return ret ?: already; } @@ -776,35 +794,35 @@ int fd_sess_state_retrieve ( struct session_handler * handler, struct session * { struct fd_list * li; struct state * st = NULL; - + TRACE_ENTRY("%p %p %p", handler, session, state); CHECK_PARAMS( handler && VALIDATE_SH(handler) && session && VALIDATE_SI(session) && state ); - + *state = NULL; - + /* Lock the session state list */ CHECK_POSIX( pthread_mutex_lock(&session->stlock) ); pthread_cleanup_push( fd_cleanup_mutex, &session->stlock ); - + /* find the state in the list */ for (li = session->states.next; li != &session->states; li = li->next) { st = (struct state *)(li->o); - + /* The list is ordered by handler's id */ if (st->hdl->id > handler->id) break; } - + /* If we found the state */ if (st && (st->hdl == handler)) { fd_list_unlink(&st->chain); *state = st->state; free(st); } - + pthread_cleanup_pop(0); CHECK_POSIX( pthread_mutex_unlock(&session->stlock) ); - + return 0; } @@ -813,15 +831,15 @@ int fd_sess_fromsid ( uint8_t * sid, size_t len, struct session ** session, int { TRACE_ENTRY("%p %zd %p %p", sid, len, session, new); CHECK_PARAMS( sid && len && session ); - + /* Get the session object */ CHECK_FCT( fd_sess_fromsid_msg ( sid, len, session, new) ); - + /* Decrease the refcount */ CHECK_POSIX( pthread_mutex_lock(&(*session)->stlock) ); (*session)->msg_cnt--; /* was increased in fd_sess_new */ CHECK_POSIX( pthread_mutex_unlock(&(*session)->stlock) ); - + /* Done */ return 0; } @@ -835,7 +853,7 @@ int fd_sess_ref_msg ( struct session * session ) CHECK_POSIX( pthread_mutex_lock(&session->stlock) ); session->msg_cnt++; CHECK_POSIX( pthread_mutex_unlock(&session->stlock) ); - + return 0; } @@ -843,25 +861,25 @@ int fd_sess_reclaim_msg ( struct session ** session ) { int reclaim; uint32_t hash; - + TRACE_ENTRY("%p", session); CHECK_PARAMS( session && VALIDATE_SI(*session) ); - + /* Lock the hash line to avoid possibility that session is freed while we are reclaiming */ hash = (*session)->hash; CHECK_POSIX( pthread_mutex_lock( H_LOCK(hash)) ); - pthread_cleanup_push( fd_cleanup_mutex, H_LOCK(hash) ); + pthread_cleanup_push( fd_cleanup_mutex, H_LOCK(hash) ); /* Update the msg refcount */ CHECK_POSIX( pthread_mutex_lock(&(*session)->stlock) ); reclaim = (*session)->msg_cnt; (*session)->msg_cnt = reclaim - 1; CHECK_POSIX( pthread_mutex_unlock(&(*session)->stlock) ); - + /* Ok, now unlock the hash line */ pthread_cleanup_pop( 0 ); CHECK_POSIX( pthread_mutex_unlock( H_LOCK(hash) ) ); - + /* and reclaim if no message references the session anymore */ if (reclaim == 1) { CHECK_FCT(fd_sess_reclaim ( session )); @@ -877,9 +895,9 @@ int fd_sess_reclaim_msg ( struct session ** session ) DECLARE_FD_DUMP_PROTOTYPE(fd_sess_dump, struct session * session, int with_states) { FD_DUMP_HANDLE_OFFSET(); - + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{session}(@%p): ", session), return NULL); - + if (!VALIDATE_SI(session)) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); } else { @@ -889,46 +907,46 @@ DECLARE_FD_DUMP_PROTOTYPE(fd_sess_dump, struct session * session, int with_state strftime(timebuf, sizeof(timebuf), "%D,%T", localtime_r( &session->timeout.tv_sec , &tm )); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'(%zd) h:%x m:%d d:%d to:%s.%06ld", session->sid, session->sidlen, session->hash, session->msg_cnt, session->is_destroyed, - timebuf, session->timeout.tv_nsec/1000), + timebuf, session->timeout.tv_nsec/1000), return NULL); - + if (with_states) { struct fd_list * li; CHECK_POSIX_DO( pthread_mutex_lock(&session->stlock), /* ignore */ ); pthread_cleanup_push( fd_cleanup_mutex, &session->stlock ); - + for (li = session->states.next; li != &session->states; li = li->next) { struct state * st = (struct state *)(li->o); CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {state i:%d}(@%p): ", st->hdl->id, st), return NULL); if (st->hdl->state_dump) { - CHECK_MALLOC_DO( (*st->hdl->state_dump)( FD_DUMP_STD_PARAMS, st->state), + CHECK_MALLOC_DO( (*st->hdl->state_dump)( FD_DUMP_STD_PARAMS, st->state), fd_dump_extend( FD_DUMP_STD_PARAMS, "[dumper error]")); } else { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "<%p>", st->state), return NULL); } } - + pthread_cleanup_pop(0); CHECK_POSIX_DO( pthread_mutex_unlock(&session->stlock), /* ignore */ ); } } - + return *buf; } DECLARE_FD_DUMP_PROTOTYPE(fd_sess_dump_hdl, struct session_handler * handler) { FD_DUMP_HANDLE_OFFSET(); - + CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{sesshdl}(@%p): ", handler), return NULL); - + if (!VALIDATE_SH(handler)) { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); } else { CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "i:%d cl:%p d:%p o:%p", handler->id, handler->cleanup, handler->state_dump, handler->opaque), return NULL); } return *buf; -} +} int fd_sess_getcount(uint32_t *cnt) { diff --git a/tests/testcnx.c b/tests/testcnx.c index e1826c9..ab93ee9 100644 --- a/tests/testcnx.c +++ b/tests/testcnx.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -53,300 +53,443 @@ /* The cryptographic data */ -static char ca_data[] = "-----BEGIN CERTIFICATE-----\n" - "MIIEqjCCA5KgAwIBAgIJANKgDwdlDYQDMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD\n" - "VQQGEwJKUDEOMAwGA1UECAwFVG9reW8xEDAOBgNVBAcMB0tvZ2FuZWkxDTALBgNV\n" - "BAoMBFdJREUxDzANBgNVBAsMBkFBQSBXRzEfMB0GA1UEAwwWY2hhdnJvdXguY293\n" - "YWRkaWN0Lm9yZzEiMCAGCSqGSIb3DQEJARYTc2RlY3VnaXNAbmljdC5nby5qcDAe\n" - "Fw0wOTEwMDUwODUxNDRaFw0xOTEwMDMwODUxNDRaMIGUMQswCQYDVQQGEwJKUDEO\n" - "MAwGA1UECAwFVG9reW8xEDAOBgNVBAcMB0tvZ2FuZWkxDTALBgNVBAoMBFdJREUx\n" - "DzANBgNVBAsMBkFBQSBXRzEfMB0GA1UEAwwWY2hhdnJvdXguY293YWRkaWN0Lm9y\n" - "ZzEiMCAGCSqGSIb3DQEJARYTc2RlY3VnaXNAbmljdC5nby5qcDCCASIwDQYJKoZI\n" - "hvcNAQEBBQADggEPADCCAQoCggEBAM5c6w4NnngTvGNWcJzbo0Kklp+kvUNQNgGu\n" - "myvz826qPp07HTSyJrIcgFnuYDR0Nd130Ot9u5osqpQhHTvolxDE87Tii8i3hJSj\n" - "TTY9K0ZwGb4AZ6QkuyMXS1jtOY657HqjpGZqT/2Syh0i7dM/hqSXFw0SPbyq+W1H\n" - "SVFWa1CTkPywFWAzwdr5WKah77uZ1dxWqgPgUdcZOiIQtLRp5n3fg40Nwso5YdwS\n" - "64+ebBX1pkhrCQ8AGc8O61Ep1JTXcO7jqQmPgzjiN+FeostI1Dp73S3MqleTAHjR\n" - "hqZ77VF7nkroMM9btMHJBaxnfwc2ewULUJwnuOiGWrvMq/9Z4J8CAwEAAaOB/DCB\n" - "+TAdBgNVHQ4EFgQUkqpVn7N3gmiJ7X5zQ2bki+7qv4UwgckGA1UdIwSBwTCBvoAU\n" - "kqpVn7N3gmiJ7X5zQ2bki+7qv4WhgZqkgZcwgZQxCzAJBgNVBAYTAkpQMQ4wDAYD\n" - "VQQIDAVUb2t5bzEQMA4GA1UEBwwHS29nYW5laTENMAsGA1UECgwEV0lERTEPMA0G\n" - "A1UECwwGQUFBIFdHMR8wHQYDVQQDDBZjaGF2cm91eC5jb3dhZGRpY3Qub3JnMSIw\n" - "IAYJKoZIhvcNAQkBFhNzZGVjdWdpc0BuaWN0LmdvLmpwggkA0qAPB2UNhAMwDAYD\n" - "VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAJy0XLk8j8YLSTt2/VMy9TAUx\n" - "esXUiZj0Ung+gkr7A1K0NnwYxDzG2adMhf13upHoydu2ErLMmD6F77x+QuY/q7nc\n" - "ZvO0tvcoAP6ToSDwiypU5dnTmnfkgwVwzFkNCi1sGRosEm8c/c/8MfK0I0nVdj1/\n" - "BIkIG7tTDVi9JvkWYl0UlSKWTZKrntVwCmscfC02DGb+GoLbO9+QmiNM5Y3yOYZ4\n" - "Pc7SSoKLL0rwJBmpPNs7boYsweeSuCAVu0shRfgC90odXcej2EN5ETfCuU1evXNW\n" - "5cA+zZsDK/nWJwxBaW0CxAHX579FElFWlK4+BnzhZRdDhmJDnN5dh4ekJGM6Lg==\n" - "-----END CERTIFICATE-----\n"; +static char ca_data[] = "" +"-----BEGIN CERTIFICATE-----\n" +"MIIFljCCA36gAwIBAgIJAIicnqmf2SGHMA0GCSqGSIb3DQEBCwUAMF8xFzAVBgNV\n" +"BAMMDmNhLmxvY2FsZG9tYWluMQswCQYDVQQGEwJGUjEMMAoGA1UECAwDQmRSMQww\n" +"CgYDVQQHDANBaXgxCzAJBgNVBAoMAmZEMQ4wDAYDVQQLDAVUZXN0czAgFw0xOTEx\n" +"MjQxNzA2NDNaGA8yMTE5MTAzMTE3MDY0M1owXzEXMBUGA1UEAwwOY2EubG9jYWxk\n" +"b21haW4xCzAJBgNVBAYTAkZSMQwwCgYDVQQIDANCZFIxDDAKBgNVBAcMA0FpeDEL\n" +"MAkGA1UECgwCZkQxDjAMBgNVBAsMBVRlc3RzMIICIjANBgkqhkiG9w0BAQEFAAOC\n" +"Ag8AMIICCgKCAgEAyj+ATbTTOkXkhnMgp4PQOcN8AppX8yKYFyWKlYfaoq1CGWhR\n" +"zMuvlgKymGPmuYDwI2ap5z9GbMeQzhq/lnz2jg37E0aWhgPEbMDknjMMgrS5N0m0\n" +"Z7Lqhj/JVcuhxKWTtPPbAaNMZFNJ+MZkI3tGPXNaih6qNGQKFplkv22HsIdvnvlB\n" +"RQ0blcaJ9KYEaDeBjjX8fjkUsxw7gHNw2Gi3O0XiftNqNywrYrLzyuKZ6T3Tq9Xp\n" +"KilwhymC3b/MiqXHeYSAHLRw3qCoaPAx01NESgr1sGoMcKyxoAkzvXsVw0fIpO5n\n" +"pShEeOf+/ID+tWJ7EG1G13fsYXTiawsNMjHcnhrtr7lYC43/xiyjAr4V5Uf51Dt4\n" +"aQWbEGOGJr4jniFt0Wis8MFrAYRekyV5ytJ6YCWt5nRs6Aujs8yjD89cGBddixfr\n" +"7NfwR/dZsv7h5cufdfh8W2jzMt9DeAHM5WANIwFhrI4rfMCKS4bG9BFCAD1wEbhg\n" +"7k/wcyOBXDIR1W1yP3SmrQRL/JiOW5jU76VQAURnmqnM9ayUdWKfROhoWuoMRIMT\n" +"IHLxkotlQUECbGZX8gzkvlnxeogPH8KVul99USpDGU66H+RUxVOUNIPGhiZUy6KU\n" +"nFQUHXXF1PB5U8JfhdOp5ODHDY0quUDG3FXpyf0NsNcbYzb8WWssLreIthcCAwEA\n" +"AaNTMFEwHQYDVR0OBBYEFFYkMOz0TqjaKeuXQMYy7Q+H9fYAMB8GA1UdIwQYMBaA\n" +"FFYkMOz0TqjaKeuXQMYy7Q+H9fYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN\n" +"AQELBQADggIBAHV7IfJgmmxvsal+C6m3exoeQwlwQP5+5xF8L+FpUyJj0TWukteM\n" +"JurAESZL7SRqBHt3XGXnNf+ghs+/hkWIoYoFj7cermN3sDqZgSqB0eOUlWEuT+bR\n" +"NUxjb1W890ok7CqN0m7qs72oYSN53De1526sfkdpc8xEiy2UGjiwIdc/3uZ3md+I\n" +"LOpRHoXUrw1rurmi2/F/oyDjmm9ABicNb4B8e7u1gyrdKB2H5z2HRgUbI1sf/l9I\n" +"7u17zrieJQ7wcBlfGfjee+Iop6/ZhZdhyF5grv7OA/YgNgTl3C3MBH22912tHj4o\n" +"3Sxpqt2q0x80Lv4nhrlnVywwp5s1tyDG8LTcOcPpjQwI8zuCTOAZIzgTarFF0/G6\n" +"NN+ZSl+RUdPNN3g0Eo2KB7QxPsSEsHmgS00I/YPhGp6kHcD8WRij253A9odXxKL+\n" +"P4nCbgIP/YGdHbRTTzlVMjHHSWbtWwEYzTIcn+2bHFXBQB7TE0MrlqaN4h+3UZ2r\n" +"YCt0qyql/RJQ+txHAp43WoEg3i8regit3F6h9plDtXpodVacMREofeWlyv1zG5nD\n" +"fjXqkb27a0tcY19OOrOU4QBks3bYLPjr4RReOvI6DSKtcXyptbjxMNihrsNpzfhH\n" +"CQ6aE6Uebc0z+DEH5g9cc7l+RlQkeOmTEXhNIuR9JVt1H4O5YXDwKZ86\n" +"-----END CERTIFICATE-----\n" +; /* Client: - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 5 (0x5) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=JP, ST=Tokyo, L=Koganei, O=WIDE, OU=AAA WG, CN=chavroux.cowaddict.org/emailAddress=sdecugis@nict.go.jp - Validity - Not Before: Oct 27 04:04:05 2009 GMT - Not After : Oct 25 04:04:05 2019 GMT - Subject: C=JP, ST=Tokyo, L=Koganei, O=WIDE, OU=AAA WG, CN=client.test/emailAddress=client@test - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:bd:eb:50:1e:9d:7a:cd:9d:bb:e7:bc:4e:38:4a: - b2:cc:9e:b4:89:77:01:ef:d1:c6:19:29:00:fe:ce: - 3c:62:05:13:b1:8c:ff:31:7a:0f:c1:2e:4b:3c:0c: - 40:1e:36:4e:76:da:0a:64:43:fc:1e:ea:0c:97:b2: - 57:9c:9c:8c:90:bd:eb:23:7b:b8:b7:5c:03:ed:6f: - 48:55:8a:88:08:38:c5:cd:33:b7:ab:a8:3a:6f:7f: - 13:10:65:a5:50:b9:f4:8b:cc:2e:e9:79:58:a6:11: - f0:58:45:41:ef:36:b3:35:cb:14:ec:82:0c:ad:11: - 6a:ea:64:ef:28:a2:6e:47:45 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - BE:B3:89:4F:9D:8F:6C:20:C4:D0:3E:6A:05:11:82:50:54:49:70:A2 - X509v3 Authority Key Identifier: - keyid:92:AA:55:9F:B3:77:82:68:89:ED:7E:73:43:66:E4:8B:EE:EA:BF:85 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=ca.localdomain, C=FR, ST=BdR, L=Aix, O=fD, OU=Tests + Validity + Not Before: Nov 24 17:06:43 2019 GMT + Not After : Oct 31 17:06:43 2119 GMT + Subject: C=FR, ST=BdR, O=fD, OU=Tests, CN=client.test + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c2:e8:d6:a4:27:56:e5:cb:c9:c1:cb:8e:19:f2: + 79:35:96:ca:f2:54:ac:3e:8f:be:8e:77:44:13:c3: + fd:74:21:45:bb:9e:65:f1:9d:46:af:cc:1e:af:fa: + d5:93:91:38:32:0e:3c:b7:5b:a3:9c:7d:4c:94:0a: + 66:3a:5d:0c:8e:1f:22:59:0d:dd:a6:de:c1:91:0a: + 8c:70:c0:c6:2c:c1:6f:68:29:45:b4:d5:14:74:8d: + 31:bb:74:1e:2d:b6:78:74:0b:95:bd:96:35:1d:24: + 1f:7d:c9:d5:fa:5a:b6:27:87:38:cc:f4:8d:a3:98: + d9:ff:32:a3:53:db:eb:b5:e5:69:a9:2b:f4:da:ec: + bd:96:f0:80:46:0d:f9:48:03:39:25:4b:a3:2f:7b: + 59:81:8b:6e:17:67:2e:3b:84:e9:ff:ac:33:7c:60: + 34:10:00:c9:7b:1f:11:e6:b7:a1:57:01:46:44:ae: + 2d:8c:ba:d6:08:3d:5d:98:d3:66:74:d8:15:fe:75: + 09:61:24:5c:a2:a2:b3:0b:bd:b6:ef:98:b4:07:8d: + 86:ae:29:87:7b:98:3a:3f:ef:4f:f6:c2:ab:40:32: + 91:06:eb:8e:c8:9d:36:45:84:d4:d3:f5:85:89:ed: + 2f:6f:e0:40:a3:d9:0b:e2:a7:80:b1:04:ef:27:70: + 9a:f1 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 52:E8:18:E1:33:09:C4:AF:65:24:25:C4:72:A8:07:BB:B7:3B:C0:31 + X509v3 Authority Key Identifier: + keyid:56:24:30:EC:F4:4E:A8:DA:29:EB:97:40:C6:32:ED:0F:87:F5:F6:00 - Signature Algorithm: sha1WithRSAEncryption - a3:88:f5:15:b5:ad:20:60:a1:85:19:3f:b9:5e:1e:be:31:7f: - 84:7a:c2:18:3a:63:6a:67:1f:46:86:4d:10:d6:1d:ad:a2:c8: - 0b:95:33:fa:e4:05:f4:b8:70:34:77:f7:85:6e:70:46:ac:39: - 54:a9:5f:ea:5e:d1:33:bb:c9:a3:42:81:41:90:25:b5:92:8b: - e8:6e:3e:97:06:dd:9a:cc:29:61:34:5a:d3:1c:5d:ad:d1:a3: - eb:6a:47:b4:d0:c2:17:89:e1:e2:2d:36:18:50:1a:e7:d4:fc: - 38:2e:47:0b:39:50:87:2f:aa:07:64:f8:9a:4d:47:01:da:10: - d8:97:c7:a6:13:bc:0e:ca:63:c1:f2:09:fb:f8:6a:a4:5f:08: - b5:ad:ed:4f:71:b9:89:7f:43:27:85:72:e7:8d:a8:4a:cc:f6: - 36:ca:8a:ae:82:b5:a8:42:41:99:87:84:7c:f0:90:fd:ca:96: - 37:a2:e0:d9:fa:dd:a4:c9:f1:50:b7:e5:e6:8f:af:83:8c:23: - b6:20:cc:66:e3:08:60:13:02:8f:42:3a:07:91:a7:38:b2:72: - 16:fd:bd:a9:60:f0:e2:9f:23:f3:c0:99:e3:17:bc:00:7c:b3: - 89:9c:ea:fa:3e:f6:69:a1:98:c2:ec:46:da:70:b6:f9:c3:93: - a7:fc:36:dd + Signature Algorithm: sha256WithRSAEncryption + 7c:1f:50:97:70:ee:43:3c:e6:3e:ec:17:f5:78:d8:32:d4:73: + e9:bd:e2:9a:b4:47:d7:c8:e5:0f:38:d3:14:a8:18:ac:fa:8e: + 8e:68:80:95:8e:0b:5b:09:25:d4:83:b6:65:ca:8e:d7:a4:31: + c1:86:00:cc:1f:c1:60:0f:c2:f1:84:fe:30:9b:f1:d1:1a:96: + d8:ae:e2:eb:28:87:7d:59:07:84:fe:c5:86:e8:41:12:98:a2: + d9:d3:bd:ce:63:79:43:62:bd:13:74:fa:a4:24:48:7a:f5:e9: + d9:d5:07:2e:33:f0:f5:0a:ab:49:41:ae:94:5c:06:bd:2e:5d: + e8:b3:72:e4:76:13:3e:36:0d:a0:bc:f5:a2:b0:17:da:75:0b: + ec:bd:0b:5b:86:a9:5f:b4:e3:3a:fa:ab:cd:4e:03:06:16:a8: + 50:10:65:56:60:bb:c4:96:e3:64:b3:7d:e6:5c:92:23:5c:18: + cf:e7:f7:a1:0f:ac:99:25:b1:9b:67:63:44:30:ab:01:5b:73: + 6d:09:80:60:c3:4b:80:04:b9:d2:47:17:ac:b7:93:58:f6:7c: + 7c:fe:79:07:4d:20:57:68:c1:33:70:65:48:b5:c2:ac:9b:10: + 67:63:1d:d1:28:0b:6e:07:c5:95:bd:d9:5c:42:f2:33:fa:38: + b1:02:3d:e2:91:b0:2c:04:66:21:35:86:68:70:06:88:a3:e3: + 43:b1:11:24:bc:33:ea:11:45:29:b0:7c:4c:25:62:7e:75:07: + 6f:58:4d:33:25:57:d8:8f:40:11:f2:66:8f:8d:6c:c6:9d:b6: + d6:b5:96:75:09:b7:57:b0:6f:ed:ac:f7:9f:42:58:ce:cf:2f: + 3c:65:6d:eb:c2:d6:ae:ed:b5:37:03:24:ed:dd:bd:53:c5:93: + e2:64:b3:8f:8f:8b:37:bf:fd:e4:de:b5:48:7e:64:6c:a1:a6: + c6:af:72:5c:d0:46:ee:0d:82:18:c9:bb:3e:39:f7:49:90:0c: + 73:ae:23:a4:2f:f3:ff:dd:99:d0:ea:66:d8:f0:97:e9:88:05: + 48:83:3d:18:a5:0c:7c:5d:17:9d:9c:cc:4d:3c:cb:46:a9:dc: + d0:69:5f:c0:73:50:2e:ea:42:f7:a1:41:e8:09:fa:56:54:15: + f4:71:e1:bd:99:07:73:94:88:2e:fb:2e:f4:b6:5d:af:a6:81: + 42:3e:4c:b5:da:ab:52:6b:36:9b:66:a1:01:09:ec:c9:d9:1b: + b0:18:8f:c1:de:7f:fa:a9:83:9f:f0:9d:b0:84:80:83:f6:0e: + 25:a7:82:55:af:63:e1:e5:85:9b:ef:ee:d7:12:ff:09:fc:41: + ed:ae:f5:25:c9:e6:cd:73 */ -static char client_cert_data[] ="-----BEGIN CERTIFICATE-----\n" - "MIIDiTCCAnGgAwIBAgIBBTANBgkqhkiG9w0BAQUFADCBlDELMAkGA1UEBhMCSlAx\n" - "DjAMBgNVBAgMBVRva3lvMRAwDgYDVQQHDAdLb2dhbmVpMQ0wCwYDVQQKDARXSURF\n" - "MQ8wDQYDVQQLDAZBQUEgV0cxHzAdBgNVBAMMFmNoYXZyb3V4LmNvd2FkZGljdC5v\n" - "cmcxIjAgBgkqhkiG9w0BCQEWE3NkZWN1Z2lzQG5pY3QuZ28uanAwHhcNMDkxMDI3\n" - "MDQwNDA1WhcNMTkxMDI1MDQwNDA1WjCBgTELMAkGA1UEBhMCSlAxDjAMBgNVBAgM\n" - "BVRva3lvMRAwDgYDVQQHDAdLb2dhbmVpMQ0wCwYDVQQKDARXSURFMQ8wDQYDVQQL\n" - "DAZBQUEgV0cxFDASBgNVBAMMC2NsaWVudC50ZXN0MRowGAYJKoZIhvcNAQkBFgtj\n" - "bGllbnRAdGVzdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvetQHp16zZ27\n" - "57xOOEqyzJ60iXcB79HGGSkA/s48YgUTsYz/MXoPwS5LPAxAHjZOdtoKZEP8HuoM\n" - "l7JXnJyMkL3rI3u4t1wD7W9IVYqICDjFzTO3q6g6b38TEGWlULn0i8wu6XlYphHw\n" - "WEVB7zazNcsU7IIMrRFq6mTvKKJuR0UCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglg\n" - "hkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0O\n" - "BBYEFL6ziU+dj2wgxNA+agURglBUSXCiMB8GA1UdIwQYMBaAFJKqVZ+zd4Joie1+\n" - "c0Nm5Ivu6r+FMA0GCSqGSIb3DQEBBQUAA4IBAQCjiPUVta0gYKGFGT+5Xh6+MX+E\n" - "esIYOmNqZx9Ghk0Q1h2tosgLlTP65AX0uHA0d/eFbnBGrDlUqV/qXtEzu8mjQoFB\n" - "kCW1kovobj6XBt2azClhNFrTHF2t0aPrake00MIXieHiLTYYUBrn1Pw4LkcLOVCH\n" - "L6oHZPiaTUcB2hDYl8emE7wOymPB8gn7+GqkXwi1re1PcbmJf0MnhXLnjahKzPY2\n" - "yoqugrWoQkGZh4R88JD9ypY3ouDZ+t2kyfFQt+Xmj6+DjCO2IMxm4whgEwKPQjoH\n" - "kac4snIW/b2pYPDinyPzwJnjF7wAfLOJnOr6PvZpoZjC7EbacLb5w5On/Dbd\n" - "-----END CERTIFICATE-----\n"; -static char client_priv_data[] ="-----BEGIN RSA PRIVATE KEY-----\n" - "MIICXgIBAAKBgQC961AenXrNnbvnvE44SrLMnrSJdwHv0cYZKQD+zjxiBROxjP8x\n" - "eg/BLks8DEAeNk522gpkQ/we6gyXslecnIyQvesje7i3XAPtb0hViogIOMXNM7er\n" - "qDpvfxMQZaVQufSLzC7peVimEfBYRUHvNrM1yxTsggytEWrqZO8oom5HRQIDAQAB\n" - "AoGBAIYnsOLPby3LnC5n8AEHkyHDgdgQvsd/MSYYtuFHIZRD7dNfu+xhQru9TdvO\n" - "84Pj7K07/FczRuc3gUmu6wBv/UIP9To15RHZh+/n537nybGus5S4IYKVvap477To\n" - "0rQDf9ec27iw77gxb7moQ9Otuxwbv0h0Z+1EVLI8d8jHOq0BAkEA9YNr0R+7KXBS\n" - "48yT43g5HpOFkTZzNXWVdpSvYGneb56wslk5Eatp235I4uz/a7Rej5v99W0M3nSe\n" - "/AgHfYn75QJBAMYH/pBx/WkrLj+pPaARlNwInCIC5zUhr6B0IKCt2tvy5eyuc5sd\n" - "AoTFaU+cSI+ZqsRzY8jMKkonktxBg48oJ+ECQQCt4AtlqcFVkbVCm8pJGQXq/7Ni\n" - "qlthiwr1Vkv2TkQ4bPza8pGWT/3Cc2ePPyWN08n8jw+G11p72cAW4mDbqfN5AkEA\n" - "mNYKrkiLn+NnqlJf8W4gSUGL3uQGtYbuGRQHKnuDckWhFm39YzWcgAQsJvkjN1EN\n" - "7thvpsWLzfeE7ODTPGVtgQJATObxYJOt6rms3fAStwuXW3ET77TA1ja4XsUEe5Yu\n" - "JpcQOruJb9XwndqzNbL0dSUePb9gFiBCGKYOyreNTTRTmw==\n" - "-----END RSA PRIVATE KEY-----\n"; +static char client_cert_data[] = "" +"-----BEGIN CERTIFICATE-----\n" +"MIIEpTCCAo2gAwIBAgIBATANBgkqhkiG9w0BAQsFADBfMRcwFQYDVQQDDA5jYS5s\n" +"b2NhbGRvbWFpbjELMAkGA1UEBhMCRlIxDDAKBgNVBAgMA0JkUjEMMAoGA1UEBwwD\n" +"QWl4MQswCQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMwIBcNMTkxMTI0MTcwNjQz\n" +"WhgPMjExOTEwMzExNzA2NDNaME4xCzAJBgNVBAYTAkZSMQwwCgYDVQQIDANCZFIx\n" +"CzAJBgNVBAoMAmZEMQ4wDAYDVQQLDAVUZXN0czEUMBIGA1UEAwwLY2xpZW50LnRl\n" +"c3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC6NakJ1bly8nBy44Z\n" +"8nk1lsryVKw+j76Od0QTw/10IUW7nmXxnUavzB6v+tWTkTgyDjy3W6OcfUyUCmY6\n" +"XQyOHyJZDd2m3sGRCoxwwMYswW9oKUW01RR0jTG7dB4ttnh0C5W9ljUdJB99ydX6\n" +"WrYnhzjM9I2jmNn/MqNT2+u15WmpK/Ta7L2W8IBGDflIAzklS6Mve1mBi24XZy47\n" +"hOn/rDN8YDQQAMl7HxHmt6FXAUZEri2MutYIPV2Y02Z02BX+dQlhJFyiorMLvbbv\n" +"mLQHjYauKYd7mDo/70/2wqtAMpEG647InTZFhNTT9YWJ7S9v4ECj2Qvip4CxBO8n\n" +"cJrxAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wg\n" +"R2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRS6BjhMwnEr2UkJcRyqAe7\n" +"tzvAMTAfBgNVHSMEGDAWgBRWJDDs9E6o2inrl0DGMu0Ph/X2ADANBgkqhkiG9w0B\n" +"AQsFAAOCAgEAfB9Ql3DuQzzmPuwX9XjYMtRz6b3imrRH18jlDzjTFKgYrPqOjmiA\n" +"lY4LWwkl1IO2ZcqO16QxwYYAzB/BYA/C8YT+MJvx0RqW2K7i6yiHfVkHhP7FhuhB\n" +"Epii2dO9zmN5Q2K9E3T6pCRIevXp2dUHLjPw9QqrSUGulFwGvS5d6LNy5HYTPjYN\n" +"oLz1orAX2nUL7L0LW4apX7TjOvqrzU4DBhaoUBBlVmC7xJbjZLN95lySI1wYz+f3\n" +"oQ+smSWxm2djRDCrAVtzbQmAYMNLgAS50kcXrLeTWPZ8fP55B00gV2jBM3BlSLXC\n" +"rJsQZ2Md0SgLbgfFlb3ZXELyM/o4sQI94pGwLARmITWGaHAGiKPjQ7ERJLwz6hFF\n" +"KbB8TCVifnUHb1hNMyVX2I9AEfJmj41sxp221rWWdQm3V7Bv7az3n0JYzs8vPGVt\n" +"68LWru21NwMk7d29U8WT4mSzj4+LN7/95N61SH5kbKGmxq9yXNBG7g2CGMm7Pjn3\n" +"SZAMc64jpC/z/92Z0Opm2PCX6YgFSIM9GKUMfF0XnZzMTTzLRqnc0GlfwHNQLupC\n" +"96FB6An6VlQV9HHhvZkHc5SILvsu9LZdr6aBQj5MtdqrUms2m2ahAQnsydkbsBiP\n" +"wd5/+qmDn/CdsISAg/YOJaeCVa9j4eWFm+/u1xL/CfxB7a71JcnmzXM=\n" +"-----END CERTIFICATE-----\n" + ; +static char client_priv_data[] = "" +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEpAIBAAKCAQEAwujWpCdW5cvJwcuOGfJ5NZbK8lSsPo++jndEE8P9dCFFu55l\n" +"8Z1Gr8wer/rVk5E4Mg48t1ujnH1MlApmOl0Mjh8iWQ3dpt7BkQqMcMDGLMFvaClF\n" +"tNUUdI0xu3QeLbZ4dAuVvZY1HSQffcnV+lq2J4c4zPSNo5jZ/zKjU9vrteVpqSv0\n" +"2uy9lvCARg35SAM5JUujL3tZgYtuF2cuO4Tp/6wzfGA0EADJex8R5rehVwFGRK4t\n" +"jLrWCD1dmNNmdNgV/nUJYSRcoqKzC72275i0B42GrimHe5g6P+9P9sKrQDKRBuuO\n" +"yJ02RYTU0/WFie0vb+BAo9kL4qeAsQTvJ3Ca8QIDAQABAoIBAG0X+hvDUSYqHHF2\n" +"R8FKMIHINyvQLOCPgG8pXldZ2eFIRkmvbQwBpfD75SlG0ohYPgX2ZhGTH06V62jp\n" +"MTL1pfNehdEmq6uc/ub56oWpwMKIOp0ojLWclmhuJynu4n1fpqf9XADTtELtVxsG\n" +"/9ezMkWJsEc3kpfBFDN82mIztAkItp+p/pChvc48p725AdOf8ZLlXW0rYKfv1J6l\n" +"4VGb2iYwokQJkx0FcgP1uo1m6Pk2xbKW6acn4g8hsvoOZ6MeJ1/Gh6hJjaQ6hw2i\n" +"Xs2effT8ZH0kDq/GikC+U+QJa3lvUdph9rtIYEL1z0WCUk+t7AsjtfqVPzuqYFO2\n" +"UKqteGECgYEA768K7sD0q+bH/P8tFALd+Ynj1bPdBOTsqPCaRiQeC8omoYpovI3z\n" +"bKEqehQA4OQ4PERrysOCQU4G+n/XV20LbvdfNx655swFhNLwbNbPfp6p6eLzfks3\n" +"52FP8B10scM7OCheHiGhyvxObTZjeVZ15eUYx8OaLCRiU9tPAuuo/5UCgYEA0C2E\n" +"bf+56XY+fxnRR6sNkVL4ztjWRku+zKTAikxu7GA9ueNBmkXSBVcTL1rj0aErOc+Z\n" +"IcUmCVoH67txmXed54NhTx7F7R+K1MBSfFS9WPMuOHfoOO0B4pH2V03bZf14WaAJ\n" +"a14WNRCHhp7bgkGPzJINi+X810dIXxw0/fBkhu0CgYBeaF4wCMTW6QIg/wnsdeyl\n" +"G9EoHb6S7PDi4lKCCjvjfO6WdoQmsOsPALRQfYyTCJG1+2VR6oxl2KwbAzv47bSx\n" +"MrLIbUvgQsBxvvyAgmQchbZ7r68lMc+FTelEtPWAB1xOFGhuCeVGpPbnQaMQ6iNq\n" +"OED4fm09sd8hFKMcjWJ1uQKBgQCxgw6YaWXS4EP8RzyAGyiPkaudXaKhAHeqspWH\n" +"mBNBtfMMbe8DqKOkcBJo39zBZOeh/RY7iIudj8qPRR9h2HCp+Api1/+36ZyNO41a\n" +"fTuT/JCeEAjRea+Qzhu7aCU7+33DFsbRacIP749QyGau1E7VBnlMoIkP3LWmfDvn\n" +"iTN/JQKBgQC2va9Ou4NNWu1VyFMO1BOo0Tw3FSPCqsZ+5iPHztw/b98EIkM72Ran\n" +"kcMwgXOMTnBN5GuGdvTARVs/PvYaHkcD7YPFR32yT1JVSOtRt6AQ+EJkVj9trPzM\n" +"Q6TrU0XBPpoXkOSDi0tLFbzdLbJLLbtIDGJfvETYNq4lTKMnvJ2hBQ==\n" +"-----END RSA PRIVATE KEY-----\n" + ; /* Server: - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 4 (0x4) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=JP, ST=Tokyo, L=Koganei, O=WIDE, OU=AAA WG, CN=chavroux.cowaddict.org/emailAddress=sdecugis@nict.go.jp - Validity - Not Before: Oct 27 04:03:39 2009 GMT - Not After : Oct 25 04:03:39 2019 GMT - Subject: C=JP, ST=Tokyo, L=Koganei, O=WIDE, OU=AAA WG, CN=serv.test/emailAddress=serv@test - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:a6:f7:1c:a9:90:5b:fa:c8:f6:a3:04:0c:d0:8b: - 45:c3:90:f7:2d:c2:c9:d7:bd:66:8a:7c:1c:51:89: - 40:9e:cd:70:57:cb:00:47:a3:e8:76:8b:00:b3:c9: - c3:0d:b1:b9:2a:08:9f:52:92:82:d3:18:c1:d8:d1: - b8:1e:fd:71:fe:23:ec:19:e9:6d:9d:fd:ae:88:bc: - 39:44:7a:37:ad:c6:88:d1:64:7c:b1:d4:3c:a9:30: - c4:de:51:02:c4:48:4f:25:3e:2f:93:ae:25:32:66: - 9a:dc:f4:44:45:ff:7f:12:49:97:0d:01:8d:13:9a: - d3:8f:9e:2d:62:95:02:0a:c7 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - 0C:33:C4:7F:39:D0:34:FF:F8:61:A1:46:8B:49:1D:A3:57:B3:4D:58 - X509v3 Authority Key Identifier: - keyid:92:AA:55:9F:B3:77:82:68:89:ED:7E:73:43:66:E4:8B:EE:EA:BF:85 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=ca.localdomain, C=FR, ST=BdR, L=Aix, O=fD, OU=Tests + Validity + Not Before: Nov 24 17:06:43 2019 GMT + Not After : Oct 31 17:06:43 2119 GMT + Subject: C=FR, ST=BdR, O=fD, OU=Tests, CN=server.test + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a4:d4:cf:09:7c:35:02:38:34:ee:80:fd:bf:a0: + d2:f9:37:c2:3f:1c:3e:74:ac:38:c4:53:ce:f6:c2: + 03:31:b8:2c:8e:b0:b5:f5:58:34:4b:ef:1d:ef:b6: + f0:66:1e:48:54:f1:b7:d5:53:13:98:81:00:a0:60: + 84:f8:f2:bd:d1:d0:74:95:d8:eb:41:77:c2:ec:48: + 5c:fa:fe:0c:ab:af:75:47:18:fa:96:27:cb:06:d8: + 01:af:05:67:cc:10:ae:71:36:7b:6b:d7:fb:c9:c7: + e3:6a:e3:20:c3:2f:9e:5e:ef:68:2c:a5:80:c1:77: + 85:ef:c0:0b:d4:00:57:07:e9:c4:fc:b1:df:93:64: + eb:1f:36:e3:81:74:e7:8c:91:8a:3d:09:60:dd:f5: + 9c:93:21:49:9c:45:6f:6f:3a:d3:39:5c:5c:54:ed: + 8c:d5:d8:28:d4:58:46:e7:6b:b2:93:09:62:8a:9c: + c7:23:dc:7f:71:93:8b:7e:11:67:73:52:3f:99:ea: + ec:9f:0e:6b:d3:0a:be:48:c2:c9:6b:05:a3:f4:d7: + 20:73:83:43:f3:7b:17:1a:fb:73:36:7e:22:a0:68: + bc:63:ea:02:0f:7c:05:92:15:8b:b2:dc:89:a9:3d: + ac:31:d5:29:4b:0d:95:b7:2c:8e:6a:61:7b:f4:c5: + cf:cf + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 79:F6:AB:D6:1F:AF:03:E0:02:90:D8:EB:0E:D2:D4:0F:01:60:43:33 + X509v3 Authority Key Identifier: + keyid:56:24:30:EC:F4:4E:A8:DA:29:EB:97:40:C6:32:ED:0F:87:F5:F6:00 - Signature Algorithm: sha1WithRSAEncryption - 87:f5:49:a6:04:f9:98:9a:f1:1a:68:ce:06:ae:4c:0c:08:eb: - ba:98:e7:3f:df:22:7f:35:88:1d:b7:8a:f3:89:a3:68:0d:53: - 45:eb:23:a1:dd:6b:dc:b0:80:58:0c:10:0b:49:74:ea:a8:b6: - 8c:2e:c6:73:dc:7a:74:c7:59:3e:79:5a:d2:5c:15:0b:f1:d8: - 19:37:2a:c0:22:75:10:3f:4c:e9:a1:e0:eb:b2:9e:09:70:3d: - 2a:4c:fe:9c:99:36:4b:aa:6c:e1:8b:9c:aa:e1:29:1f:49:6b: - 14:db:12:ae:cf:68:4a:dd:03:e1:3b:ad:79:b4:54:84:1d:bb: - ac:45:c4:85:f1:03:65:65:96:23:ae:e7:97:3c:5c:db:ce:55: - 34:5d:c3:73:ec:cd:f6:0f:a5:81:5f:c2:ab:a3:42:fa:36:7f: - 83:ef:db:0f:cd:62:0b:ea:d9:4f:73:35:68:5f:23:d5:0a:be: - ff:7f:23:9a:af:0d:a5:f8:3e:3a:f0:63:1c:e1:d2:96:81:cf: - 7b:5a:6b:d0:9b:67:56:9e:aa:a9:e8:f1:6c:fb:54:2b:1a:f4: - ef:16:5a:be:1d:a9:c8:d6:cc:f7:42:8c:fe:83:2c:84:8c:80: - fb:1c:88:f6:35:1c:ae:43:72:fa:68:30:9c:25:8b:db:2c:84: - 87:76:9d:b9 + Signature Algorithm: sha256WithRSAEncryption + c8:69:0d:53:52:2c:5f:d9:8a:e9:96:98:27:8f:88:51:df:51: + d2:fb:5c:7a:25:bb:4f:80:7a:8a:e9:f7:16:c0:d6:7e:8a:4c: + 78:81:2b:63:8f:bf:98:f2:91:fc:a7:a0:81:64:f3:c9:20:ab: + 52:fc:68:24:05:59:3e:ae:47:7b:c0:e1:97:7c:25:73:6b:a0: + 34:bd:90:61:62:51:67:1e:6c:1e:2d:8c:e1:bd:d6:a6:ba:d9: + a9:8b:7a:c8:76:d0:25:83:28:5f:9c:1d:d5:ab:40:ce:0c:8e: + 96:8c:95:ba:bd:2f:fc:f3:81:80:15:5c:7d:5f:d2:28:bd:ea: + 68:3e:df:95:df:4a:1c:f3:fc:4d:f4:87:25:f1:4b:b2:7d:f3: + ba:17:4a:2d:be:6d:a6:d6:f5:b0:cf:fc:2c:ec:5f:70:b5:30: + 3d:2c:c3:dc:33:b8:c8:2e:90:7e:62:2c:51:51:bf:91:80:a8: + b6:f7:8d:3d:69:03:f4:07:ca:8c:8a:75:f0:4b:1b:44:eb:d1: + 76:fd:61:e1:7d:f7:35:6e:04:3b:5e:c9:a9:f1:d9:7b:ee:43: + 31:84:74:66:18:71:b6:b6:c7:98:3a:42:a6:03:ac:a6:b7:56: + 8c:76:a5:13:33:71:31:0c:43:b8:27:17:7c:c8:3c:0f:3d:16: + 86:0e:13:87:00:5b:af:9c:c3:e3:e7:37:fc:3e:07:54:63:53: + af:d6:91:dd:1d:e2:25:d8:57:b0:bc:db:a8:2a:f8:23:e9:15: + 1e:01:f3:e3:37:e4:21:85:48:35:66:d0:6e:72:96:ca:09:d7: + 26:99:d5:5d:fa:b2:39:94:15:d6:29:45:e7:5c:c6:ea:61:8f: + 4d:6a:68:32:93:b1:1d:b2:28:8a:b0:43:b7:17:c4:81:eb:4e: + ef:91:ed:ca:d9:d8:fa:b2:e1:c8:9b:21:27:cf:77:83:98:10: + af:54:09:9f:ce:6b:63:bd:f9:f8:00:97:3f:53:89:50:dc:6d: + e9:45:42:18:46:91:3d:b5:60:45:9d:17:b1:69:71:a4:69:5e: + 18:65:cf:06:90:df:5b:db:60:57:ed:de:5c:ef:e8:05:d4:a7: + 10:c9:13:32:e3:b3:c3:70:fc:4e:2f:22:a4:40:e1:e3:8f:aa: + fc:f6:d6:d6:1d:9a:54:32:9c:01:11:68:69:e7:2a:9f:ca:57: + 60:f8:6c:bd:ff:5c:d4:0a:e4:45:f7:6a:3c:40:cc:27:e3:d0: + ae:9f:24:de:cc:5d:70:0e:b2:31:a5:62:65:6e:cd:0a:1c:41: + f4:45:ec:bb:47:f8:2d:80:0c:6f:62:42:8e:12:90:5a:98:56: + bc:b8:2f:0e:31:d4:f8:f3 */ -static char server_cert_data[] ="-----BEGIN CERTIFICATE-----\n" - "MIIDhDCCAmygAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBlDELMAkGA1UEBhMCSlAx\n" - "DjAMBgNVBAgMBVRva3lvMRAwDgYDVQQHDAdLb2dhbmVpMQ0wCwYDVQQKDARXSURF\n" - "MQ8wDQYDVQQLDAZBQUEgV0cxHzAdBgNVBAMMFmNoYXZyb3V4LmNvd2FkZGljdC5v\n" - "cmcxIjAgBgkqhkiG9w0BCQEWE3NkZWN1Z2lzQG5pY3QuZ28uanAwHhcNMDkxMDI3\n" - "MDQwMzM5WhcNMTkxMDI1MDQwMzM5WjB9MQswCQYDVQQGEwJKUDEOMAwGA1UECAwF\n" - "VG9reW8xEDAOBgNVBAcMB0tvZ2FuZWkxDTALBgNVBAoMBFdJREUxDzANBgNVBAsM\n" - "BkFBQSBXRzESMBAGA1UEAwwJc2Vydi50ZXN0MRgwFgYJKoZIhvcNAQkBFglzZXJ2\n" - "QHRlc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKb3HKmQW/rI9qMEDNCL\n" - "RcOQ9y3Cyde9Zop8HFGJQJ7NcFfLAEej6HaLALPJww2xuSoIn1KSgtMYwdjRuB79\n" - "cf4j7BnpbZ39roi8OUR6N63GiNFkfLHUPKkwxN5RAsRITyU+L5OuJTJmmtz0REX/\n" - "fxJJlw0BjROa04+eLWKVAgrHAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4\n" - "QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQM\n" - "M8R/OdA0//hhoUaLSR2jV7NNWDAfBgNVHSMEGDAWgBSSqlWfs3eCaIntfnNDZuSL\n" - "7uq/hTANBgkqhkiG9w0BAQUFAAOCAQEAh/VJpgT5mJrxGmjOBq5MDAjrupjnP98i\n" - "fzWIHbeK84mjaA1TResjod1r3LCAWAwQC0l06qi2jC7Gc9x6dMdZPnla0lwVC/HY\n" - "GTcqwCJ1ED9M6aHg67KeCXA9Kkz+nJk2S6ps4YucquEpH0lrFNsSrs9oSt0D4Tut\n" - "ebRUhB27rEXEhfEDZWWWI67nlzxc285VNF3Dc+zN9g+lgV/Cq6NC+jZ/g+/bD81i\n" - "C+rZT3M1aF8j1Qq+/38jmq8Npfg+OvBjHOHSloHPe1pr0JtnVp6qqejxbPtUKxr0\n" - "7xZavh2pyNbM90KM/oMshIyA+xyI9jUcrkNy+mgwnCWL2yyEh3aduQ==\n" - "-----END CERTIFICATE-----\n"; -static char server_priv_data[] ="-----BEGIN RSA PRIVATE KEY-----\n" - "MIICXQIBAAKBgQCm9xypkFv6yPajBAzQi0XDkPctwsnXvWaKfBxRiUCezXBXywBH\n" - "o+h2iwCzycMNsbkqCJ9SkoLTGMHY0bge/XH+I+wZ6W2d/a6IvDlEejetxojRZHyx\n" - "1DypMMTeUQLESE8lPi+TriUyZprc9ERF/38SSZcNAY0TmtOPni1ilQIKxwIDAQAB\n" - "AoGAZv3Ddm0P79CLIt9asEFY1VvUvSuMqkGwwPfx1/HcJJkBFYapM4fN22G/Gyf3\n" - "47ifSWhsLtklTeXVnVMwSh14dJaJQuSEnaFnUUWfjiRbEAXZnMFwAIiaszEZbPap\n" - "NUNpcGl06FZrphYAMkjOVUfjCjfOZDAvL4JGpo271Zx4l0ECQQDYoFFQpBCPx0PK\n" - "TWUmvatXI/Amo94XkGfofbdeeI8PiAJBO5UI6rmjjIVwsJwO9dQb/IlP1/OnBeJv\n" - "p9YW5uixAkEAxVAOKu7mpGu0Q/K2iEUUYDX9YHf253kgkdIDF4iZk4Tcecjoxuru\n" - "fIWu9dMtyDVV+HT2X4cNEnO1/oS3kJII9wJBAJkdwDwiqz4lV6o/yFZ4zAoc8dsu\n" - "CoZXYMq5SYox5tTQit928OHLn4mVgqBjhPsiEVnyx0+zUZpmE2ZemHm5nxECQHfE\n" - "FBVzVYRP6+eil7E3XRrZKqc3qiLunxpkA4RxYebtKnaxwLmdOI1VB9InEQ8JcNmT\n" - "BUkOzJx6p+mJ3XJfchkCQQDWmbMYYJajsjlS4YpdUUj7cBSotA6vtkNVHFr0/ak/\n" - "S+tLkMNuruaInWizK+BKYTIJLlQDf5u5NTrw41vye5Hv\n" - "-----END RSA PRIVATE KEY-----\n"; +static char server_cert_data[] = "" +"-----BEGIN CERTIFICATE-----\n" +"MIIEpTCCAo2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADBfMRcwFQYDVQQDDA5jYS5s\n" +"b2NhbGRvbWFpbjELMAkGA1UEBhMCRlIxDDAKBgNVBAgMA0JkUjEMMAoGA1UEBwwD\n" +"QWl4MQswCQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMwIBcNMTkxMTI0MTcwNjQz\n" +"WhgPMjExOTEwMzExNzA2NDNaME4xCzAJBgNVBAYTAkZSMQwwCgYDVQQIDANCZFIx\n" +"CzAJBgNVBAoMAmZEMQ4wDAYDVQQLDAVUZXN0czEUMBIGA1UEAwwLc2VydmVyLnRl\n" +"c3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk1M8JfDUCODTugP2/\n" +"oNL5N8I/HD50rDjEU872wgMxuCyOsLX1WDRL7x3vtvBmHkhU8bfVUxOYgQCgYIT4\n" +"8r3R0HSV2OtBd8LsSFz6/gyrr3VHGPqWJ8sG2AGvBWfMEK5xNntr1/vJx+Nq4yDD\n" +"L55e72gspYDBd4XvwAvUAFcH6cT8sd+TZOsfNuOBdOeMkYo9CWDd9ZyTIUmcRW9v\n" +"OtM5XFxU7YzV2CjUWEbna7KTCWKKnMcj3H9xk4t+EWdzUj+Z6uyfDmvTCr5Iwslr\n" +"BaP01yBzg0Pzexca+3M2fiKgaLxj6gIPfAWSFYuy3ImpPawx1SlLDZW3LI5qYXv0\n" +"xc/PAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wg\n" +"R2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBR59qvWH68D4AKQ2OsO0tQP\n" +"AWBDMzAfBgNVHSMEGDAWgBRWJDDs9E6o2inrl0DGMu0Ph/X2ADANBgkqhkiG9w0B\n" +"AQsFAAOCAgEAyGkNU1IsX9mK6ZaYJ4+IUd9R0vtceiW7T4B6iun3FsDWfopMeIEr\n" +"Y4+/mPKR/KeggWTzySCrUvxoJAVZPq5He8Dhl3wlc2ugNL2QYWJRZx5sHi2M4b3W\n" +"prrZqYt6yHbQJYMoX5wd1atAzgyOloyVur0v/POBgBVcfV/SKL3qaD7fld9KHPP8\n" +"TfSHJfFLsn3zuhdKLb5tptb1sM/8LOxfcLUwPSzD3DO4yC6QfmIsUVG/kYCotveN\n" +"PWkD9AfKjIp18EsbROvRdv1h4X33NW4EO17JqfHZe+5DMYR0ZhhxtrbHmDpCpgOs\n" +"prdWjHalEzNxMQxDuCcXfMg8Dz0Whg4ThwBbr5zD4+c3/D4HVGNTr9aR3R3iJdhX\n" +"sLzbqCr4I+kVHgHz4zfkIYVINWbQbnKWygnXJpnVXfqyOZQV1ilF51zG6mGPTWpo\n" +"MpOxHbIoirBDtxfEgetO75HtytnY+rLhyJshJ893g5gQr1QJn85rY735+ACXP1OJ\n" +"UNxt6UVCGEaRPbVgRZ0XsWlxpGleGGXPBpDfW9tgV+3eXO/oBdSnEMkTMuOzw3D8\n" +"Ti8ipEDh44+q/PbW1h2aVDKcARFoaecqn8pXYPhsvf9c1ArkRfdqPEDMJ+PQrp8k\n" +"3sxdcA6yMaViZW7NChxB9EXsu0f4LYAMb2JCjhKQWphWvLgvDjHU+PM=\n" +"-----END CERTIFICATE-----\n" + ; +static char server_priv_data[] = "" +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEogIBAAKCAQEApNTPCXw1Ajg07oD9v6DS+TfCPxw+dKw4xFPO9sIDMbgsjrC1\n" +"9Vg0S+8d77bwZh5IVPG31VMTmIEAoGCE+PK90dB0ldjrQXfC7Ehc+v4Mq691Rxj6\n" +"lifLBtgBrwVnzBCucTZ7a9f7ycfjauMgwy+eXu9oLKWAwXeF78AL1ABXB+nE/LHf\n" +"k2TrHzbjgXTnjJGKPQlg3fWckyFJnEVvbzrTOVxcVO2M1dgo1FhG52uykwliipzH\n" +"I9x/cZOLfhFnc1I/mersnw5r0wq+SMLJawWj9Ncgc4ND83sXGvtzNn4ioGi8Y+oC\n" +"D3wFkhWLstyJqT2sMdUpSw2VtyyOamF79MXPzwIDAQABAoIBAC6uushD7jtnsc4O\n" +"qE8afEXq/c+j7yhaEmXAGrCWOBNfxvbOo2oOBhmvajoXBLTXRMMSBm+bbMRXXNcP\n" +"Hvnmvc3rjOlXmyFaitEimXrYcrw5ICz3rRjTwlN439ky3bfUzaLwvDnJ3NzECOuf\n" +"0gqVtPPMOCPU58djU4KYUIFFa2Co5v474RKBKNv18QuxGg6NWkPZhMAp1S0uAm+w\n" +"lwnpSXzS5X0qDC/EklZ9JLlGvvLZKreoWbk+sMv0x/jykwxI567hQq6hRoQ32YM+\n" +"+d/hBDSm69zf0om/XTFMzUSs5ss3TZyVujTTquTKktXzIT3gX+e7SMrt/fJi5ofr\n" +"39ijMRECgYEA2Ye77hHLEf57hf/tTK4gV4KUhatQTI5Rfa1WD1Z+jr99H/hiJw8f\n" +"dKeu8KUkU5REYFznu0fU/hSHXAxQf6Ae2NtM7uYbTEUgbuUKfG+8CT0UqWHkTtIB\n" +"egUc8ZD580VcM/WkK1A7if688COvwGYqrilq3kJYPwDmYsQBrJ/9uWcCgYEAwfs7\n" +"Kbt/g3Y7xaSyvLTTMgWrUGHSRV70vOPYe9qOEkU1HdMKhFQxbUfolfXEHq/gK/G5\n" +"KjxghUkN86T4h7xOXaiM1uYCioVmfIfV2ye95n9jdMvAz+W2z6chYLQs33R0AW7D\n" +"wI+yk7S0EeeAbygL5GtDLz1NNUYsAe4zA/g07VkCgYBznUC096AGoErmnW9yIdnu\n" +"qOhnYvX6uml1cnsbC82X8Q5/v3Prbo45YiYIoLz97v+od7hyQWti32ZR9fmS23eJ\n" +"qoTpNEOt9c+XIQTBvmEiR+SDYhQGEHfYcn8/pN4z/dlThGsM2kfKwCmLOGxgxexJ\n" +"RJoYJwrf8YqBU8vQA/jGYQKBgFzZ7sXZE/5PN+kxHsUpIPaOtCPzzvyZqThJL7SJ\n" +"NvwT2IsAG8afrlEK3I/7ZfbyZLFkMSfAYssp3t3DF5uRTUmThmbPDmRT2my9cGZI\n" +"raOJUofzh8V7xXe8HkP1uozzZxvQcy7XGbmOA6uWTmnml1qs5SnVhAF+J059QDok\n" +"MuFxAoGAQAwkelYrjyHFIxCX4/5/o36FsSKWRnvzGVhPlUZ6lPMVSsBYuTqfNDZv\n" +"K3UFwXsqiepM4Mso1TNEmoj5OhlJRkUi2WQPcvCzhuNZOBrtENxeLvjzMkIv3QfN\n" +"PtGTm8nE7MyIChUCfsGwh1yfhGfT9s1yeRUpYCjGkD2lC2/fmmI=\n" +"-----END RSA PRIVATE KEY-----\n" + ; /* Expired: - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 6 (0x6) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=JP, ST=Tokyo, L=Koganei, O=WIDE, OU=AAA WG, CN=chavroux.cowaddict.org/emailAddress=sdecugis@nict.go.jp - Validity - Not Before: Oct 27 04:06:35 2009 GMT - Not After : Oct 28 04:06:35 2009 GMT - Subject: C=JP, ST=Tokyo, L=Koganei, O=WIDE, OU=AAA WG, CN=expired.test/emailAddress=expired@test - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:e3:17:15:54:85:dc:cf:c7:a0:32:4a:49:7d:55: - 75:9b:29:15:db:7e:87:17:d9:0e:65:44:53:d7:19: - 37:27:c7:c6:fe:c6:dc:72:2b:dc:86:1a:ff:24:6c: - 63:3f:75:9c:0a:14:e1:70:06:79:d4:b9:26:d4:68: - 4c:28:38:ba:34:60:56:02:3d:94:55:4a:1f:4e:5a: - f0:a5:71:4c:3e:71:69:39:ad:bc:aa:55:35:fb:73: - 5b:5f:6c:30:71:8e:8a:b6:a5:06:cc:ee:dd:29:c7: - 52:0d:a7:9c:0f:a1:ba:52:11:e2:1b:b9:74:6b:08: - 87:11:d2:ec:a9:ac:63:63:4f - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - 1C:AF:66:42:5B:AD:AA:A5:9B:D9:AE:3A:C1:5A:AC:2F:CC:CE:22:6C - X509v3 Authority Key Identifier: - keyid:92:AA:55:9F:B3:77:82:68:89:ED:7E:73:43:66:E4:8B:EE:EA:BF:85 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 3 (0x3) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=ca.localdomain, C=FR, ST=BdR, L=Aix, O=fD, OU=Tests + Validity + Not Before: Nov 23 17:29:33 2019 GMT + Not After : Nov 24 17:29:33 2019 GMT + Subject: C=FR, ST=BdR, O=fD, OU=Tests, CN=expired.test + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e8:11:78:5c:1a:9f:60:46:dc:0a:f7:71:6c:39: + 0c:b7:5d:b9:08:92:d8:a7:aa:b5:34:26:a6:07:18: + 65:f9:77:16:31:f4:d9:fd:fe:88:3e:d1:10:9b:e3: + f0:15:cc:ea:4e:1f:33:7d:a0:06:5c:65:41:db:d0: + 99:ce:99:4d:22:8d:bf:0d:aa:f1:30:f8:43:19:02: + 9d:2d:14:90:db:08:55:92:f4:7e:4d:46:fa:3a:39: + 43:c2:a6:6a:75:a7:52:f1:92:ba:2d:df:ba:ca:c8: + fb:53:e1:3b:fd:b6:6f:50:7a:bf:de:4b:24:13:52: + 31:de:a0:1f:35:2e:02:12:bd:15:70:51:8a:62:61: + 74:41:16:aa:22:41:ac:83:dd:a1:2b:bc:62:ab:e3: + 6d:1c:53:73:2e:70:55:f5:f0:54:27:2d:b4:31:41: + 90:b9:4b:3b:15:b8:16:dc:67:cb:4f:ea:2a:fe:69: + 13:7f:22:df:a8:96:6d:eb:42:cb:ca:ad:8b:18:5f: + b4:a3:4e:96:80:c4:33:8b:7b:0c:11:86:7d:22:9f: + 3e:ed:7d:ca:e8:e0:1a:fa:80:b0:8d:58:c9:ef:37: + 5a:a1:d4:df:1f:ac:45:5b:66:7d:92:be:25:53:ef: + 1b:e4:68:77:66:36:9c:87:c9:82:20:64:dc:f5:1a: + 64:77 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 03:44:CB:35:55:E0:87:7B:6F:3F:A5:06:19:70:99:F2:21:B1:C2:48 + X509v3 Authority Key Identifier: + keyid:56:24:30:EC:F4:4E:A8:DA:29:EB:97:40:C6:32:ED:0F:87:F5:F6:00 - Signature Algorithm: sha1WithRSAEncryption - 60:8f:55:55:59:82:0f:64:cb:b8:11:c8:44:ce:bf:69:07:0d: - be:c2:34:be:42:6a:78:15:39:9f:be:8a:17:d6:43:42:c9:7c: - f1:6d:5d:aa:c3:1b:4d:b0:f0:b6:73:46:2a:87:cd:55:56:a3: - 6d:cc:de:a8:28:6a:53:85:9e:e5:68:b7:3c:f5:72:13:7b:d0: - 21:f2:91:49:35:e0:37:1e:28:19:d5:1b:cc:e1:32:1e:7f:b0: - 86:df:43:a4:47:0f:29:0b:eb:51:60:9a:f5:ca:50:f4:2d:59: - cd:fc:50:9d:29:ed:45:98:de:a2:5c:d1:b5:7a:34:ad:7a:73: - 48:8b:a2:9b:89:8e:4a:2e:2a:04:19:d6:62:6a:0d:f0:96:f2: - f0:d0:22:77:3b:7f:b1:2a:f4:3b:17:47:5e:38:07:09:65:ad: - 1d:ea:46:69:6a:96:b6:6b:3b:5c:cc:6e:30:d7:cb:53:69:59: - c2:63:78:2b:03:d4:d4:f7:17:29:99:9a:43:ff:78:0a:af:42: - c5:b3:8d:09:38:5b:30:70:28:c1:97:ab:fd:7f:87:9a:ec:f2: - 97:44:ff:f5:b9:41:30:d1:c6:32:98:69:34:c4:39:30:6f:e2: - d3:b2:70:97:66:ee:41:f5:ae:0f:09:f0:ed:60:96:67:a9:8a: - cd:d6:95:f2 + Signature Algorithm: sha256WithRSAEncryption + 9c:d1:af:3c:6c:41:1c:fe:dd:e2:60:b0:af:0b:f4:ea:64:e0: + e3:13:54:ee:23:93:fb:61:88:a8:9d:9e:21:e8:6b:68:b0:3f: + 82:5b:95:22:ac:7b:06:d9:b4:49:b6:bd:4f:2e:4b:4a:cc:97: + b3:c4:1b:31:fd:60:ae:ca:54:aa:1f:a1:0b:f0:84:66:5f:02: + 83:cf:bc:43:aa:5f:f6:fb:17:52:9d:f0:0e:2a:d7:f3:76:63: + ca:59:ce:20:84:c5:c9:3a:bb:e7:8e:d8:04:95:4e:84:76:52: + 6d:fb:e1:fb:ae:23:64:a9:a1:34:c2:a2:8a:62:69:31:1d:88: + ef:f1:e3:ba:d3:23:8f:e3:93:0d:a8:5e:51:ce:fa:af:2c:68: + 52:40:66:84:f0:4d:cc:1b:6f:dc:fc:c7:ee:85:18:4c:ec:96: + 31:4f:36:69:ba:05:ed:27:a2:bb:b1:51:de:e9:46:ea:22:67: + 8d:ee:85:60:19:f7:5b:0e:cb:4b:04:cc:ea:17:c9:59:dd:c0: + 59:03:9d:4a:94:fa:97:47:51:95:34:a3:1e:c2:f1:ff:af:d9: + 04:48:bd:6e:6c:01:ab:5f:76:77:a3:42:3d:24:9c:00:32:1f: + f1:65:38:78:da:c8:5d:65:df:5f:9c:26:18:51:2e:56:33:73: + 7d:d3:dc:dc:3b:7a:d2:28:cb:58:92:13:bb:f8:a2:96:c0:64: + 27:c1:06:03:c3:41:28:3e:ee:c3:a6:aa:f2:20:1b:4b:78:6a: + 14:a7:eb:c5:60:ba:06:fb:1d:d5:68:c7:03:62:72:e2:dd:27: + a8:5a:dc:e8:c2:12:ba:66:9a:72:ce:a8:a3:c2:dc:b4:20:13: + 65:68:c4:bc:40:06:2a:ed:a8:95:70:9e:be:7f:d8:59:8f:bc: + 14:6a:37:9e:84:c0:c2:fb:bd:18:5d:d1:2a:25:8d:10:e1:51: + 48:66:1e:8a:c4:0f:e5:0f:46:af:e3:5c:5e:a7:45:4b:3b:e3: + 1b:bd:f9:b7:75:05:b4:39:3b:38:69:00:04:86:e7:fa:6d:20: + 5d:e7:ff:39:a5:73:5c:9c:0b:50:1d:d2:76:20:b9:28:3b:a5: + e1:24:e8:a0:85:94:39:15:8b:c8:d4:76:9e:79:82:46:56:4f: + f4:3c:18:54:2a:77:82:9b:17:0c:4f:aa:e1:28:53:19:1c:1e: + 92:f9:8d:06:82:c5:5a:40:46:79:a4:68:54:82:d0:5f:33:1e: + e1:83:dd:c2:57:ac:88:5a:31:71:b7:45:23:89:99:d6:8c:33: + 96:72:2f:6c:ee:46:31:24:ed:68:48:1d:05:b7:a2:d7:a8:5b: + 41:1b:1d:15:39:14:69:79 */ -static char expired_cert_data[]="-----BEGIN CERTIFICATE-----\n" - "MIIDizCCAnOgAwIBAgIBBjANBgkqhkiG9w0BAQUFADCBlDELMAkGA1UEBhMCSlAx\n" - "DjAMBgNVBAgMBVRva3lvMRAwDgYDVQQHDAdLb2dhbmVpMQ0wCwYDVQQKDARXSURF\n" - "MQ8wDQYDVQQLDAZBQUEgV0cxHzAdBgNVBAMMFmNoYXZyb3V4LmNvd2FkZGljdC5v\n" - "cmcxIjAgBgkqhkiG9w0BCQEWE3NkZWN1Z2lzQG5pY3QuZ28uanAwHhcNMDkxMDI3\n" - "MDQwNjM1WhcNMDkxMDI4MDQwNjM1WjCBgzELMAkGA1UEBhMCSlAxDjAMBgNVBAgM\n" - "BVRva3lvMRAwDgYDVQQHDAdLb2dhbmVpMQ0wCwYDVQQKDARXSURFMQ8wDQYDVQQL\n" - "DAZBQUEgV0cxFTATBgNVBAMMDGV4cGlyZWQudGVzdDEbMBkGCSqGSIb3DQEJARYM\n" - "ZXhwaXJlZEB0ZXN0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjFxVUhdzP\n" - "x6AySkl9VXWbKRXbfocX2Q5lRFPXGTcnx8b+xtxyK9yGGv8kbGM/dZwKFOFwBnnU\n" - "uSbUaEwoOLo0YFYCPZRVSh9OWvClcUw+cWk5rbyqVTX7c1tfbDBxjoq2pQbM7t0p\n" - "x1INp5wPobpSEeIbuXRrCIcR0uyprGNjTwIDAQABo3sweTAJBgNVHRMEAjAAMCwG\n" - "CWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNV\n" - "HQ4EFgQUHK9mQlutqqWb2a46wVqsL8zOImwwHwYDVR0jBBgwFoAUkqpVn7N3gmiJ\n" - "7X5zQ2bki+7qv4UwDQYJKoZIhvcNAQEFBQADggEBAGCPVVVZgg9ky7gRyETOv2kH\n" - "Db7CNL5CangVOZ++ihfWQ0LJfPFtXarDG02w8LZzRiqHzVVWo23M3qgoalOFnuVo\n" - "tzz1chN70CHykUk14DceKBnVG8zhMh5/sIbfQ6RHDykL61FgmvXKUPQtWc38UJ0p\n" - "7UWY3qJc0bV6NK16c0iLopuJjkouKgQZ1mJqDfCW8vDQInc7f7Eq9DsXR144Bwll\n" - "rR3qRmlqlrZrO1zMbjDXy1NpWcJjeCsD1NT3FymZmkP/eAqvQsWzjQk4WzBwKMGX\n" - "q/1/h5rs8pdE//W5QTDRxjKYaTTEOTBv4tOycJdm7kH1rg8J8O1glmepis3WlfI=\n" - "-----END CERTIFICATE-----\n"; -static char expired_priv_data[]="-----BEGIN RSA PRIVATE KEY-----\n" - "MIICXgIBAAKBgQDjFxVUhdzPx6AySkl9VXWbKRXbfocX2Q5lRFPXGTcnx8b+xtxy\n" - "K9yGGv8kbGM/dZwKFOFwBnnUuSbUaEwoOLo0YFYCPZRVSh9OWvClcUw+cWk5rbyq\n" - "VTX7c1tfbDBxjoq2pQbM7t0px1INp5wPobpSEeIbuXRrCIcR0uyprGNjTwIDAQAB\n" - "AoGASwPoDui9XYHTIGm7xwRA+kVjLAOq+qy//aHJlEeHGcP7r1PfpHNqwH4QhGat\n" - "jlv6dLYbFld9TVDwS8A8UBkVIPLWnCysd5tF2A4C5akx6ouW6HliW/JheYrgl8AV\n" - "PVeR3bm91UbnpC0ABVlw87jp1Ovyr60Suo4jsoJz+CyTa2ECQQD0LJWpnwn1jIlR\n" - "DGkLi7F3E70JJcdhTWzBjGFD+Na+/2ZO0MKLhK+O1WUkKa0oi+e5P1JOnGIpTI8c\n" - "BJOO415RAkEA7hauapYuqGI/auSPH8/nFB5z1G94RTxo2a5THKcG5MqS/8N3ubFj\n" - "i2PPS0lEYVjqoHEsZUsMnDmXp6KDKMAfnwJBAIp+T1UqM8fmsmwaEerOjRXxSCNM\n" - "Hk5+T9Vn/jNDjOpAipLhrbbcx4bIWtmsGd8Jm6Fi3RhhcvvhxLorjlZZeEECQQCf\n" - "IaPD88sNmlUewdLzhUbCiLQMadCuHflKfRxpyy1tYAQuVFxCTdDlynkzra25ju+K\n" - "+vmcXjP4evnk/lbBtt+rAkEAgOr4Apgs3nMppngPV5yFx0NDqH2n8PlEAM1Il4Qs\n" - "IuuK18v0KwlUGAfEEmCiNh1e1qkLmD0CnI2QjYAjcLQUhw==\n" - "-----END RSA PRIVATE KEY-----\n"; +static char expired_cert_data[]= "" +"-----BEGIN CERTIFICATE-----\n" +"MIIEpDCCAoygAwIBAgIBAzANBgkqhkiG9w0BAQsFADBfMRcwFQYDVQQDDA5jYS5s\n" +"b2NhbGRvbWFpbjELMAkGA1UEBhMCRlIxDDAKBgNVBAgMA0JkUjEMMAoGA1UEBwwD\n" +"QWl4MQswCQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMwHhcNMTkxMTIzMTcyOTMz\n" +"WhcNMTkxMTI0MTcyOTMzWjBPMQswCQYDVQQGEwJGUjEMMAoGA1UECAwDQmRSMQsw\n" +"CQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMxFTATBgNVBAMMDGV4cGlyZWQudGVz\n" +"dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOgReFwan2BG3Ar3cWw5\n" +"DLdduQiS2KeqtTQmpgcYZfl3FjH02f3+iD7REJvj8BXM6k4fM32gBlxlQdvQmc6Z\n" +"TSKNvw2q8TD4QxkCnS0UkNsIVZL0fk1G+jo5Q8KmanWnUvGSui3fusrI+1PhO/22\n" +"b1B6v95LJBNSMd6gHzUuAhK9FXBRimJhdEEWqiJBrIPdoSu8YqvjbRxTcy5wVfXw\n" +"VCcttDFBkLlLOxW4Ftxny0/qKv5pE38i36iWbetCy8qtixhftKNOloDEM4t7DBGG\n" +"fSKfPu19yujgGvqAsI1Yye83WqHU3x+sRVtmfZK+JVPvG+Rod2Y2nIfJgiBk3PUa\n" +"ZHcCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH\n" +"ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFANEyzVV4Id7bz+lBhlwmfIh\n" +"scJIMB8GA1UdIwQYMBaAFFYkMOz0TqjaKeuXQMYy7Q+H9fYAMA0GCSqGSIb3DQEB\n" +"CwUAA4ICAQCc0a88bEEc/t3iYLCvC/TqZODjE1TuI5P7YYionZ4h6GtosD+CW5Ui\n" +"rHsG2bRJtr1PLktKzJezxBsx/WCuylSqH6EL8IRmXwKDz7xDql/2+xdSnfAOKtfz\n" +"dmPKWc4ghMXJOrvnjtgElU6EdlJt++H7riNkqaE0wqKKYmkxHYjv8eO60yOP45MN\n" +"qF5RzvqvLGhSQGaE8E3MG2/c/MfuhRhM7JYxTzZpugXtJ6K7sVHe6UbqImeN7oVg\n" +"GfdbDstLBMzqF8lZ3cBZA51KlPqXR1GVNKMewvH/r9kESL1ubAGrX3Z3o0I9JJwA\n" +"Mh/xZTh42shdZd9fnCYYUS5WM3N909zcO3rSKMtYkhO7+KKWwGQnwQYDw0EoPu7D\n" +"pqryIBtLeGoUp+vFYLoG+x3VaMcDYnLi3SeoWtzowhK6Zppyzqijwty0IBNlaMS8\n" +"QAYq7aiVcJ6+f9hZj7wUajeehMDC+70YXdEqJY0Q4VFIZh6KxA/lD0av41xep0VL\n" +"O+Mbvfm3dQW0OTs4aQAEhuf6bSBd5/85pXNcnAtQHdJ2ILkoO6XhJOighZQ5FYvI\n" +"1HaeeYJGVk/0PBhUKneCmxcMT6rhKFMZHB6S+Y0GgsVaQEZ5pGhUgtBfMx7hg93C\n" +"V6yIWjFxt0UjiZnWjDOWci9s7kYxJO1oSB0Ft6LXqFtBGx0VORRpeQ==\n" +"-----END CERTIFICATE-----\n" + + ; +static char expired_priv_data[]= "" +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEowIBAAKCAQEA6BF4XBqfYEbcCvdxbDkMt125CJLYp6q1NCamBxhl+XcWMfTZ\n" +"/f6IPtEQm+PwFczqTh8zfaAGXGVB29CZzplNIo2/DarxMPhDGQKdLRSQ2whVkvR+\n" +"TUb6OjlDwqZqdadS8ZK6Ld+6ysj7U+E7/bZvUHq/3kskE1Ix3qAfNS4CEr0VcFGK\n" +"YmF0QRaqIkGsg92hK7xiq+NtHFNzLnBV9fBUJy20MUGQuUs7FbgW3GfLT+oq/mkT\n" +"fyLfqJZt60LLyq2LGF+0o06WgMQzi3sMEYZ9Ip8+7X3K6OAa+oCwjVjJ7zdaodTf\n" +"H6xFW2Z9kr4lU+8b5Gh3Zjach8mCIGTc9RpkdwIDAQABAoIBADS9c6sK6dmJgQyE\n" +"+6PquzcY96o5JT/FjfTSK71FEDfHlqW3zarpo7ES9kFXZgKuVTl34c3VBl0NLhB0\n" +"sd+/+0W1DQxgIvxMD4OpkmriV6FPnZMOOX36eXet9/ZOt7cRVcpM3D78r4jScDu5\n" +"3lZklZumqeAtF3/EmEzN+wms8Q+stltBR3xo7pbvmllI41Igq0UAHmbAodKBhsXc\n" +"RorKLGsVsE4EeM5tTw1Ca5wmLZ2FvJC30eAkCzB5VkdAEiRfwooT+lwM9BjMJ8he\n" +"2cVGMRcYW+52t9WMUG8z4zbvHg3WsBwKHgc6AQ9A6al7bh/end6rowiqUKRgo1a0\n" +"3cKIznECgYEA98eWvy0JIUp6kb4FzfCC3moyIroPCloadgQfPCFDpC88zK4K6LQg\n" +"qdGpWWCyNpz/MsEr8moWo9UXZo9kxoMQXS+siR8MzEff2QMHH646ZOHmODvneTL6\n" +"pOWbcCKUofJDPXB+jk9Jbeqcq3eaTxE72girt2Fc28Z2WTqyQ03M2hsCgYEA78Rx\n" +"dNxNpncsdBeWglxr4/gbDYi5QMZ/GDIRXEMCkqiHsGmW/7LVSfWwU/kDsBFKtMA0\n" +"qZdNApSuhhgSP6Sae3bwoJE6iLSSzZ2eIpAOR6uBQA20UxS85cdEtRNx4HgTmoQc\n" +"fl+zPiKeAnd0sllxzzD/uFkMm3q6dx1Qnq7JhNUCgYA1FezlLqfrGwLhoL2rnqDb\n" +"OBNfv08jn6RVrpJmlpXgYkJ7c7pgmt74ozPOM1pbOw2t+RcKS9Jn7WqjDYvAwCnM\n" +"XT9w7VcXmTqLSwvGrNRT8tYZLDRukg6DL7I6tx3zCG2Bh02F/dS0mPRSBEDqOb4B\n" +"+6OWmWSEraODgIDazJtcCwKBgE7whU4tTh91cxxRu8r1tMvcnsOI9T0fXS7RJSgU\n" +"I9+3Pt1VFlLfRRvRmRk8jftE5iy2b2A6oS8tVnxtpmxvvDDUCwtCZVwm34J012CX\n" +"vyvXinlVSb5kwICCZ9uaKE74GbQwtNTimzfk29MCE1i43CCUCE1gfCcgdA3NiAKG\n" +"l3B1AoGBANpEOZLSVd/XfBfw8dwPdtC9wjMqHcKTOuaqaCXSiKKMn2vnaSRIs08U\n" +"rhj3Qzm6p33Hsxm3WibwcW7pBTC2vsa9DBv6ZJcXeB2qmmDxpIydVn64yd6WD3+M\n" +"bvEZZHKFcDcjAeoP6RJiFb+wppk3byqxjjSUr1JhKg1NtWriOSo7\n" +"-----END RSA PRIVATE KEY-----\n" + ; /* Unknown CA certificate : Certificate: @@ -531,7 +674,7 @@ static void * connect_thr(void * arg) #ifndef DISABLE_SCTP case IPPROTO_SCTP: { - cnx = fd_cnx_cli_connect_sctp(0, TEST_PORT, &eps); + cnx = fd_cnx_cli_connect_sctp(0, TEST_PORT, &eps, NULL); CHECK( 1, (cnx ? 1 : 0) ^ cf->expect_failure ); } break; diff --git a/tests/testmesg.c b/tests/testmesg.c index 5525ff4..81c59ce 100644 --- a/tests/testmesg.c +++ b/tests/testmesg.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2015, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -164,6 +164,8 @@ int main(int argc, char *argv[]) /* Create the instance, using the templates */ CHECK( 0, fd_msg_new ( acr_model, 0, &acr ) ); + +/* TODO: Do we need this recreated? acr is not used again . */ } /* Now let's create some additional Dictionary objects for the test */ @@ -282,6 +284,11 @@ int main(int argc, char *argv[]) CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application, ENOENT ) ); CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_COMMAND, &cmd_data , application, &command ) ); + ADD_RULE(command, 0, "Session-Id", RULE_FIXED_HEAD, 1, 1, 1); + ADD_RULE(command, 0, "Result-Code", RULE_OPTIONAL, 0, 1, 0); + ADD_RULE(command, 0, "Experimental-Result", RULE_OPTIONAL, 0, 1, 0); + ADD_RULE(command, 0, "Origin-Host", RULE_REQUIRED, 1, 1, 0); + ADD_RULE(command, 0, "Origin-Realm", RULE_REQUIRED, 1, 1, 0); } { @@ -316,7 +323,19 @@ int main(int argc, char *argv[]) CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); } - + + { + struct dict_object * type = NULL; + struct dict_type_data type_data = { AVP_TYPE_UNSIGNED32, "Enumerated(73565/Experimental-Result-Code)" }; + struct dict_avp_data avp_data = { 73576, 73565, "Experimental-Result-Code", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_UNSIGNED32 }; + struct dict_enumval_data val1 = { "DIAMETER_TEST_RESULT_1000", { .u32 = 1000 } }; + struct dict_enumval_data val2 = { "DIAMETER_TEST_RESULT_5000", { .u32 = 5000 } }; + CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); + CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); + CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val1 , type, NULL ) ); + CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val2 , type, NULL ) ); + } + #if 0 { fd_log_debug("%s", fd_dict_dump_object(FD_DUMP_TEST_PARAMS, vendor)); @@ -680,21 +699,49 @@ int main(int argc, char *argv[]) { struct dict_object * avp_model; struct avp * found; + struct avp * grouped = NULL; struct avp_hdr * avpdata = NULL; - /* Now find the ACR dictionary object */ + /* Now find the Test f32 AVP dictionary object */ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "AVP Test - no vendor - f32", &avp_model, ENOENT ) ); CPYBUF(); CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) ); - + CHECK( 0, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) ); +#if 0 + LOG_D("msg: %s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1)); +#endif + /* Search this AVP instance in the msg */ CHECK( 0, fd_msg_search_avp( msg, avp_model, &found ) ); /* Check the AVP value is 3.1415 */ CHECK( 0, fd_msg_avp_hdr ( found, &avpdata ) ); CHECK( 3.1415F, avpdata->avp_value->f32 ); - + + /* Search for the first grouped message */ + { + struct dict_avp_request grouped_req = { 73565, 0, "AVP Test - grouped"}; + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &grouped_req, &avp_model, ENOENT ) ); + } + CHECK( 0, fd_msg_search_avp( msg, avp_model, &grouped ) ); +#if 0 + LOG_D("grouped: %s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, grouped, fd_g_config->cnf_dict, 0, 1)); +#endif + + /* Find the first item in the grouped */ + { + struct dict_avp_request avp_req = { 73565, 0, "AVP Test - os"}; + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &avp_req, &avp_model, ENOENT ) ); + } + + CHECK( 0, fd_msg_search_avp( grouped, avp_model, &found ) ); + + /* Check the AVP value is "1" */ + CHECK( 0, fd_msg_avp_hdr ( found, &avpdata ) ); + CHECK( 8, avpdata->avp_value->os.len ); + CHECK( 0, memcmp(avpdata->avp_value->os.data, "12345678", 8)); + /* reinit the msg */ CHECK( 0, fd_msg_free ( msg ) ); @@ -1070,6 +1117,8 @@ int main(int argc, char *argv[]) fd_log_debug("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1)); TODO("Check the Failed-AVP is as expected"); + + CHECK( 0, fd_msg_free( msg ) ); } } @@ -1448,6 +1497,120 @@ int main(int argc, char *argv[]) CHECK( 0, fd_msg_free( msg ) ); } } + + /* Test the fd_msg_add_result function for Result-Code */ + { + struct msg * msg = NULL; + struct dict_object * avp_model = NULL; + struct avp * rc = NULL; + struct avp_hdr * avpdata = NULL; + + { + struct dict_object * cmd_model = NULL; + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Answer", &cmd_model, ENOENT ) ); + + /* Create a message */ + CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) ); + + /* Add a session id */ + CHECK( 0, fd_msg_new_session( msg, (os0_t)"testmsg", strlen("testmsg") ) ); + + /* Find the DICT_TYPE Enumerated(Result-Code) */ + struct dict_object * restype = NULL; + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, "Enumerated(Result-Code)", &restype, ENOENT ) ); + + /* Now test the behavior of fd_msg_add_result for Result-Code AVP */ + CHECK( 0, fd_msg_add_result(msg, 0, restype, "DIAMETER_SUCCESS", NULL, NULL, 1) ); + + LOG_D("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1)); + } + + /* Ensure Result-Code is present */ + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &avp_model, ENOENT ) ); + CHECK( 0, fd_msg_search_avp( msg, avp_model, &rc ) ); + + /* Check the Result-Code AVP value is DIAMETER_SUCCESS */ + CHECK( 0, fd_msg_avp_hdr ( rc, &avpdata ) ); + CHECK( ER_DIAMETER_SUCCESS, avpdata->avp_value->u32 ); + + /* Ensure Experimental-Result is missing */ + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &avp_model, ENOENT ) ); + CHECK( ENOENT, fd_msg_search_avp( msg, avp_model, NULL ) ); + + /* Free msg */ + CHECK( 0, fd_msg_free( msg ) ); + } + + /* Test the fd_msg_add_result function for Experimental-Result */ + { + struct msg * msg = NULL; + struct dict_object * avp_model = NULL; + struct avp * er = NULL; + struct avp * erc = NULL; + struct avp_hdr * avpdata = NULL; + + { + struct dict_object * cmd_model = NULL; + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Answer", &cmd_model, ENOENT ) ); + + /* Create a message */ + CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) ); + + /* Add a session id */ + CHECK( 0, fd_msg_new_session( msg, (os0_t)"testmsg", strlen("testmsg") ) ); + + /* Find the DICT_TYPE Enumerated(73565/Experimental-Result-Code) */ + struct dict_object * restype = NULL; + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, "Enumerated(73565/Experimental-Result-Code)", &restype, ENOENT ) ); + + /* Now test the behavior of fd_msg_add_result for Experimental-Result AVP */ + CHECK( 0, fd_msg_add_result(msg, 73565, restype, "DIAMETER_TEST_RESULT_5000", NULL, NULL, 1) ); + + LOG_D("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1)); + } + + /* Ensure Result-Code is missing */ + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &avp_model, ENOENT ) ); + CHECK( ENOENT, fd_msg_search_avp( msg, avp_model, NULL ) ); + + /* Ensure Experimental-Result is present */ + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &avp_model, ENOENT ) ); + CHECK( 0, fd_msg_search_avp( msg, avp_model, &er ) ); + + /* Ensure Experimental-Result-Code is present */ + CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result-Code", &avp_model, ENOENT ) ); + CHECK( 0, fd_msg_search_avp( er, avp_model, &erc ) ); + + /* Check the Experimental-Result-Code AVP value is 5000 */ + CHECK( 0, fd_msg_avp_hdr ( erc, &avpdata ) ); + CHECK( 5000, avpdata->avp_value->u32 ); + + /* Free msg */ + CHECK( 0, fd_msg_free( msg ) ); + } + + /* Check IPv4 -> IPv6 and IPv6->IPv4 mapping */ + { + struct in_addr i4; + memset(&i4, 0xff, sizeof(i4)); + CHECK( 1, inet_pton( AF_INET, TEST_IP4, &i4 ) ); + + #define TEST_IP6MAP "::ffff:" TEST_IP4 + + struct in6_addr i6; + memset(&i6, 0xff, sizeof(i6)); + IN6_ADDR_V4MAP(&i6.s6_addr, i4.s_addr); + char buf6[INET6_ADDRSTRLEN]; + CHECK( 0, (inet_ntop( AF_INET6, &i6, buf6, sizeof(buf6) ) == NULL) ? errno : 0 ); + LOG_D("buf6='%s'", buf6); + CHECK( 0, strcasecmp( buf6, TEST_IP6MAP ) ); + + struct in_addr o4; + o4.s_addr = IN6_ADDR_V4UNMAP(&i6); + char buf4[INET_ADDRSTRLEN]; + CHECK( 0, (inet_ntop( AF_INET, &o4.s_addr, buf4, sizeof(buf4) ) == NULL) ? errno : 0 ); + CHECK( 0, strcmp( buf4, TEST_IP4 ) ); + } /* That's all for the tests yet */ PASSTEST(); diff --git a/tests/tests.h b/tests/tests.h index 052982d..9c3902b 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2019, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * diff --git a/tests/testsctp.c b/tests/testsctp.c index 46453c8..40d8729 100644 --- a/tests/testsctp.c +++ b/tests/testsctp.c @@ -2,7 +2,7 @@ * Software License Agreement (BSD License) * * Author: Sebastien Decugis <sdecugis@freediameter.net> * * * -* Copyright (c) 2013, WIDE Project and NICT * +* Copyright (c) 2020, WIDE Project and NICT * * All rights reserved. * * * * Redistribution and use of this software in source and binary forms, with or without modification, are * @@ -98,7 +98,7 @@ int main(int argc, char *argv[]) CHECK( 0, fd_sctp_listen( sock )); /* Now, create the client socket */ - CHECK( 0, fd_sctp_client( &cli.cc_socket, 0, TEST_PORT, &eps )); + CHECK( 0, fd_sctp_client( &cli.cc_socket, 0, TEST_PORT, &eps, NULL )); /* Accept this connection */ srv.cc_socket = accept(sock, NULL, NULL); |
